| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837408384083940840408414084240843408444084540846408474084840849408504085140852408534085440855408564085740858408594086040861408624086340864408654086640867408684086940870408714087240873408744087540876408774087840879408804088140882408834088440885408864088740888408894089040891408924089340894408954089640897408984089940900409014090240903409044090540906409074090840909409104091140912409134091440915409164091740918409194092040921409224092340924409254092640927409284092940930409314093240933409344093540936409374093840939409404094140942409434094440945409464094740948409494095040951409524095340954409554095640957409584095940960409614096240963409644096540966409674096840969409704097140972409734097440975409764097740978409794098040981409824098340984409854098640987409884098940990409914099240993409944099540996409974099840999410004100141002410034100441005410064100741008410094101041011410124101341014410154101641017410184101941020410214102241023410244102541026410274102841029410304103141032410334103441035410364103741038410394104041041410424104341044410454104641047410484104941050410514105241053410544105541056410574105841059410604106141062410634106441065410664106741068410694107041071410724107341074410754107641077410784107941080410814108241083410844108541086410874108841089410904109141092410934109441095410964109741098410994110041101411024110341104411054110641107411084110941110411114111241113411144111541116411174111841119411204112141122411234112441125411264112741128411294113041131411324113341134411354113641137411384113941140411414114241143411444114541146411474114841149411504115141152411534115441155411564115741158411594116041161411624116341164411654116641167411684116941170411714117241173411744117541176411774117841179411804118141182411834118441185411864118741188411894119041191411924119341194411954119641197411984119941200412014120241203412044120541206412074120841209412104121141212412134121441215412164121741218412194122041221412224122341224412254122641227412284122941230412314123241233412344123541236412374123841239412404124141242412434124441245412464124741248412494125041251412524125341254412554125641257412584125941260412614126241263412644126541266412674126841269412704127141272412734127441275412764127741278412794128041281412824128341284412854128641287412884128941290412914129241293412944129541296412974129841299413004130141302413034130441305413064130741308413094131041311413124131341314413154131641317413184131941320413214132241323413244132541326413274132841329413304133141332413334133441335413364133741338413394134041341413424134341344413454134641347413484134941350413514135241353413544135541356413574135841359413604136141362413634136441365413664136741368413694137041371413724137341374413754137641377413784137941380413814138241383413844138541386413874138841389413904139141392413934139441395413964139741398413994140041401414024140341404414054140641407414084140941410414114141241413414144141541416414174141841419414204142141422414234142441425414264142741428414294143041431414324143341434414354143641437414384143941440414414144241443414444144541446414474144841449414504145141452414534145441455414564145741458414594146041461414624146341464414654146641467414684146941470414714147241473414744147541476414774147841479414804148141482414834148441485414864148741488414894149041491414924149341494414954149641497414984149941500415014150241503415044150541506415074150841509415104151141512415134151441515415164151741518415194152041521415224152341524415254152641527415284152941530415314153241533415344153541536415374153841539415404154141542415434154441545415464154741548415494155041551415524155341554415554155641557415584155941560415614156241563415644156541566415674156841569415704157141572415734157441575415764157741578415794158041581415824158341584415854158641587415884158941590415914159241593415944159541596415974159841599416004160141602416034160441605416064160741608416094161041611416124161341614416154161641617416184161941620416214162241623416244162541626416274162841629416304163141632416334163441635416364163741638416394164041641416424164341644416454164641647416484164941650416514165241653416544165541656416574165841659416604166141662416634166441665416664166741668416694167041671416724167341674416754167641677416784167941680416814168241683416844168541686416874168841689416904169141692416934169441695416964169741698416994170041701417024170341704417054170641707417084170941710417114171241713417144171541716417174171841719417204172141722417234172441725417264172741728417294173041731417324173341734417354173641737417384173941740417414174241743417444174541746417474174841749417504175141752417534175441755417564175741758417594176041761417624176341764417654176641767417684176941770417714177241773417744177541776417774177841779417804178141782417834178441785417864178741788417894179041791417924179341794417954179641797417984179941800418014180241803418044180541806418074180841809418104181141812418134181441815418164181741818418194182041821418224182341824418254182641827418284182941830418314183241833418344183541836418374183841839418404184141842418434184441845418464184741848418494185041851418524185341854418554185641857418584185941860418614186241863418644186541866418674186841869418704187141872418734187441875418764187741878418794188041881418824188341884418854188641887418884188941890418914189241893418944189541896418974189841899419004190141902419034190441905419064190741908419094191041911419124191341914419154191641917419184191941920419214192241923419244192541926419274192841929419304193141932419334193441935419364193741938419394194041941419424194341944419454194641947419484194941950419514195241953419544195541956419574195841959419604196141962419634196441965419664196741968419694197041971419724197341974419754197641977419784197941980419814198241983419844198541986419874198841989419904199141992419934199441995419964199741998419994200042001420024200342004420054200642007420084200942010420114201242013420144201542016420174201842019420204202142022420234202442025420264202742028420294203042031420324203342034420354203642037420384203942040420414204242043420444204542046420474204842049420504205142052420534205442055420564205742058420594206042061420624206342064420654206642067420684206942070420714207242073420744207542076420774207842079420804208142082420834208442085420864208742088420894209042091420924209342094420954209642097420984209942100421014210242103421044210542106421074210842109421104211142112421134211442115421164211742118421194212042121421224212342124421254212642127421284212942130421314213242133421344213542136421374213842139421404214142142421434214442145421464214742148421494215042151421524215342154421554215642157421584215942160421614216242163421644216542166421674216842169421704217142172421734217442175421764217742178421794218042181421824218342184421854218642187421884218942190421914219242193421944219542196421974219842199422004220142202422034220442205422064220742208422094221042211422124221342214422154221642217422184221942220422214222242223422244222542226422274222842229422304223142232422334223442235422364223742238422394224042241422424224342244422454224642247422484224942250422514225242253422544225542256422574225842259422604226142262422634226442265422664226742268422694227042271422724227342274422754227642277422784227942280422814228242283422844228542286422874228842289422904229142292422934229442295422964229742298422994230042301423024230342304423054230642307423084230942310423114231242313423144231542316423174231842319423204232142322423234232442325423264232742328423294233042331423324233342334423354233642337423384233942340423414234242343423444234542346423474234842349423504235142352423534235442355423564235742358423594236042361423624236342364423654236642367423684236942370423714237242373423744237542376423774237842379423804238142382423834238442385423864238742388423894239042391423924239342394423954239642397423984239942400424014240242403424044240542406424074240842409424104241142412424134241442415424164241742418424194242042421424224242342424424254242642427424284242942430424314243242433424344243542436424374243842439424404244142442424434244442445424464244742448424494245042451424524245342454424554245642457424584245942460424614246242463424644246542466424674246842469424704247142472424734247442475424764247742478424794248042481424824248342484424854248642487424884248942490424914249242493424944249542496424974249842499425004250142502425034250442505425064250742508425094251042511425124251342514425154251642517425184251942520425214252242523425244252542526425274252842529425304253142532425334253442535425364253742538425394254042541425424254342544425454254642547425484254942550425514255242553425544255542556425574255842559425604256142562425634256442565425664256742568425694257042571425724257342574425754257642577425784257942580425814258242583425844258542586425874258842589425904259142592425934259442595425964259742598425994260042601426024260342604426054260642607426084260942610426114261242613426144261542616426174261842619426204262142622426234262442625426264262742628426294263042631426324263342634426354263642637426384263942640426414264242643426444264542646426474264842649426504265142652426534265442655426564265742658426594266042661426624266342664426654266642667426684266942670426714267242673426744267542676426774267842679426804268142682426834268442685426864268742688426894269042691426924269342694426954269642697426984269942700427014270242703427044270542706427074270842709427104271142712427134271442715427164271742718427194272042721427224272342724427254272642727427284272942730427314273242733427344273542736427374273842739427404274142742427434274442745427464274742748427494275042751427524275342754427554275642757427584275942760427614276242763427644276542766427674276842769427704277142772427734277442775427764277742778427794278042781427824278342784427854278642787427884278942790427914279242793427944279542796427974279842799428004280142802428034280442805428064280742808428094281042811428124281342814428154281642817428184281942820428214282242823428244282542826428274282842829428304283142832428334283442835428364283742838428394284042841428424284342844428454284642847428484284942850428514285242853428544285542856428574285842859428604286142862428634286442865428664286742868428694287042871428724287342874428754287642877428784287942880428814288242883428844288542886428874288842889428904289142892428934289442895428964289742898428994290042901429024290342904429054290642907429084290942910429114291242913429144291542916429174291842919429204292142922429234292442925429264292742928429294293042931429324293342934429354293642937429384293942940429414294242943429444294542946429474294842949429504295142952429534295442955429564295742958429594296042961429624296342964429654296642967429684296942970429714297242973429744297542976429774297842979429804298142982429834298442985429864298742988429894299042991429924299342994429954299642997429984299943000430014300243003430044300543006430074300843009430104301143012430134301443015430164301743018430194302043021430224302343024430254302643027430284302943030430314303243033430344303543036430374303843039430404304143042430434304443045430464304743048430494305043051430524305343054430554305643057430584305943060430614306243063430644306543066430674306843069430704307143072430734307443075430764307743078430794308043081430824308343084430854308643087430884308943090430914309243093430944309543096430974309843099431004310143102431034310443105431064310743108431094311043111431124311343114431154311643117431184311943120431214312243123431244312543126431274312843129431304313143132431334313443135431364313743138431394314043141431424314343144431454314643147431484314943150431514315243153431544315543156431574315843159431604316143162431634316443165431664316743168431694317043171431724317343174431754317643177431784317943180431814318243183431844318543186431874318843189431904319143192431934319443195431964319743198431994320043201432024320343204432054320643207432084320943210432114321243213432144321543216432174321843219432204322143222432234322443225432264322743228432294323043231432324323343234432354323643237432384323943240432414324243243432444324543246432474324843249432504325143252432534325443255432564325743258432594326043261432624326343264432654326643267432684326943270432714327243273432744327543276432774327843279432804328143282432834328443285432864328743288432894329043291432924329343294432954329643297432984329943300433014330243303433044330543306433074330843309433104331143312433134331443315433164331743318433194332043321433224332343324433254332643327433284332943330433314333243333433344333543336433374333843339433404334143342433434334443345433464334743348433494335043351433524335343354433554335643357433584335943360433614336243363433644336543366433674336843369433704337143372433734337443375433764337743378433794338043381433824338343384433854338643387433884338943390433914339243393433944339543396433974339843399434004340143402434034340443405434064340743408434094341043411434124341343414434154341643417434184341943420434214342243423434244342543426434274342843429434304343143432434334343443435434364343743438434394344043441434424344343444434454344643447434484344943450434514345243453434544345543456434574345843459434604346143462434634346443465434664346743468434694347043471434724347343474434754347643477434784347943480434814348243483434844348543486434874348843489434904349143492434934349443495434964349743498434994350043501435024350343504435054350643507435084350943510435114351243513435144351543516435174351843519435204352143522435234352443525435264352743528435294353043531435324353343534435354353643537435384353943540435414354243543435444354543546435474354843549435504355143552435534355443555435564355743558435594356043561435624356343564435654356643567435684356943570435714357243573435744357543576435774357843579435804358143582435834358443585435864358743588435894359043591435924359343594435954359643597435984359943600436014360243603436044360543606436074360843609436104361143612436134361443615436164361743618436194362043621436224362343624436254362643627436284362943630436314363243633436344363543636436374363843639436404364143642436434364443645436464364743648436494365043651436524365343654436554365643657436584365943660436614366243663436644366543666436674366843669436704367143672436734367443675436764367743678436794368043681436824368343684436854368643687436884368943690436914369243693436944369543696436974369843699437004370143702437034370443705437064370743708437094371043711437124371343714437154371643717437184371943720437214372243723437244372543726437274372843729437304373143732437334373443735437364373743738437394374043741437424374343744437454374643747437484374943750437514375243753437544375543756437574375843759437604376143762437634376443765437664376743768437694377043771437724377343774437754377643777437784377943780437814378243783437844378543786437874378843789437904379143792437934379443795437964379743798437994380043801438024380343804438054380643807438084380943810438114381243813438144381543816438174381843819438204382143822438234382443825438264382743828438294383043831438324383343834438354383643837438384383943840438414384243843438444384543846438474384843849438504385143852438534385443855438564385743858438594386043861438624386343864438654386643867438684386943870438714387243873438744387543876438774387843879438804388143882438834388443885438864388743888438894389043891438924389343894438954389643897438984389943900439014390243903439044390543906439074390843909439104391143912439134391443915439164391743918439194392043921439224392343924439254392643927439284392943930439314393243933439344393543936439374393843939439404394143942439434394443945439464394743948439494395043951439524395343954439554395643957439584395943960439614396243963439644396543966439674396843969439704397143972439734397443975439764397743978439794398043981439824398343984439854398643987439884398943990439914399243993439944399543996439974399843999440004400144002440034400444005440064400744008440094401044011440124401344014440154401644017440184401944020440214402244023440244402544026440274402844029440304403144032440334403444035440364403744038440394404044041440424404344044440454404644047440484404944050440514405244053440544405544056440574405844059440604406144062440634406444065440664406744068440694407044071440724407344074440754407644077440784407944080440814408244083440844408544086440874408844089440904409144092440934409444095440964409744098440994410044101441024410344104441054410644107441084410944110441114411244113441144411544116441174411844119441204412144122441234412444125441264412744128441294413044131441324413344134441354413644137441384413944140441414414244143441444414544146441474414844149441504415144152441534415444155441564415744158441594416044161441624416344164441654416644167441684416944170441714417244173441744417544176441774417844179441804418144182441834418444185441864418744188441894419044191441924419344194441954419644197441984419944200442014420244203442044420544206442074420844209442104421144212442134421444215442164421744218442194422044221442224422344224442254422644227442284422944230442314423244233442344423544236442374423844239442404424144242442434424444245442464424744248442494425044251442524425344254442554425644257442584425944260442614426244263442644426544266442674426844269442704427144272442734427444275442764427744278442794428044281442824428344284442854428644287442884428944290442914429244293442944429544296442974429844299443004430144302443034430444305443064430744308443094431044311443124431344314443154431644317443184431944320443214432244323443244432544326443274432844329443304433144332443334433444335443364433744338443394434044341443424434344344443454434644347443484434944350443514435244353443544435544356443574435844359443604436144362443634436444365443664436744368443694437044371443724437344374443754437644377443784437944380443814438244383443844438544386443874438844389443904439144392443934439444395443964439744398443994440044401444024440344404444054440644407444084440944410444114441244413444144441544416444174441844419444204442144422444234442444425444264442744428444294443044431444324443344434444354443644437444384443944440444414444244443444444444544446444474444844449444504445144452444534445444455444564445744458444594446044461444624446344464444654446644467444684446944470444714447244473444744447544476444774447844479444804448144482444834448444485444864448744488444894449044491444924449344494444954449644497444984449944500445014450244503445044450544506445074450844509445104451144512445134451444515445164451744518445194452044521445224452344524445254452644527445284452944530445314453244533445344453544536445374453844539445404454144542445434454444545445464454744548445494455044551445524455344554445554455644557445584455944560445614456244563445644456544566445674456844569445704457144572445734457444575445764457744578445794458044581445824458344584445854458644587445884458944590445914459244593445944459544596445974459844599446004460144602446034460444605446064460744608446094461044611446124461344614446154461644617446184461944620446214462244623446244462544626446274462844629446304463144632446334463444635446364463744638446394464044641446424464344644446454464644647446484464944650446514465244653446544465544656446574465844659446604466144662446634466444665446664466744668446694467044671446724467344674446754467644677446784467944680446814468244683446844468544686446874468844689446904469144692446934469444695446964469744698446994470044701447024470344704447054470644707447084470944710447114471244713447144471544716447174471844719447204472144722447234472444725447264472744728447294473044731447324473344734447354473644737447384473944740447414474244743447444474544746447474474844749447504475144752447534475444755447564475744758447594476044761447624476344764447654476644767447684476944770447714477244773447744477544776447774477844779447804478144782447834478444785447864478744788447894479044791447924479344794447954479644797447984479944800448014480244803448044480544806448074480844809448104481144812448134481444815448164481744818448194482044821448224482344824448254482644827448284482944830448314483244833448344483544836448374483844839448404484144842448434484444845448464484744848448494485044851448524485344854448554485644857448584485944860448614486244863448644486544866448674486844869448704487144872448734487444875448764487744878448794488044881448824488344884448854488644887448884488944890448914489244893448944489544896448974489844899449004490144902449034490444905449064490744908449094491044911449124491344914449154491644917449184491944920449214492244923449244492544926449274492844929449304493144932449334493444935449364493744938449394494044941449424494344944449454494644947449484494944950449514495244953449544495544956449574495844959449604496144962449634496444965449664496744968449694497044971449724497344974449754497644977449784497944980449814498244983449844498544986449874498844989449904499144992449934499444995449964499744998449994500045001450024500345004450054500645007450084500945010450114501245013450144501545016450174501845019450204502145022450234502445025450264502745028450294503045031450324503345034450354503645037450384503945040450414504245043450444504545046450474504845049450504505145052450534505445055450564505745058450594506045061450624506345064450654506645067450684506945070450714507245073450744507545076450774507845079450804508145082450834508445085450864508745088450894509045091450924509345094450954509645097450984509945100451014510245103451044510545106451074510845109451104511145112451134511445115451164511745118451194512045121451224512345124451254512645127451284512945130451314513245133451344513545136451374513845139451404514145142451434514445145451464514745148451494515045151451524515345154451554515645157451584515945160451614516245163451644516545166451674516845169451704517145172451734517445175451764517745178451794518045181451824518345184451854518645187451884518945190451914519245193451944519545196451974519845199452004520145202452034520445205452064520745208452094521045211452124521345214452154521645217452184521945220452214522245223452244522545226452274522845229452304523145232452334523445235452364523745238452394524045241452424524345244452454524645247452484524945250452514525245253452544525545256452574525845259452604526145262452634526445265452664526745268452694527045271452724527345274452754527645277452784527945280452814528245283452844528545286452874528845289452904529145292452934529445295452964529745298452994530045301453024530345304453054530645307453084530945310453114531245313453144531545316453174531845319453204532145322453234532445325453264532745328453294533045331453324533345334453354533645337453384533945340453414534245343453444534545346453474534845349453504535145352453534535445355453564535745358453594536045361453624536345364453654536645367453684536945370453714537245373453744537545376453774537845379453804538145382453834538445385453864538745388453894539045391453924539345394453954539645397453984539945400454014540245403454044540545406454074540845409454104541145412454134541445415454164541745418454194542045421454224542345424454254542645427454284542945430454314543245433454344543545436454374543845439454404544145442454434544445445454464544745448454494545045451454524545345454454554545645457454584545945460454614546245463454644546545466454674546845469454704547145472454734547445475454764547745478454794548045481454824548345484454854548645487454884548945490454914549245493454944549545496454974549845499455004550145502455034550445505455064550745508455094551045511455124551345514455154551645517455184551945520455214552245523455244552545526455274552845529455304553145532455334553445535455364553745538455394554045541455424554345544455454554645547455484554945550455514555245553455544555545556455574555845559455604556145562455634556445565455664556745568455694557045571455724557345574455754557645577455784557945580455814558245583455844558545586455874558845589455904559145592455934559445595455964559745598455994560045601456024560345604456054560645607456084560945610456114561245613456144561545616456174561845619456204562145622456234562445625456264562745628456294563045631456324563345634456354563645637456384563945640456414564245643456444564545646456474564845649456504565145652456534565445655456564565745658456594566045661456624566345664456654566645667456684566945670456714567245673456744567545676456774567845679456804568145682456834568445685456864568745688456894569045691456924569345694456954569645697456984569945700457014570245703457044570545706457074570845709457104571145712457134571445715457164571745718457194572045721457224572345724457254572645727457284572945730457314573245733457344573545736457374573845739457404574145742457434574445745457464574745748457494575045751457524575345754457554575645757457584575945760457614576245763457644576545766457674576845769457704577145772457734577445775457764577745778457794578045781457824578345784457854578645787457884578945790457914579245793457944579545796457974579845799458004580145802458034580445805458064580745808458094581045811458124581345814458154581645817458184581945820458214582245823458244582545826458274582845829458304583145832458334583445835458364583745838458394584045841458424584345844458454584645847458484584945850458514585245853458544585545856458574585845859458604586145862458634586445865458664586745868458694587045871458724587345874458754587645877458784587945880458814588245883458844588545886458874588845889458904589145892458934589445895458964589745898458994590045901459024590345904459054590645907459084590945910459114591245913459144591545916459174591845919459204592145922459234592445925459264592745928459294593045931459324593345934459354593645937459384593945940459414594245943459444594545946459474594845949459504595145952459534595445955459564595745958459594596045961459624596345964459654596645967459684596945970459714597245973459744597545976459774597845979459804598145982459834598445985459864598745988459894599045991459924599345994459954599645997459984599946000460014600246003460044600546006460074600846009460104601146012460134601446015460164601746018460194602046021460224602346024460254602646027460284602946030460314603246033460344603546036460374603846039460404604146042460434604446045460464604746048460494605046051460524605346054460554605646057460584605946060460614606246063460644606546066460674606846069460704607146072460734607446075460764607746078460794608046081460824608346084460854608646087460884608946090460914609246093460944609546096460974609846099461004610146102461034610446105461064610746108461094611046111461124611346114461154611646117461184611946120461214612246123461244612546126461274612846129461304613146132461334613446135461364613746138461394614046141461424614346144461454614646147461484614946150461514615246153461544615546156461574615846159461604616146162461634616446165461664616746168461694617046171461724617346174461754617646177461784617946180461814618246183461844618546186461874618846189461904619146192461934619446195461964619746198461994620046201462024620346204462054620646207462084620946210462114621246213462144621546216462174621846219462204622146222462234622446225462264622746228462294623046231462324623346234462354623646237462384623946240462414624246243462444624546246462474624846249462504625146252462534625446255462564625746258462594626046261462624626346264462654626646267462684626946270462714627246273462744627546276462774627846279462804628146282462834628446285462864628746288462894629046291462924629346294462954629646297462984629946300463014630246303463044630546306463074630846309463104631146312463134631446315463164631746318463194632046321463224632346324463254632646327463284632946330463314633246333463344633546336463374633846339463404634146342463434634446345463464634746348463494635046351463524635346354463554635646357463584635946360463614636246363463644636546366463674636846369463704637146372463734637446375463764637746378463794638046381463824638346384463854638646387463884638946390463914639246393463944639546396463974639846399464004640146402464034640446405464064640746408464094641046411464124641346414464154641646417464184641946420464214642246423464244642546426464274642846429464304643146432464334643446435464364643746438464394644046441464424644346444464454644646447464484644946450464514645246453464544645546456464574645846459464604646146462464634646446465464664646746468464694647046471464724647346474464754647646477464784647946480464814648246483464844648546486464874648846489464904649146492464934649446495464964649746498464994650046501465024650346504465054650646507465084650946510465114651246513465144651546516465174651846519465204652146522465234652446525465264652746528465294653046531465324653346534465354653646537465384653946540465414654246543465444654546546465474654846549465504655146552465534655446555465564655746558465594656046561465624656346564465654656646567465684656946570465714657246573465744657546576465774657846579465804658146582465834658446585465864658746588465894659046591465924659346594465954659646597465984659946600466014660246603466044660546606466074660846609466104661146612466134661446615466164661746618466194662046621466224662346624466254662646627466284662946630466314663246633466344663546636466374663846639466404664146642466434664446645466464664746648466494665046651466524665346654466554665646657466584665946660466614666246663466644666546666466674666846669466704667146672466734667446675466764667746678466794668046681466824668346684466854668646687466884668946690466914669246693466944669546696466974669846699467004670146702467034670446705467064670746708467094671046711467124671346714467154671646717467184671946720467214672246723467244672546726467274672846729467304673146732467334673446735467364673746738467394674046741467424674346744467454674646747467484674946750467514675246753467544675546756467574675846759467604676146762467634676446765467664676746768467694677046771467724677346774467754677646777467784677946780467814678246783467844678546786467874678846789467904679146792467934679446795467964679746798467994680046801468024680346804468054680646807468084680946810468114681246813468144681546816468174681846819468204682146822468234682446825468264682746828468294683046831468324683346834468354683646837468384683946840468414684246843468444684546846468474684846849468504685146852468534685446855468564685746858468594686046861468624686346864468654686646867468684686946870468714687246873468744687546876468774687846879468804688146882468834688446885468864688746888468894689046891468924689346894468954689646897468984689946900469014690246903469044690546906469074690846909469104691146912469134691446915469164691746918469194692046921469224692346924469254692646927469284692946930469314693246933469344693546936469374693846939469404694146942469434694446945469464694746948469494695046951469524695346954469554695646957469584695946960469614696246963469644696546966469674696846969469704697146972469734697446975469764697746978469794698046981469824698346984469854698646987469884698946990469914699246993469944699546996469974699846999470004700147002470034700447005470064700747008470094701047011470124701347014470154701647017470184701947020470214702247023470244702547026470274702847029470304703147032470334703447035470364703747038470394704047041470424704347044470454704647047470484704947050470514705247053470544705547056470574705847059470604706147062470634706447065470664706747068470694707047071470724707347074470754707647077470784707947080470814708247083470844708547086470874708847089470904709147092470934709447095470964709747098470994710047101471024710347104471054710647107471084710947110471114711247113471144711547116471174711847119471204712147122471234712447125471264712747128471294713047131471324713347134471354713647137471384713947140471414714247143471444714547146471474714847149471504715147152471534715447155471564715747158471594716047161471624716347164471654716647167471684716947170471714717247173471744717547176471774717847179471804718147182471834718447185471864718747188471894719047191471924719347194471954719647197471984719947200472014720247203472044720547206472074720847209472104721147212472134721447215472164721747218472194722047221472224722347224472254722647227472284722947230472314723247233472344723547236472374723847239472404724147242472434724447245472464724747248472494725047251472524725347254472554725647257472584725947260472614726247263472644726547266472674726847269472704727147272472734727447275472764727747278472794728047281472824728347284472854728647287472884728947290472914729247293472944729547296472974729847299473004730147302473034730447305473064730747308473094731047311473124731347314473154731647317473184731947320473214732247323473244732547326473274732847329473304733147332473334733447335473364733747338473394734047341473424734347344473454734647347473484734947350473514735247353473544735547356473574735847359473604736147362473634736447365473664736747368473694737047371473724737347374473754737647377473784737947380473814738247383473844738547386473874738847389473904739147392473934739447395473964739747398473994740047401474024740347404474054740647407474084740947410474114741247413474144741547416474174741847419474204742147422474234742447425474264742747428474294743047431474324743347434474354743647437474384743947440474414744247443474444744547446474474744847449474504745147452474534745447455474564745747458474594746047461474624746347464474654746647467474684746947470474714747247473474744747547476474774747847479474804748147482474834748447485474864748747488474894749047491474924749347494474954749647497474984749947500475014750247503475044750547506475074750847509475104751147512475134751447515475164751747518475194752047521475224752347524475254752647527475284752947530475314753247533475344753547536475374753847539475404754147542475434754447545475464754747548475494755047551475524755347554475554755647557475584755947560475614756247563475644756547566475674756847569475704757147572475734757447575475764757747578475794758047581475824758347584475854758647587475884758947590475914759247593475944759547596475974759847599476004760147602476034760447605476064760747608476094761047611476124761347614476154761647617476184761947620476214762247623476244762547626476274762847629476304763147632476334763447635476364763747638476394764047641476424764347644476454764647647476484764947650476514765247653476544765547656476574765847659476604766147662476634766447665476664766747668476694767047671476724767347674476754767647677476784767947680476814768247683476844768547686476874768847689476904769147692476934769447695476964769747698476994770047701477024770347704477054770647707477084770947710477114771247713477144771547716477174771847719477204772147722477234772447725477264772747728477294773047731477324773347734477354773647737477384773947740477414774247743477444774547746477474774847749477504775147752477534775447755477564775747758477594776047761477624776347764477654776647767477684776947770477714777247773477744777547776477774777847779477804778147782477834778447785477864778747788477894779047791477924779347794477954779647797477984779947800478014780247803478044780547806478074780847809478104781147812478134781447815478164781747818478194782047821478224782347824478254782647827478284782947830478314783247833478344783547836478374783847839478404784147842478434784447845478464784747848478494785047851478524785347854478554785647857478584785947860478614786247863478644786547866478674786847869478704787147872478734787447875478764787747878478794788047881478824788347884478854788647887478884788947890478914789247893478944789547896478974789847899479004790147902479034790447905479064790747908479094791047911479124791347914479154791647917479184791947920479214792247923479244792547926479274792847929479304793147932479334793447935479364793747938479394794047941479424794347944479454794647947479484794947950479514795247953479544795547956479574795847959479604796147962479634796447965479664796747968479694797047971479724797347974479754797647977479784797947980479814798247983479844798547986479874798847989479904799147992479934799447995479964799747998479994800048001480024800348004480054800648007480084800948010480114801248013480144801548016480174801848019480204802148022480234802448025480264802748028480294803048031480324803348034480354803648037480384803948040480414804248043480444804548046480474804848049480504805148052480534805448055480564805748058480594806048061480624806348064480654806648067480684806948070480714807248073480744807548076480774807848079480804808148082480834808448085480864808748088480894809048091480924809348094480954809648097480984809948100481014810248103481044810548106481074810848109481104811148112481134811448115481164811748118481194812048121481224812348124481254812648127481284812948130481314813248133481344813548136481374813848139481404814148142481434814448145481464814748148481494815048151481524815348154481554815648157481584815948160481614816248163481644816548166481674816848169481704817148172481734817448175481764817748178481794818048181481824818348184481854818648187481884818948190481914819248193481944819548196481974819848199482004820148202482034820448205482064820748208482094821048211482124821348214482154821648217482184821948220482214822248223482244822548226482274822848229482304823148232482334823448235482364823748238482394824048241482424824348244482454824648247482484824948250482514825248253482544825548256482574825848259482604826148262482634826448265482664826748268482694827048271482724827348274482754827648277482784827948280482814828248283482844828548286482874828848289482904829148292482934829448295482964829748298482994830048301483024830348304483054830648307483084830948310483114831248313483144831548316483174831848319483204832148322483234832448325483264832748328483294833048331483324833348334483354833648337483384833948340483414834248343483444834548346483474834848349483504835148352483534835448355483564835748358483594836048361483624836348364483654836648367483684836948370483714837248373483744837548376483774837848379483804838148382483834838448385483864838748388483894839048391483924839348394483954839648397483984839948400484014840248403484044840548406484074840848409484104841148412484134841448415484164841748418484194842048421484224842348424484254842648427484284842948430484314843248433484344843548436484374843848439484404844148442484434844448445484464844748448484494845048451484524845348454484554845648457484584845948460484614846248463484644846548466484674846848469484704847148472484734847448475484764847748478484794848048481484824848348484484854848648487484884848948490484914849248493484944849548496484974849848499485004850148502485034850448505485064850748508485094851048511485124851348514485154851648517485184851948520485214852248523485244852548526485274852848529485304853148532485334853448535485364853748538485394854048541485424854348544485454854648547485484854948550485514855248553485544855548556485574855848559485604856148562485634856448565485664856748568485694857048571485724857348574485754857648577485784857948580485814858248583485844858548586485874858848589485904859148592485934859448595485964859748598485994860048601486024860348604486054860648607486084860948610486114861248613486144861548616486174861848619486204862148622486234862448625486264862748628486294863048631486324863348634486354863648637486384863948640486414864248643486444864548646486474864848649486504865148652486534865448655486564865748658486594866048661486624866348664486654866648667486684866948670486714867248673486744867548676486774867848679486804868148682486834868448685486864868748688486894869048691486924869348694486954869648697486984869948700487014870248703487044870548706487074870848709487104871148712487134871448715487164871748718487194872048721487224872348724487254872648727487284872948730487314873248733487344873548736487374873848739487404874148742487434874448745487464874748748487494875048751487524875348754487554875648757487584875948760487614876248763487644876548766487674876848769487704877148772487734877448775487764877748778487794878048781487824878348784487854878648787487884878948790487914879248793487944879548796487974879848799488004880148802488034880448805488064880748808488094881048811488124881348814488154881648817488184881948820488214882248823488244882548826488274882848829488304883148832488334883448835488364883748838488394884048841488424884348844488454884648847488484884948850488514885248853488544885548856488574885848859488604886148862488634886448865488664886748868488694887048871488724887348874488754887648877488784887948880488814888248883488844888548886488874888848889488904889148892488934889448895488964889748898488994890048901489024890348904489054890648907489084890948910489114891248913489144891548916489174891848919489204892148922489234892448925489264892748928489294893048931489324893348934489354893648937489384893948940489414894248943489444894548946489474894848949489504895148952489534895448955489564895748958489594896048961489624896348964489654896648967489684896948970489714897248973489744897548976489774897848979489804898148982489834898448985489864898748988489894899048991489924899348994489954899648997489984899949000490014900249003490044900549006490074900849009490104901149012490134901449015490164901749018490194902049021490224902349024490254902649027490284902949030490314903249033490344903549036490374903849039490404904149042490434904449045490464904749048490494905049051490524905349054490554905649057490584905949060490614906249063490644906549066490674906849069490704907149072490734907449075490764907749078490794908049081490824908349084490854908649087490884908949090490914909249093490944909549096490974909849099491004910149102491034910449105491064910749108491094911049111491124911349114491154911649117491184911949120491214912249123491244912549126491274912849129491304913149132491334913449135491364913749138491394914049141491424914349144491454914649147491484914949150491514915249153491544915549156491574915849159491604916149162491634916449165491664916749168491694917049171491724917349174491754917649177491784917949180491814918249183491844918549186491874918849189491904919149192491934919449195491964919749198491994920049201492024920349204492054920649207492084920949210492114921249213492144921549216492174921849219492204922149222492234922449225492264922749228492294923049231492324923349234492354923649237492384923949240492414924249243492444924549246492474924849249492504925149252492534925449255492564925749258492594926049261492624926349264492654926649267492684926949270492714927249273492744927549276492774927849279492804928149282492834928449285492864928749288492894929049291492924929349294492954929649297492984929949300493014930249303493044930549306493074930849309493104931149312493134931449315493164931749318493194932049321493224932349324493254932649327493284932949330493314933249333493344933549336493374933849339493404934149342493434934449345493464934749348493494935049351493524935349354493554935649357493584935949360493614936249363493644936549366493674936849369493704937149372493734937449375493764937749378493794938049381493824938349384493854938649387493884938949390493914939249393493944939549396493974939849399494004940149402494034940449405494064940749408494094941049411494124941349414494154941649417494184941949420494214942249423494244942549426494274942849429494304943149432494334943449435494364943749438494394944049441494424944349444494454944649447494484944949450494514945249453494544945549456494574945849459494604946149462494634946449465494664946749468494694947049471494724947349474494754947649477494784947949480494814948249483494844948549486494874948849489494904949149492494934949449495494964949749498494994950049501495024950349504495054950649507495084950949510495114951249513495144951549516495174951849519495204952149522495234952449525495264952749528495294953049531495324953349534495354953649537495384953949540495414954249543495444954549546495474954849549495504955149552495534955449555495564955749558495594956049561495624956349564495654956649567495684956949570495714957249573495744957549576495774957849579495804958149582495834958449585495864958749588495894959049591495924959349594495954959649597495984959949600496014960249603496044960549606496074960849609496104961149612496134961449615496164961749618496194962049621496224962349624496254962649627496284962949630496314963249633496344963549636496374963849639496404964149642496434964449645496464964749648496494965049651496524965349654496554965649657496584965949660496614966249663496644966549666496674966849669496704967149672496734967449675496764967749678496794968049681496824968349684496854968649687496884968949690496914969249693496944969549696496974969849699497004970149702497034970449705497064970749708497094971049711497124971349714497154971649717497184971949720497214972249723497244972549726497274972849729497304973149732497334973449735497364973749738497394974049741497424974349744497454974649747497484974949750497514975249753497544975549756497574975849759497604976149762497634976449765497664976749768497694977049771497724977349774497754977649777497784977949780497814978249783497844978549786497874978849789497904979149792497934979449795497964979749798497994980049801498024980349804498054980649807498084980949810498114981249813498144981549816498174981849819498204982149822498234982449825498264982749828498294983049831498324983349834498354983649837498384983949840498414984249843498444984549846498474984849849498504985149852498534985449855498564985749858498594986049861498624986349864498654986649867498684986949870498714987249873498744987549876498774987849879498804988149882498834988449885498864988749888498894989049891498924989349894498954989649897498984989949900499014990249903499044990549906499074990849909499104991149912499134991449915499164991749918499194992049921499224992349924499254992649927499284992949930499314993249933499344993549936499374993849939499404994149942499434994449945499464994749948499494995049951499524995349954499554995649957499584995949960499614996249963499644996549966499674996849969499704997149972499734997449975499764997749978499794998049981499824998349984499854998649987499884998949990499914999249993499944999549996499974999849999500005000150002500035000450005500065000750008500095001050011500125001350014500155001650017500185001950020500215002250023500245002550026500275002850029500305003150032500335003450035500365003750038500395004050041500425004350044500455004650047500485004950050500515005250053500545005550056500575005850059500605006150062500635006450065500665006750068500695007050071500725007350074500755007650077500785007950080500815008250083500845008550086500875008850089500905009150092500935009450095500965009750098500995010050101501025010350104501055010650107501085010950110501115011250113501145011550116501175011850119501205012150122501235012450125501265012750128501295013050131501325013350134501355013650137501385013950140501415014250143501445014550146501475014850149501505015150152501535015450155501565015750158501595016050161501625016350164501655016650167501685016950170501715017250173501745017550176501775017850179501805018150182501835018450185501865018750188501895019050191501925019350194501955019650197501985019950200502015020250203502045020550206502075020850209502105021150212502135021450215502165021750218502195022050221502225022350224502255022650227502285022950230502315023250233502345023550236502375023850239502405024150242502435024450245502465024750248502495025050251502525025350254502555025650257502585025950260502615026250263502645026550266502675026850269502705027150272502735027450275502765027750278502795028050281502825028350284502855028650287502885028950290502915029250293502945029550296502975029850299503005030150302503035030450305503065030750308503095031050311503125031350314503155031650317503185031950320503215032250323503245032550326503275032850329503305033150332503335033450335503365033750338503395034050341503425034350344503455034650347503485034950350503515035250353503545035550356503575035850359503605036150362503635036450365503665036750368503695037050371503725037350374503755037650377503785037950380503815038250383503845038550386503875038850389503905039150392503935039450395503965039750398503995040050401504025040350404504055040650407504085040950410504115041250413504145041550416504175041850419504205042150422504235042450425504265042750428504295043050431504325043350434504355043650437504385043950440504415044250443504445044550446504475044850449504505045150452504535045450455504565045750458504595046050461504625046350464504655046650467504685046950470504715047250473504745047550476504775047850479504805048150482504835048450485504865048750488504895049050491504925049350494504955049650497504985049950500505015050250503505045050550506505075050850509505105051150512505135051450515505165051750518505195052050521505225052350524505255052650527505285052950530505315053250533505345053550536505375053850539505405054150542505435054450545505465054750548505495055050551505525055350554505555055650557505585055950560505615056250563505645056550566505675056850569505705057150572505735057450575505765057750578505795058050581505825058350584505855058650587505885058950590505915059250593505945059550596505975059850599506005060150602506035060450605506065060750608506095061050611506125061350614506155061650617506185061950620506215062250623506245062550626506275062850629506305063150632506335063450635506365063750638506395064050641506425064350644506455064650647506485064950650506515065250653506545065550656506575065850659506605066150662506635066450665506665066750668506695067050671506725067350674506755067650677506785067950680506815068250683506845068550686506875068850689506905069150692506935069450695506965069750698506995070050701507025070350704507055070650707507085070950710507115071250713507145071550716507175071850719507205072150722507235072450725507265072750728507295073050731507325073350734507355073650737507385073950740507415074250743507445074550746507475074850749507505075150752507535075450755507565075750758507595076050761507625076350764507655076650767507685076950770507715077250773507745077550776507775077850779507805078150782507835078450785507865078750788507895079050791507925079350794507955079650797507985079950800508015080250803508045080550806508075080850809508105081150812508135081450815508165081750818508195082050821508225082350824508255082650827508285082950830508315083250833508345083550836508375083850839508405084150842508435084450845508465084750848508495085050851508525085350854508555085650857508585085950860508615086250863508645086550866508675086850869508705087150872508735087450875508765087750878508795088050881508825088350884508855088650887508885088950890508915089250893508945089550896508975089850899509005090150902509035090450905509065090750908509095091050911509125091350914509155091650917509185091950920509215092250923509245092550926509275092850929509305093150932509335093450935509365093750938509395094050941509425094350944509455094650947509485094950950509515095250953509545095550956509575095850959509605096150962509635096450965509665096750968509695097050971509725097350974509755097650977509785097950980509815098250983509845098550986509875098850989509905099150992509935099450995509965099750998509995100051001510025100351004510055100651007510085100951010510115101251013510145101551016510175101851019510205102151022510235102451025510265102751028510295103051031510325103351034510355103651037510385103951040510415104251043510445104551046510475104851049510505105151052510535105451055510565105751058510595106051061510625106351064510655106651067510685106951070510715107251073510745107551076510775107851079510805108151082510835108451085510865108751088510895109051091510925109351094510955109651097510985109951100511015110251103511045110551106511075110851109511105111151112511135111451115511165111751118511195112051121511225112351124511255112651127511285112951130511315113251133511345113551136511375113851139511405114151142511435114451145511465114751148511495115051151511525115351154511555115651157511585115951160511615116251163511645116551166511675116851169511705117151172511735117451175511765117751178511795118051181511825118351184511855118651187511885118951190511915119251193511945119551196511975119851199512005120151202512035120451205512065120751208512095121051211512125121351214512155121651217512185121951220512215122251223512245122551226512275122851229512305123151232512335123451235512365123751238512395124051241512425124351244512455124651247512485124951250512515125251253512545125551256512575125851259512605126151262512635126451265512665126751268512695127051271512725127351274512755127651277512785127951280512815128251283512845128551286512875128851289512905129151292512935129451295512965129751298512995130051301513025130351304513055130651307513085130951310513115131251313513145131551316513175131851319513205132151322513235132451325513265132751328513295133051331513325133351334513355133651337513385133951340513415134251343513445134551346513475134851349513505135151352513535135451355513565135751358513595136051361513625136351364513655136651367513685136951370513715137251373513745137551376513775137851379513805138151382513835138451385513865138751388513895139051391513925139351394513955139651397513985139951400514015140251403514045140551406514075140851409514105141151412514135141451415514165141751418514195142051421514225142351424514255142651427514285142951430514315143251433514345143551436514375143851439514405144151442514435144451445514465144751448514495145051451514525145351454514555145651457514585145951460514615146251463514645146551466514675146851469514705147151472514735147451475514765147751478514795148051481514825148351484514855148651487514885148951490514915149251493514945149551496514975149851499515005150151502515035150451505515065150751508515095151051511515125151351514515155151651517515185151951520515215152251523515245152551526515275152851529515305153151532515335153451535515365153751538515395154051541515425154351544515455154651547515485154951550515515155251553515545155551556515575155851559515605156151562515635156451565515665156751568515695157051571515725157351574515755157651577515785157951580515815158251583515845158551586515875158851589515905159151592515935159451595515965159751598515995160051601516025160351604516055160651607516085160951610516115161251613516145161551616516175161851619516205162151622516235162451625516265162751628516295163051631516325163351634516355163651637516385163951640516415164251643516445164551646516475164851649516505165151652516535165451655516565165751658516595166051661516625166351664516655166651667516685166951670516715167251673516745167551676516775167851679516805168151682516835168451685516865168751688516895169051691516925169351694516955169651697516985169951700517015170251703517045170551706517075170851709517105171151712517135171451715517165171751718517195172051721517225172351724517255172651727517285172951730517315173251733517345173551736517375173851739517405174151742517435174451745517465174751748517495175051751517525175351754517555175651757517585175951760517615176251763517645176551766517675176851769517705177151772517735177451775517765177751778517795178051781517825178351784517855178651787517885178951790517915179251793517945179551796517975179851799518005180151802518035180451805518065180751808518095181051811518125181351814518155181651817518185181951820518215182251823518245182551826518275182851829518305183151832518335183451835518365183751838518395184051841518425184351844518455184651847518485184951850518515185251853518545185551856518575185851859518605186151862518635186451865518665186751868518695187051871518725187351874518755187651877518785187951880518815188251883518845188551886518875188851889518905189151892518935189451895518965189751898518995190051901519025190351904519055190651907519085190951910519115191251913519145191551916519175191851919519205192151922519235192451925519265192751928519295193051931519325193351934519355193651937519385193951940519415194251943519445194551946519475194851949519505195151952519535195451955519565195751958519595196051961519625196351964519655196651967519685196951970519715197251973519745197551976519775197851979519805198151982519835198451985519865198751988519895199051991519925199351994519955199651997519985199952000520015200252003520045200552006520075200852009520105201152012520135201452015520165201752018520195202052021520225202352024520255202652027520285202952030520315203252033520345203552036520375203852039520405204152042520435204452045520465204752048520495205052051520525205352054520555205652057520585205952060520615206252063520645206552066520675206852069520705207152072520735207452075520765207752078520795208052081520825208352084520855208652087520885208952090520915209252093520945209552096520975209852099521005210152102521035210452105521065210752108521095211052111521125211352114521155211652117521185211952120521215212252123521245212552126521275212852129521305213152132521335213452135521365213752138521395214052141521425214352144521455214652147521485214952150521515215252153521545215552156521575215852159521605216152162521635216452165521665216752168521695217052171521725217352174521755217652177521785217952180521815218252183521845218552186521875218852189521905219152192521935219452195521965219752198521995220052201522025220352204522055220652207522085220952210522115221252213522145221552216522175221852219522205222152222522235222452225522265222752228522295223052231522325223352234522355223652237522385223952240522415224252243522445224552246522475224852249522505225152252522535225452255522565225752258522595226052261522625226352264522655226652267522685226952270522715227252273522745227552276522775227852279522805228152282522835228452285522865228752288522895229052291522925229352294522955229652297522985229952300523015230252303523045230552306523075230852309523105231152312523135231452315523165231752318523195232052321523225232352324523255232652327523285232952330523315233252333523345233552336523375233852339523405234152342523435234452345523465234752348523495235052351523525235352354523555235652357523585235952360523615236252363523645236552366523675236852369523705237152372523735237452375523765237752378523795238052381523825238352384523855238652387523885238952390523915239252393523945239552396523975239852399524005240152402524035240452405524065240752408524095241052411524125241352414524155241652417524185241952420524215242252423524245242552426524275242852429524305243152432524335243452435524365243752438524395244052441524425244352444524455244652447524485244952450524515245252453524545245552456524575245852459524605246152462524635246452465524665246752468524695247052471524725247352474524755247652477524785247952480524815248252483524845248552486524875248852489524905249152492524935249452495524965249752498524995250052501525025250352504525055250652507525085250952510525115251252513525145251552516525175251852519525205252152522525235252452525525265252752528525295253052531525325253352534525355253652537525385253952540525415254252543525445254552546525475254852549525505255152552525535255452555525565255752558525595256052561525625256352564525655256652567525685256952570525715257252573525745257552576525775257852579525805258152582525835258452585525865258752588525895259052591525925259352594525955259652597525985259952600526015260252603526045260552606526075260852609526105261152612526135261452615526165261752618526195262052621526225262352624526255262652627526285262952630526315263252633526345263552636526375263852639526405264152642526435264452645526465264752648526495265052651526525265352654526555265652657526585265952660526615266252663526645266552666526675266852669526705267152672526735267452675526765267752678526795268052681526825268352684526855268652687526885268952690526915269252693526945269552696526975269852699527005270152702527035270452705527065270752708527095271052711527125271352714527155271652717527185271952720527215272252723527245272552726527275272852729527305273152732527335273452735527365273752738527395274052741527425274352744527455274652747527485274952750527515275252753527545275552756527575275852759527605276152762527635276452765527665276752768527695277052771527725277352774527755277652777527785277952780527815278252783527845278552786527875278852789527905279152792527935279452795527965279752798527995280052801528025280352804528055280652807528085280952810528115281252813528145281552816528175281852819528205282152822528235282452825528265282752828528295283052831528325283352834528355283652837528385283952840528415284252843528445284552846528475284852849528505285152852528535285452855528565285752858528595286052861528625286352864528655286652867528685286952870528715287252873528745287552876528775287852879528805288152882528835288452885528865288752888528895289052891528925289352894528955289652897528985289952900529015290252903529045290552906529075290852909529105291152912529135291452915529165291752918529195292052921529225292352924529255292652927529285292952930529315293252933529345293552936529375293852939529405294152942529435294452945529465294752948529495295052951529525295352954529555295652957529585295952960529615296252963529645296552966529675296852969529705297152972529735297452975529765297752978529795298052981529825298352984529855298652987529885298952990529915299252993529945299552996529975299852999530005300153002530035300453005530065300753008530095301053011530125301353014530155301653017530185301953020530215302253023530245302553026530275302853029530305303153032530335303453035530365303753038530395304053041530425304353044530455304653047530485304953050530515305253053530545305553056530575305853059530605306153062530635306453065530665306753068530695307053071530725307353074530755307653077530785307953080530815308253083530845308553086530875308853089530905309153092530935309453095530965309753098530995310053101531025310353104531055310653107531085310953110531115311253113531145311553116531175311853119531205312153122531235312453125531265312753128531295313053131531325313353134531355313653137531385313953140531415314253143531445314553146531475314853149531505315153152531535315453155531565315753158531595316053161531625316353164531655316653167531685316953170531715317253173531745317553176531775317853179531805318153182531835318453185531865318753188531895319053191531925319353194531955319653197531985319953200532015320253203532045320553206532075320853209532105321153212532135321453215532165321753218532195322053221532225322353224532255322653227532285322953230532315323253233532345323553236532375323853239532405324153242532435324453245532465324753248532495325053251532525325353254532555325653257532585325953260532615326253263532645326553266532675326853269532705327153272532735327453275532765327753278532795328053281532825328353284532855328653287532885328953290532915329253293532945329553296532975329853299533005330153302533035330453305533065330753308533095331053311533125331353314533155331653317533185331953320533215332253323533245332553326533275332853329533305333153332533335333453335533365333753338533395334053341533425334353344533455334653347533485334953350533515335253353533545335553356533575335853359533605336153362533635336453365533665336753368533695337053371533725337353374533755337653377533785337953380533815338253383533845338553386533875338853389533905339153392533935339453395533965339753398533995340053401534025340353404534055340653407534085340953410534115341253413534145341553416534175341853419534205342153422534235342453425534265342753428534295343053431534325343353434534355343653437534385343953440534415344253443534445344553446534475344853449534505345153452534535345453455534565345753458534595346053461534625346353464534655346653467534685346953470534715347253473534745347553476534775347853479534805348153482534835348453485534865348753488534895349053491534925349353494534955349653497534985349953500535015350253503535045350553506535075350853509535105351153512535135351453515535165351753518535195352053521535225352353524535255352653527535285352953530535315353253533535345353553536535375353853539535405354153542535435354453545535465354753548535495355053551535525355353554535555355653557535585355953560535615356253563535645356553566535675356853569535705357153572535735357453575535765357753578535795358053581535825358353584535855358653587535885358953590535915359253593535945359553596535975359853599536005360153602536035360453605536065360753608536095361053611536125361353614536155361653617536185361953620536215362253623536245362553626536275362853629536305363153632536335363453635536365363753638536395364053641536425364353644536455364653647536485364953650536515365253653536545365553656536575365853659536605366153662536635366453665536665366753668536695367053671536725367353674536755367653677536785367953680536815368253683536845368553686536875368853689536905369153692536935369453695536965369753698536995370053701537025370353704537055370653707537085370953710537115371253713537145371553716537175371853719537205372153722537235372453725537265372753728537295373053731537325373353734537355373653737537385373953740537415374253743537445374553746537475374853749537505375153752537535375453755537565375753758537595376053761537625376353764537655376653767537685376953770537715377253773537745377553776537775377853779537805378153782537835378453785537865378753788537895379053791537925379353794537955379653797537985379953800538015380253803538045380553806538075380853809538105381153812538135381453815538165381753818538195382053821538225382353824538255382653827538285382953830538315383253833538345383553836538375383853839538405384153842538435384453845538465384753848538495385053851538525385353854538555385653857538585385953860538615386253863538645386553866538675386853869538705387153872538735387453875538765387753878538795388053881538825388353884538855388653887538885388953890538915389253893538945389553896538975389853899539005390153902539035390453905539065390753908539095391053911539125391353914539155391653917539185391953920539215392253923539245392553926539275392853929539305393153932539335393453935539365393753938539395394053941539425394353944539455394653947539485394953950539515395253953539545395553956539575395853959539605396153962539635396453965539665396753968539695397053971539725397353974539755397653977539785397953980539815398253983539845398553986539875398853989539905399153992539935399453995539965399753998539995400054001540025400354004540055400654007540085400954010540115401254013540145401554016540175401854019540205402154022540235402454025540265402754028540295403054031540325403354034540355403654037540385403954040540415404254043540445404554046540475404854049540505405154052540535405454055540565405754058540595406054061540625406354064540655406654067540685406954070540715407254073540745407554076540775407854079540805408154082540835408454085540865408754088540895409054091540925409354094540955409654097540985409954100541015410254103541045410554106541075410854109541105411154112541135411454115541165411754118541195412054121541225412354124541255412654127541285412954130541315413254133541345413554136541375413854139541405414154142541435414454145541465414754148541495415054151541525415354154541555415654157541585415954160541615416254163541645416554166541675416854169541705417154172541735417454175541765417754178541795418054181541825418354184541855418654187541885418954190541915419254193541945419554196541975419854199542005420154202542035420454205542065420754208542095421054211542125421354214542155421654217542185421954220542215422254223542245422554226542275422854229542305423154232542335423454235542365423754238542395424054241542425424354244542455424654247542485424954250542515425254253542545425554256542575425854259542605426154262542635426454265542665426754268542695427054271542725427354274542755427654277542785427954280542815428254283542845428554286542875428854289542905429154292542935429454295542965429754298542995430054301543025430354304543055430654307543085430954310543115431254313543145431554316543175431854319543205432154322543235432454325543265432754328543295433054331543325433354334543355433654337543385433954340543415434254343543445434554346543475434854349543505435154352543535435454355543565435754358543595436054361543625436354364543655436654367543685436954370543715437254373543745437554376543775437854379543805438154382543835438454385543865438754388543895439054391543925439354394543955439654397543985439954400544015440254403544045440554406544075440854409544105441154412544135441454415544165441754418544195442054421544225442354424544255442654427544285442954430544315443254433544345443554436544375443854439544405444154442544435444454445544465444754448544495445054451544525445354454544555445654457544585445954460544615446254463544645446554466544675446854469544705447154472544735447454475544765447754478544795448054481544825448354484544855448654487544885448954490544915449254493544945449554496544975449854499545005450154502545035450454505545065450754508545095451054511545125451354514545155451654517545185451954520545215452254523545245452554526545275452854529545305453154532545335453454535545365453754538545395454054541545425454354544545455454654547545485454954550545515455254553545545455554556545575455854559545605456154562545635456454565545665456754568545695457054571545725457354574545755457654577545785457954580545815458254583545845458554586545875458854589545905459154592545935459454595545965459754598545995460054601546025460354604546055460654607546085460954610546115461254613546145461554616546175461854619546205462154622546235462454625546265462754628546295463054631546325463354634546355463654637546385463954640546415464254643546445464554646546475464854649546505465154652546535465454655546565465754658546595466054661546625466354664546655466654667546685466954670546715467254673546745467554676546775467854679546805468154682546835468454685546865468754688546895469054691546925469354694546955469654697546985469954700547015470254703547045470554706547075470854709547105471154712547135471454715547165471754718547195472054721547225472354724547255472654727547285472954730547315473254733547345473554736547375473854739547405474154742547435474454745547465474754748547495475054751547525475354754547555475654757547585475954760547615476254763547645476554766547675476854769547705477154772547735477454775547765477754778547795478054781547825478354784547855478654787547885478954790547915479254793547945479554796547975479854799548005480154802548035480454805548065480754808548095481054811548125481354814548155481654817548185481954820548215482254823548245482554826548275482854829548305483154832548335483454835548365483754838548395484054841548425484354844548455484654847548485484954850548515485254853548545485554856548575485854859548605486154862548635486454865548665486754868548695487054871548725487354874548755487654877548785487954880548815488254883548845488554886548875488854889548905489154892548935489454895548965489754898548995490054901549025490354904549055490654907549085490954910549115491254913549145491554916549175491854919549205492154922549235492454925549265492754928549295493054931549325493354934549355493654937549385493954940549415494254943549445494554946549475494854949549505495154952549535495454955549565495754958549595496054961549625496354964549655496654967549685496954970549715497254973549745497554976549775497854979549805498154982549835498454985549865498754988549895499054991549925499354994549955499654997549985499955000550015500255003550045500555006550075500855009550105501155012550135501455015550165501755018550195502055021550225502355024550255502655027550285502955030550315503255033550345503555036550375503855039550405504155042550435504455045550465504755048550495505055051550525505355054550555505655057550585505955060550615506255063550645506555066550675506855069550705507155072550735507455075550765507755078550795508055081550825508355084550855508655087550885508955090550915509255093550945509555096550975509855099551005510155102551035510455105551065510755108551095511055111551125511355114551155511655117551185511955120551215512255123551245512555126551275512855129551305513155132551335513455135551365513755138551395514055141551425514355144551455514655147551485514955150551515515255153551545515555156551575515855159551605516155162551635516455165551665516755168551695517055171551725517355174551755517655177551785517955180551815518255183551845518555186551875518855189551905519155192551935519455195551965519755198551995520055201552025520355204552055520655207552085520955210552115521255213552145521555216552175521855219552205522155222552235522455225552265522755228552295523055231552325523355234552355523655237552385523955240552415524255243552445524555246552475524855249552505525155252552535525455255552565525755258552595526055261552625526355264552655526655267552685526955270552715527255273552745527555276552775527855279552805528155282552835528455285552865528755288552895529055291552925529355294552955529655297552985529955300553015530255303553045530555306553075530855309553105531155312553135531455315553165531755318553195532055321553225532355324553255532655327553285532955330553315533255333553345533555336553375533855339553405534155342553435534455345553465534755348553495535055351553525535355354553555535655357553585535955360553615536255363553645536555366553675536855369553705537155372553735537455375553765537755378553795538055381553825538355384553855538655387553885538955390553915539255393553945539555396553975539855399554005540155402554035540455405554065540755408554095541055411554125541355414554155541655417554185541955420554215542255423554245542555426554275542855429554305543155432554335543455435554365543755438554395544055441554425544355444554455544655447554485544955450554515545255453554545545555456554575545855459554605546155462554635546455465554665546755468554695547055471554725547355474554755547655477554785547955480554815548255483554845548555486554875548855489554905549155492554935549455495554965549755498554995550055501555025550355504555055550655507555085550955510555115551255513555145551555516555175551855519555205552155522555235552455525555265552755528555295553055531555325553355534555355553655537555385553955540555415554255543555445554555546555475554855549555505555155552555535555455555555565555755558555595556055561555625556355564555655556655567555685556955570555715557255573555745557555576555775557855579555805558155582555835558455585555865558755588555895559055591555925559355594555955559655597555985559955600556015560255603556045560555606556075560855609556105561155612556135561455615556165561755618556195562055621556225562355624556255562655627556285562955630556315563255633556345563555636556375563855639556405564155642556435564455645556465564755648556495565055651556525565355654556555565655657556585565955660556615566255663556645566555666556675566855669556705567155672556735567455675556765567755678556795568055681556825568355684556855568655687556885568955690556915569255693556945569555696556975569855699557005570155702557035570455705557065570755708557095571055711557125571355714557155571655717557185571955720557215572255723557245572555726557275572855729557305573155732557335573455735557365573755738557395574055741557425574355744557455574655747557485574955750557515575255753557545575555756557575575855759557605576155762557635576455765557665576755768557695577055771557725577355774557755577655777557785577955780557815578255783557845578555786557875578855789557905579155792557935579455795557965579755798557995580055801558025580355804558055580655807558085580955810558115581255813558145581555816558175581855819558205582155822558235582455825558265582755828558295583055831558325583355834558355583655837558385583955840558415584255843558445584555846558475584855849558505585155852558535585455855558565585755858558595586055861558625586355864558655586655867558685586955870558715587255873558745587555876558775587855879558805588155882558835588455885558865588755888558895589055891558925589355894558955589655897558985589955900559015590255903559045590555906559075590855909559105591155912559135591455915559165591755918559195592055921559225592355924559255592655927559285592955930559315593255933559345593555936559375593855939559405594155942559435594455945559465594755948559495595055951559525595355954559555595655957559585595955960559615596255963559645596555966559675596855969559705597155972559735597455975559765597755978559795598055981559825598355984559855598655987559885598955990559915599255993559945599555996559975599855999560005600156002560035600456005560065600756008560095601056011560125601356014560155601656017560185601956020560215602256023560245602556026560275602856029560305603156032560335603456035560365603756038560395604056041560425604356044560455604656047560485604956050560515605256053560545605556056560575605856059560605606156062560635606456065560665606756068560695607056071560725607356074560755607656077560785607956080560815608256083560845608556086560875608856089560905609156092560935609456095560965609756098560995610056101561025610356104561055610656107561085610956110561115611256113561145611556116561175611856119561205612156122561235612456125561265612756128561295613056131561325613356134561355613656137561385613956140561415614256143561445614556146561475614856149561505615156152561535615456155561565615756158561595616056161561625616356164561655616656167561685616956170561715617256173561745617556176561775617856179561805618156182561835618456185561865618756188561895619056191561925619356194561955619656197561985619956200562015620256203562045620556206562075620856209562105621156212562135621456215562165621756218562195622056221562225622356224562255622656227562285622956230562315623256233562345623556236562375623856239562405624156242562435624456245562465624756248562495625056251562525625356254562555625656257562585625956260562615626256263562645626556266562675626856269562705627156272562735627456275562765627756278562795628056281562825628356284562855628656287562885628956290562915629256293562945629556296562975629856299563005630156302563035630456305563065630756308563095631056311563125631356314563155631656317563185631956320563215632256323563245632556326563275632856329563305633156332563335633456335563365633756338563395634056341563425634356344563455634656347563485634956350563515635256353563545635556356563575635856359563605636156362563635636456365563665636756368563695637056371563725637356374563755637656377563785637956380563815638256383563845638556386563875638856389563905639156392563935639456395563965639756398563995640056401564025640356404564055640656407564085640956410564115641256413564145641556416564175641856419564205642156422564235642456425564265642756428564295643056431564325643356434564355643656437564385643956440564415644256443564445644556446564475644856449564505645156452564535645456455564565645756458564595646056461564625646356464564655646656467564685646956470564715647256473564745647556476564775647856479564805648156482564835648456485564865648756488564895649056491564925649356494564955649656497564985649956500565015650256503565045650556506565075650856509565105651156512565135651456515565165651756518565195652056521565225652356524565255652656527565285652956530565315653256533565345653556536565375653856539565405654156542565435654456545565465654756548565495655056551565525655356554565555655656557565585655956560565615656256563565645656556566565675656856569565705657156572565735657456575565765657756578565795658056581565825658356584565855658656587565885658956590565915659256593565945659556596565975659856599566005660156602566035660456605566065660756608566095661056611566125661356614566155661656617566185661956620566215662256623566245662556626566275662856629566305663156632566335663456635566365663756638566395664056641566425664356644566455664656647566485664956650566515665256653566545665556656566575665856659566605666156662566635666456665566665666756668566695667056671566725667356674566755667656677566785667956680566815668256683566845668556686566875668856689566905669156692566935669456695566965669756698566995670056701567025670356704567055670656707567085670956710567115671256713567145671556716567175671856719567205672156722567235672456725567265672756728567295673056731567325673356734567355673656737567385673956740567415674256743567445674556746567475674856749567505675156752567535675456755567565675756758567595676056761567625676356764567655676656767567685676956770567715677256773567745677556776567775677856779567805678156782567835678456785567865678756788567895679056791567925679356794567955679656797567985679956800568015680256803568045680556806568075680856809568105681156812568135681456815568165681756818568195682056821568225682356824568255682656827568285682956830568315683256833568345683556836568375683856839568405684156842568435684456845568465684756848568495685056851568525685356854568555685656857568585685956860568615686256863568645686556866568675686856869568705687156872568735687456875568765687756878568795688056881568825688356884568855688656887568885688956890568915689256893568945689556896568975689856899569005690156902569035690456905569065690756908569095691056911569125691356914569155691656917569185691956920569215692256923569245692556926569275692856929569305693156932569335693456935569365693756938569395694056941569425694356944569455694656947569485694956950569515695256953569545695556956569575695856959569605696156962569635696456965569665696756968569695697056971569725697356974569755697656977569785697956980569815698256983569845698556986569875698856989569905699156992569935699456995569965699756998569995700057001570025700357004570055700657007570085700957010570115701257013570145701557016570175701857019570205702157022570235702457025570265702757028570295703057031570325703357034570355703657037570385703957040570415704257043570445704557046570475704857049570505705157052570535705457055570565705757058570595706057061570625706357064570655706657067570685706957070570715707257073570745707557076570775707857079570805708157082570835708457085570865708757088570895709057091570925709357094570955709657097570985709957100571015710257103571045710557106571075710857109571105711157112571135711457115571165711757118571195712057121571225712357124571255712657127571285712957130571315713257133571345713557136571375713857139571405714157142571435714457145571465714757148571495715057151571525715357154571555715657157571585715957160571615716257163571645716557166571675716857169571705717157172571735717457175571765717757178571795718057181571825718357184571855718657187571885718957190571915719257193571945719557196571975719857199572005720157202572035720457205572065720757208572095721057211572125721357214572155721657217572185721957220572215722257223572245722557226572275722857229572305723157232572335723457235572365723757238572395724057241572425724357244572455724657247572485724957250572515725257253572545725557256572575725857259572605726157262572635726457265572665726757268572695727057271572725727357274572755727657277572785727957280572815728257283572845728557286572875728857289572905729157292572935729457295572965729757298572995730057301573025730357304573055730657307573085730957310573115731257313573145731557316573175731857319573205732157322573235732457325573265732757328573295733057331573325733357334573355733657337573385733957340573415734257343573445734557346573475734857349573505735157352573535735457355573565735757358573595736057361573625736357364573655736657367573685736957370573715737257373573745737557376573775737857379573805738157382573835738457385573865738757388573895739057391573925739357394573955739657397573985739957400574015740257403574045740557406574075740857409574105741157412574135741457415574165741757418574195742057421574225742357424574255742657427574285742957430574315743257433574345743557436574375743857439574405744157442574435744457445574465744757448574495745057451574525745357454574555745657457574585745957460574615746257463574645746557466574675746857469574705747157472574735747457475574765747757478574795748057481574825748357484574855748657487574885748957490574915749257493574945749557496574975749857499575005750157502575035750457505575065750757508575095751057511575125751357514575155751657517575185751957520575215752257523575245752557526575275752857529575305753157532575335753457535575365753757538575395754057541575425754357544575455754657547575485754957550575515755257553575545755557556575575755857559575605756157562575635756457565575665756757568575695757057571575725757357574575755757657577575785757957580575815758257583575845758557586575875758857589575905759157592575935759457595575965759757598575995760057601576025760357604576055760657607576085760957610576115761257613576145761557616576175761857619576205762157622576235762457625576265762757628576295763057631576325763357634576355763657637576385763957640576415764257643576445764557646576475764857649576505765157652576535765457655576565765757658576595766057661576625766357664576655766657667576685766957670576715767257673576745767557676576775767857679576805768157682576835768457685576865768757688576895769057691576925769357694576955769657697576985769957700577015770257703577045770557706577075770857709577105771157712577135771457715577165771757718577195772057721577225772357724577255772657727577285772957730577315773257733577345773557736577375773857739577405774157742577435774457745577465774757748577495775057751577525775357754577555775657757577585775957760577615776257763577645776557766577675776857769577705777157772577735777457775577765777757778577795778057781577825778357784577855778657787577885778957790577915779257793577945779557796577975779857799578005780157802578035780457805578065780757808578095781057811578125781357814578155781657817578185781957820578215782257823578245782557826578275782857829578305783157832578335783457835578365783757838578395784057841578425784357844578455784657847578485784957850578515785257853578545785557856578575785857859578605786157862578635786457865578665786757868578695787057871578725787357874578755787657877578785787957880578815788257883578845788557886578875788857889578905789157892578935789457895578965789757898578995790057901579025790357904579055790657907579085790957910579115791257913579145791557916579175791857919579205792157922579235792457925579265792757928579295793057931579325793357934579355793657937579385793957940579415794257943579445794557946579475794857949579505795157952579535795457955579565795757958579595796057961579625796357964579655796657967579685796957970579715797257973579745797557976579775797857979579805798157982579835798457985579865798757988579895799057991579925799357994579955799657997579985799958000580015800258003580045800558006580075800858009580105801158012580135801458015580165801758018580195802058021580225802358024580255802658027580285802958030580315803258033580345803558036580375803858039580405804158042580435804458045580465804758048580495805058051580525805358054580555805658057580585805958060580615806258063580645806558066580675806858069580705807158072580735807458075580765807758078580795808058081580825808358084580855808658087580885808958090580915809258093580945809558096580975809858099581005810158102581035810458105581065810758108581095811058111581125811358114581155811658117581185811958120581215812258123581245812558126581275812858129581305813158132581335813458135581365813758138581395814058141581425814358144581455814658147581485814958150581515815258153581545815558156581575815858159581605816158162581635816458165581665816758168581695817058171581725817358174581755817658177581785817958180581815818258183581845818558186581875818858189581905819158192581935819458195581965819758198581995820058201582025820358204582055820658207582085820958210582115821258213582145821558216582175821858219582205822158222582235822458225582265822758228582295823058231582325823358234582355823658237582385823958240582415824258243582445824558246582475824858249582505825158252582535825458255582565825758258582595826058261582625826358264582655826658267582685826958270582715827258273582745827558276582775827858279582805828158282582835828458285582865828758288582895829058291582925829358294582955829658297582985829958300583015830258303583045830558306583075830858309583105831158312583135831458315583165831758318583195832058321583225832358324583255832658327583285832958330583315833258333583345833558336583375833858339583405834158342583435834458345583465834758348583495835058351583525835358354583555835658357583585835958360583615836258363583645836558366583675836858369583705837158372583735837458375583765837758378583795838058381583825838358384583855838658387583885838958390583915839258393583945839558396583975839858399584005840158402584035840458405584065840758408584095841058411584125841358414584155841658417584185841958420584215842258423584245842558426584275842858429584305843158432584335843458435584365843758438584395844058441584425844358444584455844658447584485844958450584515845258453584545845558456584575845858459584605846158462584635846458465584665846758468584695847058471584725847358474584755847658477584785847958480584815848258483584845848558486584875848858489584905849158492584935849458495584965849758498584995850058501585025850358504585055850658507585085850958510585115851258513585145851558516585175851858519585205852158522585235852458525585265852758528585295853058531585325853358534585355853658537585385853958540585415854258543585445854558546585475854858549585505855158552585535855458555585565855758558585595856058561585625856358564585655856658567585685856958570585715857258573585745857558576585775857858579585805858158582585835858458585585865858758588585895859058591585925859358594585955859658597585985859958600586015860258603586045860558606586075860858609586105861158612586135861458615586165861758618586195862058621586225862358624586255862658627586285862958630586315863258633586345863558636586375863858639586405864158642586435864458645586465864758648586495865058651586525865358654586555865658657586585865958660586615866258663586645866558666586675866858669586705867158672586735867458675586765867758678586795868058681586825868358684586855868658687586885868958690586915869258693586945869558696586975869858699587005870158702587035870458705587065870758708587095871058711587125871358714587155871658717587185871958720587215872258723587245872558726587275872858729587305873158732587335873458735587365873758738587395874058741587425874358744587455874658747587485874958750587515875258753587545875558756587575875858759587605876158762587635876458765587665876758768587695877058771587725877358774587755877658777587785877958780587815878258783587845878558786587875878858789587905879158792587935879458795587965879758798587995880058801588025880358804588055880658807588085880958810588115881258813588145881558816588175881858819588205882158822588235882458825588265882758828588295883058831588325883358834588355883658837588385883958840588415884258843588445884558846588475884858849588505885158852588535885458855588565885758858588595886058861588625886358864588655886658867588685886958870588715887258873588745887558876588775887858879588805888158882588835888458885588865888758888588895889058891588925889358894588955889658897588985889958900589015890258903589045890558906589075890858909589105891158912589135891458915589165891758918589195892058921589225892358924589255892658927589285892958930589315893258933589345893558936589375893858939589405894158942589435894458945589465894758948589495895058951589525895358954589555895658957589585895958960589615896258963589645896558966589675896858969589705897158972589735897458975589765897758978589795898058981589825898358984589855898658987589885898958990589915899258993589945899558996589975899858999590005900159002590035900459005590065900759008590095901059011590125901359014590155901659017590185901959020590215902259023590245902559026590275902859029590305903159032590335903459035590365903759038590395904059041590425904359044590455904659047590485904959050590515905259053590545905559056590575905859059590605906159062590635906459065590665906759068590695907059071590725907359074590755907659077590785907959080590815908259083590845908559086590875908859089590905909159092590935909459095590965909759098590995910059101591025910359104591055910659107591085910959110591115911259113591145911559116591175911859119591205912159122591235912459125591265912759128591295913059131591325913359134591355913659137591385913959140591415914259143591445914559146591475914859149591505915159152591535915459155591565915759158591595916059161591625916359164591655916659167591685916959170591715917259173591745917559176591775917859179591805918159182591835918459185591865918759188591895919059191591925919359194591955919659197591985919959200592015920259203592045920559206592075920859209592105921159212592135921459215592165921759218592195922059221592225922359224592255922659227592285922959230592315923259233592345923559236592375923859239592405924159242592435924459245592465924759248592495925059251592525925359254592555925659257592585925959260592615926259263592645926559266592675926859269592705927159272592735927459275592765927759278592795928059281592825928359284592855928659287592885928959290592915929259293592945929559296592975929859299593005930159302593035930459305593065930759308593095931059311593125931359314593155931659317593185931959320593215932259323593245932559326593275932859329593305933159332593335933459335593365933759338593395934059341593425934359344593455934659347593485934959350593515935259353593545935559356593575935859359593605936159362593635936459365593665936759368593695937059371593725937359374593755937659377593785937959380593815938259383593845938559386593875938859389593905939159392593935939459395593965939759398593995940059401594025940359404594055940659407594085940959410594115941259413594145941559416594175941859419594205942159422594235942459425594265942759428594295943059431594325943359434594355943659437594385943959440594415944259443594445944559446594475944859449594505945159452594535945459455594565945759458594595946059461594625946359464594655946659467594685946959470594715947259473594745947559476594775947859479594805948159482594835948459485594865948759488594895949059491594925949359494594955949659497594985949959500595015950259503595045950559506595075950859509595105951159512595135951459515595165951759518595195952059521595225952359524595255952659527595285952959530595315953259533595345953559536595375953859539595405954159542595435954459545595465954759548595495955059551595525955359554595555955659557595585955959560595615956259563595645956559566595675956859569595705957159572595735957459575595765957759578595795958059581595825958359584595855958659587595885958959590595915959259593595945959559596595975959859599596005960159602596035960459605596065960759608596095961059611596125961359614596155961659617596185961959620596215962259623596245962559626596275962859629596305963159632596335963459635596365963759638596395964059641596425964359644596455964659647596485964959650596515965259653596545965559656596575965859659596605966159662596635966459665596665966759668596695967059671596725967359674596755967659677596785967959680596815968259683596845968559686596875968859689596905969159692596935969459695596965969759698596995970059701597025970359704597055970659707597085970959710597115971259713597145971559716597175971859719597205972159722597235972459725597265972759728597295973059731597325973359734597355973659737597385973959740597415974259743597445974559746597475974859749597505975159752597535975459755597565975759758597595976059761597625976359764597655976659767597685976959770597715977259773597745977559776597775977859779597805978159782597835978459785597865978759788597895979059791597925979359794597955979659797597985979959800598015980259803598045980559806598075980859809598105981159812598135981459815598165981759818598195982059821598225982359824598255982659827598285982959830598315983259833598345983559836598375983859839598405984159842598435984459845598465984759848598495985059851598525985359854598555985659857598585985959860598615986259863598645986559866598675986859869598705987159872598735987459875598765987759878598795988059881598825988359884598855988659887598885988959890598915989259893598945989559896598975989859899599005990159902599035990459905599065990759908599095991059911599125991359914599155991659917599185991959920599215992259923599245992559926599275992859929599305993159932599335993459935599365993759938599395994059941599425994359944599455994659947599485994959950599515995259953599545995559956599575995859959599605996159962599635996459965599665996759968599695997059971599725997359974599755997659977599785997959980599815998259983599845998559986599875998859989599905999159992599935999459995599965999759998599996000060001600026000360004600056000660007600086000960010600116001260013600146001560016600176001860019600206002160022600236002460025600266002760028600296003060031600326003360034600356003660037600386003960040600416004260043600446004560046600476004860049600506005160052600536005460055600566005760058600596006060061600626006360064600656006660067600686006960070600716007260073600746007560076600776007860079600806008160082600836008460085600866008760088600896009060091600926009360094600956009660097600986009960100601016010260103601046010560106601076010860109601106011160112601136011460115601166011760118601196012060121601226012360124601256012660127601286012960130601316013260133601346013560136601376013860139601406014160142601436014460145601466014760148601496015060151601526015360154601556015660157601586015960160601616016260163601646016560166601676016860169601706017160172601736017460175601766017760178601796018060181601826018360184601856018660187601886018960190601916019260193601946019560196601976019860199602006020160202602036020460205602066020760208602096021060211602126021360214602156021660217602186021960220602216022260223602246022560226602276022860229602306023160232602336023460235602366023760238602396024060241602426024360244602456024660247602486024960250602516025260253602546025560256602576025860259602606026160262602636026460265602666026760268602696027060271602726027360274602756027660277602786027960280602816028260283602846028560286602876028860289602906029160292602936029460295602966029760298602996030060301603026030360304603056030660307603086030960310603116031260313603146031560316603176031860319603206032160322603236032460325603266032760328603296033060331603326033360334603356033660337603386033960340603416034260343603446034560346603476034860349603506035160352603536035460355603566035760358603596036060361603626036360364603656036660367603686036960370603716037260373603746037560376603776037860379603806038160382603836038460385603866038760388603896039060391603926039360394603956039660397603986039960400604016040260403604046040560406604076040860409604106041160412604136041460415604166041760418604196042060421604226042360424604256042660427604286042960430604316043260433604346043560436604376043860439604406044160442604436044460445604466044760448604496045060451604526045360454604556045660457604586045960460604616046260463604646046560466604676046860469604706047160472604736047460475604766047760478604796048060481604826048360484604856048660487604886048960490604916049260493604946049560496604976049860499605006050160502605036050460505605066050760508605096051060511605126051360514605156051660517605186051960520605216052260523605246052560526605276052860529605306053160532605336053460535605366053760538605396054060541605426054360544605456054660547605486054960550605516055260553605546055560556605576055860559605606056160562605636056460565605666056760568605696057060571605726057360574605756057660577605786057960580605816058260583605846058560586605876058860589605906059160592605936059460595605966059760598605996060060601606026060360604606056060660607606086060960610606116061260613606146061560616606176061860619606206062160622606236062460625606266062760628606296063060631606326063360634606356063660637606386063960640606416064260643606446064560646606476064860649606506065160652606536065460655606566065760658606596066060661606626066360664606656066660667606686066960670606716067260673606746067560676606776067860679606806068160682606836068460685606866068760688606896069060691606926069360694606956069660697606986069960700607016070260703607046070560706607076070860709607106071160712607136071460715607166071760718607196072060721607226072360724607256072660727607286072960730607316073260733607346073560736607376073860739607406074160742607436074460745607466074760748607496075060751607526075360754607556075660757607586075960760607616076260763607646076560766607676076860769607706077160772607736077460775607766077760778607796078060781607826078360784607856078660787607886078960790607916079260793607946079560796607976079860799608006080160802608036080460805608066080760808608096081060811608126081360814608156081660817608186081960820608216082260823608246082560826608276082860829608306083160832608336083460835608366083760838608396084060841608426084360844608456084660847608486084960850608516085260853608546085560856608576085860859608606086160862608636086460865608666086760868608696087060871608726087360874608756087660877608786087960880608816088260883608846088560886608876088860889608906089160892608936089460895608966089760898608996090060901609026090360904609056090660907609086090960910609116091260913609146091560916609176091860919609206092160922609236092460925609266092760928609296093060931609326093360934609356093660937609386093960940609416094260943609446094560946609476094860949609506095160952609536095460955609566095760958609596096060961609626096360964609656096660967609686096960970609716097260973609746097560976609776097860979609806098160982609836098460985609866098760988609896099060991609926099360994609956099660997609986099961000610016100261003610046100561006610076100861009610106101161012610136101461015610166101761018610196102061021610226102361024610256102661027610286102961030610316103261033610346103561036610376103861039610406104161042610436104461045610466104761048610496105061051610526105361054610556105661057610586105961060610616106261063610646106561066610676106861069610706107161072610736107461075610766107761078610796108061081610826108361084610856108661087610886108961090610916109261093610946109561096610976109861099611006110161102611036110461105611066110761108611096111061111611126111361114611156111661117611186111961120611216112261123611246112561126611276112861129611306113161132611336113461135611366113761138611396114061141611426114361144611456114661147611486114961150611516115261153611546115561156611576115861159611606116161162611636116461165611666116761168611696117061171611726117361174611756117661177611786117961180611816118261183611846118561186611876118861189611906119161192611936119461195611966119761198611996120061201612026120361204612056120661207612086120961210612116121261213612146121561216612176121861219612206122161222612236122461225612266122761228612296123061231612326123361234612356123661237612386123961240612416124261243612446124561246612476124861249612506125161252612536125461255612566125761258612596126061261612626126361264612656126661267612686126961270612716127261273612746127561276612776127861279612806128161282612836128461285612866128761288612896129061291612926129361294612956129661297612986129961300613016130261303613046130561306613076130861309613106131161312613136131461315613166131761318613196132061321613226132361324613256132661327613286132961330613316133261333613346133561336613376133861339613406134161342613436134461345613466134761348613496135061351613526135361354613556135661357613586135961360613616136261363613646136561366613676136861369613706137161372613736137461375613766137761378613796138061381613826138361384613856138661387613886138961390613916139261393613946139561396613976139861399614006140161402614036140461405614066140761408614096141061411614126141361414614156141661417614186141961420614216142261423614246142561426614276142861429614306143161432614336143461435614366143761438614396144061441614426144361444614456144661447614486144961450614516145261453614546145561456614576145861459614606146161462614636146461465614666146761468614696147061471614726147361474614756147661477614786147961480614816148261483614846148561486614876148861489614906149161492614936149461495614966149761498614996150061501615026150361504615056150661507615086150961510615116151261513615146151561516615176151861519615206152161522615236152461525615266152761528615296153061531615326153361534615356153661537615386153961540615416154261543615446154561546615476154861549615506155161552615536155461555615566155761558615596156061561615626156361564615656156661567615686156961570615716157261573615746157561576615776157861579615806158161582615836158461585615866158761588615896159061591615926159361594615956159661597615986159961600616016160261603616046160561606616076160861609616106161161612616136161461615616166161761618616196162061621616226162361624616256162661627616286162961630616316163261633616346163561636616376163861639616406164161642616436164461645616466164761648616496165061651616526165361654616556165661657616586165961660616616166261663616646166561666616676166861669616706167161672616736167461675616766167761678616796168061681616826168361684616856168661687616886168961690616916169261693616946169561696616976169861699617006170161702617036170461705617066170761708617096171061711617126171361714617156171661717617186171961720617216172261723617246172561726617276172861729617306173161732617336173461735617366173761738617396174061741617426174361744617456174661747617486174961750617516175261753617546175561756617576175861759617606176161762617636176461765617666176761768617696177061771617726177361774617756177661777617786177961780617816178261783617846178561786617876178861789617906179161792617936179461795617966179761798617996180061801618026180361804618056180661807618086180961810618116181261813618146181561816618176181861819618206182161822618236182461825618266182761828618296183061831618326183361834618356183661837618386183961840618416184261843618446184561846618476184861849618506185161852618536185461855618566185761858618596186061861618626186361864618656186661867618686186961870618716187261873618746187561876618776187861879618806188161882618836188461885618866188761888618896189061891618926189361894618956189661897618986189961900619016190261903619046190561906619076190861909619106191161912619136191461915619166191761918619196192061921619226192361924619256192661927619286192961930619316193261933619346193561936619376193861939619406194161942619436194461945619466194761948619496195061951619526195361954619556195661957619586195961960619616196261963619646196561966619676196861969619706197161972619736197461975619766197761978619796198061981619826198361984619856198661987619886198961990619916199261993619946199561996619976199861999620006200162002620036200462005620066200762008620096201062011620126201362014620156201662017620186201962020620216202262023620246202562026620276202862029620306203162032620336203462035620366203762038620396204062041620426204362044620456204662047620486204962050620516205262053620546205562056620576205862059620606206162062620636206462065620666206762068620696207062071620726207362074620756207662077620786207962080620816208262083620846208562086620876208862089620906209162092620936209462095620966209762098620996210062101621026210362104621056210662107621086210962110621116211262113621146211562116621176211862119621206212162122621236212462125621266212762128621296213062131621326213362134621356213662137621386213962140621416214262143621446214562146621476214862149621506215162152621536215462155621566215762158621596216062161621626216362164621656216662167621686216962170621716217262173621746217562176621776217862179621806218162182621836218462185621866218762188621896219062191621926219362194621956219662197621986219962200622016220262203622046220562206622076220862209622106221162212622136221462215622166221762218622196222062221622226222362224622256222662227622286222962230622316223262233622346223562236622376223862239622406224162242622436224462245622466224762248622496225062251622526225362254622556225662257622586225962260622616226262263622646226562266622676226862269622706227162272622736227462275622766227762278622796228062281622826228362284622856228662287622886228962290622916229262293622946229562296622976229862299623006230162302623036230462305623066230762308623096231062311623126231362314623156231662317623186231962320623216232262323623246232562326623276232862329623306233162332623336233462335623366233762338623396234062341623426234362344623456234662347623486234962350623516235262353623546235562356623576235862359623606236162362623636236462365623666236762368623696237062371623726237362374623756237662377623786237962380623816238262383623846238562386623876238862389623906239162392623936239462395623966239762398623996240062401624026240362404624056240662407624086240962410624116241262413624146241562416624176241862419624206242162422624236242462425624266242762428624296243062431624326243362434624356243662437624386243962440624416244262443624446244562446624476244862449624506245162452624536245462455624566245762458624596246062461624626246362464624656246662467624686246962470624716247262473624746247562476624776247862479624806248162482624836248462485624866248762488624896249062491624926249362494624956249662497624986249962500625016250262503625046250562506625076250862509625106251162512625136251462515625166251762518625196252062521625226252362524625256252662527625286252962530625316253262533625346253562536625376253862539625406254162542625436254462545625466254762548625496255062551625526255362554625556255662557625586255962560625616256262563625646256562566625676256862569625706257162572625736257462575625766257762578625796258062581625826258362584625856258662587625886258962590625916259262593625946259562596625976259862599626006260162602626036260462605626066260762608626096261062611626126261362614626156261662617626186261962620 |
- var Aag = Object.defineProperty;
- var J6 = (t) => {
- throw TypeError(t);
- };
- var sag = (t, I, g) => I in t ? Aag(t, I, { enumerable: !0, configurable: !0, writable: !0, value: g }) : t[I] = g;
- var iI = (t, I, g) => sag(t, typeof I != "symbol" ? I + "" : I, g), KH = (t, I, g) => I.has(t) || J6("Cannot " + g);
- var M = (t, I, g) => (KH(t, I, "read from private field"), g ? g.call(t) : I.get(t)), tg = (t, I, g) => I.has(t) ? J6("Cannot add the same private member more than once") : I instanceof WeakSet ? I.add(t) : I.set(t, g), $ = (t, I, g, C) => (KH(t, I, "write to private field"), C ? C.call(t, g) : I.set(t, g), g), ig = (t, I, g) => (KH(t, I, "access private method"), g);
- var Wi = (t, I, g, C) => ({
- set _(i) {
- $(t, I, i, g);
- },
- get _() {
- return M(t, I, C);
- }
- });
- import { ref as wi, onMounted as tG, createElementBlock as Pg, openBlock as Ug, createElementVNode as tC, normalizeStyle as Ae, Fragment as ct, renderList as vi, createApp as iG, computed as DA, onBeforeUnmount as s9, renderSlot as d$, createCommentVNode as Yt, withModifiers as ah, toDisplayString as um, defineComponent as r$, h as yI, unref as Dg, createBlock as h$, watch as b$, resolveComponent as lag, createTextVNode as nag, createVNode as aag, withCtx as oag, nextTick as cag, withDirectives as SY, vShow as DY } from "vue";
- var JI = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
- function u$(t) {
- return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t;
- }
- function Qa(t) {
- throw new Error('Could not dynamically require "' + t + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
- }
- var FH = { exports: {} };
- /*!
- JSZip v3.10.1 - A JavaScript class for generating and reading zip files
- <http://stuartk.com/jszip>
- (c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>
- Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.
- JSZip uses the library pako released under the MIT license :
- https://github.com/nodeca/pako/blob/main/LICENSE
- */
- var L6;
- function dag() {
- return L6 || (L6 = 1, function(t, I) {
- (function(g) {
- t.exports = g();
- })(function() {
- return function g(C, i, e) {
- function A(n, a) {
- if (!i[n]) {
- if (!C[n]) {
- var d = typeof Qa == "function" && Qa;
- if (!a && d) return d(n, !0);
- if (s) return s(n, !0);
- var o = new Error("Cannot find module '" + n + "'");
- throw o.code = "MODULE_NOT_FOUND", o;
- }
- var c = i[n] = { exports: {} };
- C[n][0].call(c.exports, function(r) {
- var h = C[n][1][r];
- return A(h || r);
- }, c, c.exports, g, C, i, e);
- }
- return i[n].exports;
- }
- for (var s = typeof Qa == "function" && Qa, l = 0; l < e.length; l++) A(e[l]);
- return A;
- }({ 1: [function(g, C, i) {
- var e = g("./utils"), A = g("./support"), s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- i.encode = function(l) {
- for (var n, a, d, o, c, r, h, b = [], u = 0, m = l.length, Z = m, p = e.getTypeOf(l) !== "string"; u < l.length; ) Z = m - u, d = p ? (n = l[u++], a = u < m ? l[u++] : 0, u < m ? l[u++] : 0) : (n = l.charCodeAt(u++), a = u < m ? l.charCodeAt(u++) : 0, u < m ? l.charCodeAt(u++) : 0), o = n >> 2, c = (3 & n) << 4 | a >> 4, r = 1 < Z ? (15 & a) << 2 | d >> 6 : 64, h = 2 < Z ? 63 & d : 64, b.push(s.charAt(o) + s.charAt(c) + s.charAt(r) + s.charAt(h));
- return b.join("");
- }, i.decode = function(l) {
- var n, a, d, o, c, r, h = 0, b = 0, u = "data:";
- if (l.substr(0, u.length) === u) throw new Error("Invalid base64 input, it looks like a data url.");
- var m, Z = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
- if (l.charAt(l.length - 1) === s.charAt(64) && Z--, l.charAt(l.length - 2) === s.charAt(64) && Z--, Z % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
- for (m = A.uint8array ? new Uint8Array(0 | Z) : new Array(0 | Z); h < l.length; ) n = s.indexOf(l.charAt(h++)) << 2 | (o = s.indexOf(l.charAt(h++))) >> 4, a = (15 & o) << 4 | (c = s.indexOf(l.charAt(h++))) >> 2, d = (3 & c) << 6 | (r = s.indexOf(l.charAt(h++))), m[b++] = n, c !== 64 && (m[b++] = a), r !== 64 && (m[b++] = d);
- return m;
- };
- }, { "./support": 30, "./utils": 32 }], 2: [function(g, C, i) {
- var e = g("./external"), A = g("./stream/DataWorker"), s = g("./stream/Crc32Probe"), l = g("./stream/DataLengthProbe");
- function n(a, d, o, c, r) {
- this.compressedSize = a, this.uncompressedSize = d, this.crc32 = o, this.compression = c, this.compressedContent = r;
- }
- n.prototype = { getContentWorker: function() {
- var a = new A(e.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l("data_length")), d = this;
- return a.on("end", function() {
- if (this.streamInfo.data_length !== d.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
- }), a;
- }, getCompressedWorker: function() {
- return new A(e.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
- } }, n.createWorkerFrom = function(a, d, o) {
- return a.pipe(new s()).pipe(new l("uncompressedSize")).pipe(d.compressWorker(o)).pipe(new l("compressedSize")).withStreamInfo("compression", d);
- }, C.exports = n;
- }, { "./external": 6, "./stream/Crc32Probe": 25, "./stream/DataLengthProbe": 26, "./stream/DataWorker": 27 }], 3: [function(g, C, i) {
- var e = g("./stream/GenericWorker");
- i.STORE = { magic: "\0\0", compressWorker: function() {
- return new e("STORE compression");
- }, uncompressWorker: function() {
- return new e("STORE decompression");
- } }, i.DEFLATE = g("./flate");
- }, { "./flate": 7, "./stream/GenericWorker": 28 }], 4: [function(g, C, i) {
- var e = g("./utils"), A = function() {
- for (var s, l = [], n = 0; n < 256; n++) {
- s = n;
- for (var a = 0; a < 8; a++) s = 1 & s ? 3988292384 ^ s >>> 1 : s >>> 1;
- l[n] = s;
- }
- return l;
- }();
- C.exports = function(s, l) {
- return s !== void 0 && s.length ? e.getTypeOf(s) !== "string" ? function(n, a, d, o) {
- var c = A, r = o + d;
- n ^= -1;
- for (var h = o; h < r; h++) n = n >>> 8 ^ c[255 & (n ^ a[h])];
- return -1 ^ n;
- }(0 | l, s, s.length, 0) : function(n, a, d, o) {
- var c = A, r = o + d;
- n ^= -1;
- for (var h = o; h < r; h++) n = n >>> 8 ^ c[255 & (n ^ a.charCodeAt(h))];
- return -1 ^ n;
- }(0 | l, s, s.length, 0) : 0;
- };
- }, { "./utils": 32 }], 5: [function(g, C, i) {
- i.base64 = !1, i.binary = !1, i.dir = !1, i.createFolders = !0, i.date = null, i.compression = null, i.compressionOptions = null, i.comment = null, i.unixPermissions = null, i.dosPermissions = null;
- }, {}], 6: [function(g, C, i) {
- var e = null;
- e = typeof Promise < "u" ? Promise : g("lie"), C.exports = { Promise: e };
- }, { lie: 37 }], 7: [function(g, C, i) {
- var e = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", A = g("pako"), s = g("./utils"), l = g("./stream/GenericWorker"), n = e ? "uint8array" : "array";
- function a(d, o) {
- l.call(this, "FlateWorker/" + d), this._pako = null, this._pakoAction = d, this._pakoOptions = o, this.meta = {};
- }
- i.magic = "\b\0", s.inherits(a, l), a.prototype.processChunk = function(d) {
- this.meta = d.meta, this._pako === null && this._createPako(), this._pako.push(s.transformTo(n, d.data), !1);
- }, a.prototype.flush = function() {
- l.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
- }, a.prototype.cleanUp = function() {
- l.prototype.cleanUp.call(this), this._pako = null;
- }, a.prototype._createPako = function() {
- this._pako = new A[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
- var d = this;
- this._pako.onData = function(o) {
- d.push({ data: o, meta: d.meta });
- };
- }, i.compressWorker = function(d) {
- return new a("Deflate", d);
- }, i.uncompressWorker = function() {
- return new a("Inflate", {});
- };
- }, { "./stream/GenericWorker": 28, "./utils": 32, pako: 38 }], 8: [function(g, C, i) {
- function e(c, r) {
- var h, b = "";
- for (h = 0; h < r; h++) b += String.fromCharCode(255 & c), c >>>= 8;
- return b;
- }
- function A(c, r, h, b, u, m) {
- var Z, p, Y = c.file, R = c.compression, X = m !== n.utf8encode, H = s.transformTo("string", m(Y.name)), S = s.transformTo("string", n.utf8encode(Y.name)), z = Y.comment, v = s.transformTo("string", m(z)), K = s.transformTo("string", n.utf8encode(z)), V = S.length !== Y.name.length, N = K.length !== z.length, B = "", G = "", w = "", W = Y.dir, y = Y.date, f = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
- r && !h || (f.crc32 = c.crc32, f.compressedSize = c.compressedSize, f.uncompressedSize = c.uncompressedSize);
- var D = 0;
- r && (D |= 8), X || !V && !N || (D |= 2048);
- var F = 0, T = 0;
- W && (F |= 16), u === "UNIX" ? (T = 798, F |= function(P, L) {
- var E = P;
- return P || (E = L ? 16893 : 33204), (65535 & E) << 16;
- }(Y.unixPermissions, W)) : (T = 20, F |= function(P) {
- return 63 & (P || 0);
- }(Y.dosPermissions)), Z = y.getUTCHours(), Z <<= 6, Z |= y.getUTCMinutes(), Z <<= 5, Z |= y.getUTCSeconds() / 2, p = y.getUTCFullYear() - 1980, p <<= 4, p |= y.getUTCMonth() + 1, p <<= 5, p |= y.getUTCDate(), V && (G = e(1, 1) + e(a(H), 4) + S, B += "up" + e(G.length, 2) + G), N && (w = e(1, 1) + e(a(v), 4) + K, B += "uc" + e(w.length, 2) + w);
- var Q = "";
- return Q += `
- \0`, Q += e(D, 2), Q += R.magic, Q += e(Z, 2), Q += e(p, 2), Q += e(f.crc32, 4), Q += e(f.compressedSize, 4), Q += e(f.uncompressedSize, 4), Q += e(H.length, 2), Q += e(B.length, 2), { fileRecord: d.LOCAL_FILE_HEADER + Q + H + B, dirRecord: d.CENTRAL_FILE_HEADER + e(T, 2) + Q + e(v.length, 2) + "\0\0\0\0" + e(F, 4) + e(b, 4) + H + B + v };
- }
- var s = g("../utils"), l = g("../stream/GenericWorker"), n = g("../utf8"), a = g("../crc32"), d = g("../signature");
- function o(c, r, h, b) {
- l.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = r, this.zipPlatform = h, this.encodeFileName = b, this.streamFiles = c, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
- }
- s.inherits(o, l), o.prototype.push = function(c) {
- var r = c.meta.percent || 0, h = this.entriesCount, b = this._sources.length;
- this.accumulate ? this.contentBuffer.push(c) : (this.bytesWritten += c.data.length, l.prototype.push.call(this, { data: c.data, meta: { currentFile: this.currentFile, percent: h ? (r + 100 * (h - b - 1)) / h : 100 } }));
- }, o.prototype.openedSource = function(c) {
- this.currentSourceOffset = this.bytesWritten, this.currentFile = c.file.name;
- var r = this.streamFiles && !c.file.dir;
- if (r) {
- var h = A(c, r, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
- this.push({ data: h.fileRecord, meta: { percent: 0 } });
- } else this.accumulate = !0;
- }, o.prototype.closedSource = function(c) {
- this.accumulate = !1;
- var r = this.streamFiles && !c.file.dir, h = A(c, r, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
- if (this.dirRecords.push(h.dirRecord), r) this.push({ data: function(b) {
- return d.DATA_DESCRIPTOR + e(b.crc32, 4) + e(b.compressedSize, 4) + e(b.uncompressedSize, 4);
- }(c), meta: { percent: 100 } });
- else for (this.push({ data: h.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
- this.currentFile = null;
- }, o.prototype.flush = function() {
- for (var c = this.bytesWritten, r = 0; r < this.dirRecords.length; r++) this.push({ data: this.dirRecords[r], meta: { percent: 100 } });
- var h = this.bytesWritten - c, b = function(u, m, Z, p, Y) {
- var R = s.transformTo("string", Y(p));
- return d.CENTRAL_DIRECTORY_END + "\0\0\0\0" + e(u, 2) + e(u, 2) + e(m, 4) + e(Z, 4) + e(R.length, 2) + R;
- }(this.dirRecords.length, h, c, this.zipComment, this.encodeFileName);
- this.push({ data: b, meta: { percent: 100 } });
- }, o.prototype.prepareNextSource = function() {
- this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
- }, o.prototype.registerPrevious = function(c) {
- this._sources.push(c);
- var r = this;
- return c.on("data", function(h) {
- r.processChunk(h);
- }), c.on("end", function() {
- r.closedSource(r.previous.streamInfo), r._sources.length ? r.prepareNextSource() : r.end();
- }), c.on("error", function(h) {
- r.error(h);
- }), this;
- }, o.prototype.resume = function() {
- return !!l.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
- }, o.prototype.error = function(c) {
- var r = this._sources;
- if (!l.prototype.error.call(this, c)) return !1;
- for (var h = 0; h < r.length; h++) try {
- r[h].error(c);
- } catch {
- }
- return !0;
- }, o.prototype.lock = function() {
- l.prototype.lock.call(this);
- for (var c = this._sources, r = 0; r < c.length; r++) c[r].lock();
- }, C.exports = o;
- }, { "../crc32": 4, "../signature": 23, "../stream/GenericWorker": 28, "../utf8": 31, "../utils": 32 }], 9: [function(g, C, i) {
- var e = g("../compressions"), A = g("./ZipFileWorker");
- i.generateWorker = function(s, l, n) {
- var a = new A(l.streamFiles, n, l.platform, l.encodeFileName), d = 0;
- try {
- s.forEach(function(o, c) {
- d++;
- var r = function(m, Z) {
- var p = m || Z, Y = e[p];
- if (!Y) throw new Error(p + " is not a valid compression method !");
- return Y;
- }(c.options.compression, l.compression), h = c.options.compressionOptions || l.compressionOptions || {}, b = c.dir, u = c.date;
- c._compressWorker(r, h).withStreamInfo("file", { name: o, dir: b, date: u, comment: c.comment || "", unixPermissions: c.unixPermissions, dosPermissions: c.dosPermissions }).pipe(a);
- }), a.entriesCount = d;
- } catch (o) {
- a.error(o);
- }
- return a;
- };
- }, { "../compressions": 3, "./ZipFileWorker": 8 }], 10: [function(g, C, i) {
- function e() {
- if (!(this instanceof e)) return new e();
- if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
- this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
- var A = new e();
- for (var s in this) typeof this[s] != "function" && (A[s] = this[s]);
- return A;
- };
- }
- (e.prototype = g("./object")).loadAsync = g("./load"), e.support = g("./support"), e.defaults = g("./defaults"), e.version = "3.10.1", e.loadAsync = function(A, s) {
- return new e().loadAsync(A, s);
- }, e.external = g("./external"), C.exports = e;
- }, { "./defaults": 5, "./external": 6, "./load": 11, "./object": 15, "./support": 30 }], 11: [function(g, C, i) {
- var e = g("./utils"), A = g("./external"), s = g("./utf8"), l = g("./zipEntries"), n = g("./stream/Crc32Probe"), a = g("./nodejsUtils");
- function d(o) {
- return new A.Promise(function(c, r) {
- var h = o.decompressed.getContentWorker().pipe(new n());
- h.on("error", function(b) {
- r(b);
- }).on("end", function() {
- h.streamInfo.crc32 !== o.decompressed.crc32 ? r(new Error("Corrupted zip : CRC32 mismatch")) : c();
- }).resume();
- });
- }
- C.exports = function(o, c) {
- var r = this;
- return c = e.extend(c || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: s.utf8decode }), a.isNode && a.isStream(o) ? A.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : e.prepareContent("the loaded zip file", o, !0, c.optimizedBinaryString, c.base64).then(function(h) {
- var b = new l(c);
- return b.load(h), b;
- }).then(function(h) {
- var b = [A.Promise.resolve(h)], u = h.files;
- if (c.checkCRC32) for (var m = 0; m < u.length; m++) b.push(d(u[m]));
- return A.Promise.all(b);
- }).then(function(h) {
- for (var b = h.shift(), u = b.files, m = 0; m < u.length; m++) {
- var Z = u[m], p = Z.fileNameStr, Y = e.resolve(Z.fileNameStr);
- r.file(Y, Z.decompressed, { binary: !0, optimizedBinaryString: !0, date: Z.date, dir: Z.dir, comment: Z.fileCommentStr.length ? Z.fileCommentStr : null, unixPermissions: Z.unixPermissions, dosPermissions: Z.dosPermissions, createFolders: c.createFolders }), Z.dir || (r.file(Y).unsafeOriginalName = p);
- }
- return b.zipComment.length && (r.comment = b.zipComment), r;
- });
- };
- }, { "./external": 6, "./nodejsUtils": 14, "./stream/Crc32Probe": 25, "./utf8": 31, "./utils": 32, "./zipEntries": 33 }], 12: [function(g, C, i) {
- var e = g("../utils"), A = g("../stream/GenericWorker");
- function s(l, n) {
- A.call(this, "Nodejs stream input adapter for " + l), this._upstreamEnded = !1, this._bindStream(n);
- }
- e.inherits(s, A), s.prototype._bindStream = function(l) {
- var n = this;
- (this._stream = l).pause(), l.on("data", function(a) {
- n.push({ data: a, meta: { percent: 0 } });
- }).on("error", function(a) {
- n.isPaused ? this.generatedError = a : n.error(a);
- }).on("end", function() {
- n.isPaused ? n._upstreamEnded = !0 : n.end();
- });
- }, s.prototype.pause = function() {
- return !!A.prototype.pause.call(this) && (this._stream.pause(), !0);
- }, s.prototype.resume = function() {
- return !!A.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
- }, C.exports = s;
- }, { "../stream/GenericWorker": 28, "../utils": 32 }], 13: [function(g, C, i) {
- var e = g("readable-stream").Readable;
- function A(s, l, n) {
- e.call(this, l), this._helper = s;
- var a = this;
- s.on("data", function(d, o) {
- a.push(d) || a._helper.pause(), n && n(o);
- }).on("error", function(d) {
- a.emit("error", d);
- }).on("end", function() {
- a.push(null);
- });
- }
- g("../utils").inherits(A, e), A.prototype._read = function() {
- this._helper.resume();
- }, C.exports = A;
- }, { "../utils": 32, "readable-stream": 16 }], 14: [function(g, C, i) {
- C.exports = { isNode: typeof Buffer < "u", newBufferFrom: function(e, A) {
- if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(e, A);
- if (typeof e == "number") throw new Error('The "data" argument must not be a number');
- return new Buffer(e, A);
- }, allocBuffer: function(e) {
- if (Buffer.alloc) return Buffer.alloc(e);
- var A = new Buffer(e);
- return A.fill(0), A;
- }, isBuffer: function(e) {
- return Buffer.isBuffer(e);
- }, isStream: function(e) {
- return e && typeof e.on == "function" && typeof e.pause == "function" && typeof e.resume == "function";
- } };
- }, {}], 15: [function(g, C, i) {
- function e(Y, R, X) {
- var H, S = s.getTypeOf(R), z = s.extend(X || {}, a);
- z.date = z.date || /* @__PURE__ */ new Date(), z.compression !== null && (z.compression = z.compression.toUpperCase()), typeof z.unixPermissions == "string" && (z.unixPermissions = parseInt(z.unixPermissions, 8)), z.unixPermissions && 16384 & z.unixPermissions && (z.dir = !0), z.dosPermissions && 16 & z.dosPermissions && (z.dir = !0), z.dir && (Y = u(Y)), z.createFolders && (H = b(Y)) && m.call(this, H, !0);
- var v = S === "string" && z.binary === !1 && z.base64 === !1;
- X && X.binary !== void 0 || (z.binary = !v), (R instanceof d && R.uncompressedSize === 0 || z.dir || !R || R.length === 0) && (z.base64 = !1, z.binary = !0, R = "", z.compression = "STORE", S = "string");
- var K = null;
- K = R instanceof d || R instanceof l ? R : r.isNode && r.isStream(R) ? new h(Y, R) : s.prepareContent(Y, R, z.binary, z.optimizedBinaryString, z.base64);
- var V = new o(Y, K, z);
- this.files[Y] = V;
- }
- var A = g("./utf8"), s = g("./utils"), l = g("./stream/GenericWorker"), n = g("./stream/StreamHelper"), a = g("./defaults"), d = g("./compressedObject"), o = g("./zipObject"), c = g("./generate"), r = g("./nodejsUtils"), h = g("./nodejs/NodejsStreamInputAdapter"), b = function(Y) {
- Y.slice(-1) === "/" && (Y = Y.substring(0, Y.length - 1));
- var R = Y.lastIndexOf("/");
- return 0 < R ? Y.substring(0, R) : "";
- }, u = function(Y) {
- return Y.slice(-1) !== "/" && (Y += "/"), Y;
- }, m = function(Y, R) {
- return R = R !== void 0 ? R : a.createFolders, Y = u(Y), this.files[Y] || e.call(this, Y, null, { dir: !0, createFolders: R }), this.files[Y];
- };
- function Z(Y) {
- return Object.prototype.toString.call(Y) === "[object RegExp]";
- }
- var p = { load: function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, forEach: function(Y) {
- var R, X, H;
- for (R in this.files) H = this.files[R], (X = R.slice(this.root.length, R.length)) && R.slice(0, this.root.length) === this.root && Y(X, H);
- }, filter: function(Y) {
- var R = [];
- return this.forEach(function(X, H) {
- Y(X, H) && R.push(H);
- }), R;
- }, file: function(Y, R, X) {
- if (arguments.length !== 1) return Y = this.root + Y, e.call(this, Y, R, X), this;
- if (Z(Y)) {
- var H = Y;
- return this.filter(function(z, v) {
- return !v.dir && H.test(z);
- });
- }
- var S = this.files[this.root + Y];
- return S && !S.dir ? S : null;
- }, folder: function(Y) {
- if (!Y) return this;
- if (Z(Y)) return this.filter(function(S, z) {
- return z.dir && Y.test(S);
- });
- var R = this.root + Y, X = m.call(this, R), H = this.clone();
- return H.root = X.name, H;
- }, remove: function(Y) {
- Y = this.root + Y;
- var R = this.files[Y];
- if (R || (Y.slice(-1) !== "/" && (Y += "/"), R = this.files[Y]), R && !R.dir) delete this.files[Y];
- else for (var X = this.filter(function(S, z) {
- return z.name.slice(0, Y.length) === Y;
- }), H = 0; H < X.length; H++) delete this.files[X[H].name];
- return this;
- }, generate: function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, generateInternalStream: function(Y) {
- var R, X = {};
- try {
- if ((X = s.extend(Y || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: A.utf8encode })).type = X.type.toLowerCase(), X.compression = X.compression.toUpperCase(), X.type === "binarystring" && (X.type = "string"), !X.type) throw new Error("No output type specified.");
- s.checkSupport(X.type), X.platform !== "darwin" && X.platform !== "freebsd" && X.platform !== "linux" && X.platform !== "sunos" || (X.platform = "UNIX"), X.platform === "win32" && (X.platform = "DOS");
- var H = X.comment || this.comment || "";
- R = c.generateWorker(this, X, H);
- } catch (S) {
- (R = new l("error")).error(S);
- }
- return new n(R, X.type || "string", X.mimeType);
- }, generateAsync: function(Y, R) {
- return this.generateInternalStream(Y).accumulate(R);
- }, generateNodeStream: function(Y, R) {
- return (Y = Y || {}).type || (Y.type = "nodebuffer"), this.generateInternalStream(Y).toNodejsStream(R);
- } };
- C.exports = p;
- }, { "./compressedObject": 2, "./defaults": 5, "./generate": 9, "./nodejs/NodejsStreamInputAdapter": 12, "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31, "./utils": 32, "./zipObject": 35 }], 16: [function(g, C, i) {
- C.exports = g("stream");
- }, { stream: void 0 }], 17: [function(g, C, i) {
- var e = g("./DataReader");
- function A(s) {
- e.call(this, s);
- for (var l = 0; l < this.data.length; l++) s[l] = 255 & s[l];
- }
- g("../utils").inherits(A, e), A.prototype.byteAt = function(s) {
- return this.data[this.zero + s];
- }, A.prototype.lastIndexOfSignature = function(s) {
- for (var l = s.charCodeAt(0), n = s.charCodeAt(1), a = s.charCodeAt(2), d = s.charCodeAt(3), o = this.length - 4; 0 <= o; --o) if (this.data[o] === l && this.data[o + 1] === n && this.data[o + 2] === a && this.data[o + 3] === d) return o - this.zero;
- return -1;
- }, A.prototype.readAndCheckSignature = function(s) {
- var l = s.charCodeAt(0), n = s.charCodeAt(1), a = s.charCodeAt(2), d = s.charCodeAt(3), o = this.readData(4);
- return l === o[0] && n === o[1] && a === o[2] && d === o[3];
- }, A.prototype.readData = function(s) {
- if (this.checkOffset(s), s === 0) return [];
- var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
- return this.index += s, l;
- }, C.exports = A;
- }, { "../utils": 32, "./DataReader": 18 }], 18: [function(g, C, i) {
- var e = g("../utils");
- function A(s) {
- this.data = s, this.length = s.length, this.index = 0, this.zero = 0;
- }
- A.prototype = { checkOffset: function(s) {
- this.checkIndex(this.index + s);
- }, checkIndex: function(s) {
- if (this.length < this.zero + s || s < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + s + "). Corrupted zip ?");
- }, setIndex: function(s) {
- this.checkIndex(s), this.index = s;
- }, skip: function(s) {
- this.setIndex(this.index + s);
- }, byteAt: function() {
- }, readInt: function(s) {
- var l, n = 0;
- for (this.checkOffset(s), l = this.index + s - 1; l >= this.index; l--) n = (n << 8) + this.byteAt(l);
- return this.index += s, n;
- }, readString: function(s) {
- return e.transformTo("string", this.readData(s));
- }, readData: function() {
- }, lastIndexOfSignature: function() {
- }, readAndCheckSignature: function() {
- }, readDate: function() {
- var s = this.readInt(4);
- return new Date(Date.UTC(1980 + (s >> 25 & 127), (s >> 21 & 15) - 1, s >> 16 & 31, s >> 11 & 31, s >> 5 & 63, (31 & s) << 1));
- } }, C.exports = A;
- }, { "../utils": 32 }], 19: [function(g, C, i) {
- var e = g("./Uint8ArrayReader");
- function A(s) {
- e.call(this, s);
- }
- g("../utils").inherits(A, e), A.prototype.readData = function(s) {
- this.checkOffset(s);
- var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
- return this.index += s, l;
- }, C.exports = A;
- }, { "../utils": 32, "./Uint8ArrayReader": 21 }], 20: [function(g, C, i) {
- var e = g("./DataReader");
- function A(s) {
- e.call(this, s);
- }
- g("../utils").inherits(A, e), A.prototype.byteAt = function(s) {
- return this.data.charCodeAt(this.zero + s);
- }, A.prototype.lastIndexOfSignature = function(s) {
- return this.data.lastIndexOf(s) - this.zero;
- }, A.prototype.readAndCheckSignature = function(s) {
- return s === this.readData(4);
- }, A.prototype.readData = function(s) {
- this.checkOffset(s);
- var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
- return this.index += s, l;
- }, C.exports = A;
- }, { "../utils": 32, "./DataReader": 18 }], 21: [function(g, C, i) {
- var e = g("./ArrayReader");
- function A(s) {
- e.call(this, s);
- }
- g("../utils").inherits(A, e), A.prototype.readData = function(s) {
- if (this.checkOffset(s), s === 0) return new Uint8Array(0);
- var l = this.data.subarray(this.zero + this.index, this.zero + this.index + s);
- return this.index += s, l;
- }, C.exports = A;
- }, { "../utils": 32, "./ArrayReader": 17 }], 22: [function(g, C, i) {
- var e = g("../utils"), A = g("../support"), s = g("./ArrayReader"), l = g("./StringReader"), n = g("./NodeBufferReader"), a = g("./Uint8ArrayReader");
- C.exports = function(d) {
- var o = e.getTypeOf(d);
- return e.checkSupport(o), o !== "string" || A.uint8array ? o === "nodebuffer" ? new n(d) : A.uint8array ? new a(e.transformTo("uint8array", d)) : new s(e.transformTo("array", d)) : new l(d);
- };
- }, { "../support": 30, "../utils": 32, "./ArrayReader": 17, "./NodeBufferReader": 19, "./StringReader": 20, "./Uint8ArrayReader": 21 }], 23: [function(g, C, i) {
- i.LOCAL_FILE_HEADER = "PK", i.CENTRAL_FILE_HEADER = "PK", i.CENTRAL_DIRECTORY_END = "PK", i.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x07", i.ZIP64_CENTRAL_DIRECTORY_END = "PK", i.DATA_DESCRIPTOR = "PK\x07\b";
- }, {}], 24: [function(g, C, i) {
- var e = g("./GenericWorker"), A = g("../utils");
- function s(l) {
- e.call(this, "ConvertWorker to " + l), this.destType = l;
- }
- A.inherits(s, e), s.prototype.processChunk = function(l) {
- this.push({ data: A.transformTo(this.destType, l.data), meta: l.meta });
- }, C.exports = s;
- }, { "../utils": 32, "./GenericWorker": 28 }], 25: [function(g, C, i) {
- var e = g("./GenericWorker"), A = g("../crc32");
- function s() {
- e.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
- }
- g("../utils").inherits(s, e), s.prototype.processChunk = function(l) {
- this.streamInfo.crc32 = A(l.data, this.streamInfo.crc32 || 0), this.push(l);
- }, C.exports = s;
- }, { "../crc32": 4, "../utils": 32, "./GenericWorker": 28 }], 26: [function(g, C, i) {
- var e = g("../utils"), A = g("./GenericWorker");
- function s(l) {
- A.call(this, "DataLengthProbe for " + l), this.propName = l, this.withStreamInfo(l, 0);
- }
- e.inherits(s, A), s.prototype.processChunk = function(l) {
- if (l) {
- var n = this.streamInfo[this.propName] || 0;
- this.streamInfo[this.propName] = n + l.data.length;
- }
- A.prototype.processChunk.call(this, l);
- }, C.exports = s;
- }, { "../utils": 32, "./GenericWorker": 28 }], 27: [function(g, C, i) {
- var e = g("../utils"), A = g("./GenericWorker");
- function s(l) {
- A.call(this, "DataWorker");
- var n = this;
- this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, l.then(function(a) {
- n.dataIsReady = !0, n.data = a, n.max = a && a.length || 0, n.type = e.getTypeOf(a), n.isPaused || n._tickAndRepeat();
- }, function(a) {
- n.error(a);
- });
- }
- e.inherits(s, A), s.prototype.cleanUp = function() {
- A.prototype.cleanUp.call(this), this.data = null;
- }, s.prototype.resume = function() {
- return !!A.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, e.delay(this._tickAndRepeat, [], this)), !0);
- }, s.prototype._tickAndRepeat = function() {
- this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (e.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
- }, s.prototype._tick = function() {
- if (this.isPaused || this.isFinished) return !1;
- var l = null, n = Math.min(this.max, this.index + 16384);
- if (this.index >= this.max) return this.end();
- switch (this.type) {
- case "string":
- l = this.data.substring(this.index, n);
- break;
- case "uint8array":
- l = this.data.subarray(this.index, n);
- break;
- case "array":
- case "nodebuffer":
- l = this.data.slice(this.index, n);
- }
- return this.index = n, this.push({ data: l, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
- }, C.exports = s;
- }, { "../utils": 32, "./GenericWorker": 28 }], 28: [function(g, C, i) {
- function e(A) {
- this.name = A || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
- }
- e.prototype = { push: function(A) {
- this.emit("data", A);
- }, end: function() {
- if (this.isFinished) return !1;
- this.flush();
- try {
- this.emit("end"), this.cleanUp(), this.isFinished = !0;
- } catch (A) {
- this.emit("error", A);
- }
- return !0;
- }, error: function(A) {
- return !this.isFinished && (this.isPaused ? this.generatedError = A : (this.isFinished = !0, this.emit("error", A), this.previous && this.previous.error(A), this.cleanUp()), !0);
- }, on: function(A, s) {
- return this._listeners[A].push(s), this;
- }, cleanUp: function() {
- this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
- }, emit: function(A, s) {
- if (this._listeners[A]) for (var l = 0; l < this._listeners[A].length; l++) this._listeners[A][l].call(this, s);
- }, pipe: function(A) {
- return A.registerPrevious(this);
- }, registerPrevious: function(A) {
- if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
- this.streamInfo = A.streamInfo, this.mergeStreamInfo(), this.previous = A;
- var s = this;
- return A.on("data", function(l) {
- s.processChunk(l);
- }), A.on("end", function() {
- s.end();
- }), A.on("error", function(l) {
- s.error(l);
- }), this;
- }, pause: function() {
- return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
- }, resume: function() {
- if (!this.isPaused || this.isFinished) return !1;
- var A = this.isPaused = !1;
- return this.generatedError && (this.error(this.generatedError), A = !0), this.previous && this.previous.resume(), !A;
- }, flush: function() {
- }, processChunk: function(A) {
- this.push(A);
- }, withStreamInfo: function(A, s) {
- return this.extraStreamInfo[A] = s, this.mergeStreamInfo(), this;
- }, mergeStreamInfo: function() {
- for (var A in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, A) && (this.streamInfo[A] = this.extraStreamInfo[A]);
- }, lock: function() {
- if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
- this.isLocked = !0, this.previous && this.previous.lock();
- }, toString: function() {
- var A = "Worker " + this.name;
- return this.previous ? this.previous + " -> " + A : A;
- } }, C.exports = e;
- }, {}], 29: [function(g, C, i) {
- var e = g("../utils"), A = g("./ConvertWorker"), s = g("./GenericWorker"), l = g("../base64"), n = g("../support"), a = g("../external"), d = null;
- if (n.nodestream) try {
- d = g("../nodejs/NodejsStreamOutputAdapter");
- } catch {
- }
- function o(r, h) {
- return new a.Promise(function(b, u) {
- var m = [], Z = r._internalType, p = r._outputType, Y = r._mimeType;
- r.on("data", function(R, X) {
- m.push(R), h && h(X);
- }).on("error", function(R) {
- m = [], u(R);
- }).on("end", function() {
- try {
- var R = function(X, H, S) {
- switch (X) {
- case "blob":
- return e.newBlob(e.transformTo("arraybuffer", H), S);
- case "base64":
- return l.encode(H);
- default:
- return e.transformTo(X, H);
- }
- }(p, function(X, H) {
- var S, z = 0, v = null, K = 0;
- for (S = 0; S < H.length; S++) K += H[S].length;
- switch (X) {
- case "string":
- return H.join("");
- case "array":
- return Array.prototype.concat.apply([], H);
- case "uint8array":
- for (v = new Uint8Array(K), S = 0; S < H.length; S++) v.set(H[S], z), z += H[S].length;
- return v;
- case "nodebuffer":
- return Buffer.concat(H);
- default:
- throw new Error("concat : unsupported type '" + X + "'");
- }
- }(Z, m), Y);
- b(R);
- } catch (X) {
- u(X);
- }
- m = [];
- }).resume();
- });
- }
- function c(r, h, b) {
- var u = h;
- switch (h) {
- case "blob":
- case "arraybuffer":
- u = "uint8array";
- break;
- case "base64":
- u = "string";
- }
- try {
- this._internalType = u, this._outputType = h, this._mimeType = b, e.checkSupport(u), this._worker = r.pipe(new A(u)), r.lock();
- } catch (m) {
- this._worker = new s("error"), this._worker.error(m);
- }
- }
- c.prototype = { accumulate: function(r) {
- return o(this, r);
- }, on: function(r, h) {
- var b = this;
- return r === "data" ? this._worker.on(r, function(u) {
- h.call(b, u.data, u.meta);
- }) : this._worker.on(r, function() {
- e.delay(h, arguments, b);
- }), this;
- }, resume: function() {
- return e.delay(this._worker.resume, [], this._worker), this;
- }, pause: function() {
- return this._worker.pause(), this;
- }, toNodejsStream: function(r) {
- if (e.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
- return new d(this, { objectMode: this._outputType !== "nodebuffer" }, r);
- } }, C.exports = c;
- }, { "../base64": 1, "../external": 6, "../nodejs/NodejsStreamOutputAdapter": 13, "../support": 30, "../utils": 32, "./ConvertWorker": 24, "./GenericWorker": 28 }], 30: [function(g, C, i) {
- if (i.base64 = !0, i.array = !0, i.string = !0, i.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", i.nodebuffer = typeof Buffer < "u", i.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") i.blob = !1;
- else {
- var e = new ArrayBuffer(0);
- try {
- i.blob = new Blob([e], { type: "application/zip" }).size === 0;
- } catch {
- try {
- var A = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
- A.append(e), i.blob = A.getBlob("application/zip").size === 0;
- } catch {
- i.blob = !1;
- }
- }
- }
- try {
- i.nodestream = !!g("readable-stream").Readable;
- } catch {
- i.nodestream = !1;
- }
- }, { "readable-stream": 16 }], 31: [function(g, C, i) {
- for (var e = g("./utils"), A = g("./support"), s = g("./nodejsUtils"), l = g("./stream/GenericWorker"), n = new Array(256), a = 0; a < 256; a++) n[a] = 252 <= a ? 6 : 248 <= a ? 5 : 240 <= a ? 4 : 224 <= a ? 3 : 192 <= a ? 2 : 1;
- n[254] = n[254] = 1;
- function d() {
- l.call(this, "utf-8 decode"), this.leftOver = null;
- }
- function o() {
- l.call(this, "utf-8 encode");
- }
- i.utf8encode = function(c) {
- return A.nodebuffer ? s.newBufferFrom(c, "utf-8") : function(r) {
- var h, b, u, m, Z, p = r.length, Y = 0;
- for (m = 0; m < p; m++) (64512 & (b = r.charCodeAt(m))) == 55296 && m + 1 < p && (64512 & (u = r.charCodeAt(m + 1))) == 56320 && (b = 65536 + (b - 55296 << 10) + (u - 56320), m++), Y += b < 128 ? 1 : b < 2048 ? 2 : b < 65536 ? 3 : 4;
- for (h = A.uint8array ? new Uint8Array(Y) : new Array(Y), m = Z = 0; Z < Y; m++) (64512 & (b = r.charCodeAt(m))) == 55296 && m + 1 < p && (64512 & (u = r.charCodeAt(m + 1))) == 56320 && (b = 65536 + (b - 55296 << 10) + (u - 56320), m++), b < 128 ? h[Z++] = b : (b < 2048 ? h[Z++] = 192 | b >>> 6 : (b < 65536 ? h[Z++] = 224 | b >>> 12 : (h[Z++] = 240 | b >>> 18, h[Z++] = 128 | b >>> 12 & 63), h[Z++] = 128 | b >>> 6 & 63), h[Z++] = 128 | 63 & b);
- return h;
- }(c);
- }, i.utf8decode = function(c) {
- return A.nodebuffer ? e.transformTo("nodebuffer", c).toString("utf-8") : function(r) {
- var h, b, u, m, Z = r.length, p = new Array(2 * Z);
- for (h = b = 0; h < Z; ) if ((u = r[h++]) < 128) p[b++] = u;
- else if (4 < (m = n[u])) p[b++] = 65533, h += m - 1;
- else {
- for (u &= m === 2 ? 31 : m === 3 ? 15 : 7; 1 < m && h < Z; ) u = u << 6 | 63 & r[h++], m--;
- 1 < m ? p[b++] = 65533 : u < 65536 ? p[b++] = u : (u -= 65536, p[b++] = 55296 | u >> 10 & 1023, p[b++] = 56320 | 1023 & u);
- }
- return p.length !== b && (p.subarray ? p = p.subarray(0, b) : p.length = b), e.applyFromCharCode(p);
- }(c = e.transformTo(A.uint8array ? "uint8array" : "array", c));
- }, e.inherits(d, l), d.prototype.processChunk = function(c) {
- var r = e.transformTo(A.uint8array ? "uint8array" : "array", c.data);
- if (this.leftOver && this.leftOver.length) {
- if (A.uint8array) {
- var h = r;
- (r = new Uint8Array(h.length + this.leftOver.length)).set(this.leftOver, 0), r.set(h, this.leftOver.length);
- } else r = this.leftOver.concat(r);
- this.leftOver = null;
- }
- var b = function(m, Z) {
- var p;
- for ((Z = Z || m.length) > m.length && (Z = m.length), p = Z - 1; 0 <= p && (192 & m[p]) == 128; ) p--;
- return p < 0 || p === 0 ? Z : p + n[m[p]] > Z ? p : Z;
- }(r), u = r;
- b !== r.length && (A.uint8array ? (u = r.subarray(0, b), this.leftOver = r.subarray(b, r.length)) : (u = r.slice(0, b), this.leftOver = r.slice(b, r.length))), this.push({ data: i.utf8decode(u), meta: c.meta });
- }, d.prototype.flush = function() {
- this.leftOver && this.leftOver.length && (this.push({ data: i.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
- }, i.Utf8DecodeWorker = d, e.inherits(o, l), o.prototype.processChunk = function(c) {
- this.push({ data: i.utf8encode(c.data), meta: c.meta });
- }, i.Utf8EncodeWorker = o;
- }, { "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./support": 30, "./utils": 32 }], 32: [function(g, C, i) {
- var e = g("./support"), A = g("./base64"), s = g("./nodejsUtils"), l = g("./external");
- function n(h) {
- return h;
- }
- function a(h, b) {
- for (var u = 0; u < h.length; ++u) b[u] = 255 & h.charCodeAt(u);
- return b;
- }
- g("setimmediate"), i.newBlob = function(h, b) {
- i.checkSupport("blob");
- try {
- return new Blob([h], { type: b });
- } catch {
- try {
- var u = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
- return u.append(h), u.getBlob(b);
- } catch {
- throw new Error("Bug : can't construct the Blob.");
- }
- }
- };
- var d = { stringifyByChunk: function(h, b, u) {
- var m = [], Z = 0, p = h.length;
- if (p <= u) return String.fromCharCode.apply(null, h);
- for (; Z < p; ) b === "array" || b === "nodebuffer" ? m.push(String.fromCharCode.apply(null, h.slice(Z, Math.min(Z + u, p)))) : m.push(String.fromCharCode.apply(null, h.subarray(Z, Math.min(Z + u, p)))), Z += u;
- return m.join("");
- }, stringifyByChar: function(h) {
- for (var b = "", u = 0; u < h.length; u++) b += String.fromCharCode(h[u]);
- return b;
- }, applyCanBeUsed: { uint8array: function() {
- try {
- return e.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
- } catch {
- return !1;
- }
- }(), nodebuffer: function() {
- try {
- return e.nodebuffer && String.fromCharCode.apply(null, s.allocBuffer(1)).length === 1;
- } catch {
- return !1;
- }
- }() } };
- function o(h) {
- var b = 65536, u = i.getTypeOf(h), m = !0;
- if (u === "uint8array" ? m = d.applyCanBeUsed.uint8array : u === "nodebuffer" && (m = d.applyCanBeUsed.nodebuffer), m) for (; 1 < b; ) try {
- return d.stringifyByChunk(h, u, b);
- } catch {
- b = Math.floor(b / 2);
- }
- return d.stringifyByChar(h);
- }
- function c(h, b) {
- for (var u = 0; u < h.length; u++) b[u] = h[u];
- return b;
- }
- i.applyFromCharCode = o;
- var r = {};
- r.string = { string: n, array: function(h) {
- return a(h, new Array(h.length));
- }, arraybuffer: function(h) {
- return r.string.uint8array(h).buffer;
- }, uint8array: function(h) {
- return a(h, new Uint8Array(h.length));
- }, nodebuffer: function(h) {
- return a(h, s.allocBuffer(h.length));
- } }, r.array = { string: o, array: n, arraybuffer: function(h) {
- return new Uint8Array(h).buffer;
- }, uint8array: function(h) {
- return new Uint8Array(h);
- }, nodebuffer: function(h) {
- return s.newBufferFrom(h);
- } }, r.arraybuffer = { string: function(h) {
- return o(new Uint8Array(h));
- }, array: function(h) {
- return c(new Uint8Array(h), new Array(h.byteLength));
- }, arraybuffer: n, uint8array: function(h) {
- return new Uint8Array(h);
- }, nodebuffer: function(h) {
- return s.newBufferFrom(new Uint8Array(h));
- } }, r.uint8array = { string: o, array: function(h) {
- return c(h, new Array(h.length));
- }, arraybuffer: function(h) {
- return h.buffer;
- }, uint8array: n, nodebuffer: function(h) {
- return s.newBufferFrom(h);
- } }, r.nodebuffer = { string: o, array: function(h) {
- return c(h, new Array(h.length));
- }, arraybuffer: function(h) {
- return r.nodebuffer.uint8array(h).buffer;
- }, uint8array: function(h) {
- return c(h, new Uint8Array(h.length));
- }, nodebuffer: n }, i.transformTo = function(h, b) {
- if (b = b || "", !h) return b;
- i.checkSupport(h);
- var u = i.getTypeOf(b);
- return r[u][h](b);
- }, i.resolve = function(h) {
- for (var b = h.split("/"), u = [], m = 0; m < b.length; m++) {
- var Z = b[m];
- Z === "." || Z === "" && m !== 0 && m !== b.length - 1 || (Z === ".." ? u.pop() : u.push(Z));
- }
- return u.join("/");
- }, i.getTypeOf = function(h) {
- return typeof h == "string" ? "string" : Object.prototype.toString.call(h) === "[object Array]" ? "array" : e.nodebuffer && s.isBuffer(h) ? "nodebuffer" : e.uint8array && h instanceof Uint8Array ? "uint8array" : e.arraybuffer && h instanceof ArrayBuffer ? "arraybuffer" : void 0;
- }, i.checkSupport = function(h) {
- if (!e[h.toLowerCase()]) throw new Error(h + " is not supported by this platform");
- }, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(h) {
- var b, u, m = "";
- for (u = 0; u < (h || "").length; u++) m += "\\x" + ((b = h.charCodeAt(u)) < 16 ? "0" : "") + b.toString(16).toUpperCase();
- return m;
- }, i.delay = function(h, b, u) {
- setImmediate(function() {
- h.apply(u || null, b || []);
- });
- }, i.inherits = function(h, b) {
- function u() {
- }
- u.prototype = b.prototype, h.prototype = new u();
- }, i.extend = function() {
- var h, b, u = {};
- for (h = 0; h < arguments.length; h++) for (b in arguments[h]) Object.prototype.hasOwnProperty.call(arguments[h], b) && u[b] === void 0 && (u[b] = arguments[h][b]);
- return u;
- }, i.prepareContent = function(h, b, u, m, Z) {
- return l.Promise.resolve(b).then(function(p) {
- return e.blob && (p instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(p)) !== -1) && typeof FileReader < "u" ? new l.Promise(function(Y, R) {
- var X = new FileReader();
- X.onload = function(H) {
- Y(H.target.result);
- }, X.onerror = function(H) {
- R(H.target.error);
- }, X.readAsArrayBuffer(p);
- }) : p;
- }).then(function(p) {
- var Y = i.getTypeOf(p);
- return Y ? (Y === "arraybuffer" ? p = i.transformTo("uint8array", p) : Y === "string" && (Z ? p = A.decode(p) : u && m !== !0 && (p = function(R) {
- return a(R, e.uint8array ? new Uint8Array(R.length) : new Array(R.length));
- }(p))), p) : l.Promise.reject(new Error("Can't read the data of '" + h + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
- });
- };
- }, { "./base64": 1, "./external": 6, "./nodejsUtils": 14, "./support": 30, setimmediate: 54 }], 33: [function(g, C, i) {
- var e = g("./reader/readerFor"), A = g("./utils"), s = g("./signature"), l = g("./zipEntry"), n = g("./support");
- function a(d) {
- this.files = [], this.loadOptions = d;
- }
- a.prototype = { checkSignature: function(d) {
- if (!this.reader.readAndCheckSignature(d)) {
- this.reader.index -= 4;
- var o = this.reader.readString(4);
- throw new Error("Corrupted zip or bug: unexpected signature (" + A.pretty(o) + ", expected " + A.pretty(d) + ")");
- }
- }, isSignature: function(d, o) {
- var c = this.reader.index;
- this.reader.setIndex(d);
- var r = this.reader.readString(4) === o;
- return this.reader.setIndex(c), r;
- }, readBlockEndOfCentral: function() {
- this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
- var d = this.reader.readData(this.zipCommentLength), o = n.uint8array ? "uint8array" : "array", c = A.transformTo(o, d);
- this.zipComment = this.loadOptions.decodeFileName(c);
- }, readBlockZip64EndOfCentral: function() {
- this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
- for (var d, o, c, r = this.zip64EndOfCentralSize - 44; 0 < r; ) d = this.reader.readInt(2), o = this.reader.readInt(4), c = this.reader.readData(o), this.zip64ExtensibleData[d] = { id: d, length: o, value: c };
- }, readBlockZip64EndOfCentralLocator: function() {
- if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error("Multi-volumes zip are not supported");
- }, readLocalFiles: function() {
- var d, o;
- for (d = 0; d < this.files.length; d++) o = this.files[d], this.reader.setIndex(o.localHeaderOffset), this.checkSignature(s.LOCAL_FILE_HEADER), o.readLocalPart(this.reader), o.handleUTF8(), o.processAttributes();
- }, readCentralDir: function() {
- var d;
- for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER); ) (d = new l({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(d);
- if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
- }, readEndOfCentral: function() {
- var d = this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);
- if (d < 0) throw this.isSignature(0, s.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
- this.reader.setIndex(d);
- var o = d;
- if (this.checkSignature(s.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === A.MAX_VALUE_16BITS || this.diskWithCentralDirStart === A.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === A.MAX_VALUE_16BITS || this.centralDirRecords === A.MAX_VALUE_16BITS || this.centralDirSize === A.MAX_VALUE_32BITS || this.centralDirOffset === A.MAX_VALUE_32BITS) {
- if (this.zip64 = !0, (d = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
- if (this.reader.setIndex(d), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, s.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
- this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
- }
- var c = this.centralDirOffset + this.centralDirSize;
- this.zip64 && (c += 20, c += 12 + this.zip64EndOfCentralSize);
- var r = o - c;
- if (0 < r) this.isSignature(o, s.CENTRAL_FILE_HEADER) || (this.reader.zero = r);
- else if (r < 0) throw new Error("Corrupted zip: missing " + Math.abs(r) + " bytes.");
- }, prepareReader: function(d) {
- this.reader = e(d);
- }, load: function(d) {
- this.prepareReader(d), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
- } }, C.exports = a;
- }, { "./reader/readerFor": 22, "./signature": 23, "./support": 30, "./utils": 32, "./zipEntry": 34 }], 34: [function(g, C, i) {
- var e = g("./reader/readerFor"), A = g("./utils"), s = g("./compressedObject"), l = g("./crc32"), n = g("./utf8"), a = g("./compressions"), d = g("./support");
- function o(c, r) {
- this.options = c, this.loadOptions = r;
- }
- o.prototype = { isEncrypted: function() {
- return (1 & this.bitFlag) == 1;
- }, useUTF8: function() {
- return (2048 & this.bitFlag) == 2048;
- }, readLocalPart: function(c) {
- var r, h;
- if (c.skip(22), this.fileNameLength = c.readInt(2), h = c.readInt(2), this.fileName = c.readData(this.fileNameLength), c.skip(h), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
- if ((r = function(b) {
- for (var u in a) if (Object.prototype.hasOwnProperty.call(a, u) && a[u].magic === b) return a[u];
- return null;
- }(this.compressionMethod)) === null) throw new Error("Corrupted zip : compression " + A.pretty(this.compressionMethod) + " unknown (inner file : " + A.transformTo("string", this.fileName) + ")");
- this.decompressed = new s(this.compressedSize, this.uncompressedSize, this.crc32, r, c.readData(this.compressedSize));
- }, readCentralPart: function(c) {
- this.versionMadeBy = c.readInt(2), c.skip(2), this.bitFlag = c.readInt(2), this.compressionMethod = c.readString(2), this.date = c.readDate(), this.crc32 = c.readInt(4), this.compressedSize = c.readInt(4), this.uncompressedSize = c.readInt(4);
- var r = c.readInt(2);
- if (this.extraFieldsLength = c.readInt(2), this.fileCommentLength = c.readInt(2), this.diskNumberStart = c.readInt(2), this.internalFileAttributes = c.readInt(2), this.externalFileAttributes = c.readInt(4), this.localHeaderOffset = c.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
- c.skip(r), this.readExtraFields(c), this.parseZIP64ExtraField(c), this.fileComment = c.readData(this.fileCommentLength);
- }, processAttributes: function() {
- this.unixPermissions = null, this.dosPermissions = null;
- var c = this.versionMadeBy >> 8;
- this.dir = !!(16 & this.externalFileAttributes), c == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), c == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
- }, parseZIP64ExtraField: function() {
- if (this.extraFields[1]) {
- var c = e(this.extraFields[1].value);
- this.uncompressedSize === A.MAX_VALUE_32BITS && (this.uncompressedSize = c.readInt(8)), this.compressedSize === A.MAX_VALUE_32BITS && (this.compressedSize = c.readInt(8)), this.localHeaderOffset === A.MAX_VALUE_32BITS && (this.localHeaderOffset = c.readInt(8)), this.diskNumberStart === A.MAX_VALUE_32BITS && (this.diskNumberStart = c.readInt(4));
- }
- }, readExtraFields: function(c) {
- var r, h, b, u = c.index + this.extraFieldsLength;
- for (this.extraFields || (this.extraFields = {}); c.index + 4 < u; ) r = c.readInt(2), h = c.readInt(2), b = c.readData(h), this.extraFields[r] = { id: r, length: h, value: b };
- c.setIndex(u);
- }, handleUTF8: function() {
- var c = d.uint8array ? "uint8array" : "array";
- if (this.useUTF8()) this.fileNameStr = n.utf8decode(this.fileName), this.fileCommentStr = n.utf8decode(this.fileComment);
- else {
- var r = this.findExtraFieldUnicodePath();
- if (r !== null) this.fileNameStr = r;
- else {
- var h = A.transformTo(c, this.fileName);
- this.fileNameStr = this.loadOptions.decodeFileName(h);
- }
- var b = this.findExtraFieldUnicodeComment();
- if (b !== null) this.fileCommentStr = b;
- else {
- var u = A.transformTo(c, this.fileComment);
- this.fileCommentStr = this.loadOptions.decodeFileName(u);
- }
- }
- }, findExtraFieldUnicodePath: function() {
- var c = this.extraFields[28789];
- if (c) {
- var r = e(c.value);
- return r.readInt(1) !== 1 || l(this.fileName) !== r.readInt(4) ? null : n.utf8decode(r.readData(c.length - 5));
- }
- return null;
- }, findExtraFieldUnicodeComment: function() {
- var c = this.extraFields[25461];
- if (c) {
- var r = e(c.value);
- return r.readInt(1) !== 1 || l(this.fileComment) !== r.readInt(4) ? null : n.utf8decode(r.readData(c.length - 5));
- }
- return null;
- } }, C.exports = o;
- }, { "./compressedObject": 2, "./compressions": 3, "./crc32": 4, "./reader/readerFor": 22, "./support": 30, "./utf8": 31, "./utils": 32 }], 35: [function(g, C, i) {
- function e(r, h, b) {
- this.name = r, this.dir = b.dir, this.date = b.date, this.comment = b.comment, this.unixPermissions = b.unixPermissions, this.dosPermissions = b.dosPermissions, this._data = h, this._dataBinary = b.binary, this.options = { compression: b.compression, compressionOptions: b.compressionOptions };
- }
- var A = g("./stream/StreamHelper"), s = g("./stream/DataWorker"), l = g("./utf8"), n = g("./compressedObject"), a = g("./stream/GenericWorker");
- e.prototype = { internalStream: function(r) {
- var h = null, b = "string";
- try {
- if (!r) throw new Error("No output type specified.");
- var u = (b = r.toLowerCase()) === "string" || b === "text";
- b !== "binarystring" && b !== "text" || (b = "string"), h = this._decompressWorker();
- var m = !this._dataBinary;
- m && !u && (h = h.pipe(new l.Utf8EncodeWorker())), !m && u && (h = h.pipe(new l.Utf8DecodeWorker()));
- } catch (Z) {
- (h = new a("error")).error(Z);
- }
- return new A(h, b, "");
- }, async: function(r, h) {
- return this.internalStream(r).accumulate(h);
- }, nodeStream: function(r, h) {
- return this.internalStream(r || "nodebuffer").toNodejsStream(h);
- }, _compressWorker: function(r, h) {
- if (this._data instanceof n && this._data.compression.magic === r.magic) return this._data.getCompressedWorker();
- var b = this._decompressWorker();
- return this._dataBinary || (b = b.pipe(new l.Utf8EncodeWorker())), n.createWorkerFrom(b, r, h);
- }, _decompressWorker: function() {
- return this._data instanceof n ? this._data.getContentWorker() : this._data instanceof a ? this._data : new s(this._data);
- } };
- for (var d = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], o = function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, c = 0; c < d.length; c++) e.prototype[d[c]] = o;
- C.exports = e;
- }, { "./compressedObject": 2, "./stream/DataWorker": 27, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31 }], 36: [function(g, C, i) {
- (function(e) {
- var A, s, l = e.MutationObserver || e.WebKitMutationObserver;
- if (l) {
- var n = 0, a = new l(r), d = e.document.createTextNode("");
- a.observe(d, { characterData: !0 }), A = function() {
- d.data = n = ++n % 2;
- };
- } else if (e.setImmediate || e.MessageChannel === void 0) A = "document" in e && "onreadystatechange" in e.document.createElement("script") ? function() {
- var h = e.document.createElement("script");
- h.onreadystatechange = function() {
- r(), h.onreadystatechange = null, h.parentNode.removeChild(h), h = null;
- }, e.document.documentElement.appendChild(h);
- } : function() {
- setTimeout(r, 0);
- };
- else {
- var o = new e.MessageChannel();
- o.port1.onmessage = r, A = function() {
- o.port2.postMessage(0);
- };
- }
- var c = [];
- function r() {
- var h, b;
- s = !0;
- for (var u = c.length; u; ) {
- for (b = c, c = [], h = -1; ++h < u; ) b[h]();
- u = c.length;
- }
- s = !1;
- }
- C.exports = function(h) {
- c.push(h) !== 1 || s || A();
- };
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 37: [function(g, C, i) {
- var e = g("immediate");
- function A() {
- }
- var s = {}, l = ["REJECTED"], n = ["FULFILLED"], a = ["PENDING"];
- function d(u) {
- if (typeof u != "function") throw new TypeError("resolver must be a function");
- this.state = a, this.queue = [], this.outcome = void 0, u !== A && h(this, u);
- }
- function o(u, m, Z) {
- this.promise = u, typeof m == "function" && (this.onFulfilled = m, this.callFulfilled = this.otherCallFulfilled), typeof Z == "function" && (this.onRejected = Z, this.callRejected = this.otherCallRejected);
- }
- function c(u, m, Z) {
- e(function() {
- var p;
- try {
- p = m(Z);
- } catch (Y) {
- return s.reject(u, Y);
- }
- p === u ? s.reject(u, new TypeError("Cannot resolve promise with itself")) : s.resolve(u, p);
- });
- }
- function r(u) {
- var m = u && u.then;
- if (u && (typeof u == "object" || typeof u == "function") && typeof m == "function") return function() {
- m.apply(u, arguments);
- };
- }
- function h(u, m) {
- var Z = !1;
- function p(X) {
- Z || (Z = !0, s.reject(u, X));
- }
- function Y(X) {
- Z || (Z = !0, s.resolve(u, X));
- }
- var R = b(function() {
- m(Y, p);
- });
- R.status === "error" && p(R.value);
- }
- function b(u, m) {
- var Z = {};
- try {
- Z.value = u(m), Z.status = "success";
- } catch (p) {
- Z.status = "error", Z.value = p;
- }
- return Z;
- }
- (C.exports = d).prototype.finally = function(u) {
- if (typeof u != "function") return this;
- var m = this.constructor;
- return this.then(function(Z) {
- return m.resolve(u()).then(function() {
- return Z;
- });
- }, function(Z) {
- return m.resolve(u()).then(function() {
- throw Z;
- });
- });
- }, d.prototype.catch = function(u) {
- return this.then(null, u);
- }, d.prototype.then = function(u, m) {
- if (typeof u != "function" && this.state === n || typeof m != "function" && this.state === l) return this;
- var Z = new this.constructor(A);
- return this.state !== a ? c(Z, this.state === n ? u : m, this.outcome) : this.queue.push(new o(Z, u, m)), Z;
- }, o.prototype.callFulfilled = function(u) {
- s.resolve(this.promise, u);
- }, o.prototype.otherCallFulfilled = function(u) {
- c(this.promise, this.onFulfilled, u);
- }, o.prototype.callRejected = function(u) {
- s.reject(this.promise, u);
- }, o.prototype.otherCallRejected = function(u) {
- c(this.promise, this.onRejected, u);
- }, s.resolve = function(u, m) {
- var Z = b(r, m);
- if (Z.status === "error") return s.reject(u, Z.value);
- var p = Z.value;
- if (p) h(u, p);
- else {
- u.state = n, u.outcome = m;
- for (var Y = -1, R = u.queue.length; ++Y < R; ) u.queue[Y].callFulfilled(m);
- }
- return u;
- }, s.reject = function(u, m) {
- u.state = l, u.outcome = m;
- for (var Z = -1, p = u.queue.length; ++Z < p; ) u.queue[Z].callRejected(m);
- return u;
- }, d.resolve = function(u) {
- return u instanceof this ? u : s.resolve(new this(A), u);
- }, d.reject = function(u) {
- var m = new this(A);
- return s.reject(m, u);
- }, d.all = function(u) {
- var m = this;
- if (Object.prototype.toString.call(u) !== "[object Array]") return this.reject(new TypeError("must be an array"));
- var Z = u.length, p = !1;
- if (!Z) return this.resolve([]);
- for (var Y = new Array(Z), R = 0, X = -1, H = new this(A); ++X < Z; ) S(u[X], X);
- return H;
- function S(z, v) {
- m.resolve(z).then(function(K) {
- Y[v] = K, ++R !== Z || p || (p = !0, s.resolve(H, Y));
- }, function(K) {
- p || (p = !0, s.reject(H, K));
- });
- }
- }, d.race = function(u) {
- var m = this;
- if (Object.prototype.toString.call(u) !== "[object Array]") return this.reject(new TypeError("must be an array"));
- var Z = u.length, p = !1;
- if (!Z) return this.resolve([]);
- for (var Y = -1, R = new this(A); ++Y < Z; ) X = u[Y], m.resolve(X).then(function(H) {
- p || (p = !0, s.resolve(R, H));
- }, function(H) {
- p || (p = !0, s.reject(R, H));
- });
- var X;
- return R;
- };
- }, { immediate: 36 }], 38: [function(g, C, i) {
- var e = {};
- (0, g("./lib/utils/common").assign)(e, g("./lib/deflate"), g("./lib/inflate"), g("./lib/zlib/constants")), C.exports = e;
- }, { "./lib/deflate": 39, "./lib/inflate": 40, "./lib/utils/common": 41, "./lib/zlib/constants": 44 }], 39: [function(g, C, i) {
- var e = g("./zlib/deflate"), A = g("./utils/common"), s = g("./utils/strings"), l = g("./zlib/messages"), n = g("./zlib/zstream"), a = Object.prototype.toString, d = 0, o = -1, c = 0, r = 8;
- function h(u) {
- if (!(this instanceof h)) return new h(u);
- this.options = A.assign({ level: o, method: r, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: c, to: "" }, u || {});
- var m = this.options;
- m.raw && 0 < m.windowBits ? m.windowBits = -m.windowBits : m.gzip && 0 < m.windowBits && m.windowBits < 16 && (m.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new n(), this.strm.avail_out = 0;
- var Z = e.deflateInit2(this.strm, m.level, m.method, m.windowBits, m.memLevel, m.strategy);
- if (Z !== d) throw new Error(l[Z]);
- if (m.header && e.deflateSetHeader(this.strm, m.header), m.dictionary) {
- var p;
- if (p = typeof m.dictionary == "string" ? s.string2buf(m.dictionary) : a.call(m.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(m.dictionary) : m.dictionary, (Z = e.deflateSetDictionary(this.strm, p)) !== d) throw new Error(l[Z]);
- this._dict_set = !0;
- }
- }
- function b(u, m) {
- var Z = new h(m);
- if (Z.push(u, !0), Z.err) throw Z.msg || l[Z.err];
- return Z.result;
- }
- h.prototype.push = function(u, m) {
- var Z, p, Y = this.strm, R = this.options.chunkSize;
- if (this.ended) return !1;
- p = m === ~~m ? m : m === !0 ? 4 : 0, typeof u == "string" ? Y.input = s.string2buf(u) : a.call(u) === "[object ArrayBuffer]" ? Y.input = new Uint8Array(u) : Y.input = u, Y.next_in = 0, Y.avail_in = Y.input.length;
- do {
- if (Y.avail_out === 0 && (Y.output = new A.Buf8(R), Y.next_out = 0, Y.avail_out = R), (Z = e.deflate(Y, p)) !== 1 && Z !== d) return this.onEnd(Z), !(this.ended = !0);
- Y.avail_out !== 0 && (Y.avail_in !== 0 || p !== 4 && p !== 2) || (this.options.to === "string" ? this.onData(s.buf2binstring(A.shrinkBuf(Y.output, Y.next_out))) : this.onData(A.shrinkBuf(Y.output, Y.next_out)));
- } while ((0 < Y.avail_in || Y.avail_out === 0) && Z !== 1);
- return p === 4 ? (Z = e.deflateEnd(this.strm), this.onEnd(Z), this.ended = !0, Z === d) : p !== 2 || (this.onEnd(d), !(Y.avail_out = 0));
- }, h.prototype.onData = function(u) {
- this.chunks.push(u);
- }, h.prototype.onEnd = function(u) {
- u === d && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = A.flattenChunks(this.chunks)), this.chunks = [], this.err = u, this.msg = this.strm.msg;
- }, i.Deflate = h, i.deflate = b, i.deflateRaw = function(u, m) {
- return (m = m || {}).raw = !0, b(u, m);
- }, i.gzip = function(u, m) {
- return (m = m || {}).gzip = !0, b(u, m);
- };
- }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/deflate": 46, "./zlib/messages": 51, "./zlib/zstream": 53 }], 40: [function(g, C, i) {
- var e = g("./zlib/inflate"), A = g("./utils/common"), s = g("./utils/strings"), l = g("./zlib/constants"), n = g("./zlib/messages"), a = g("./zlib/zstream"), d = g("./zlib/gzheader"), o = Object.prototype.toString;
- function c(h) {
- if (!(this instanceof c)) return new c(h);
- this.options = A.assign({ chunkSize: 16384, windowBits: 0, to: "" }, h || {});
- var b = this.options;
- b.raw && 0 <= b.windowBits && b.windowBits < 16 && (b.windowBits = -b.windowBits, b.windowBits === 0 && (b.windowBits = -15)), !(0 <= b.windowBits && b.windowBits < 16) || h && h.windowBits || (b.windowBits += 32), 15 < b.windowBits && b.windowBits < 48 && (15 & b.windowBits) == 0 && (b.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new a(), this.strm.avail_out = 0;
- var u = e.inflateInit2(this.strm, b.windowBits);
- if (u !== l.Z_OK) throw new Error(n[u]);
- this.header = new d(), e.inflateGetHeader(this.strm, this.header);
- }
- function r(h, b) {
- var u = new c(b);
- if (u.push(h, !0), u.err) throw u.msg || n[u.err];
- return u.result;
- }
- c.prototype.push = function(h, b) {
- var u, m, Z, p, Y, R, X = this.strm, H = this.options.chunkSize, S = this.options.dictionary, z = !1;
- if (this.ended) return !1;
- m = b === ~~b ? b : b === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof h == "string" ? X.input = s.binstring2buf(h) : o.call(h) === "[object ArrayBuffer]" ? X.input = new Uint8Array(h) : X.input = h, X.next_in = 0, X.avail_in = X.input.length;
- do {
- if (X.avail_out === 0 && (X.output = new A.Buf8(H), X.next_out = 0, X.avail_out = H), (u = e.inflate(X, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && S && (R = typeof S == "string" ? s.string2buf(S) : o.call(S) === "[object ArrayBuffer]" ? new Uint8Array(S) : S, u = e.inflateSetDictionary(this.strm, R)), u === l.Z_BUF_ERROR && z === !0 && (u = l.Z_OK, z = !1), u !== l.Z_STREAM_END && u !== l.Z_OK) return this.onEnd(u), !(this.ended = !0);
- X.next_out && (X.avail_out !== 0 && u !== l.Z_STREAM_END && (X.avail_in !== 0 || m !== l.Z_FINISH && m !== l.Z_SYNC_FLUSH) || (this.options.to === "string" ? (Z = s.utf8border(X.output, X.next_out), p = X.next_out - Z, Y = s.buf2string(X.output, Z), X.next_out = p, X.avail_out = H - p, p && A.arraySet(X.output, X.output, Z, p, 0), this.onData(Y)) : this.onData(A.shrinkBuf(X.output, X.next_out)))), X.avail_in === 0 && X.avail_out === 0 && (z = !0);
- } while ((0 < X.avail_in || X.avail_out === 0) && u !== l.Z_STREAM_END);
- return u === l.Z_STREAM_END && (m = l.Z_FINISH), m === l.Z_FINISH ? (u = e.inflateEnd(this.strm), this.onEnd(u), this.ended = !0, u === l.Z_OK) : m !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(X.avail_out = 0));
- }, c.prototype.onData = function(h) {
- this.chunks.push(h);
- }, c.prototype.onEnd = function(h) {
- h === l.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = A.flattenChunks(this.chunks)), this.chunks = [], this.err = h, this.msg = this.strm.msg;
- }, i.Inflate = c, i.inflate = r, i.inflateRaw = function(h, b) {
- return (b = b || {}).raw = !0, r(h, b);
- }, i.ungzip = r;
- }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/constants": 44, "./zlib/gzheader": 47, "./zlib/inflate": 49, "./zlib/messages": 51, "./zlib/zstream": 53 }], 41: [function(g, C, i) {
- var e = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
- i.assign = function(l) {
- for (var n = Array.prototype.slice.call(arguments, 1); n.length; ) {
- var a = n.shift();
- if (a) {
- if (typeof a != "object") throw new TypeError(a + "must be non-object");
- for (var d in a) a.hasOwnProperty(d) && (l[d] = a[d]);
- }
- }
- return l;
- }, i.shrinkBuf = function(l, n) {
- return l.length === n ? l : l.subarray ? l.subarray(0, n) : (l.length = n, l);
- };
- var A = { arraySet: function(l, n, a, d, o) {
- if (n.subarray && l.subarray) l.set(n.subarray(a, a + d), o);
- else for (var c = 0; c < d; c++) l[o + c] = n[a + c];
- }, flattenChunks: function(l) {
- var n, a, d, o, c, r;
- for (n = d = 0, a = l.length; n < a; n++) d += l[n].length;
- for (r = new Uint8Array(d), n = o = 0, a = l.length; n < a; n++) c = l[n], r.set(c, o), o += c.length;
- return r;
- } }, s = { arraySet: function(l, n, a, d, o) {
- for (var c = 0; c < d; c++) l[o + c] = n[a + c];
- }, flattenChunks: function(l) {
- return [].concat.apply([], l);
- } };
- i.setTyped = function(l) {
- l ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, A)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, s));
- }, i.setTyped(e);
- }, {}], 42: [function(g, C, i) {
- var e = g("./common"), A = !0, s = !0;
- try {
- String.fromCharCode.apply(null, [0]);
- } catch {
- A = !1;
- }
- try {
- String.fromCharCode.apply(null, new Uint8Array(1));
- } catch {
- s = !1;
- }
- for (var l = new e.Buf8(256), n = 0; n < 256; n++) l[n] = 252 <= n ? 6 : 248 <= n ? 5 : 240 <= n ? 4 : 224 <= n ? 3 : 192 <= n ? 2 : 1;
- function a(d, o) {
- if (o < 65537 && (d.subarray && s || !d.subarray && A)) return String.fromCharCode.apply(null, e.shrinkBuf(d, o));
- for (var c = "", r = 0; r < o; r++) c += String.fromCharCode(d[r]);
- return c;
- }
- l[254] = l[254] = 1, i.string2buf = function(d) {
- var o, c, r, h, b, u = d.length, m = 0;
- for (h = 0; h < u; h++) (64512 & (c = d.charCodeAt(h))) == 55296 && h + 1 < u && (64512 & (r = d.charCodeAt(h + 1))) == 56320 && (c = 65536 + (c - 55296 << 10) + (r - 56320), h++), m += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4;
- for (o = new e.Buf8(m), h = b = 0; b < m; h++) (64512 & (c = d.charCodeAt(h))) == 55296 && h + 1 < u && (64512 & (r = d.charCodeAt(h + 1))) == 56320 && (c = 65536 + (c - 55296 << 10) + (r - 56320), h++), c < 128 ? o[b++] = c : (c < 2048 ? o[b++] = 192 | c >>> 6 : (c < 65536 ? o[b++] = 224 | c >>> 12 : (o[b++] = 240 | c >>> 18, o[b++] = 128 | c >>> 12 & 63), o[b++] = 128 | c >>> 6 & 63), o[b++] = 128 | 63 & c);
- return o;
- }, i.buf2binstring = function(d) {
- return a(d, d.length);
- }, i.binstring2buf = function(d) {
- for (var o = new e.Buf8(d.length), c = 0, r = o.length; c < r; c++) o[c] = d.charCodeAt(c);
- return o;
- }, i.buf2string = function(d, o) {
- var c, r, h, b, u = o || d.length, m = new Array(2 * u);
- for (c = r = 0; c < u; ) if ((h = d[c++]) < 128) m[r++] = h;
- else if (4 < (b = l[h])) m[r++] = 65533, c += b - 1;
- else {
- for (h &= b === 2 ? 31 : b === 3 ? 15 : 7; 1 < b && c < u; ) h = h << 6 | 63 & d[c++], b--;
- 1 < b ? m[r++] = 65533 : h < 65536 ? m[r++] = h : (h -= 65536, m[r++] = 55296 | h >> 10 & 1023, m[r++] = 56320 | 1023 & h);
- }
- return a(m, r);
- }, i.utf8border = function(d, o) {
- var c;
- for ((o = o || d.length) > d.length && (o = d.length), c = o - 1; 0 <= c && (192 & d[c]) == 128; ) c--;
- return c < 0 || c === 0 ? o : c + l[d[c]] > o ? c : o;
- };
- }, { "./common": 41 }], 43: [function(g, C, i) {
- C.exports = function(e, A, s, l) {
- for (var n = 65535 & e | 0, a = e >>> 16 & 65535 | 0, d = 0; s !== 0; ) {
- for (s -= d = 2e3 < s ? 2e3 : s; a = a + (n = n + A[l++] | 0) | 0, --d; ) ;
- n %= 65521, a %= 65521;
- }
- return n | a << 16 | 0;
- };
- }, {}], 44: [function(g, C, i) {
- C.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };
- }, {}], 45: [function(g, C, i) {
- var e = function() {
- for (var A, s = [], l = 0; l < 256; l++) {
- A = l;
- for (var n = 0; n < 8; n++) A = 1 & A ? 3988292384 ^ A >>> 1 : A >>> 1;
- s[l] = A;
- }
- return s;
- }();
- C.exports = function(A, s, l, n) {
- var a = e, d = n + l;
- A ^= -1;
- for (var o = n; o < d; o++) A = A >>> 8 ^ a[255 & (A ^ s[o])];
- return -1 ^ A;
- };
- }, {}], 46: [function(g, C, i) {
- var e, A = g("../utils/common"), s = g("./trees"), l = g("./adler32"), n = g("./crc32"), a = g("./messages"), d = 0, o = 4, c = 0, r = -2, h = -1, b = 4, u = 2, m = 8, Z = 9, p = 286, Y = 30, R = 19, X = 2 * p + 1, H = 15, S = 3, z = 258, v = z + S + 1, K = 42, V = 113, N = 1, B = 2, G = 3, w = 4;
- function W(x, Ag) {
- return x.msg = a[Ag], Ag;
- }
- function y(x) {
- return (x << 1) - (4 < x ? 9 : 0);
- }
- function f(x) {
- for (var Ag = x.length; 0 <= --Ag; ) x[Ag] = 0;
- }
- function D(x) {
- var Ag = x.state, eg = Ag.pending;
- eg > x.avail_out && (eg = x.avail_out), eg !== 0 && (A.arraySet(x.output, Ag.pending_buf, Ag.pending_out, eg, x.next_out), x.next_out += eg, Ag.pending_out += eg, x.total_out += eg, x.avail_out -= eg, Ag.pending -= eg, Ag.pending === 0 && (Ag.pending_out = 0));
- }
- function F(x, Ag) {
- s._tr_flush_block(x, 0 <= x.block_start ? x.block_start : -1, x.strstart - x.block_start, Ag), x.block_start = x.strstart, D(x.strm);
- }
- function T(x, Ag) {
- x.pending_buf[x.pending++] = Ag;
- }
- function Q(x, Ag) {
- x.pending_buf[x.pending++] = Ag >>> 8 & 255, x.pending_buf[x.pending++] = 255 & Ag;
- }
- function P(x, Ag) {
- var eg, O, _ = x.max_chain_length, gg = x.strstart, lg = x.prev_length, ng = x.nice_match, sg = x.strstart > x.w_size - v ? x.strstart - (x.w_size - v) : 0, og = x.window, cg = x.w_mask, rg = x.prev, dg = x.strstart + z, Bg = og[gg + lg - 1], Zg = og[gg + lg];
- x.prev_length >= x.good_match && (_ >>= 2), ng > x.lookahead && (ng = x.lookahead);
- do
- if (og[(eg = Ag) + lg] === Zg && og[eg + lg - 1] === Bg && og[eg] === og[gg] && og[++eg] === og[gg + 1]) {
- gg += 2, eg++;
- do
- ;
- while (og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && gg < dg);
- if (O = z - (dg - gg), gg = dg - z, lg < O) {
- if (x.match_start = Ag, ng <= (lg = O)) break;
- Bg = og[gg + lg - 1], Zg = og[gg + lg];
- }
- }
- while ((Ag = rg[Ag & cg]) > sg && --_ != 0);
- return lg <= x.lookahead ? lg : x.lookahead;
- }
- function L(x) {
- var Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg = x.w_size;
- do {
- if (_ = x.window_size - x.lookahead - x.strstart, x.strstart >= rg + (rg - v)) {
- for (A.arraySet(x.window, x.window, rg, rg, 0), x.match_start -= rg, x.strstart -= rg, x.block_start -= rg, Ag = eg = x.hash_size; O = x.head[--Ag], x.head[Ag] = rg <= O ? O - rg : 0, --eg; ) ;
- for (Ag = eg = rg; O = x.prev[--Ag], x.prev[Ag] = rg <= O ? O - rg : 0, --eg; ) ;
- _ += rg;
- }
- if (x.strm.avail_in === 0) break;
- if (lg = x.strm, ng = x.window, sg = x.strstart + x.lookahead, og = _, cg = void 0, cg = lg.avail_in, og < cg && (cg = og), eg = cg === 0 ? 0 : (lg.avail_in -= cg, A.arraySet(ng, lg.input, lg.next_in, cg, sg), lg.state.wrap === 1 ? lg.adler = l(lg.adler, ng, cg, sg) : lg.state.wrap === 2 && (lg.adler = n(lg.adler, ng, cg, sg)), lg.next_in += cg, lg.total_in += cg, cg), x.lookahead += eg, x.lookahead + x.insert >= S) for (gg = x.strstart - x.insert, x.ins_h = x.window[gg], x.ins_h = (x.ins_h << x.hash_shift ^ x.window[gg + 1]) & x.hash_mask; x.insert && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[gg + S - 1]) & x.hash_mask, x.prev[gg & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = gg, gg++, x.insert--, !(x.lookahead + x.insert < S)); ) ;
- } while (x.lookahead < v && x.strm.avail_in !== 0);
- }
- function E(x, Ag) {
- for (var eg, O; ; ) {
- if (x.lookahead < v) {
- if (L(x), x.lookahead < v && Ag === d) return N;
- if (x.lookahead === 0) break;
- }
- if (eg = 0, x.lookahead >= S && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), eg !== 0 && x.strstart - eg <= x.w_size - v && (x.match_length = P(x, eg)), x.match_length >= S) if (O = s._tr_tally(x, x.strstart - x.match_start, x.match_length - S), x.lookahead -= x.match_length, x.match_length <= x.max_lazy_match && x.lookahead >= S) {
- for (x.match_length--; x.strstart++, x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart, --x.match_length != 0; ) ;
- x.strstart++;
- } else x.strstart += x.match_length, x.match_length = 0, x.ins_h = x.window[x.strstart], x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + 1]) & x.hash_mask;
- else O = s._tr_tally(x, 0, x.window[x.strstart]), x.lookahead--, x.strstart++;
- if (O && (F(x, !1), x.strm.avail_out === 0)) return N;
- }
- return x.insert = x.strstart < S - 1 ? x.strstart : S - 1, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : x.last_lit && (F(x, !1), x.strm.avail_out === 0) ? N : B;
- }
- function J(x, Ag) {
- for (var eg, O, _; ; ) {
- if (x.lookahead < v) {
- if (L(x), x.lookahead < v && Ag === d) return N;
- if (x.lookahead === 0) break;
- }
- if (eg = 0, x.lookahead >= S && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), x.prev_length = x.match_length, x.prev_match = x.match_start, x.match_length = S - 1, eg !== 0 && x.prev_length < x.max_lazy_match && x.strstart - eg <= x.w_size - v && (x.match_length = P(x, eg), x.match_length <= 5 && (x.strategy === 1 || x.match_length === S && 4096 < x.strstart - x.match_start) && (x.match_length = S - 1)), x.prev_length >= S && x.match_length <= x.prev_length) {
- for (_ = x.strstart + x.lookahead - S, O = s._tr_tally(x, x.strstart - 1 - x.prev_match, x.prev_length - S), x.lookahead -= x.prev_length - 1, x.prev_length -= 2; ++x.strstart <= _ && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), --x.prev_length != 0; ) ;
- if (x.match_available = 0, x.match_length = S - 1, x.strstart++, O && (F(x, !1), x.strm.avail_out === 0)) return N;
- } else if (x.match_available) {
- if ((O = s._tr_tally(x, 0, x.window[x.strstart - 1])) && F(x, !1), x.strstart++, x.lookahead--, x.strm.avail_out === 0) return N;
- } else x.match_available = 1, x.strstart++, x.lookahead--;
- }
- return x.match_available && (O = s._tr_tally(x, 0, x.window[x.strstart - 1]), x.match_available = 0), x.insert = x.strstart < S - 1 ? x.strstart : S - 1, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : x.last_lit && (F(x, !1), x.strm.avail_out === 0) ? N : B;
- }
- function k(x, Ag, eg, O, _) {
- this.good_length = x, this.max_lazy = Ag, this.nice_length = eg, this.max_chain = O, this.func = _;
- }
- function j() {
- this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = m, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new A.Buf16(2 * X), this.dyn_dtree = new A.Buf16(2 * (2 * Y + 1)), this.bl_tree = new A.Buf16(2 * (2 * R + 1)), f(this.dyn_ltree), f(this.dyn_dtree), f(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new A.Buf16(H + 1), this.heap = new A.Buf16(2 * p + 1), f(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new A.Buf16(2 * p + 1), f(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
- }
- function q(x) {
- var Ag;
- return x && x.state ? (x.total_in = x.total_out = 0, x.data_type = u, (Ag = x.state).pending = 0, Ag.pending_out = 0, Ag.wrap < 0 && (Ag.wrap = -Ag.wrap), Ag.status = Ag.wrap ? K : V, x.adler = Ag.wrap === 2 ? 0 : 1, Ag.last_flush = d, s._tr_init(Ag), c) : W(x, r);
- }
- function Cg(x) {
- var Ag = q(x);
- return Ag === c && function(eg) {
- eg.window_size = 2 * eg.w_size, f(eg.head), eg.max_lazy_match = e[eg.level].max_lazy, eg.good_match = e[eg.level].good_length, eg.nice_match = e[eg.level].nice_length, eg.max_chain_length = e[eg.level].max_chain, eg.strstart = 0, eg.block_start = 0, eg.lookahead = 0, eg.insert = 0, eg.match_length = eg.prev_length = S - 1, eg.match_available = 0, eg.ins_h = 0;
- }(x.state), Ag;
- }
- function Ig(x, Ag, eg, O, _, gg) {
- if (!x) return r;
- var lg = 1;
- if (Ag === h && (Ag = 6), O < 0 ? (lg = 0, O = -O) : 15 < O && (lg = 2, O -= 16), _ < 1 || Z < _ || eg !== m || O < 8 || 15 < O || Ag < 0 || 9 < Ag || gg < 0 || b < gg) return W(x, r);
- O === 8 && (O = 9);
- var ng = new j();
- return (x.state = ng).strm = x, ng.wrap = lg, ng.gzhead = null, ng.w_bits = O, ng.w_size = 1 << ng.w_bits, ng.w_mask = ng.w_size - 1, ng.hash_bits = _ + 7, ng.hash_size = 1 << ng.hash_bits, ng.hash_mask = ng.hash_size - 1, ng.hash_shift = ~~((ng.hash_bits + S - 1) / S), ng.window = new A.Buf8(2 * ng.w_size), ng.head = new A.Buf16(ng.hash_size), ng.prev = new A.Buf16(ng.w_size), ng.lit_bufsize = 1 << _ + 6, ng.pending_buf_size = 4 * ng.lit_bufsize, ng.pending_buf = new A.Buf8(ng.pending_buf_size), ng.d_buf = 1 * ng.lit_bufsize, ng.l_buf = 3 * ng.lit_bufsize, ng.level = Ag, ng.strategy = gg, ng.method = eg, Cg(x);
- }
- e = [new k(0, 0, 0, 0, function(x, Ag) {
- var eg = 65535;
- for (eg > x.pending_buf_size - 5 && (eg = x.pending_buf_size - 5); ; ) {
- if (x.lookahead <= 1) {
- if (L(x), x.lookahead === 0 && Ag === d) return N;
- if (x.lookahead === 0) break;
- }
- x.strstart += x.lookahead, x.lookahead = 0;
- var O = x.block_start + eg;
- if ((x.strstart === 0 || x.strstart >= O) && (x.lookahead = x.strstart - O, x.strstart = O, F(x, !1), x.strm.avail_out === 0) || x.strstart - x.block_start >= x.w_size - v && (F(x, !1), x.strm.avail_out === 0)) return N;
- }
- return x.insert = 0, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : (x.strstart > x.block_start && (F(x, !1), x.strm.avail_out), N);
- }), new k(4, 4, 8, 4, E), new k(4, 5, 16, 8, E), new k(4, 6, 32, 32, E), new k(4, 4, 16, 16, J), new k(8, 16, 32, 32, J), new k(8, 16, 128, 128, J), new k(8, 32, 128, 256, J), new k(32, 128, 258, 1024, J), new k(32, 258, 258, 4096, J)], i.deflateInit = function(x, Ag) {
- return Ig(x, Ag, m, 15, 8, 0);
- }, i.deflateInit2 = Ig, i.deflateReset = Cg, i.deflateResetKeep = q, i.deflateSetHeader = function(x, Ag) {
- return x && x.state ? x.state.wrap !== 2 ? r : (x.state.gzhead = Ag, c) : r;
- }, i.deflate = function(x, Ag) {
- var eg, O, _, gg;
- if (!x || !x.state || 5 < Ag || Ag < 0) return x ? W(x, r) : r;
- if (O = x.state, !x.output || !x.input && x.avail_in !== 0 || O.status === 666 && Ag !== o) return W(x, x.avail_out === 0 ? -5 : r);
- if (O.strm = x, eg = O.last_flush, O.last_flush = Ag, O.status === K) if (O.wrap === 2) x.adler = 0, T(O, 31), T(O, 139), T(O, 8), O.gzhead ? (T(O, (O.gzhead.text ? 1 : 0) + (O.gzhead.hcrc ? 2 : 0) + (O.gzhead.extra ? 4 : 0) + (O.gzhead.name ? 8 : 0) + (O.gzhead.comment ? 16 : 0)), T(O, 255 & O.gzhead.time), T(O, O.gzhead.time >> 8 & 255), T(O, O.gzhead.time >> 16 & 255), T(O, O.gzhead.time >> 24 & 255), T(O, O.level === 9 ? 2 : 2 <= O.strategy || O.level < 2 ? 4 : 0), T(O, 255 & O.gzhead.os), O.gzhead.extra && O.gzhead.extra.length && (T(O, 255 & O.gzhead.extra.length), T(O, O.gzhead.extra.length >> 8 & 255)), O.gzhead.hcrc && (x.adler = n(x.adler, O.pending_buf, O.pending, 0)), O.gzindex = 0, O.status = 69) : (T(O, 0), T(O, 0), T(O, 0), T(O, 0), T(O, 0), T(O, O.level === 9 ? 2 : 2 <= O.strategy || O.level < 2 ? 4 : 0), T(O, 3), O.status = V);
- else {
- var lg = m + (O.w_bits - 8 << 4) << 8;
- lg |= (2 <= O.strategy || O.level < 2 ? 0 : O.level < 6 ? 1 : O.level === 6 ? 2 : 3) << 6, O.strstart !== 0 && (lg |= 32), lg += 31 - lg % 31, O.status = V, Q(O, lg), O.strstart !== 0 && (Q(O, x.adler >>> 16), Q(O, 65535 & x.adler)), x.adler = 1;
- }
- if (O.status === 69) if (O.gzhead.extra) {
- for (_ = O.pending; O.gzindex < (65535 & O.gzhead.extra.length) && (O.pending !== O.pending_buf_size || (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending !== O.pending_buf_size)); ) T(O, 255 & O.gzhead.extra[O.gzindex]), O.gzindex++;
- O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), O.gzindex === O.gzhead.extra.length && (O.gzindex = 0, O.status = 73);
- } else O.status = 73;
- if (O.status === 73) if (O.gzhead.name) {
- _ = O.pending;
- do {
- if (O.pending === O.pending_buf_size && (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending === O.pending_buf_size)) {
- gg = 1;
- break;
- }
- gg = O.gzindex < O.gzhead.name.length ? 255 & O.gzhead.name.charCodeAt(O.gzindex++) : 0, T(O, gg);
- } while (gg !== 0);
- O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), gg === 0 && (O.gzindex = 0, O.status = 91);
- } else O.status = 91;
- if (O.status === 91) if (O.gzhead.comment) {
- _ = O.pending;
- do {
- if (O.pending === O.pending_buf_size && (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending === O.pending_buf_size)) {
- gg = 1;
- break;
- }
- gg = O.gzindex < O.gzhead.comment.length ? 255 & O.gzhead.comment.charCodeAt(O.gzindex++) : 0, T(O, gg);
- } while (gg !== 0);
- O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), gg === 0 && (O.status = 103);
- } else O.status = 103;
- if (O.status === 103 && (O.gzhead.hcrc ? (O.pending + 2 > O.pending_buf_size && D(x), O.pending + 2 <= O.pending_buf_size && (T(O, 255 & x.adler), T(O, x.adler >> 8 & 255), x.adler = 0, O.status = V)) : O.status = V), O.pending !== 0) {
- if (D(x), x.avail_out === 0) return O.last_flush = -1, c;
- } else if (x.avail_in === 0 && y(Ag) <= y(eg) && Ag !== o) return W(x, -5);
- if (O.status === 666 && x.avail_in !== 0) return W(x, -5);
- if (x.avail_in !== 0 || O.lookahead !== 0 || Ag !== d && O.status !== 666) {
- var ng = O.strategy === 2 ? function(sg, og) {
- for (var cg; ; ) {
- if (sg.lookahead === 0 && (L(sg), sg.lookahead === 0)) {
- if (og === d) return N;
- break;
- }
- if (sg.match_length = 0, cg = s._tr_tally(sg, 0, sg.window[sg.strstart]), sg.lookahead--, sg.strstart++, cg && (F(sg, !1), sg.strm.avail_out === 0)) return N;
- }
- return sg.insert = 0, og === o ? (F(sg, !0), sg.strm.avail_out === 0 ? G : w) : sg.last_lit && (F(sg, !1), sg.strm.avail_out === 0) ? N : B;
- }(O, Ag) : O.strategy === 3 ? function(sg, og) {
- for (var cg, rg, dg, Bg, Zg = sg.window; ; ) {
- if (sg.lookahead <= z) {
- if (L(sg), sg.lookahead <= z && og === d) return N;
- if (sg.lookahead === 0) break;
- }
- if (sg.match_length = 0, sg.lookahead >= S && 0 < sg.strstart && (rg = Zg[dg = sg.strstart - 1]) === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg]) {
- Bg = sg.strstart + z;
- do
- ;
- while (rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && dg < Bg);
- sg.match_length = z - (Bg - dg), sg.match_length > sg.lookahead && (sg.match_length = sg.lookahead);
- }
- if (sg.match_length >= S ? (cg = s._tr_tally(sg, 1, sg.match_length - S), sg.lookahead -= sg.match_length, sg.strstart += sg.match_length, sg.match_length = 0) : (cg = s._tr_tally(sg, 0, sg.window[sg.strstart]), sg.lookahead--, sg.strstart++), cg && (F(sg, !1), sg.strm.avail_out === 0)) return N;
- }
- return sg.insert = 0, og === o ? (F(sg, !0), sg.strm.avail_out === 0 ? G : w) : sg.last_lit && (F(sg, !1), sg.strm.avail_out === 0) ? N : B;
- }(O, Ag) : e[O.level].func(O, Ag);
- if (ng !== G && ng !== w || (O.status = 666), ng === N || ng === G) return x.avail_out === 0 && (O.last_flush = -1), c;
- if (ng === B && (Ag === 1 ? s._tr_align(O) : Ag !== 5 && (s._tr_stored_block(O, 0, 0, !1), Ag === 3 && (f(O.head), O.lookahead === 0 && (O.strstart = 0, O.block_start = 0, O.insert = 0))), D(x), x.avail_out === 0)) return O.last_flush = -1, c;
- }
- return Ag !== o ? c : O.wrap <= 0 ? 1 : (O.wrap === 2 ? (T(O, 255 & x.adler), T(O, x.adler >> 8 & 255), T(O, x.adler >> 16 & 255), T(O, x.adler >> 24 & 255), T(O, 255 & x.total_in), T(O, x.total_in >> 8 & 255), T(O, x.total_in >> 16 & 255), T(O, x.total_in >> 24 & 255)) : (Q(O, x.adler >>> 16), Q(O, 65535 & x.adler)), D(x), 0 < O.wrap && (O.wrap = -O.wrap), O.pending !== 0 ? c : 1);
- }, i.deflateEnd = function(x) {
- var Ag;
- return x && x.state ? (Ag = x.state.status) !== K && Ag !== 69 && Ag !== 73 && Ag !== 91 && Ag !== 103 && Ag !== V && Ag !== 666 ? W(x, r) : (x.state = null, Ag === V ? W(x, -3) : c) : r;
- }, i.deflateSetDictionary = function(x, Ag) {
- var eg, O, _, gg, lg, ng, sg, og, cg = Ag.length;
- if (!x || !x.state || (gg = (eg = x.state).wrap) === 2 || gg === 1 && eg.status !== K || eg.lookahead) return r;
- for (gg === 1 && (x.adler = l(x.adler, Ag, cg, 0)), eg.wrap = 0, cg >= eg.w_size && (gg === 0 && (f(eg.head), eg.strstart = 0, eg.block_start = 0, eg.insert = 0), og = new A.Buf8(eg.w_size), A.arraySet(og, Ag, cg - eg.w_size, eg.w_size, 0), Ag = og, cg = eg.w_size), lg = x.avail_in, ng = x.next_in, sg = x.input, x.avail_in = cg, x.next_in = 0, x.input = Ag, L(eg); eg.lookahead >= S; ) {
- for (O = eg.strstart, _ = eg.lookahead - (S - 1); eg.ins_h = (eg.ins_h << eg.hash_shift ^ eg.window[O + S - 1]) & eg.hash_mask, eg.prev[O & eg.w_mask] = eg.head[eg.ins_h], eg.head[eg.ins_h] = O, O++, --_; ) ;
- eg.strstart = O, eg.lookahead = S - 1, L(eg);
- }
- return eg.strstart += eg.lookahead, eg.block_start = eg.strstart, eg.insert = eg.lookahead, eg.lookahead = 0, eg.match_length = eg.prev_length = S - 1, eg.match_available = 0, x.next_in = ng, x.input = sg, x.avail_in = lg, eg.wrap = gg, c;
- }, i.deflateInfo = "pako deflate (from Nodeca project)";
- }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./messages": 51, "./trees": 52 }], 47: [function(g, C, i) {
- C.exports = function() {
- this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
- };
- }, {}], 48: [function(g, C, i) {
- C.exports = function(e, A) {
- var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B;
- s = e.state, l = e.next_in, N = e.input, n = l + (e.avail_in - 5), a = e.next_out, B = e.output, d = a - (A - e.avail_out), o = a + (e.avail_out - 257), c = s.dmax, r = s.wsize, h = s.whave, b = s.wnext, u = s.window, m = s.hold, Z = s.bits, p = s.lencode, Y = s.distcode, R = (1 << s.lenbits) - 1, X = (1 << s.distbits) - 1;
- g: do {
- Z < 15 && (m += N[l++] << Z, Z += 8, m += N[l++] << Z, Z += 8), H = p[m & R];
- I: for (; ; ) {
- if (m >>>= S = H >>> 24, Z -= S, (S = H >>> 16 & 255) === 0) B[a++] = 65535 & H;
- else {
- if (!(16 & S)) {
- if ((64 & S) == 0) {
- H = p[(65535 & H) + (m & (1 << S) - 1)];
- continue I;
- }
- if (32 & S) {
- s.mode = 12;
- break g;
- }
- e.msg = "invalid literal/length code", s.mode = 30;
- break g;
- }
- z = 65535 & H, (S &= 15) && (Z < S && (m += N[l++] << Z, Z += 8), z += m & (1 << S) - 1, m >>>= S, Z -= S), Z < 15 && (m += N[l++] << Z, Z += 8, m += N[l++] << Z, Z += 8), H = Y[m & X];
- C: for (; ; ) {
- if (m >>>= S = H >>> 24, Z -= S, !(16 & (S = H >>> 16 & 255))) {
- if ((64 & S) == 0) {
- H = Y[(65535 & H) + (m & (1 << S) - 1)];
- continue C;
- }
- e.msg = "invalid distance code", s.mode = 30;
- break g;
- }
- if (v = 65535 & H, Z < (S &= 15) && (m += N[l++] << Z, (Z += 8) < S && (m += N[l++] << Z, Z += 8)), c < (v += m & (1 << S) - 1)) {
- e.msg = "invalid distance too far back", s.mode = 30;
- break g;
- }
- if (m >>>= S, Z -= S, (S = a - d) < v) {
- if (h < (S = v - S) && s.sane) {
- e.msg = "invalid distance too far back", s.mode = 30;
- break g;
- }
- if (V = u, (K = 0) === b) {
- if (K += r - S, S < z) {
- for (z -= S; B[a++] = u[K++], --S; ) ;
- K = a - v, V = B;
- }
- } else if (b < S) {
- if (K += r + b - S, (S -= b) < z) {
- for (z -= S; B[a++] = u[K++], --S; ) ;
- if (K = 0, b < z) {
- for (z -= S = b; B[a++] = u[K++], --S; ) ;
- K = a - v, V = B;
- }
- }
- } else if (K += b - S, S < z) {
- for (z -= S; B[a++] = u[K++], --S; ) ;
- K = a - v, V = B;
- }
- for (; 2 < z; ) B[a++] = V[K++], B[a++] = V[K++], B[a++] = V[K++], z -= 3;
- z && (B[a++] = V[K++], 1 < z && (B[a++] = V[K++]));
- } else {
- for (K = a - v; B[a++] = B[K++], B[a++] = B[K++], B[a++] = B[K++], 2 < (z -= 3); ) ;
- z && (B[a++] = B[K++], 1 < z && (B[a++] = B[K++]));
- }
- break;
- }
- }
- break;
- }
- } while (l < n && a < o);
- l -= z = Z >> 3, m &= (1 << (Z -= z << 3)) - 1, e.next_in = l, e.next_out = a, e.avail_in = l < n ? n - l + 5 : 5 - (l - n), e.avail_out = a < o ? o - a + 257 : 257 - (a - o), s.hold = m, s.bits = Z;
- };
- }, {}], 49: [function(g, C, i) {
- var e = g("../utils/common"), A = g("./adler32"), s = g("./crc32"), l = g("./inffast"), n = g("./inftrees"), a = 1, d = 2, o = 0, c = -2, r = 1, h = 852, b = 592;
- function u(K) {
- return (K >>> 24 & 255) + (K >>> 8 & 65280) + ((65280 & K) << 8) + ((255 & K) << 24);
- }
- function m() {
- this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new e.Buf16(320), this.work = new e.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
- }
- function Z(K) {
- var V;
- return K && K.state ? (V = K.state, K.total_in = K.total_out = V.total = 0, K.msg = "", V.wrap && (K.adler = 1 & V.wrap), V.mode = r, V.last = 0, V.havedict = 0, V.dmax = 32768, V.head = null, V.hold = 0, V.bits = 0, V.lencode = V.lendyn = new e.Buf32(h), V.distcode = V.distdyn = new e.Buf32(b), V.sane = 1, V.back = -1, o) : c;
- }
- function p(K) {
- var V;
- return K && K.state ? ((V = K.state).wsize = 0, V.whave = 0, V.wnext = 0, Z(K)) : c;
- }
- function Y(K, V) {
- var N, B;
- return K && K.state ? (B = K.state, V < 0 ? (N = 0, V = -V) : (N = 1 + (V >> 4), V < 48 && (V &= 15)), V && (V < 8 || 15 < V) ? c : (B.window !== null && B.wbits !== V && (B.window = null), B.wrap = N, B.wbits = V, p(K))) : c;
- }
- function R(K, V) {
- var N, B;
- return K ? (B = new m(), (K.state = B).window = null, (N = Y(K, V)) !== o && (K.state = null), N) : c;
- }
- var X, H, S = !0;
- function z(K) {
- if (S) {
- var V;
- for (X = new e.Buf32(512), H = new e.Buf32(32), V = 0; V < 144; ) K.lens[V++] = 8;
- for (; V < 256; ) K.lens[V++] = 9;
- for (; V < 280; ) K.lens[V++] = 7;
- for (; V < 288; ) K.lens[V++] = 8;
- for (n(a, K.lens, 0, 288, X, 0, K.work, { bits: 9 }), V = 0; V < 32; ) K.lens[V++] = 5;
- n(d, K.lens, 0, 32, H, 0, K.work, { bits: 5 }), S = !1;
- }
- K.lencode = X, K.lenbits = 9, K.distcode = H, K.distbits = 5;
- }
- function v(K, V, N, B) {
- var G, w = K.state;
- return w.window === null && (w.wsize = 1 << w.wbits, w.wnext = 0, w.whave = 0, w.window = new e.Buf8(w.wsize)), B >= w.wsize ? (e.arraySet(w.window, V, N - w.wsize, w.wsize, 0), w.wnext = 0, w.whave = w.wsize) : (B < (G = w.wsize - w.wnext) && (G = B), e.arraySet(w.window, V, N - B, G, w.wnext), (B -= G) ? (e.arraySet(w.window, V, N - B, B, 0), w.wnext = B, w.whave = w.wsize) : (w.wnext += G, w.wnext === w.wsize && (w.wnext = 0), w.whave < w.wsize && (w.whave += G))), 0;
- }
- i.inflateReset = p, i.inflateReset2 = Y, i.inflateResetKeep = Z, i.inflateInit = function(K) {
- return R(K, 15);
- }, i.inflateInit2 = R, i.inflate = function(K, V) {
- var N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _ = 0, gg = new e.Buf8(4), lg = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
- if (!K || !K.state || !K.output || !K.input && K.avail_in !== 0) return c;
- (N = K.state).mode === 12 && (N.mode = 13), W = K.next_out, G = K.output, f = K.avail_out, w = K.next_in, B = K.input, y = K.avail_in, D = N.hold, F = N.bits, T = y, Q = f, Ag = o;
- g: for (; ; ) switch (N.mode) {
- case r:
- if (N.wrap === 0) {
- N.mode = 13;
- break;
- }
- for (; F < 16; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (2 & N.wrap && D === 35615) {
- gg[N.check = 0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0), F = D = 0, N.mode = 2;
- break;
- }
- if (N.flags = 0, N.head && (N.head.done = !1), !(1 & N.wrap) || (((255 & D) << 8) + (D >> 8)) % 31) {
- K.msg = "incorrect header check", N.mode = 30;
- break;
- }
- if ((15 & D) != 8) {
- K.msg = "unknown compression method", N.mode = 30;
- break;
- }
- if (F -= 4, x = 8 + (15 & (D >>>= 4)), N.wbits === 0) N.wbits = x;
- else if (x > N.wbits) {
- K.msg = "invalid window size", N.mode = 30;
- break;
- }
- N.dmax = 1 << x, K.adler = N.check = 1, N.mode = 512 & D ? 10 : 12, F = D = 0;
- break;
- case 2:
- for (; F < 16; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (N.flags = D, (255 & N.flags) != 8) {
- K.msg = "unknown compression method", N.mode = 30;
- break;
- }
- if (57344 & N.flags) {
- K.msg = "unknown header flags set", N.mode = 30;
- break;
- }
- N.head && (N.head.text = D >> 8 & 1), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0, N.mode = 3;
- case 3:
- for (; F < 32; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- N.head && (N.head.time = D), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, gg[2] = D >>> 16 & 255, gg[3] = D >>> 24 & 255, N.check = s(N.check, gg, 4, 0)), F = D = 0, N.mode = 4;
- case 4:
- for (; F < 16; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- N.head && (N.head.xflags = 255 & D, N.head.os = D >> 8), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0, N.mode = 5;
- case 5:
- if (1024 & N.flags) {
- for (; F < 16; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- N.length = D, N.head && (N.head.extra_len = D), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0;
- } else N.head && (N.head.extra = null);
- N.mode = 6;
- case 6:
- if (1024 & N.flags && (y < (P = N.length) && (P = y), P && (N.head && (x = N.head.extra_len - N.length, N.head.extra || (N.head.extra = new Array(N.head.extra_len)), e.arraySet(N.head.extra, B, w, P, x)), 512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, N.length -= P), N.length)) break g;
- N.length = 0, N.mode = 7;
- case 7:
- if (2048 & N.flags) {
- if (y === 0) break g;
- for (P = 0; x = B[w + P++], N.head && x && N.length < 65536 && (N.head.name += String.fromCharCode(x)), x && P < y; ) ;
- if (512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, x) break g;
- } else N.head && (N.head.name = null);
- N.length = 0, N.mode = 8;
- case 8:
- if (4096 & N.flags) {
- if (y === 0) break g;
- for (P = 0; x = B[w + P++], N.head && x && N.length < 65536 && (N.head.comment += String.fromCharCode(x)), x && P < y; ) ;
- if (512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, x) break g;
- } else N.head && (N.head.comment = null);
- N.mode = 9;
- case 9:
- if (512 & N.flags) {
- for (; F < 16; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (D !== (65535 & N.check)) {
- K.msg = "header crc mismatch", N.mode = 30;
- break;
- }
- F = D = 0;
- }
- N.head && (N.head.hcrc = N.flags >> 9 & 1, N.head.done = !0), K.adler = N.check = 0, N.mode = 12;
- break;
- case 10:
- for (; F < 32; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- K.adler = N.check = u(D), F = D = 0, N.mode = 11;
- case 11:
- if (N.havedict === 0) return K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, 2;
- K.adler = N.check = 1, N.mode = 12;
- case 12:
- if (V === 5 || V === 6) break g;
- case 13:
- if (N.last) {
- D >>>= 7 & F, F -= 7 & F, N.mode = 27;
- break;
- }
- for (; F < 3; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- switch (N.last = 1 & D, F -= 1, 3 & (D >>>= 1)) {
- case 0:
- N.mode = 14;
- break;
- case 1:
- if (z(N), N.mode = 20, V !== 6) break;
- D >>>= 2, F -= 2;
- break g;
- case 2:
- N.mode = 17;
- break;
- case 3:
- K.msg = "invalid block type", N.mode = 30;
- }
- D >>>= 2, F -= 2;
- break;
- case 14:
- for (D >>>= 7 & F, F -= 7 & F; F < 32; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if ((65535 & D) != (D >>> 16 ^ 65535)) {
- K.msg = "invalid stored block lengths", N.mode = 30;
- break;
- }
- if (N.length = 65535 & D, F = D = 0, N.mode = 15, V === 6) break g;
- case 15:
- N.mode = 16;
- case 16:
- if (P = N.length) {
- if (y < P && (P = y), f < P && (P = f), P === 0) break g;
- e.arraySet(G, B, w, P, W), y -= P, w += P, f -= P, W += P, N.length -= P;
- break;
- }
- N.mode = 12;
- break;
- case 17:
- for (; F < 14; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (N.nlen = 257 + (31 & D), D >>>= 5, F -= 5, N.ndist = 1 + (31 & D), D >>>= 5, F -= 5, N.ncode = 4 + (15 & D), D >>>= 4, F -= 4, 286 < N.nlen || 30 < N.ndist) {
- K.msg = "too many length or distance symbols", N.mode = 30;
- break;
- }
- N.have = 0, N.mode = 18;
- case 18:
- for (; N.have < N.ncode; ) {
- for (; F < 3; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- N.lens[lg[N.have++]] = 7 & D, D >>>= 3, F -= 3;
- }
- for (; N.have < 19; ) N.lens[lg[N.have++]] = 0;
- if (N.lencode = N.lendyn, N.lenbits = 7, eg = { bits: N.lenbits }, Ag = n(0, N.lens, 0, 19, N.lencode, 0, N.work, eg), N.lenbits = eg.bits, Ag) {
- K.msg = "invalid code lengths set", N.mode = 30;
- break;
- }
- N.have = 0, N.mode = 19;
- case 19:
- for (; N.have < N.nlen + N.ndist; ) {
- for (; k = (_ = N.lencode[D & (1 << N.lenbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (j < 16) D >>>= J, F -= J, N.lens[N.have++] = j;
- else {
- if (j === 16) {
- for (O = J + 2; F < O; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (D >>>= J, F -= J, N.have === 0) {
- K.msg = "invalid bit length repeat", N.mode = 30;
- break;
- }
- x = N.lens[N.have - 1], P = 3 + (3 & D), D >>>= 2, F -= 2;
- } else if (j === 17) {
- for (O = J + 3; F < O; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- F -= J, x = 0, P = 3 + (7 & (D >>>= J)), D >>>= 3, F -= 3;
- } else {
- for (O = J + 7; F < O; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- F -= J, x = 0, P = 11 + (127 & (D >>>= J)), D >>>= 7, F -= 7;
- }
- if (N.have + P > N.nlen + N.ndist) {
- K.msg = "invalid bit length repeat", N.mode = 30;
- break;
- }
- for (; P--; ) N.lens[N.have++] = x;
- }
- }
- if (N.mode === 30) break;
- if (N.lens[256] === 0) {
- K.msg = "invalid code -- missing end-of-block", N.mode = 30;
- break;
- }
- if (N.lenbits = 9, eg = { bits: N.lenbits }, Ag = n(a, N.lens, 0, N.nlen, N.lencode, 0, N.work, eg), N.lenbits = eg.bits, Ag) {
- K.msg = "invalid literal/lengths set", N.mode = 30;
- break;
- }
- if (N.distbits = 6, N.distcode = N.distdyn, eg = { bits: N.distbits }, Ag = n(d, N.lens, N.nlen, N.ndist, N.distcode, 0, N.work, eg), N.distbits = eg.bits, Ag) {
- K.msg = "invalid distances set", N.mode = 30;
- break;
- }
- if (N.mode = 20, V === 6) break g;
- case 20:
- N.mode = 21;
- case 21:
- if (6 <= y && 258 <= f) {
- K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, l(K, Q), W = K.next_out, G = K.output, f = K.avail_out, w = K.next_in, B = K.input, y = K.avail_in, D = N.hold, F = N.bits, N.mode === 12 && (N.back = -1);
- break;
- }
- for (N.back = 0; k = (_ = N.lencode[D & (1 << N.lenbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (k && (240 & k) == 0) {
- for (q = J, Cg = k, Ig = j; k = (_ = N.lencode[Ig + ((D & (1 << q + Cg) - 1) >> q)]) >>> 16 & 255, j = 65535 & _, !(q + (J = _ >>> 24) <= F); ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- D >>>= q, F -= q, N.back += q;
- }
- if (D >>>= J, F -= J, N.back += J, N.length = j, k === 0) {
- N.mode = 26;
- break;
- }
- if (32 & k) {
- N.back = -1, N.mode = 12;
- break;
- }
- if (64 & k) {
- K.msg = "invalid literal/length code", N.mode = 30;
- break;
- }
- N.extra = 15 & k, N.mode = 22;
- case 22:
- if (N.extra) {
- for (O = N.extra; F < O; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- N.length += D & (1 << N.extra) - 1, D >>>= N.extra, F -= N.extra, N.back += N.extra;
- }
- N.was = N.length, N.mode = 23;
- case 23:
- for (; k = (_ = N.distcode[D & (1 << N.distbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if ((240 & k) == 0) {
- for (q = J, Cg = k, Ig = j; k = (_ = N.distcode[Ig + ((D & (1 << q + Cg) - 1) >> q)]) >>> 16 & 255, j = 65535 & _, !(q + (J = _ >>> 24) <= F); ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- D >>>= q, F -= q, N.back += q;
- }
- if (D >>>= J, F -= J, N.back += J, 64 & k) {
- K.msg = "invalid distance code", N.mode = 30;
- break;
- }
- N.offset = j, N.extra = 15 & k, N.mode = 24;
- case 24:
- if (N.extra) {
- for (O = N.extra; F < O; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- N.offset += D & (1 << N.extra) - 1, D >>>= N.extra, F -= N.extra, N.back += N.extra;
- }
- if (N.offset > N.dmax) {
- K.msg = "invalid distance too far back", N.mode = 30;
- break;
- }
- N.mode = 25;
- case 25:
- if (f === 0) break g;
- if (P = Q - f, N.offset > P) {
- if ((P = N.offset - P) > N.whave && N.sane) {
- K.msg = "invalid distance too far back", N.mode = 30;
- break;
- }
- L = P > N.wnext ? (P -= N.wnext, N.wsize - P) : N.wnext - P, P > N.length && (P = N.length), E = N.window;
- } else E = G, L = W - N.offset, P = N.length;
- for (f < P && (P = f), f -= P, N.length -= P; G[W++] = E[L++], --P; ) ;
- N.length === 0 && (N.mode = 21);
- break;
- case 26:
- if (f === 0) break g;
- G[W++] = N.length, f--, N.mode = 21;
- break;
- case 27:
- if (N.wrap) {
- for (; F < 32; ) {
- if (y === 0) break g;
- y--, D |= B[w++] << F, F += 8;
- }
- if (Q -= f, K.total_out += Q, N.total += Q, Q && (K.adler = N.check = N.flags ? s(N.check, G, Q, W - Q) : A(N.check, G, Q, W - Q)), Q = f, (N.flags ? D : u(D)) !== N.check) {
- K.msg = "incorrect data check", N.mode = 30;
- break;
- }
- F = D = 0;
- }
- N.mode = 28;
- case 28:
- if (N.wrap && N.flags) {
- for (; F < 32; ) {
- if (y === 0) break g;
- y--, D += B[w++] << F, F += 8;
- }
- if (D !== (4294967295 & N.total)) {
- K.msg = "incorrect length check", N.mode = 30;
- break;
- }
- F = D = 0;
- }
- N.mode = 29;
- case 29:
- Ag = 1;
- break g;
- case 30:
- Ag = -3;
- break g;
- case 31:
- return -4;
- case 32:
- default:
- return c;
- }
- return K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, (N.wsize || Q !== K.avail_out && N.mode < 30 && (N.mode < 27 || V !== 4)) && v(K, K.output, K.next_out, Q - K.avail_out) ? (N.mode = 31, -4) : (T -= K.avail_in, Q -= K.avail_out, K.total_in += T, K.total_out += Q, N.total += Q, N.wrap && Q && (K.adler = N.check = N.flags ? s(N.check, G, Q, K.next_out - Q) : A(N.check, G, Q, K.next_out - Q)), K.data_type = N.bits + (N.last ? 64 : 0) + (N.mode === 12 ? 128 : 0) + (N.mode === 20 || N.mode === 15 ? 256 : 0), (T == 0 && Q === 0 || V === 4) && Ag === o && (Ag = -5), Ag);
- }, i.inflateEnd = function(K) {
- if (!K || !K.state) return c;
- var V = K.state;
- return V.window && (V.window = null), K.state = null, o;
- }, i.inflateGetHeader = function(K, V) {
- var N;
- return K && K.state ? (2 & (N = K.state).wrap) == 0 ? c : ((N.head = V).done = !1, o) : c;
- }, i.inflateSetDictionary = function(K, V) {
- var N, B = V.length;
- return K && K.state ? (N = K.state).wrap !== 0 && N.mode !== 11 ? c : N.mode === 11 && A(1, V, B, 0) !== N.check ? -3 : v(K, V, B, B) ? (N.mode = 31, -4) : (N.havedict = 1, o) : c;
- }, i.inflateInfo = "pako inflate (from Nodeca project)";
- }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./inffast": 48, "./inftrees": 50 }], 50: [function(g, C, i) {
- var e = g("../utils/common"), A = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], s = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], n = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
- C.exports = function(a, d, o, c, r, h, b, u) {
- var m, Z, p, Y, R, X, H, S, z, v = u.bits, K = 0, V = 0, N = 0, B = 0, G = 0, w = 0, W = 0, y = 0, f = 0, D = 0, F = null, T = 0, Q = new e.Buf16(16), P = new e.Buf16(16), L = null, E = 0;
- for (K = 0; K <= 15; K++) Q[K] = 0;
- for (V = 0; V < c; V++) Q[d[o + V]]++;
- for (G = v, B = 15; 1 <= B && Q[B] === 0; B--) ;
- if (B < G && (G = B), B === 0) return r[h++] = 20971520, r[h++] = 20971520, u.bits = 1, 0;
- for (N = 1; N < B && Q[N] === 0; N++) ;
- for (G < N && (G = N), K = y = 1; K <= 15; K++) if (y <<= 1, (y -= Q[K]) < 0) return -1;
- if (0 < y && (a === 0 || B !== 1)) return -1;
- for (P[1] = 0, K = 1; K < 15; K++) P[K + 1] = P[K] + Q[K];
- for (V = 0; V < c; V++) d[o + V] !== 0 && (b[P[d[o + V]]++] = V);
- if (X = a === 0 ? (F = L = b, 19) : a === 1 ? (F = A, T -= 257, L = s, E -= 257, 256) : (F = l, L = n, -1), K = N, R = h, W = V = D = 0, p = -1, Y = (f = 1 << (w = G)) - 1, a === 1 && 852 < f || a === 2 && 592 < f) return 1;
- for (; ; ) {
- for (H = K - W, z = b[V] < X ? (S = 0, b[V]) : b[V] > X ? (S = L[E + b[V]], F[T + b[V]]) : (S = 96, 0), m = 1 << K - W, N = Z = 1 << w; r[R + (D >> W) + (Z -= m)] = H << 24 | S << 16 | z | 0, Z !== 0; ) ;
- for (m = 1 << K - 1; D & m; ) m >>= 1;
- if (m !== 0 ? (D &= m - 1, D += m) : D = 0, V++, --Q[K] == 0) {
- if (K === B) break;
- K = d[o + b[V]];
- }
- if (G < K && (D & Y) !== p) {
- for (W === 0 && (W = G), R += N, y = 1 << (w = K - W); w + W < B && !((y -= Q[w + W]) <= 0); ) w++, y <<= 1;
- if (f += 1 << w, a === 1 && 852 < f || a === 2 && 592 < f) return 1;
- r[p = D & Y] = G << 24 | w << 16 | R - h | 0;
- }
- }
- return D !== 0 && (r[R + D] = K - W << 24 | 64 << 16 | 0), u.bits = G, 0;
- };
- }, { "../utils/common": 41 }], 51: [function(g, C, i) {
- C.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" };
- }, {}], 52: [function(g, C, i) {
- var e = g("../utils/common"), A = 0, s = 1;
- function l(_) {
- for (var gg = _.length; 0 <= --gg; ) _[gg] = 0;
- }
- var n = 0, a = 29, d = 256, o = d + 1 + a, c = 30, r = 19, h = 2 * o + 1, b = 15, u = 16, m = 7, Z = 256, p = 16, Y = 17, R = 18, X = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], H = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], S = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], z = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], v = new Array(2 * (o + 2));
- l(v);
- var K = new Array(2 * c);
- l(K);
- var V = new Array(512);
- l(V);
- var N = new Array(256);
- l(N);
- var B = new Array(a);
- l(B);
- var G, w, W, y = new Array(c);
- function f(_, gg, lg, ng, sg) {
- this.static_tree = _, this.extra_bits = gg, this.extra_base = lg, this.elems = ng, this.max_length = sg, this.has_stree = _ && _.length;
- }
- function D(_, gg) {
- this.dyn_tree = _, this.max_code = 0, this.stat_desc = gg;
- }
- function F(_) {
- return _ < 256 ? V[_] : V[256 + (_ >>> 7)];
- }
- function T(_, gg) {
- _.pending_buf[_.pending++] = 255 & gg, _.pending_buf[_.pending++] = gg >>> 8 & 255;
- }
- function Q(_, gg, lg) {
- _.bi_valid > u - lg ? (_.bi_buf |= gg << _.bi_valid & 65535, T(_, _.bi_buf), _.bi_buf = gg >> u - _.bi_valid, _.bi_valid += lg - u) : (_.bi_buf |= gg << _.bi_valid & 65535, _.bi_valid += lg);
- }
- function P(_, gg, lg) {
- Q(_, lg[2 * gg], lg[2 * gg + 1]);
- }
- function L(_, gg) {
- for (var lg = 0; lg |= 1 & _, _ >>>= 1, lg <<= 1, 0 < --gg; ) ;
- return lg >>> 1;
- }
- function E(_, gg, lg) {
- var ng, sg, og = new Array(b + 1), cg = 0;
- for (ng = 1; ng <= b; ng++) og[ng] = cg = cg + lg[ng - 1] << 1;
- for (sg = 0; sg <= gg; sg++) {
- var rg = _[2 * sg + 1];
- rg !== 0 && (_[2 * sg] = L(og[rg]++, rg));
- }
- }
- function J(_) {
- var gg;
- for (gg = 0; gg < o; gg++) _.dyn_ltree[2 * gg] = 0;
- for (gg = 0; gg < c; gg++) _.dyn_dtree[2 * gg] = 0;
- for (gg = 0; gg < r; gg++) _.bl_tree[2 * gg] = 0;
- _.dyn_ltree[2 * Z] = 1, _.opt_len = _.static_len = 0, _.last_lit = _.matches = 0;
- }
- function k(_) {
- 8 < _.bi_valid ? T(_, _.bi_buf) : 0 < _.bi_valid && (_.pending_buf[_.pending++] = _.bi_buf), _.bi_buf = 0, _.bi_valid = 0;
- }
- function j(_, gg, lg, ng) {
- var sg = 2 * gg, og = 2 * lg;
- return _[sg] < _[og] || _[sg] === _[og] && ng[gg] <= ng[lg];
- }
- function q(_, gg, lg) {
- for (var ng = _.heap[lg], sg = lg << 1; sg <= _.heap_len && (sg < _.heap_len && j(gg, _.heap[sg + 1], _.heap[sg], _.depth) && sg++, !j(gg, ng, _.heap[sg], _.depth)); ) _.heap[lg] = _.heap[sg], lg = sg, sg <<= 1;
- _.heap[lg] = ng;
- }
- function Cg(_, gg, lg) {
- var ng, sg, og, cg, rg = 0;
- if (_.last_lit !== 0) for (; ng = _.pending_buf[_.d_buf + 2 * rg] << 8 | _.pending_buf[_.d_buf + 2 * rg + 1], sg = _.pending_buf[_.l_buf + rg], rg++, ng === 0 ? P(_, sg, gg) : (P(_, (og = N[sg]) + d + 1, gg), (cg = X[og]) !== 0 && Q(_, sg -= B[og], cg), P(_, og = F(--ng), lg), (cg = H[og]) !== 0 && Q(_, ng -= y[og], cg)), rg < _.last_lit; ) ;
- P(_, Z, gg);
- }
- function Ig(_, gg) {
- var lg, ng, sg, og = gg.dyn_tree, cg = gg.stat_desc.static_tree, rg = gg.stat_desc.has_stree, dg = gg.stat_desc.elems, Bg = -1;
- for (_.heap_len = 0, _.heap_max = h, lg = 0; lg < dg; lg++) og[2 * lg] !== 0 ? (_.heap[++_.heap_len] = Bg = lg, _.depth[lg] = 0) : og[2 * lg + 1] = 0;
- for (; _.heap_len < 2; ) og[2 * (sg = _.heap[++_.heap_len] = Bg < 2 ? ++Bg : 0)] = 1, _.depth[sg] = 0, _.opt_len--, rg && (_.static_len -= cg[2 * sg + 1]);
- for (gg.max_code = Bg, lg = _.heap_len >> 1; 1 <= lg; lg--) q(_, og, lg);
- for (sg = dg; lg = _.heap[1], _.heap[1] = _.heap[_.heap_len--], q(_, og, 1), ng = _.heap[1], _.heap[--_.heap_max] = lg, _.heap[--_.heap_max] = ng, og[2 * sg] = og[2 * lg] + og[2 * ng], _.depth[sg] = (_.depth[lg] >= _.depth[ng] ? _.depth[lg] : _.depth[ng]) + 1, og[2 * lg + 1] = og[2 * ng + 1] = sg, _.heap[1] = sg++, q(_, og, 1), 2 <= _.heap_len; ) ;
- _.heap[--_.heap_max] = _.heap[1], function(Zg, Xg) {
- var Kg, kg, Wg, Ng, wg, fg, Jg = Xg.dyn_tree, zg = Xg.max_code, cI = Xg.stat_desc.static_tree, YI = Xg.stat_desc.has_stree, Eg = Xg.stat_desc.extra_bits, aI = Xg.stat_desc.extra_base, dI = Xg.stat_desc.max_length, _g = 0;
- for (Ng = 0; Ng <= b; Ng++) Zg.bl_count[Ng] = 0;
- for (Jg[2 * Zg.heap[Zg.heap_max] + 1] = 0, Kg = Zg.heap_max + 1; Kg < h; Kg++) dI < (Ng = Jg[2 * Jg[2 * (kg = Zg.heap[Kg]) + 1] + 1] + 1) && (Ng = dI, _g++), Jg[2 * kg + 1] = Ng, zg < kg || (Zg.bl_count[Ng]++, wg = 0, aI <= kg && (wg = Eg[kg - aI]), fg = Jg[2 * kg], Zg.opt_len += fg * (Ng + wg), YI && (Zg.static_len += fg * (cI[2 * kg + 1] + wg)));
- if (_g !== 0) {
- do {
- for (Ng = dI - 1; Zg.bl_count[Ng] === 0; ) Ng--;
- Zg.bl_count[Ng]--, Zg.bl_count[Ng + 1] += 2, Zg.bl_count[dI]--, _g -= 2;
- } while (0 < _g);
- for (Ng = dI; Ng !== 0; Ng--) for (kg = Zg.bl_count[Ng]; kg !== 0; ) zg < (Wg = Zg.heap[--Kg]) || (Jg[2 * Wg + 1] !== Ng && (Zg.opt_len += (Ng - Jg[2 * Wg + 1]) * Jg[2 * Wg], Jg[2 * Wg + 1] = Ng), kg--);
- }
- }(_, gg), E(og, Bg, _.bl_count);
- }
- function x(_, gg, lg) {
- var ng, sg, og = -1, cg = gg[1], rg = 0, dg = 7, Bg = 4;
- for (cg === 0 && (dg = 138, Bg = 3), gg[2 * (lg + 1) + 1] = 65535, ng = 0; ng <= lg; ng++) sg = cg, cg = gg[2 * (ng + 1) + 1], ++rg < dg && sg === cg || (rg < Bg ? _.bl_tree[2 * sg] += rg : sg !== 0 ? (sg !== og && _.bl_tree[2 * sg]++, _.bl_tree[2 * p]++) : rg <= 10 ? _.bl_tree[2 * Y]++ : _.bl_tree[2 * R]++, og = sg, Bg = (rg = 0) === cg ? (dg = 138, 3) : sg === cg ? (dg = 6, 3) : (dg = 7, 4));
- }
- function Ag(_, gg, lg) {
- var ng, sg, og = -1, cg = gg[1], rg = 0, dg = 7, Bg = 4;
- for (cg === 0 && (dg = 138, Bg = 3), ng = 0; ng <= lg; ng++) if (sg = cg, cg = gg[2 * (ng + 1) + 1], !(++rg < dg && sg === cg)) {
- if (rg < Bg) for (; P(_, sg, _.bl_tree), --rg != 0; ) ;
- else sg !== 0 ? (sg !== og && (P(_, sg, _.bl_tree), rg--), P(_, p, _.bl_tree), Q(_, rg - 3, 2)) : rg <= 10 ? (P(_, Y, _.bl_tree), Q(_, rg - 3, 3)) : (P(_, R, _.bl_tree), Q(_, rg - 11, 7));
- og = sg, Bg = (rg = 0) === cg ? (dg = 138, 3) : sg === cg ? (dg = 6, 3) : (dg = 7, 4);
- }
- }
- l(y);
- var eg = !1;
- function O(_, gg, lg, ng) {
- Q(_, (n << 1) + (ng ? 1 : 0), 3), function(sg, og, cg, rg) {
- k(sg), T(sg, cg), T(sg, ~cg), e.arraySet(sg.pending_buf, sg.window, og, cg, sg.pending), sg.pending += cg;
- }(_, gg, lg);
- }
- i._tr_init = function(_) {
- eg || (function() {
- var gg, lg, ng, sg, og, cg = new Array(b + 1);
- for (sg = ng = 0; sg < a - 1; sg++) for (B[sg] = ng, gg = 0; gg < 1 << X[sg]; gg++) N[ng++] = sg;
- for (N[ng - 1] = sg, sg = og = 0; sg < 16; sg++) for (y[sg] = og, gg = 0; gg < 1 << H[sg]; gg++) V[og++] = sg;
- for (og >>= 7; sg < c; sg++) for (y[sg] = og << 7, gg = 0; gg < 1 << H[sg] - 7; gg++) V[256 + og++] = sg;
- for (lg = 0; lg <= b; lg++) cg[lg] = 0;
- for (gg = 0; gg <= 143; ) v[2 * gg + 1] = 8, gg++, cg[8]++;
- for (; gg <= 255; ) v[2 * gg + 1] = 9, gg++, cg[9]++;
- for (; gg <= 279; ) v[2 * gg + 1] = 7, gg++, cg[7]++;
- for (; gg <= 287; ) v[2 * gg + 1] = 8, gg++, cg[8]++;
- for (E(v, o + 1, cg), gg = 0; gg < c; gg++) K[2 * gg + 1] = 5, K[2 * gg] = L(gg, 5);
- G = new f(v, X, d + 1, o, b), w = new f(K, H, 0, c, b), W = new f(new Array(0), S, 0, r, m);
- }(), eg = !0), _.l_desc = new D(_.dyn_ltree, G), _.d_desc = new D(_.dyn_dtree, w), _.bl_desc = new D(_.bl_tree, W), _.bi_buf = 0, _.bi_valid = 0, J(_);
- }, i._tr_stored_block = O, i._tr_flush_block = function(_, gg, lg, ng) {
- var sg, og, cg = 0;
- 0 < _.level ? (_.strm.data_type === 2 && (_.strm.data_type = function(rg) {
- var dg, Bg = 4093624447;
- for (dg = 0; dg <= 31; dg++, Bg >>>= 1) if (1 & Bg && rg.dyn_ltree[2 * dg] !== 0) return A;
- if (rg.dyn_ltree[18] !== 0 || rg.dyn_ltree[20] !== 0 || rg.dyn_ltree[26] !== 0) return s;
- for (dg = 32; dg < d; dg++) if (rg.dyn_ltree[2 * dg] !== 0) return s;
- return A;
- }(_)), Ig(_, _.l_desc), Ig(_, _.d_desc), cg = function(rg) {
- var dg;
- for (x(rg, rg.dyn_ltree, rg.l_desc.max_code), x(rg, rg.dyn_dtree, rg.d_desc.max_code), Ig(rg, rg.bl_desc), dg = r - 1; 3 <= dg && rg.bl_tree[2 * z[dg] + 1] === 0; dg--) ;
- return rg.opt_len += 3 * (dg + 1) + 5 + 5 + 4, dg;
- }(_), sg = _.opt_len + 3 + 7 >>> 3, (og = _.static_len + 3 + 7 >>> 3) <= sg && (sg = og)) : sg = og = lg + 5, lg + 4 <= sg && gg !== -1 ? O(_, gg, lg, ng) : _.strategy === 4 || og === sg ? (Q(_, 2 + (ng ? 1 : 0), 3), Cg(_, v, K)) : (Q(_, 4 + (ng ? 1 : 0), 3), function(rg, dg, Bg, Zg) {
- var Xg;
- for (Q(rg, dg - 257, 5), Q(rg, Bg - 1, 5), Q(rg, Zg - 4, 4), Xg = 0; Xg < Zg; Xg++) Q(rg, rg.bl_tree[2 * z[Xg] + 1], 3);
- Ag(rg, rg.dyn_ltree, dg - 1), Ag(rg, rg.dyn_dtree, Bg - 1);
- }(_, _.l_desc.max_code + 1, _.d_desc.max_code + 1, cg + 1), Cg(_, _.dyn_ltree, _.dyn_dtree)), J(_), ng && k(_);
- }, i._tr_tally = function(_, gg, lg) {
- return _.pending_buf[_.d_buf + 2 * _.last_lit] = gg >>> 8 & 255, _.pending_buf[_.d_buf + 2 * _.last_lit + 1] = 255 & gg, _.pending_buf[_.l_buf + _.last_lit] = 255 & lg, _.last_lit++, gg === 0 ? _.dyn_ltree[2 * lg]++ : (_.matches++, gg--, _.dyn_ltree[2 * (N[lg] + d + 1)]++, _.dyn_dtree[2 * F(gg)]++), _.last_lit === _.lit_bufsize - 1;
- }, i._tr_align = function(_) {
- Q(_, 2, 3), P(_, Z, v), function(gg) {
- gg.bi_valid === 16 ? (T(gg, gg.bi_buf), gg.bi_buf = 0, gg.bi_valid = 0) : 8 <= gg.bi_valid && (gg.pending_buf[gg.pending++] = 255 & gg.bi_buf, gg.bi_buf >>= 8, gg.bi_valid -= 8);
- }(_);
- };
- }, { "../utils/common": 41 }], 53: [function(g, C, i) {
- C.exports = function() {
- this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
- };
- }, {}], 54: [function(g, C, i) {
- (function(e) {
- (function(A, s) {
- if (!A.setImmediate) {
- var l, n, a, d, o = 1, c = {}, r = !1, h = A.document, b = Object.getPrototypeOf && Object.getPrototypeOf(A);
- b = b && b.setTimeout ? b : A, l = {}.toString.call(A.process) === "[object process]" ? function(p) {
- process.nextTick(function() {
- m(p);
- });
- } : function() {
- if (A.postMessage && !A.importScripts) {
- var p = !0, Y = A.onmessage;
- return A.onmessage = function() {
- p = !1;
- }, A.postMessage("", "*"), A.onmessage = Y, p;
- }
- }() ? (d = "setImmediate$" + Math.random() + "$", A.addEventListener ? A.addEventListener("message", Z, !1) : A.attachEvent("onmessage", Z), function(p) {
- A.postMessage(d + p, "*");
- }) : A.MessageChannel ? ((a = new MessageChannel()).port1.onmessage = function(p) {
- m(p.data);
- }, function(p) {
- a.port2.postMessage(p);
- }) : h && "onreadystatechange" in h.createElement("script") ? (n = h.documentElement, function(p) {
- var Y = h.createElement("script");
- Y.onreadystatechange = function() {
- m(p), Y.onreadystatechange = null, n.removeChild(Y), Y = null;
- }, n.appendChild(Y);
- }) : function(p) {
- setTimeout(m, 0, p);
- }, b.setImmediate = function(p) {
- typeof p != "function" && (p = new Function("" + p));
- for (var Y = new Array(arguments.length - 1), R = 0; R < Y.length; R++) Y[R] = arguments[R + 1];
- var X = { callback: p, args: Y };
- return c[o] = X, l(o), o++;
- }, b.clearImmediate = u;
- }
- function u(p) {
- delete c[p];
- }
- function m(p) {
- if (r) setTimeout(m, 0, p);
- else {
- var Y = c[p];
- if (Y) {
- r = !0;
- try {
- (function(R) {
- var X = R.callback, H = R.args;
- switch (H.length) {
- case 0:
- X();
- break;
- case 1:
- X(H[0]);
- break;
- case 2:
- X(H[0], H[1]);
- break;
- case 3:
- X(H[0], H[1], H[2]);
- break;
- default:
- X.apply(s, H);
- }
- })(Y);
- } finally {
- u(p), r = !1;
- }
- }
- }
- }
- function Z(p) {
- p.source === A && typeof p.data == "string" && p.data.indexOf(d) === 0 && m(+p.data.slice(d.length));
- }
- })(typeof self > "u" ? e === void 0 ? this : e : self);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}] }, {}, [10])(10);
- });
- }(FH)), FH.exports;
- }
- var rag = dag();
- const hag = /* @__PURE__ */ u$(rag);
- var At;
- (function(t) {
- t.OfficeDocument = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", t.FontTable = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable", t.Image = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", t.Numbering = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering", t.Styles = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", t.StylesWithEffects = "http://schemas.microsoft.com/office/2007/relationships/stylesWithEffects", t.Theme = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", t.Settings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings", t.WebSettings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings", t.Hyperlink = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", t.Footnotes = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes", t.Endnotes = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes", t.Footer = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", t.Header = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", t.ExtendedProperties = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", t.CoreProperties = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", t.CustomProperties = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/custom-properties", t.Comments = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", t.CommentsExtended = "http://schemas.microsoft.com/office/2011/relationships/commentsExtended", t.AltChunk = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk";
- })(At || (At = {}));
- function bag(t, I) {
- return I.elements(t).map((g) => ({
- id: I.attr(g, "Id"),
- type: I.attr(g, "Type"),
- target: I.attr(g, "Target"),
- targetMode: I.attr(g, "TargetMode")
- }));
- }
- function uag(t) {
- return t == null ? void 0 : t.replace(/[ .]+/g, "-").replace(/[&]+/g, "and").toLowerCase();
- }
- function xX(t) {
- return /^[^"'].*\s.*[^"']$/.test(t) ? `'${t}'` : t;
- }
- function lN(t) {
- let I = t.lastIndexOf("/") + 1, g = I == 0 ? "" : t.substring(0, I), C = I == 0 ? t : t.substring(I);
- return [g, C];
- }
- function kH(t, I) {
- try {
- const g = "http://docx/";
- return new URL(t, g + I).toString().substring(g.length);
- } catch {
- return `${I}${t}`;
- }
- }
- function ea(t, I) {
- return t.reduce((g, C) => (g[I(C)] = C, g), {});
- }
- function mag(t) {
- return new Promise((I, g) => {
- const C = new FileReader();
- C.onloadend = () => I(C.result), C.onerror = () => g(), C.readAsDataURL(t);
- });
- }
- function zH(t) {
- return t && typeof t == "object" && !Array.isArray(t);
- }
- function Zag(t) {
- return typeof t == "string" || t instanceof String;
- }
- function gV(t, ...I) {
- if (!I.length)
- return t;
- const g = I.shift();
- if (zH(t) && zH(g))
- for (const C in g)
- if (zH(g[C])) {
- const i = t[C] ?? (t[C] = {});
- gV(i, g[C]);
- } else
- t[C] = g[C];
- return gV(t, ...I);
- }
- function Ru(t) {
- return Array.isArray(t) ? t : [t];
- }
- function Gag(t, I, g) {
- return I > t ? I : g < t ? g : t;
- }
- const m$ = {
- wordml: "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
- }, st = {
- Dxa: { mul: 0.05, unit: "pt" },
- Emu: { mul: 1 / 12700, unit: "pt" },
- FontSize: { mul: 0.5, unit: "pt" },
- Border: { mul: 0.125, unit: "pt", min: 0.25, max: 12 },
- Point: { mul: 1, unit: "pt" },
- Percent: { mul: 0.02, unit: "%" }
- };
- function Z$(t, I = st.Dxa) {
- if (t == null || /.+(p[xt]|[%])$/.test(t))
- return t;
- var g = parseInt(t) * I.mul;
- return I.min && I.max && (g = Gag(g, I.min, I.max)), `${g.toFixed(2)}${I.unit}`;
- }
- function wag(t, I = !1) {
- switch (t) {
- case "1":
- return !0;
- case "0":
- return !1;
- case "on":
- return !0;
- case "off":
- return !1;
- case "true":
- return !0;
- case "false":
- return !1;
- default:
- return I;
- }
- }
- function G$(t, I, g) {
- if (t.namespaceURI != m$.wordml)
- return !1;
- switch (t.localName) {
- case "color":
- I.color = g.attr(t, "val");
- break;
- case "sz":
- I.fontSize = g.lengthAttr(t, "val", st.FontSize);
- break;
- default:
- return !1;
- }
- return !0;
- }
- function pag(t, I = !1) {
- I && (t = t.replace(/<[?].*[?]>/, "")), t = Wag(t);
- const g = new DOMParser().parseFromString(t, "application/xml"), C = Bag(g);
- if (C)
- throw new Error(C);
- return g;
- }
- function Bag(t) {
- var I;
- return (I = t.getElementsByTagName("parsererror")[0]) == null ? void 0 : I.textContent;
- }
- function Wag(t) {
- return t.charCodeAt(0) === 65279 ? t.substring(1) : t;
- }
- function yag(t) {
- return new XMLSerializer().serializeToString(t);
- }
- class w$ {
- elements(I, g = null) {
- const C = [];
- for (let i = 0, e = I.childNodes.length; i < e; i++) {
- let A = I.childNodes.item(i);
- A.nodeType == 1 && (g == null || A.localName == g) && C.push(A);
- }
- return C;
- }
- element(I, g) {
- for (let C = 0, i = I.childNodes.length; C < i; C++) {
- let e = I.childNodes.item(C);
- if (e.nodeType == 1 && e.localName == g)
- return e;
- }
- return null;
- }
- elementAttr(I, g, C) {
- var i = this.element(I, g);
- return i ? this.attr(i, C) : void 0;
- }
- attrs(I) {
- return Array.from(I.attributes);
- }
- attr(I, g) {
- for (let C = 0, i = I.attributes.length; C < i; C++) {
- let e = I.attributes.item(C);
- if (e.localName == g)
- return e.value;
- }
- return null;
- }
- intAttr(I, g, C = null) {
- var i = this.attr(I, g);
- return i ? parseInt(i) : C;
- }
- hexAttr(I, g, C = null) {
- var i = this.attr(I, g);
- return i ? parseInt(i, 16) : C;
- }
- floatAttr(I, g, C = null) {
- var i = this.attr(I, g);
- return i ? parseFloat(i) : C;
- }
- boolAttr(I, g, C = null) {
- return wag(this.attr(I, g), C);
- }
- lengthAttr(I, g, C = st.Dxa) {
- return Z$(this.attr(I, g), C);
- }
- }
- const ug = new w$();
- class Re {
- constructor(I, g) {
- this._package = I, this.path = g;
- }
- async load() {
- this.rels = await this._package.loadRelationships(this.path);
- const I = await this._package.load(this.path), g = this._package.parseXmlDocument(I);
- this._package.options.keepOrigin && (this._xmlDocument = g), this.parseXml(g.firstElementChild);
- }
- save() {
- this._package.update(this.path, yag(this._xmlDocument));
- }
- parseXml(I) {
- }
- }
- const Yag = {
- embedRegular: "regular",
- embedBold: "bold",
- embedItalic: "italic",
- embedBoldItalic: "boldItalic"
- };
- function Nag(t, I) {
- return I.elements(t).map((g) => Vag(g, I));
- }
- function Vag(t, I) {
- let g = {
- name: I.attr(t, "name"),
- embedFontRefs: []
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "family":
- g.family = I.attr(C, "val");
- break;
- case "altName":
- g.altName = I.attr(C, "val");
- break;
- case "embedRegular":
- case "embedBold":
- case "embedItalic":
- case "embedBoldItalic":
- g.embedFontRefs.push(Mag(C, I));
- break;
- }
- return g;
- }
- function Mag(t, I) {
- return {
- id: I.attr(t, "id"),
- key: I.attr(t, "fontKey"),
- type: Yag[t.localName]
- };
- }
- class Rag extends Re {
- parseXml(I) {
- this.fonts = Nag(I, this._package.xmlParser);
- }
- }
- class l9 {
- constructor(I, g) {
- this._zip = I, this.options = g, this.xmlParser = new w$();
- }
- get(I) {
- const g = fag(I);
- return this._zip.files[g] ?? this._zip.files[g.replace(/\//g, "\\")];
- }
- update(I, g) {
- this._zip.file(I, g);
- }
- static async load(I, g) {
- const C = await hag.loadAsync(I);
- return new l9(C, g);
- }
- save(I = "blob") {
- return this._zip.generateAsync({ type: I });
- }
- load(I, g = "string") {
- var C;
- return ((C = this.get(I)) == null ? void 0 : C.async(g)) ?? Promise.resolve(null);
- }
- async loadRelationships(I = null) {
- let g = "_rels/.rels";
- if (I != null) {
- const [i, e] = lN(I);
- g = `${i}_rels/${e}.rels`;
- }
- const C = await this.load(g);
- return C ? bag(this.parseXmlDocument(C).firstElementChild, this.xmlParser) : null;
- }
- parseXmlDocument(I) {
- return pag(I, this.options.trimXmlDeclaration);
- }
- }
- function fag(t) {
- return t.startsWith("/") ? t.substr(1) : t;
- }
- class Hag extends Re {
- constructor(I, g, C) {
- super(I, g), this._documentParser = C;
- }
- parseXml(I) {
- this.body = this._documentParser.parseDocumentFile(I);
- }
- }
- function KY(t, I) {
- return {
- type: I.attr(t, "val"),
- color: I.attr(t, "color"),
- size: I.lengthAttr(t, "sz", st.Border),
- offset: I.lengthAttr(t, "space", st.Point),
- frame: I.boolAttr(t, "frame"),
- shadow: I.boolAttr(t, "shadow")
- };
- }
- function Xag(t, I) {
- var g = {};
- for (let C of I.elements(t))
- switch (C.localName) {
- case "left":
- g.left = KY(C, I);
- break;
- case "top":
- g.top = KY(C, I);
- break;
- case "right":
- g.right = KY(C, I);
- break;
- case "bottom":
- g.bottom = KY(C, I);
- break;
- }
- return g;
- }
- var v6;
- (function(t) {
- t.Continuous = "continuous", t.NextPage = "nextPage", t.NextColumn = "nextColumn", t.EvenPage = "evenPage", t.OddPage = "oddPage";
- })(v6 || (v6 = {}));
- function p$(t, I = ug) {
- var g = {};
- for (let C of I.elements(t))
- switch (C.localName) {
- case "pgSz":
- g.pageSize = {
- width: I.lengthAttr(C, "w"),
- height: I.lengthAttr(C, "h"),
- orientation: I.attr(C, "orient")
- };
- break;
- case "type":
- g.type = I.attr(C, "val");
- break;
- case "pgMar":
- g.pageMargins = {
- left: I.lengthAttr(C, "left"),
- right: I.lengthAttr(C, "right"),
- top: I.lengthAttr(C, "top"),
- bottom: I.lengthAttr(C, "bottom"),
- header: I.lengthAttr(C, "header"),
- footer: I.lengthAttr(C, "footer"),
- gutter: I.lengthAttr(C, "gutter")
- };
- break;
- case "cols":
- g.columns = Sag(C, I);
- break;
- case "headerReference":
- (g.headerRefs ?? (g.headerRefs = [])).push(T6(C, I));
- break;
- case "footerReference":
- (g.footerRefs ?? (g.footerRefs = [])).push(T6(C, I));
- break;
- case "titlePg":
- g.titlePage = I.boolAttr(C, "val", !0);
- break;
- case "pgBorders":
- g.pageBorders = Xag(C, I);
- break;
- case "pgNumType":
- g.pageNumber = Dag(C, I);
- break;
- }
- return g;
- }
- function Sag(t, I) {
- return {
- numberOfColumns: I.intAttr(t, "num"),
- space: I.lengthAttr(t, "space"),
- separator: I.boolAttr(t, "sep"),
- equalWidth: I.boolAttr(t, "equalWidth", !0),
- columns: I.elements(t, "col").map((g) => ({
- width: I.lengthAttr(g, "w"),
- space: I.lengthAttr(g, "space")
- }))
- };
- }
- function Dag(t, I) {
- return {
- chapSep: I.attr(t, "chapSep"),
- chapStyle: I.attr(t, "chapStyle"),
- format: I.attr(t, "fmt"),
- start: I.intAttr(t, "start")
- };
- }
- function T6(t, I) {
- return {
- id: I.attr(t, "id"),
- type: I.attr(t, "type")
- };
- }
- function Kag(t, I) {
- return {
- before: I.lengthAttr(t, "before"),
- after: I.lengthAttr(t, "after"),
- line: I.intAttr(t, "line"),
- lineRule: I.attr(t, "lineRule")
- };
- }
- function n9(t, I) {
- let g = {};
- for (let C of I.elements(t))
- Fag(C, g, I);
- return g;
- }
- function Fag(t, I, g) {
- return !!G$(t, I, g);
- }
- function B$(t, I) {
- let g = {};
- for (let C of I.elements(t))
- W$(C, g, I);
- return g;
- }
- function W$(t, I, g) {
- if (t.namespaceURI != m$.wordml)
- return !1;
- if (G$(t, I, g))
- return !0;
- switch (t.localName) {
- case "tabs":
- I.tabs = kag(t, g);
- break;
- case "sectPr":
- I.sectionProps = p$(t, g);
- break;
- case "numPr":
- I.numbering = zag(t, g);
- break;
- case "spacing":
- return I.lineSpacing = Kag(t, g), !1;
- case "textAlignment":
- return I.textAlignment = g.attr(t, "val"), !1;
- case "keepLines":
- I.keepLines = g.boolAttr(t, "val", !0);
- break;
- case "keepNext":
- I.keepNext = g.boolAttr(t, "val", !0);
- break;
- case "pageBreakBefore":
- I.pageBreakBefore = g.boolAttr(t, "val", !0);
- break;
- case "outlineLvl":
- I.outlineLevel = g.intAttr(t, "val");
- break;
- case "pStyle":
- I.styleName = g.attr(t, "val");
- break;
- case "rPr":
- I.runProps = n9(t, g);
- break;
- default:
- return !1;
- }
- return !0;
- }
- function kag(t, I) {
- return I.elements(t, "tab").map((g) => ({
- position: I.lengthAttr(g, "pos"),
- leader: I.attr(g, "leader"),
- style: I.attr(g, "val")
- }));
- }
- function zag(t, I) {
- var g = {};
- for (let C of I.elements(t))
- switch (C.localName) {
- case "numId":
- g.id = I.attr(C, "val");
- break;
- case "ilvl":
- g.level = I.intAttr(C, "val");
- break;
- }
- return g;
- }
- function Jag(t, I) {
- let g = {
- numberings: [],
- abstractNumberings: [],
- bulletPictures: []
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "num":
- g.numberings.push(Lag(C, I));
- break;
- case "abstractNum":
- g.abstractNumberings.push(vag(C, I));
- break;
- case "numPicBullet":
- g.bulletPictures.push(xag(C, I));
- break;
- }
- return g;
- }
- function Lag(t, I) {
- let g = {
- id: I.attr(t, "numId"),
- overrides: []
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "abstractNumId":
- g.abstractId = I.attr(C, "val");
- break;
- case "lvlOverride":
- g.overrides.push(Tag(C, I));
- break;
- }
- return g;
- }
- function vag(t, I) {
- let g = {
- id: I.attr(t, "abstractNumId"),
- levels: []
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "name":
- g.name = I.attr(C, "val");
- break;
- case "multiLevelType":
- g.multiLevelType = I.attr(C, "val");
- break;
- case "numStyleLink":
- g.numberingStyleLink = I.attr(C, "val");
- break;
- case "styleLink":
- g.styleLink = I.attr(C, "val");
- break;
- case "lvl":
- g.levels.push(y$(C, I));
- break;
- }
- return g;
- }
- function y$(t, I) {
- let g = {
- level: I.intAttr(t, "ilvl")
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "start":
- g.start = I.attr(C, "val");
- break;
- case "lvlRestart":
- g.restart = I.intAttr(C, "val");
- break;
- case "numFmt":
- g.format = I.attr(C, "val");
- break;
- case "lvlText":
- g.text = I.attr(C, "val");
- break;
- case "lvlJc":
- g.justification = I.attr(C, "val");
- break;
- case "lvlPicBulletId":
- g.bulletPictureId = I.attr(C, "val");
- break;
- case "pStyle":
- g.paragraphStyle = I.attr(C, "val");
- break;
- case "pPr":
- g.paragraphProps = B$(C, I);
- break;
- case "rPr":
- g.runProps = n9(C, I);
- break;
- }
- return g;
- }
- function Tag(t, I) {
- let g = {
- level: I.intAttr(t, "ilvl")
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "startOverride":
- g.start = I.intAttr(C, "val");
- break;
- case "lvl":
- g.numberingLevel = y$(C, I);
- break;
- }
- return g;
- }
- function xag(t, I) {
- var g = I.element(t, "pict"), C = g && I.element(g, "shape"), i = C && I.element(C, "imagedata");
- return i ? {
- id: I.attr(t, "numPicBulletId"),
- referenceId: I.attr(i, "id"),
- style: I.attr(C, "style")
- } : null;
- }
- class jag extends Re {
- constructor(I, g, C) {
- super(I, g), this._documentParser = C;
- }
- parseXml(I) {
- Object.assign(this, Jag(I, this._package.xmlParser)), this.domNumberings = this._documentParser.parseNumberingFile(I);
- }
- }
- class Qag extends Re {
- constructor(I, g, C) {
- super(I, g), this._documentParser = C;
- }
- parseXml(I) {
- this.styles = this._documentParser.parseStylesFile(I);
- }
- }
- var Yg;
- (function(t) {
- t.Document = "document", t.Paragraph = "paragraph", t.Run = "run", t.Break = "break", t.NoBreakHyphen = "noBreakHyphen", t.Table = "table", t.Row = "row", t.Cell = "cell", t.Hyperlink = "hyperlink", t.SmartTag = "smartTag", t.Drawing = "drawing", t.Image = "image", t.Text = "text", t.Tab = "tab", t.Symbol = "symbol", t.BookmarkStart = "bookmarkStart", t.BookmarkEnd = "bookmarkEnd", t.Footer = "footer", t.Header = "header", t.FootnoteReference = "footnoteReference", t.EndnoteReference = "endnoteReference", t.Footnote = "footnote", t.Endnote = "endnote", t.SimpleField = "simpleField", t.ComplexField = "complexField", t.Instruction = "instruction", t.VmlPicture = "vmlPicture", t.MmlMath = "mmlMath", t.MmlMathParagraph = "mmlMathParagraph", t.MmlFraction = "mmlFraction", t.MmlFunction = "mmlFunction", t.MmlFunctionName = "mmlFunctionName", t.MmlNumerator = "mmlNumerator", t.MmlDenominator = "mmlDenominator", t.MmlRadical = "mmlRadical", t.MmlBase = "mmlBase", t.MmlDegree = "mmlDegree", t.MmlSuperscript = "mmlSuperscript", t.MmlSubscript = "mmlSubscript", t.MmlPreSubSuper = "mmlPreSubSuper", t.MmlSubArgument = "mmlSubArgument", t.MmlSuperArgument = "mmlSuperArgument", t.MmlNary = "mmlNary", t.MmlDelimiter = "mmlDelimiter", t.MmlRun = "mmlRun", t.MmlEquationArray = "mmlEquationArray", t.MmlLimit = "mmlLimit", t.MmlLimitLower = "mmlLimitLower", t.MmlMatrix = "mmlMatrix", t.MmlMatrixRow = "mmlMatrixRow", t.MmlBox = "mmlBox", t.MmlBar = "mmlBar", t.MmlGroupChar = "mmlGroupChar", t.VmlElement = "vmlElement", t.Inserted = "inserted", t.Deleted = "deleted", t.DeletedText = "deletedText", t.Comment = "comment", t.CommentReference = "commentReference", t.CommentRangeStart = "commentRangeStart", t.CommentRangeEnd = "commentRangeEnd", t.AltChunk = "altChunk";
- })(Yg || (Yg = {}));
- class bd {
- constructor() {
- this.children = [], this.cssStyle = {};
- }
- }
- class Oag extends bd {
- constructor() {
- super(...arguments), this.type = Yg.Header;
- }
- }
- class Uag extends bd {
- constructor() {
- super(...arguments), this.type = Yg.Footer;
- }
- }
- class Y$ extends Re {
- constructor(I, g, C) {
- super(I, g), this._documentParser = C;
- }
- parseXml(I) {
- this.rootElement = this.createRootElement(), this.rootElement.children = this._documentParser.parseBodyElements(I);
- }
- }
- class Eag extends Y$ {
- createRootElement() {
- return new Oag();
- }
- }
- class Pag extends Y$ {
- createRootElement() {
- return new Uag();
- }
- }
- function _ag(t, I) {
- const g = {};
- for (let C of I.elements(t))
- switch (C.localName) {
- case "Template":
- g.template = C.textContent;
- break;
- case "Pages":
- g.pages = fu(C.textContent);
- break;
- case "Words":
- g.words = fu(C.textContent);
- break;
- case "Characters":
- g.characters = fu(C.textContent);
- break;
- case "Application":
- g.application = C.textContent;
- break;
- case "Lines":
- g.lines = fu(C.textContent);
- break;
- case "Paragraphs":
- g.paragraphs = fu(C.textContent);
- break;
- case "Company":
- g.company = C.textContent;
- break;
- case "AppVersion":
- g.appVersion = C.textContent;
- break;
- }
- return g;
- }
- function fu(t) {
- if (!(typeof t > "u"))
- return parseInt(t);
- }
- class qag extends Re {
- parseXml(I) {
- this.props = _ag(I, this._package.xmlParser);
- }
- }
- function $ag(t, I) {
- const g = {};
- for (let C of I.elements(t))
- switch (C.localName) {
- case "title":
- g.title = C.textContent;
- break;
- case "description":
- g.description = C.textContent;
- break;
- case "subject":
- g.subject = C.textContent;
- break;
- case "creator":
- g.creator = C.textContent;
- break;
- case "keywords":
- g.keywords = C.textContent;
- break;
- case "language":
- g.language = C.textContent;
- break;
- case "lastModifiedBy":
- g.lastModifiedBy = C.textContent;
- break;
- case "revision":
- C.textContent && (g.revision = parseInt(C.textContent));
- break;
- }
- return g;
- }
- class gog extends Re {
- parseXml(I) {
- this.props = $ag(I, this._package.xmlParser);
- }
- }
- class Iog {
- }
- function Cog(t, I) {
- var g = new Iog(), C = I.element(t, "themeElements");
- for (let i of I.elements(C))
- switch (i.localName) {
- case "clrScheme":
- g.colorScheme = tog(i, I);
- break;
- case "fontScheme":
- g.fontScheme = iog(i, I);
- break;
- }
- return g;
- }
- function tog(t, I) {
- var g = {
- name: I.attr(t, "name"),
- colors: {}
- };
- for (let e of I.elements(t)) {
- var C = I.element(e, "srgbClr"), i = I.element(e, "sysClr");
- C ? g.colors[e.localName] = I.attr(C, "val") : i && (g.colors[e.localName] = I.attr(i, "lastClr"));
- }
- return g;
- }
- function iog(t, I) {
- var g = {
- name: I.attr(t, "name")
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "majorFont":
- g.majorFont = x6(C, I);
- break;
- case "minorFont":
- g.minorFont = x6(C, I);
- break;
- }
- return g;
- }
- function x6(t, I) {
- return {
- latinTypeface: I.elementAttr(t, "latin", "typeface"),
- eaTypeface: I.elementAttr(t, "ea", "typeface"),
- csTypeface: I.elementAttr(t, "cs", "typeface")
- };
- }
- class eog extends Re {
- constructor(I, g) {
- super(I, g);
- }
- parseXml(I) {
- this.theme = Cog(I, this._package.xmlParser);
- }
- }
- class N$ {
- }
- class Aog extends N$ {
- constructor() {
- super(...arguments), this.type = Yg.Footnote;
- }
- }
- class sog extends N$ {
- constructor() {
- super(...arguments), this.type = Yg.Endnote;
- }
- }
- class V$ extends Re {
- constructor(I, g, C) {
- super(I, g), this._documentParser = C;
- }
- }
- class log extends V$ {
- constructor(I, g, C) {
- super(I, g, C);
- }
- parseXml(I) {
- this.notes = this._documentParser.parseNotes(I, "footnote", Aog);
- }
- }
- class nog extends V$ {
- constructor(I, g, C) {
- super(I, g, C);
- }
- parseXml(I) {
- this.notes = this._documentParser.parseNotes(I, "endnote", sog);
- }
- }
- function aog(t, I) {
- var g = {};
- for (let C of I.elements(t))
- switch (C.localName) {
- case "defaultTabStop":
- g.defaultTabStop = I.lengthAttr(C, "val");
- break;
- case "footnotePr":
- g.footnoteProps = j6(C, I);
- break;
- case "endnotePr":
- g.endnoteProps = j6(C, I);
- break;
- case "autoHyphenation":
- g.autoHyphenation = I.boolAttr(C, "val");
- break;
- }
- return g;
- }
- function j6(t, I) {
- var g = {
- defaultNoteIds: []
- };
- for (let C of I.elements(t))
- switch (C.localName) {
- case "numFmt":
- g.nummeringFormat = I.attr(C, "val");
- break;
- case "footnote":
- case "endnote":
- g.defaultNoteIds.push(I.attr(C, "id"));
- break;
- }
- return g;
- }
- class oog extends Re {
- constructor(I, g) {
- super(I, g);
- }
- parseXml(I) {
- this.settings = aog(I, this._package.xmlParser);
- }
- }
- function cog(t, I) {
- return I.elements(t, "property").map((g) => {
- const C = g.firstChild;
- return {
- formatId: I.attr(g, "fmtid"),
- name: I.attr(g, "name"),
- type: C.nodeName,
- value: C.textContent
- };
- });
- }
- class dog extends Re {
- parseXml(I) {
- this.props = cog(I, this._package.xmlParser);
- }
- }
- class rog extends Re {
- constructor(I, g, C) {
- super(I, g), this._documentParser = C;
- }
- parseXml(I) {
- this.comments = this._documentParser.parseComments(I), this.commentMap = ea(this.comments, (g) => g.id);
- }
- }
- class hog extends Re {
- constructor(I, g) {
- super(I, g), this.comments = [];
- }
- parseXml(I) {
- const g = this._package.xmlParser;
- for (let C of g.elements(I, "commentEx"))
- this.comments.push({
- paraId: g.attr(C, "paraId"),
- paraIdParent: g.attr(C, "paraIdParent"),
- done: g.boolAttr(C, "done")
- });
- this.commentMap = ea(this.comments, (C) => C.paraId);
- }
- }
- const bog = [
- { type: At.OfficeDocument, target: "word/document.xml" },
- { type: At.ExtendedProperties, target: "docProps/app.xml" },
- { type: At.CoreProperties, target: "docProps/core.xml" },
- { type: At.CustomProperties, target: "docProps/custom.xml" }
- ];
- class a9 {
- constructor() {
- this.parts = [], this.partsMap = {};
- }
- static async load(I, g, C) {
- var i = new a9();
- return i._options = C, i._parser = g, i._package = await l9.load(I, C), i.rels = await i._package.loadRelationships(), await Promise.all(bog.map((e) => {
- const A = i.rels.find((s) => s.type === e.type) ?? e;
- return i.loadRelationshipPart(A.target, A.type);
- })), i;
- }
- save(I = "blob") {
- return this._package.save(I);
- }
- async loadRelationshipPart(I, g) {
- var i;
- if (this.partsMap[I])
- return this.partsMap[I];
- if (!this._package.get(I))
- return null;
- let C = null;
- switch (g) {
- case At.OfficeDocument:
- this.documentPart = C = new Hag(this._package, I, this._parser);
- break;
- case At.FontTable:
- this.fontTablePart = C = new Rag(this._package, I);
- break;
- case At.Numbering:
- this.numberingPart = C = new jag(this._package, I, this._parser);
- break;
- case At.Styles:
- this.stylesPart = C = new Qag(this._package, I, this._parser);
- break;
- case At.Theme:
- this.themePart = C = new eog(this._package, I);
- break;
- case At.Footnotes:
- this.footnotesPart = C = new log(this._package, I, this._parser);
- break;
- case At.Endnotes:
- this.endnotesPart = C = new nog(this._package, I, this._parser);
- break;
- case At.Footer:
- C = new Pag(this._package, I, this._parser);
- break;
- case At.Header:
- C = new Eag(this._package, I, this._parser);
- break;
- case At.CoreProperties:
- this.corePropsPart = C = new gog(this._package, I);
- break;
- case At.ExtendedProperties:
- this.extendedPropsPart = C = new qag(this._package, I);
- break;
- case At.CustomProperties:
- C = new dog(this._package, I);
- break;
- case At.Settings:
- this.settingsPart = C = new oog(this._package, I);
- break;
- case At.Comments:
- this.commentsPart = C = new rog(this._package, I, this._parser);
- break;
- case At.CommentsExtended:
- this.commentsExtendedPart = C = new hog(this._package, I);
- break;
- }
- if (C == null)
- return Promise.resolve(null);
- if (this.partsMap[I] = C, this.parts.push(C), await C.load(), ((i = C.rels) == null ? void 0 : i.length) > 0) {
- const [e] = lN(C.path);
- await Promise.all(C.rels.map((A) => this.loadRelationshipPart(kH(A.target, e), A.type)));
- }
- return C;
- }
- async loadDocumentImage(I, g) {
- const C = await this.loadResource(g ?? this.documentPart, I, "blob");
- return this.blobToURL(C);
- }
- async loadNumberingImage(I) {
- const g = await this.loadResource(this.numberingPart, I, "blob");
- return this.blobToURL(g);
- }
- async loadFont(I, g) {
- const C = await this.loadResource(this.fontTablePart, I, "uint8array");
- return C && this.blobToURL(new Blob([uog(C, g)]));
- }
- async loadAltChunk(I, g) {
- return await this.loadResource(g ?? this.documentPart, I, "string");
- }
- blobToURL(I) {
- return I ? this._options.useBase64URL ? mag(I) : URL.createObjectURL(I) : null;
- }
- findPartByRelId(I, g = null) {
- var C = (g.rels ?? this.rels).find((e) => e.id == I);
- const i = g ? lN(g.path)[0] : "";
- return C ? this.partsMap[kH(C.target, i)] : null;
- }
- getPathById(I, g) {
- const C = I.rels.find((e) => e.id == g), [i] = lN(I.path);
- return C ? kH(C.target, i) : null;
- }
- loadResource(I, g, C) {
- const i = this.getPathById(I, g);
- return i ? this._package.load(i, C) : Promise.resolve(null);
- }
- }
- function uog(t, I) {
- const C = I.replace(/{|}|-/g, ""), i = new Array(16);
- for (let e = 0; e < 16; e++)
- i[16 - e - 1] = parseInt(C.substr(e * 2, 2), 16);
- for (let e = 0; e < 32; e++)
- t[e] = t[e] ^ i[e % 16];
- return t;
- }
- function mog(t, I) {
- return {
- type: Yg.BookmarkStart,
- id: I.attr(t, "id"),
- name: I.attr(t, "name"),
- colFirst: I.intAttr(t, "colFirst"),
- colLast: I.intAttr(t, "colLast")
- };
- }
- function Zog(t, I) {
- return {
- type: Yg.BookmarkEnd,
- id: I.attr(t, "id")
- };
- }
- class Gog extends bd {
- constructor() {
- super(...arguments), this.type = Yg.VmlElement, this.attrs = {};
- }
- }
- function M$(t, I) {
- var g = new Gog();
- switch (t.localName) {
- case "rect":
- g.tagName = "rect", Object.assign(g.attrs, { width: "100%", height: "100%" });
- break;
- case "oval":
- g.tagName = "ellipse", Object.assign(g.attrs, { cx: "50%", cy: "50%", rx: "50%", ry: "50%" });
- break;
- case "line":
- g.tagName = "line";
- break;
- case "shape":
- g.tagName = "g";
- break;
- case "textbox":
- g.tagName = "foreignObject", Object.assign(g.attrs, { width: "100%", height: "100%" });
- break;
- default:
- return null;
- }
- for (const C of ug.attrs(t))
- switch (C.localName) {
- case "style":
- g.cssStyleText = C.value;
- break;
- case "fillcolor":
- g.attrs.fill = C.value;
- break;
- case "from":
- const [i, e] = Q6(C.value);
- Object.assign(g.attrs, { x1: i, y1: e });
- break;
- case "to":
- const [A, s] = Q6(C.value);
- Object.assign(g.attrs, { x2: A, y2: s });
- break;
- }
- for (const C of ug.elements(t))
- switch (C.localName) {
- case "stroke":
- Object.assign(g.attrs, wog(C));
- break;
- case "fill":
- Object.assign(g.attrs, pog());
- break;
- case "imagedata":
- g.tagName = "image", Object.assign(g.attrs, { width: "100%", height: "100%" }), g.imageHref = {
- id: ug.attr(C, "id"),
- title: ug.attr(C, "title")
- };
- break;
- case "txbxContent":
- g.children.push(...I.parseBodyElements(C));
- break;
- default:
- const i = M$(C, I);
- i && g.children.push(i);
- break;
- }
- return g;
- }
- function wog(t) {
- return {
- stroke: ug.attr(t, "color"),
- "stroke-width": ug.lengthAttr(t, "weight", st.Emu) ?? "1px"
- };
- }
- function pog(t) {
- return {};
- }
- function Q6(t) {
- return t.split(",");
- }
- class Bog extends bd {
- constructor() {
- super(...arguments), this.type = Yg.Comment;
- }
- }
- class Wog extends bd {
- constructor(I) {
- super(), this.id = I, this.type = Yg.CommentReference;
- }
- }
- class yog extends bd {
- constructor(I) {
- super(), this.id = I, this.type = Yg.CommentRangeStart;
- }
- }
- class Yog extends bd {
- constructor(I) {
- super(), this.id = I, this.type = Yg.CommentRangeEnd;
- }
- }
- var nN = {
- shd: "inherit",
- color: "black",
- borderColor: "black",
- highlight: "transparent"
- };
- const Nog = [], O6 = {
- oMath: Yg.MmlMath,
- oMathPara: Yg.MmlMathParagraph,
- f: Yg.MmlFraction,
- func: Yg.MmlFunction,
- fName: Yg.MmlFunctionName,
- num: Yg.MmlNumerator,
- den: Yg.MmlDenominator,
- rad: Yg.MmlRadical,
- deg: Yg.MmlDegree,
- e: Yg.MmlBase,
- sSup: Yg.MmlSuperscript,
- sSub: Yg.MmlSubscript,
- sPre: Yg.MmlPreSubSuper,
- sup: Yg.MmlSuperArgument,
- sub: Yg.MmlSubArgument,
- d: Yg.MmlDelimiter,
- nary: Yg.MmlNary,
- eqArr: Yg.MmlEquationArray,
- lim: Yg.MmlLimit,
- limLow: Yg.MmlLimitLower,
- m: Yg.MmlMatrix,
- mr: Yg.MmlMatrixRow,
- box: Yg.MmlBox,
- bar: Yg.MmlBar,
- groupChr: Yg.MmlGroupChar
- };
- class Vog {
- constructor(I) {
- this.options = {
- ignoreWidth: !1,
- debug: !1,
- ...I
- };
- }
- parseNotes(I, g, C) {
- var i = [];
- for (let e of ug.elements(I, g)) {
- const A = new C();
- A.id = ug.attr(e, "id"), A.noteType = ug.attr(e, "type"), A.children = this.parseBodyElements(e), i.push(A);
- }
- return i;
- }
- parseComments(I) {
- var g = [];
- for (let C of ug.elements(I, "comment")) {
- const i = new Bog();
- i.id = ug.attr(C, "id"), i.author = ug.attr(C, "author"), i.initials = ug.attr(C, "initials"), i.date = ug.attr(C, "date"), i.children = this.parseBodyElements(C), g.push(i);
- }
- return g;
- }
- parseDocumentFile(I) {
- var g = ug.element(I, "body"), C = ug.element(I, "background"), i = ug.element(g, "sectPr");
- return {
- type: Yg.Document,
- children: this.parseBodyElements(g),
- props: i ? p$(i, ug) : {},
- cssStyle: C ? this.parseBackground(C) : {}
- };
- }
- parseBackground(I) {
- var g = {}, C = fC.colorAttr(I, "color");
- return C && (g["background-color"] = C), g;
- }
- parseBodyElements(I) {
- var g = [];
- for (let C of ug.elements(I))
- switch (C.localName) {
- case "p":
- g.push(this.parseParagraph(C));
- break;
- case "altChunk":
- g.push(this.parseAltChunk(C));
- break;
- case "tbl":
- g.push(this.parseTable(C));
- break;
- case "sdt":
- g.push(...this.parseSdt(C, (i) => this.parseBodyElements(i)));
- break;
- }
- return g;
- }
- parseStylesFile(I) {
- var g = [];
- return fC.foreach(I, (C) => {
- switch (C.localName) {
- case "style":
- g.push(this.parseStyle(C));
- break;
- case "docDefaults":
- g.push(this.parseDefaultStyles(C));
- break;
- }
- }), g;
- }
- parseDefaultStyles(I) {
- var g = {
- id: null,
- name: null,
- target: null,
- basedOn: null,
- styles: []
- };
- return fC.foreach(I, (C) => {
- switch (C.localName) {
- case "rPrDefault":
- var i = ug.element(C, "rPr");
- i && g.styles.push({
- target: "span",
- values: this.parseDefaultProperties(i, {})
- });
- break;
- case "pPrDefault":
- var e = ug.element(C, "pPr");
- e && g.styles.push({
- target: "p",
- values: this.parseDefaultProperties(e, {})
- });
- break;
- }
- }), g;
- }
- parseStyle(I) {
- var g = {
- id: ug.attr(I, "styleId"),
- isDefault: ug.boolAttr(I, "default"),
- name: null,
- target: null,
- basedOn: null,
- styles: [],
- linked: null
- };
- switch (ug.attr(I, "type")) {
- case "paragraph":
- g.target = "p";
- break;
- case "table":
- g.target = "table";
- break;
- case "character":
- g.target = "span";
- break;
- }
- return fC.foreach(I, (C) => {
- switch (C.localName) {
- case "basedOn":
- g.basedOn = ug.attr(C, "val");
- break;
- case "name":
- g.name = ug.attr(C, "val");
- break;
- case "link":
- g.linked = ug.attr(C, "val");
- break;
- case "next":
- g.next = ug.attr(C, "val");
- break;
- case "aliases":
- g.aliases = ug.attr(C, "val").split(",");
- break;
- case "pPr":
- g.styles.push({
- target: "p",
- values: this.parseDefaultProperties(C, {})
- }), g.paragraphProps = B$(C, ug);
- break;
- case "rPr":
- g.styles.push({
- target: "span",
- values: this.parseDefaultProperties(C, {})
- }), g.runProps = n9(C, ug);
- break;
- case "tblPr":
- case "tcPr":
- g.styles.push({
- target: "td",
- values: this.parseDefaultProperties(C, {})
- });
- break;
- case "tblStylePr":
- for (let i of this.parseTableStyle(C))
- g.styles.push(i);
- break;
- case "rsid":
- case "qFormat":
- case "hidden":
- case "semiHidden":
- case "unhideWhenUsed":
- case "autoRedefine":
- case "uiPriority":
- break;
- default:
- this.options.debug && console.warn(`DOCX: Unknown style element: ${C.localName}`);
- }
- }), g;
- }
- parseTableStyle(I) {
- var g = [], C = ug.attr(I, "type"), i = "", e = "";
- switch (C) {
- case "firstRow":
- e = ".first-row", i = "tr.first-row td";
- break;
- case "lastRow":
- e = ".last-row", i = "tr.last-row td";
- break;
- case "firstCol":
- e = ".first-col", i = "td.first-col";
- break;
- case "lastCol":
- e = ".last-col", i = "td.last-col";
- break;
- case "band1Vert":
- e = ":not(.no-vband)", i = "td.odd-col";
- break;
- case "band2Vert":
- e = ":not(.no-vband)", i = "td.even-col";
- break;
- case "band1Horz":
- e = ":not(.no-hband)", i = "tr.odd-row";
- break;
- case "band2Horz":
- e = ":not(.no-hband)", i = "tr.even-row";
- break;
- default:
- return [];
- }
- return fC.foreach(I, (A) => {
- switch (A.localName) {
- case "pPr":
- g.push({
- target: `${i} p`,
- mod: e,
- values: this.parseDefaultProperties(A, {})
- });
- break;
- case "rPr":
- g.push({
- target: `${i} span`,
- mod: e,
- values: this.parseDefaultProperties(A, {})
- });
- break;
- case "tblPr":
- case "tcPr":
- g.push({
- target: i,
- mod: e,
- values: this.parseDefaultProperties(A, {})
- });
- break;
- }
- }), g;
- }
- parseNumberingFile(I) {
- var g = [], C = {}, i = [];
- return fC.foreach(I, (e) => {
- switch (e.localName) {
- case "abstractNum":
- this.parseAbstractNumbering(e, i).forEach((l) => g.push(l));
- break;
- case "numPicBullet":
- i.push(this.parseNumberingPicBullet(e));
- break;
- case "num":
- var A = ug.attr(e, "numId"), s = ug.elementAttr(e, "abstractNumId", "val");
- C[s] = A;
- break;
- }
- }), g.forEach((e) => e.id = C[e.id]), g;
- }
- parseNumberingPicBullet(I) {
- var g = ug.element(I, "pict"), C = g && ug.element(g, "shape"), i = C && ug.element(C, "imagedata");
- return i ? {
- id: ug.intAttr(I, "numPicBulletId"),
- src: ug.attr(i, "id"),
- style: ug.attr(C, "style")
- } : null;
- }
- parseAbstractNumbering(I, g) {
- var C = [], i = ug.attr(I, "abstractNumId");
- return fC.foreach(I, (e) => {
- switch (e.localName) {
- case "lvl":
- C.push(this.parseNumberingLevel(i, e, g));
- break;
- }
- }), C;
- }
- parseNumberingLevel(I, g, C) {
- var i = {
- id: I,
- level: ug.intAttr(g, "ilvl"),
- start: 1,
- pStyleName: void 0,
- pStyle: {},
- rStyle: {},
- suff: "tab"
- };
- return fC.foreach(g, (e) => {
- switch (e.localName) {
- case "start":
- i.start = ug.intAttr(e, "val");
- break;
- case "pPr":
- this.parseDefaultProperties(e, i.pStyle);
- break;
- case "rPr":
- this.parseDefaultProperties(e, i.rStyle);
- break;
- case "lvlPicBulletId":
- var A = ug.intAttr(e, "val");
- i.bullet = C.find((s) => (s == null ? void 0 : s.id) == A);
- break;
- case "lvlText":
- i.levelText = ug.attr(e, "val");
- break;
- case "pStyle":
- i.pStyleName = ug.attr(e, "val");
- break;
- case "numFmt":
- i.format = ug.attr(e, "val");
- break;
- case "suff":
- i.suff = ug.attr(e, "val");
- break;
- }
- }), i;
- }
- parseSdt(I, g) {
- const C = ug.element(I, "sdtContent");
- return C ? g(C) : [];
- }
- parseInserted(I, g) {
- var C;
- return {
- type: Yg.Inserted,
- children: ((C = g(I)) == null ? void 0 : C.children) ?? []
- };
- }
- parseDeleted(I, g) {
- var C;
- return {
- type: Yg.Deleted,
- children: ((C = g(I)) == null ? void 0 : C.children) ?? []
- };
- }
- parseAltChunk(I) {
- return { type: Yg.AltChunk, children: [], id: ug.attr(I, "id") };
- }
- parseParagraph(I) {
- var g = { type: Yg.Paragraph, children: [] };
- for (let C of ug.elements(I))
- switch (C.localName) {
- case "pPr":
- this.parseParagraphProperties(C, g);
- break;
- case "r":
- g.children.push(this.parseRun(C, g));
- break;
- case "hyperlink":
- g.children.push(this.parseHyperlink(C, g));
- break;
- case "smartTag":
- g.children.push(this.parseSmartTag(C, g));
- break;
- case "bookmarkStart":
- g.children.push(mog(C, ug));
- break;
- case "bookmarkEnd":
- g.children.push(Zog(C, ug));
- break;
- case "commentRangeStart":
- g.children.push(new yog(ug.attr(C, "id")));
- break;
- case "commentRangeEnd":
- g.children.push(new Yog(ug.attr(C, "id")));
- break;
- case "oMath":
- case "oMathPara":
- g.children.push(this.parseMathElement(C));
- break;
- case "sdt":
- g.children.push(...this.parseSdt(C, (i) => this.parseParagraph(i).children));
- break;
- case "ins":
- g.children.push(this.parseInserted(C, (i) => this.parseParagraph(i)));
- break;
- case "del":
- g.children.push(this.parseDeleted(C, (i) => this.parseParagraph(i)));
- break;
- }
- return g;
- }
- parseParagraphProperties(I, g) {
- this.parseDefaultProperties(I, g.cssStyle = {}, null, (C) => {
- if (W$(C, g, ug))
- return !0;
- switch (C.localName) {
- case "pStyle":
- g.styleName = ug.attr(C, "val");
- break;
- case "cnfStyle":
- g.className = RC.classNameOfCnfStyle(C);
- break;
- case "framePr":
- this.parseFrame(C, g);
- break;
- case "rPr":
- break;
- default:
- return !1;
- }
- return !0;
- });
- }
- parseFrame(I, g) {
- var C = ug.attr(I, "dropCap");
- C == "drop" && (g.cssStyle.float = "left");
- }
- parseHyperlink(I, g) {
- var C = { type: Yg.Hyperlink, parent: g, children: [] };
- return C.anchor = ug.attr(I, "anchor"), C.id = ug.attr(I, "id"), fC.foreach(I, (i) => {
- switch (i.localName) {
- case "r":
- C.children.push(this.parseRun(i, C));
- break;
- }
- }), C;
- }
- parseSmartTag(I, g) {
- var C = { type: Yg.SmartTag, parent: g, children: [] }, i = ug.attr(I, "uri"), e = ug.attr(I, "element");
- return i && (C.uri = i), e && (C.element = e), fC.foreach(I, (A) => {
- switch (A.localName) {
- case "r":
- C.children.push(this.parseRun(A, C));
- break;
- }
- }), C;
- }
- parseRun(I, g) {
- var C = { type: Yg.Run, parent: g, children: [] };
- return fC.foreach(I, (i) => {
- switch (i = this.checkAlternateContent(i), i.localName) {
- case "t":
- C.children.push({
- type: Yg.Text,
- text: i.textContent
- });
- break;
- case "delText":
- C.children.push({
- type: Yg.DeletedText,
- text: i.textContent
- });
- break;
- case "commentReference":
- C.children.push(new Wog(ug.attr(i, "id")));
- break;
- case "fldSimple":
- C.children.push({
- type: Yg.SimpleField,
- instruction: ug.attr(i, "instr"),
- lock: ug.boolAttr(i, "lock", !1),
- dirty: ug.boolAttr(i, "dirty", !1)
- });
- break;
- case "instrText":
- C.fieldRun = !0, C.children.push({
- type: Yg.Instruction,
- text: i.textContent
- });
- break;
- case "fldChar":
- C.fieldRun = !0, C.children.push({
- type: Yg.ComplexField,
- charType: ug.attr(i, "fldCharType"),
- lock: ug.boolAttr(i, "lock", !1),
- dirty: ug.boolAttr(i, "dirty", !1)
- });
- break;
- case "noBreakHyphen":
- C.children.push({ type: Yg.NoBreakHyphen });
- break;
- case "br":
- C.children.push({
- type: Yg.Break,
- break: ug.attr(i, "type") || "textWrapping"
- });
- break;
- case "lastRenderedPageBreak":
- C.children.push({
- type: Yg.Break,
- break: "lastRenderedPageBreak"
- });
- break;
- case "sym":
- C.children.push({
- type: Yg.Symbol,
- font: xX(ug.attr(i, "font")),
- char: ug.attr(i, "char")
- });
- break;
- case "tab":
- C.children.push({ type: Yg.Tab });
- break;
- case "footnoteReference":
- C.children.push({
- type: Yg.FootnoteReference,
- id: ug.attr(i, "id")
- });
- break;
- case "endnoteReference":
- C.children.push({
- type: Yg.EndnoteReference,
- id: ug.attr(i, "id")
- });
- break;
- case "drawing":
- let e = this.parseDrawing(i);
- e && (C.children = [e]);
- break;
- case "pict":
- C.children.push(this.parseVmlPicture(i));
- break;
- case "rPr":
- this.parseRunProperties(i, C);
- break;
- }
- }), C;
- }
- parseMathElement(I) {
- const g = `${I.localName}Pr`, C = { type: O6[I.localName], children: [] };
- for (const e of ug.elements(I))
- if (O6[e.localName])
- C.children.push(this.parseMathElement(e));
- else if (e.localName == "r") {
- var i = this.parseRun(e);
- i.type = Yg.MmlRun, C.children.push(i);
- } else e.localName == g && (C.props = this.parseMathProperies(e));
- return C;
- }
- parseMathProperies(I) {
- const g = {};
- for (const C of ug.elements(I))
- switch (C.localName) {
- case "chr":
- g.char = ug.attr(C, "val");
- break;
- case "vertJc":
- g.verticalJustification = ug.attr(C, "val");
- break;
- case "pos":
- g.position = ug.attr(C, "val");
- break;
- case "degHide":
- g.hideDegree = ug.boolAttr(C, "val");
- break;
- case "begChr":
- g.beginChar = ug.attr(C, "val");
- break;
- case "endChr":
- g.endChar = ug.attr(C, "val");
- break;
- }
- return g;
- }
- parseRunProperties(I, g) {
- this.parseDefaultProperties(I, g.cssStyle = {}, null, (C) => {
- switch (C.localName) {
- case "rStyle":
- g.styleName = ug.attr(C, "val");
- break;
- case "vertAlign":
- g.verticalAlign = RC.valueOfVertAlign(C, !0);
- break;
- default:
- return !1;
- }
- return !0;
- });
- }
- parseVmlPicture(I) {
- const g = { type: Yg.VmlPicture, children: [] };
- for (const C of ug.elements(I)) {
- const i = M$(C, this);
- i && g.children.push(i);
- }
- return g;
- }
- checkAlternateContent(I) {
- var e;
- if (I.localName != "AlternateContent")
- return I;
- var g = ug.element(I, "Choice");
- if (g) {
- var C = ug.attr(g, "Requires"), i = I.lookupNamespaceURI(C);
- if (Nog.includes(i))
- return g.firstElementChild;
- }
- return (e = ug.element(I, "Fallback")) == null ? void 0 : e.firstElementChild;
- }
- parseDrawing(I) {
- for (var g of ug.elements(I))
- switch (g.localName) {
- case "inline":
- case "anchor":
- return this.parseDrawingWrapper(g);
- }
- }
- parseDrawingWrapper(I) {
- var g = { type: Yg.Drawing, children: [], cssStyle: {} }, C = I.localName == "anchor";
- let i = null, e = ug.boolAttr(I, "simplePos");
- ug.boolAttr(I, "behindDoc");
- let A = { relative: "page", align: "left", offset: "0" }, s = { relative: "page", align: "top", offset: "0" };
- for (var l of ug.elements(I))
- switch (l.localName) {
- case "simplePos":
- e && (A.offset = ug.lengthAttr(l, "x", st.Emu), s.offset = ug.lengthAttr(l, "y", st.Emu));
- break;
- case "extent":
- g.cssStyle.width = ug.lengthAttr(l, "cx", st.Emu), g.cssStyle.height = ug.lengthAttr(l, "cy", st.Emu);
- break;
- case "positionH":
- case "positionV":
- if (!e) {
- let o = l.localName == "positionH" ? A : s;
- var n = ug.element(l, "align"), a = ug.element(l, "posOffset");
- o.relative = ug.attr(l, "relativeFrom") ?? o.relative, n && (o.align = n.textContent), a && (o.offset = fC.sizeValue(a, st.Emu));
- }
- break;
- case "wrapTopAndBottom":
- i = "wrapTopAndBottom";
- break;
- case "wrapNone":
- i = "wrapNone";
- break;
- case "graphic":
- var d = this.parseGraphic(l);
- d && g.children.push(d);
- break;
- }
- return i == "wrapTopAndBottom" ? (g.cssStyle.display = "block", A.align && (g.cssStyle["text-align"] = A.align, g.cssStyle.width = "100%")) : i == "wrapNone" ? (g.cssStyle.display = "block", g.cssStyle.position = "relative", g.cssStyle.width = "0px", g.cssStyle.height = "0px", A.offset && (g.cssStyle.left = A.offset), s.offset && (g.cssStyle.top = s.offset)) : C && (A.align == "left" || A.align == "right") && (g.cssStyle.float = A.align), g;
- }
- parseGraphic(I) {
- var g = ug.element(I, "graphicData");
- for (let C of ug.elements(g))
- switch (C.localName) {
- case "pic":
- return this.parsePicture(C);
- }
- return null;
- }
- parsePicture(I) {
- var g = { type: Yg.Image, src: "", cssStyle: {} }, C = ug.element(I, "blipFill"), i = ug.element(C, "blip");
- g.src = ug.attr(i, "embed");
- var e = ug.element(I, "spPr"), A = ug.element(e, "xfrm");
- g.cssStyle.position = "relative";
- for (var s of ug.elements(A))
- switch (s.localName) {
- case "ext":
- g.cssStyle.width = ug.lengthAttr(s, "cx", st.Emu), g.cssStyle.height = ug.lengthAttr(s, "cy", st.Emu);
- break;
- case "off":
- g.cssStyle.left = ug.lengthAttr(s, "x", st.Emu), g.cssStyle.top = ug.lengthAttr(s, "y", st.Emu);
- break;
- }
- return g;
- }
- parseTable(I) {
- var g = { type: Yg.Table, children: [] };
- return fC.foreach(I, (C) => {
- switch (C.localName) {
- case "tr":
- g.children.push(this.parseTableRow(C));
- break;
- case "tblGrid":
- g.columns = this.parseTableColumns(C);
- break;
- case "tblPr":
- this.parseTableProperties(C, g);
- break;
- }
- }), g;
- }
- parseTableColumns(I) {
- var g = [];
- return fC.foreach(I, (C) => {
- switch (C.localName) {
- case "gridCol":
- g.push({ width: ug.lengthAttr(C, "w") });
- break;
- }
- }), g;
- }
- parseTableProperties(I, g) {
- switch (g.cssStyle = {}, g.cellStyle = {}, this.parseDefaultProperties(I, g.cssStyle, g.cellStyle, (C) => {
- switch (C.localName) {
- case "tblStyle":
- g.styleName = ug.attr(C, "val");
- break;
- case "tblLook":
- g.className = RC.classNameOftblLook(C);
- break;
- case "tblpPr":
- this.parseTablePosition(C, g);
- break;
- case "tblStyleColBandSize":
- g.colBandSize = ug.intAttr(C, "val");
- break;
- case "tblStyleRowBandSize":
- g.rowBandSize = ug.intAttr(C, "val");
- break;
- default:
- return !1;
- }
- return !0;
- }), g.cssStyle["text-align"]) {
- case "center":
- delete g.cssStyle["text-align"], g.cssStyle["margin-left"] = "auto", g.cssStyle["margin-right"] = "auto";
- break;
- case "right":
- delete g.cssStyle["text-align"], g.cssStyle["margin-left"] = "auto";
- break;
- }
- }
- parseTablePosition(I, g) {
- var C = ug.lengthAttr(I, "topFromText"), i = ug.lengthAttr(I, "bottomFromText"), e = ug.lengthAttr(I, "rightFromText"), A = ug.lengthAttr(I, "leftFromText");
- g.cssStyle.float = "left", g.cssStyle["margin-bottom"] = RC.addSize(g.cssStyle["margin-bottom"], i), g.cssStyle["margin-left"] = RC.addSize(g.cssStyle["margin-left"], A), g.cssStyle["margin-right"] = RC.addSize(g.cssStyle["margin-right"], e), g.cssStyle["margin-top"] = RC.addSize(g.cssStyle["margin-top"], C);
- }
- parseTableRow(I) {
- var g = { type: Yg.Row, children: [] };
- return fC.foreach(I, (C) => {
- switch (C.localName) {
- case "tc":
- g.children.push(this.parseTableCell(C));
- break;
- case "trPr":
- this.parseTableRowProperties(C, g);
- break;
- }
- }), g;
- }
- parseTableRowProperties(I, g) {
- g.cssStyle = this.parseDefaultProperties(I, {}, null, (C) => {
- switch (C.localName) {
- case "cnfStyle":
- g.className = RC.classNameOfCnfStyle(C);
- break;
- case "tblHeader":
- g.isHeader = ug.boolAttr(C, "val");
- break;
- default:
- return !1;
- }
- return !0;
- });
- }
- parseTableCell(I) {
- var g = { type: Yg.Cell, children: [] };
- return fC.foreach(I, (C) => {
- switch (C.localName) {
- case "tbl":
- g.children.push(this.parseTable(C));
- break;
- case "p":
- g.children.push(this.parseParagraph(C));
- break;
- case "tcPr":
- this.parseTableCellProperties(C, g);
- break;
- }
- }), g;
- }
- parseTableCellProperties(I, g) {
- g.cssStyle = this.parseDefaultProperties(I, {}, null, (C) => {
- switch (C.localName) {
- case "gridSpan":
- g.span = ug.intAttr(C, "val", null);
- break;
- case "vMerge":
- g.verticalMerge = ug.attr(C, "val") ?? "continue";
- break;
- case "cnfStyle":
- g.className = RC.classNameOfCnfStyle(C);
- break;
- default:
- return !1;
- }
- return !0;
- }), this.parseTableCellVerticalText(I, g);
- }
- parseTableCellVerticalText(I, g) {
- const C = {
- btLr: {
- writingMode: "vertical-rl",
- transform: "rotate(180deg)"
- },
- lrTb: {
- writingMode: "vertical-lr",
- transform: "none"
- },
- tbRl: {
- writingMode: "vertical-rl",
- transform: "none"
- }
- };
- fC.foreach(I, (i) => {
- if (i.localName === "textDirection") {
- const e = ug.attr(i, "val"), A = C[e] || { writingMode: "horizontal-tb" };
- g.cssStyle["writing-mode"] = A.writingMode, g.cssStyle.transform = A.transform;
- }
- });
- }
- parseDefaultProperties(I, g = null, C = null, i = null) {
- return g = g || {}, fC.foreach(I, (e) => {
- if (!(i != null && i(e)))
- switch (e.localName) {
- case "jc":
- g["text-align"] = RC.valueOfJc(e);
- break;
- case "textAlignment":
- g["vertical-align"] = RC.valueOfTextAlignment(e);
- break;
- case "color":
- g.color = fC.colorAttr(e, "val", null, nN.color);
- break;
- case "sz":
- g["font-size"] = g["min-height"] = ug.lengthAttr(e, "val", st.FontSize);
- break;
- case "shd":
- g["background-color"] = fC.colorAttr(e, "fill", null, nN.shd);
- break;
- case "highlight":
- g["background-color"] = fC.colorAttr(e, "val", null, nN.highlight);
- break;
- case "vertAlign":
- break;
- case "position":
- g.verticalAlign = ug.lengthAttr(e, "val", st.FontSize);
- break;
- case "tcW":
- if (this.options.ignoreWidth)
- break;
- case "tblW":
- g.width = RC.valueOfSize(e, "w");
- break;
- case "trHeight":
- this.parseTrHeight(e, g);
- break;
- case "strike":
- g["text-decoration"] = ug.boolAttr(e, "val", !0) ? "line-through" : "none";
- break;
- case "b":
- g["font-weight"] = ug.boolAttr(e, "val", !0) ? "bold" : "normal";
- break;
- case "i":
- g["font-style"] = ug.boolAttr(e, "val", !0) ? "italic" : "normal";
- break;
- case "caps":
- g["text-transform"] = ug.boolAttr(e, "val", !0) ? "uppercase" : "none";
- break;
- case "smallCaps":
- g["font-variant"] = ug.boolAttr(e, "val", !0) ? "small-caps" : "none";
- break;
- case "u":
- this.parseUnderline(e, g);
- break;
- case "ind":
- case "tblInd":
- this.parseIndentation(e, g);
- break;
- case "rFonts":
- this.parseFont(e, g);
- break;
- case "tblBorders":
- this.parseBorderProperties(e, C || g);
- break;
- case "tblCellSpacing":
- g["border-spacing"] = RC.valueOfMargin(e), g["border-collapse"] = "separate";
- break;
- case "pBdr":
- this.parseBorderProperties(e, g);
- break;
- case "bdr":
- g.border = RC.valueOfBorder(e);
- break;
- case "tcBorders":
- this.parseBorderProperties(e, g);
- break;
- case "vanish":
- ug.boolAttr(e, "val", !0) && (g.display = "none");
- break;
- case "kern":
- break;
- case "noWrap":
- break;
- case "tblCellMar":
- case "tcMar":
- this.parseMarginProperties(e, C || g);
- break;
- case "tblLayout":
- g["table-layout"] = RC.valueOfTblLayout(e);
- break;
- case "vAlign":
- g["vertical-align"] = RC.valueOfTextAlignment(e);
- break;
- case "spacing":
- I.localName == "pPr" && this.parseSpacing(e, g);
- break;
- case "wordWrap":
- ug.boolAttr(e, "val") && (g["overflow-wrap"] = "break-word");
- break;
- case "suppressAutoHyphens":
- g.hyphens = ug.boolAttr(e, "val", !0) ? "none" : "auto";
- break;
- case "lang":
- g.$lang = ug.attr(e, "val");
- break;
- case "bCs":
- case "iCs":
- case "szCs":
- case "tabs":
- case "outlineLvl":
- case "contextualSpacing":
- case "tblStyleColBandSize":
- case "tblStyleRowBandSize":
- case "webHidden":
- case "pageBreakBefore":
- case "suppressLineNumbers":
- case "keepLines":
- case "keepNext":
- case "widowControl":
- case "bidi":
- case "rtl":
- case "noProof":
- break;
- default:
- this.options.debug && console.warn(`DOCX: Unknown document element: ${I.localName}.${e.localName}`);
- break;
- }
- }), g;
- }
- parseUnderline(I, g) {
- var C = ug.attr(I, "val");
- if (C != null) {
- switch (C) {
- case "dash":
- case "dashDotDotHeavy":
- case "dashDotHeavy":
- case "dashedHeavy":
- case "dashLong":
- case "dashLongHeavy":
- case "dotDash":
- case "dotDotDash":
- g["text-decoration"] = "underline dashed";
- break;
- case "dotted":
- case "dottedHeavy":
- g["text-decoration"] = "underline dotted";
- break;
- case "double":
- g["text-decoration"] = "underline double";
- break;
- case "single":
- case "thick":
- g["text-decoration"] = "underline";
- break;
- case "wave":
- case "wavyDouble":
- case "wavyHeavy":
- g["text-decoration"] = "underline wavy";
- break;
- case "words":
- g["text-decoration"] = "underline";
- break;
- case "none":
- g["text-decoration"] = "none";
- break;
- }
- var i = fC.colorAttr(I, "color");
- i && (g["text-decoration-color"] = i);
- }
- }
- parseFont(I, g) {
- var C = ug.attr(I, "ascii"), i = RC.themeValue(I, "asciiTheme"), e = ug.attr(I, "eastAsia"), A = [C, i, e].filter((s) => s).map((s) => xX(s));
- A.length > 0 && (g["font-family"] = [...new Set(A)].join(", "));
- }
- parseIndentation(I, g) {
- var C = ug.lengthAttr(I, "firstLine"), i = ug.lengthAttr(I, "hanging"), e = ug.lengthAttr(I, "left"), A = ug.lengthAttr(I, "start"), s = ug.lengthAttr(I, "right"), l = ug.lengthAttr(I, "end");
- C && (g["text-indent"] = C), i && (g["text-indent"] = `-${i}`), (e || A) && (g["margin-left"] = e || A), (s || l) && (g["margin-right"] = s || l);
- }
- parseSpacing(I, g) {
- var C = ug.lengthAttr(I, "before"), i = ug.lengthAttr(I, "after"), e = ug.intAttr(I, "line", null), A = ug.attr(I, "lineRule");
- if (C && (g["margin-top"] = C), i && (g["margin-bottom"] = i), e !== null)
- switch (A) {
- case "auto":
- g["line-height"] = `${(e / 240).toFixed(2)}`;
- break;
- case "atLeast":
- g["line-height"] = `calc(100% + ${e / 20}pt)`;
- break;
- default:
- g["line-height"] = g["min-height"] = `${e / 20}pt`;
- break;
- }
- }
- parseMarginProperties(I, g) {
- fC.foreach(I, (C) => {
- switch (C.localName) {
- case "left":
- g["padding-left"] = RC.valueOfMargin(C);
- break;
- case "right":
- g["padding-right"] = RC.valueOfMargin(C);
- break;
- case "top":
- g["padding-top"] = RC.valueOfMargin(C);
- break;
- case "bottom":
- g["padding-bottom"] = RC.valueOfMargin(C);
- break;
- }
- });
- }
- parseTrHeight(I, g) {
- switch (ug.attr(I, "hRule")) {
- case "exact":
- g.height = ug.lengthAttr(I, "val");
- break;
- case "atLeast":
- default:
- g.height = ug.lengthAttr(I, "val");
- break;
- }
- }
- parseBorderProperties(I, g) {
- fC.foreach(I, (C) => {
- switch (C.localName) {
- case "start":
- case "left":
- g["border-left"] = RC.valueOfBorder(C);
- break;
- case "end":
- case "right":
- g["border-right"] = RC.valueOfBorder(C);
- break;
- case "top":
- g["border-top"] = RC.valueOfBorder(C);
- break;
- case "bottom":
- g["border-bottom"] = RC.valueOfBorder(C);
- break;
- }
- });
- }
- }
- const Mog = ["black", "blue", "cyan", "darkBlue", "darkCyan", "darkGray", "darkGreen", "darkMagenta", "darkRed", "darkYellow", "green", "lightGray", "magenta", "none", "red", "white", "yellow"];
- class fC {
- static foreach(I, g) {
- for (var C = 0; C < I.childNodes.length; C++) {
- let i = I.childNodes[C];
- i.nodeType == Node.ELEMENT_NODE && g(i);
- }
- }
- static colorAttr(I, g, C = null, i = "black") {
- var e = ug.attr(I, g);
- if (e)
- return e == "auto" ? i : Mog.includes(e) ? e : `#${e}`;
- var A = ug.attr(I, "themeColor");
- return A ? `var(--docx-${A}-color)` : C;
- }
- static sizeValue(I, g = st.Dxa) {
- return Z$(I.textContent, g);
- }
- }
- class RC {
- static themeValue(I, g) {
- var C = ug.attr(I, g);
- return C ? `var(--docx-${C}-font)` : null;
- }
- static valueOfSize(I, g) {
- var C = st.Dxa;
- switch (ug.attr(I, "type")) {
- case "dxa":
- break;
- case "pct":
- C = st.Percent;
- break;
- case "auto":
- return "auto";
- }
- return ug.lengthAttr(I, g, C);
- }
- static valueOfMargin(I) {
- return ug.lengthAttr(I, "w");
- }
- static valueOfBorder(I) {
- var g = ug.attr(I, "val");
- if (g == "nil")
- return "none";
- var C = fC.colorAttr(I, "color"), i = ug.lengthAttr(I, "sz", st.Border);
- return `${i} solid ${C == "auto" ? nN.borderColor : C}`;
- }
- static valueOfTblLayout(I) {
- var g = ug.attr(I, "val");
- return g == "fixed" ? "fixed" : "auto";
- }
- static classNameOfCnfStyle(I) {
- const g = ug.attr(I, "val");
- return [
- "first-row",
- "last-row",
- "first-col",
- "last-col",
- "odd-col",
- "even-col",
- "odd-row",
- "even-row",
- "ne-cell",
- "nw-cell",
- "se-cell",
- "sw-cell"
- ].filter((i, e) => g[e] == "1").join(" ");
- }
- static valueOfJc(I) {
- var g = ug.attr(I, "val");
- switch (g) {
- case "start":
- case "left":
- return "left";
- case "center":
- return "center";
- case "end":
- case "right":
- return "right";
- case "both":
- return "justify";
- }
- return g;
- }
- static valueOfVertAlign(I, g = !1) {
- var C = ug.attr(I, "val");
- switch (C) {
- case "subscript":
- return "sub";
- case "superscript":
- return g ? "sup" : "super";
- }
- return g ? null : C;
- }
- static valueOfTextAlignment(I) {
- var g = ug.attr(I, "val");
- switch (g) {
- case "auto":
- case "baseline":
- return "baseline";
- case "top":
- return "top";
- case "center":
- return "middle";
- case "bottom":
- return "bottom";
- }
- return g;
- }
- static addSize(I, g) {
- return I == null ? g : g == null ? I : `calc(${I} + ${g})`;
- }
- static classNameOftblLook(I) {
- const g = ug.hexAttr(I, "val", 0);
- let C = "";
- return (ug.boolAttr(I, "firstRow") || g & 32) && (C += " first-row"), (ug.boolAttr(I, "lastRow") || g & 64) && (C += " last-row"), (ug.boolAttr(I, "firstColumn") || g & 128) && (C += " first-col"), (ug.boolAttr(I, "lastColumn") || g & 256) && (C += " last-col"), (ug.boolAttr(I, "noHBand") || g & 512) && (C += " no-hband"), (ug.boolAttr(I, "noVBand") || g & 1024) && (C += " no-vband"), C.trim();
- }
- }
- const U6 = { pos: 0, leader: "none", style: "left" }, Rog = 50;
- function fog(t = document.body) {
- const I = document.createElement("div");
- I.style.width = "100pt", t.appendChild(I);
- const g = 100 / I.offsetWidth;
- return t.removeChild(I), g;
- }
- function Hog(t, I, g, C = 72 / 96) {
- const i = t.closest("p"), e = t.getBoundingClientRect(), A = i.getBoundingClientRect(), s = getComputedStyle(i), l = (I == null ? void 0 : I.length) > 0 ? I.map((m) => ({
- pos: E6(m.position),
- leader: m.leader,
- style: m.style
- })).sort((m, Z) => m.pos - Z.pos) : [U6], n = l[l.length - 1], a = A.width * C, d = E6(g);
- let o = n.pos + d;
- if (o < a)
- for (; o < a && l.length < Rog; o += d)
- l.push({ ...U6, pos: o });
- const c = parseFloat(s.marginLeft), r = A.left + c, h = (e.left - r) * C, b = l.find((m) => m.style != "clear" && m.pos > h);
- if (b == null)
- return;
- let u = 1;
- if (b.style == "right" || b.style == "center") {
- const m = Array.from(i.querySelectorAll(`.${t.className}`)), Z = m.indexOf(t) + 1, p = document.createRange();
- p.setStart(t, 1), Z < m.length ? p.setEndBefore(m[Z]) : p.setEndAfter(i);
- const Y = b.style == "center" ? 0.5 : 1, R = p.getBoundingClientRect(), X = R.left + Y * R.width - (A.left - c);
- u = b.pos - X * C;
- } else
- u = b.pos - h;
- switch (t.innerHTML = " ", t.style.textDecoration = "inherit", t.style.wordSpacing = `${u.toFixed(0)}pt`, b.leader) {
- case "dot":
- case "middleDot":
- t.style.textDecoration = "underline", t.style.textDecorationStyle = "dotted";
- break;
- case "hyphen":
- case "heavy":
- case "underscore":
- t.style.textDecoration = "underline";
- break;
- }
- }
- function E6(t) {
- return parseFloat(t);
- }
- const OI = {
- svg: "http://www.w3.org/2000/svg",
- mathML: "http://www.w3.org/1998/Math/MathML"
- };
- class Xog {
- constructor(I) {
- this.htmlDocument = I, this.className = "docx", this.styleMap = {}, this.currentPart = null, this.tableVerticalMerges = [], this.currentVerticalMerge = null, this.tableCellPositions = [], this.currentCellPosition = null, this.footnoteMap = {}, this.endnoteMap = {}, this.currentEndnoteIds = [], this.usedHederFooterParts = [], this.currentTabs = [], this.commentMap = {}, this.tasks = [], this.postRenderTasks = [];
- }
- async render(I, g, C = null, i) {
- var A;
- this.document = I, this.options = i, this.className = i.className, this.rootSelector = i.inWrapper ? `.${this.className}-wrapper` : ":root", this.styleMap = null, this.tasks = [], this.options.renderComments && globalThis.Highlight && (this.commentHighlight = new Highlight()), C = C || g, P6(C), P6(g), C.appendChild(this.createComment("docxjs library predefined styles")), C.appendChild(this.renderDefaultStyle()), I.themePart && (C.appendChild(this.createComment("docxjs document theme values")), this.renderTheme(I.themePart, C)), I.stylesPart != null && (this.styleMap = this.processStyles(I.stylesPart.styles), C.appendChild(this.createComment("docxjs document styles")), C.appendChild(this.renderStyles(I.stylesPart.styles))), I.numberingPart && (this.prodessNumberings(I.numberingPart.domNumberings), C.appendChild(this.createComment("docxjs document numbering styles")), C.appendChild(this.renderNumbering(I.numberingPart.domNumberings, C))), I.footnotesPart && (this.footnoteMap = ea(I.footnotesPart.notes, (s) => s.id)), I.endnotesPart && (this.endnoteMap = ea(I.endnotesPart.notes, (s) => s.id)), I.settingsPart && (this.defaultTabSize = (A = I.settingsPart.settings) == null ? void 0 : A.defaultTabStop), !i.ignoreFonts && I.fontTablePart && this.renderFontTable(I.fontTablePart, C);
- var e = this.renderSections(I.documentPart.body);
- this.options.inWrapper ? g.appendChild(this.renderWrapper(e)) : JH(g, e), this.commentHighlight && i.renderComments && CSS.highlights.set(`${this.className}-comments`, this.commentHighlight), this.postRenderTasks.forEach((s) => s()), await Promise.allSettled(this.tasks), this.refreshTabStops();
- }
- renderTheme(I, g) {
- var s, l;
- const C = {}, i = (s = I.theme) == null ? void 0 : s.fontScheme;
- i && (i.majorFont && (C["--docx-majorHAnsi-font"] = i.majorFont.latinTypeface), i.minorFont && (C["--docx-minorHAnsi-font"] = i.minorFont.latinTypeface));
- const e = (l = I.theme) == null ? void 0 : l.colorScheme;
- if (e)
- for (let [n, a] of Object.entries(e.colors))
- C[`--docx-${n}-color`] = `#${a}`;
- const A = this.styleToString(`.${this.className}`, C);
- g.appendChild(this.createStyleElement(A));
- }
- renderFontTable(I, g) {
- for (let C of I.fonts)
- for (let i of C.embedFontRefs)
- this.tasks.push(this.document.loadFont(i.id, i.key).then((e) => {
- const A = {
- "font-family": xX(C.name),
- src: `url(${e})`
- };
- (i.type == "bold" || i.type == "boldItalic") && (A["font-weight"] = "bold"), (i.type == "italic" || i.type == "boldItalic") && (A["font-style"] = "italic");
- const s = this.styleToString("@font-face", A);
- g.appendChild(this.createComment(`docxjs ${C.name} font`)), g.appendChild(this.createStyleElement(s));
- }));
- }
- processStyleName(I) {
- return I ? `${this.className}_${uag(I)}` : this.className;
- }
- processStyles(I) {
- const g = ea(I.filter((i) => i.id != null), (i) => i.id);
- for (const i of I.filter((e) => e.basedOn)) {
- var C = g[i.basedOn];
- if (C) {
- i.paragraphProps = gV(i.paragraphProps, C.paragraphProps), i.runProps = gV(i.runProps, C.runProps);
- for (const e of C.styles) {
- const A = i.styles.find((s) => s.target == e.target);
- A ? this.copyStyleProperties(e.values, A.values) : i.styles.push({ ...e, values: { ...e.values } });
- }
- } else this.options.debug && console.warn(`Can't find base style ${i.basedOn}`);
- }
- for (let i of I)
- i.cssName = this.processStyleName(i.id);
- return g;
- }
- prodessNumberings(I) {
- var g;
- for (let C of I.filter((i) => i.pStyleName)) {
- const i = this.findStyle(C.pStyleName);
- (g = i == null ? void 0 : i.paragraphProps) != null && g.numbering && (i.paragraphProps.numbering.level = C.level);
- }
- }
- processElement(I) {
- if (I.children)
- for (var g of I.children)
- g.parent = I, g.type == Yg.Table ? this.processTable(g) : this.processElement(g);
- }
- processTable(I) {
- for (var g of I.children)
- for (var C of g.children)
- C.cssStyle = this.copyStyleProperties(I.cellStyle, C.cssStyle, [
- "border-left",
- "border-right",
- "border-top",
- "border-bottom",
- "padding-left",
- "padding-right",
- "padding-top",
- "padding-bottom"
- ]), this.processElement(C);
- }
- copyStyleProperties(I, g, C = null) {
- if (!I)
- return g;
- g == null && (g = {}), C == null && (C = Object.getOwnPropertyNames(I));
- for (var i of C)
- I.hasOwnProperty(i) && !g.hasOwnProperty(i) && (g[i] = I[i]);
- return g;
- }
- createPageElement(I, g) {
- var C = this.createElement("section", { className: I });
- return g && (g.pageMargins && (C.style.paddingLeft = g.pageMargins.left, C.style.paddingRight = g.pageMargins.right, C.style.paddingTop = g.pageMargins.top, C.style.paddingBottom = g.pageMargins.bottom), g.pageSize && (this.options.ignoreWidth || (C.style.width = g.pageSize.width), this.options.ignoreHeight || (C.style.minHeight = g.pageSize.height))), C;
- }
- createSectionContent(I) {
- var g = this.createElement("article");
- return I.columns && I.columns.numberOfColumns && (g.style.columnCount = `${I.columns.numberOfColumns}`, g.style.columnGap = I.columns.space, I.columns.separator && (g.style.columnRule = "1px solid black")), g;
- }
- renderSections(I) {
- const g = [];
- this.processElement(I);
- const C = this.splitBySection(I.children, I.props), i = this.groupByPageBreaks(C);
- let e = null;
- for (let s = 0, l = i.length; s < l; s++) {
- this.currentFootnoteIds = [];
- let a = i[s][0].sectProps;
- const d = this.createPageElement(this.className, a);
- this.renderStyleValues(I.cssStyle, d), this.options.renderHeaders && this.renderHeaderFooter(a.headerRefs, a, g.length, e != a, d);
- for (const o of i[s]) {
- var A = this.createSectionContent(o.sectProps);
- this.renderElements(o.elements, A), d.appendChild(A), a = o.sectProps;
- }
- this.options.renderFootnotes && this.renderNotes(this.currentFootnoteIds, this.footnoteMap, d), this.options.renderEndnotes && s == l - 1 && this.renderNotes(this.currentEndnoteIds, this.endnoteMap, d), this.options.renderFooters && this.renderHeaderFooter(a.footerRefs, a, g.length, e != a, d), g.push(d), e = a;
- }
- return g;
- }
- renderHeaderFooter(I, g, C, i, e) {
- if (I) {
- var A = (g.titlePage && i ? I.find((l) => l.type == "first") : null) ?? (C % 2 == 1 ? I.find((l) => l.type == "even") : null) ?? I.find((l) => l.type == "default"), s = A && this.document.findPartByRelId(A.id, this.document.documentPart);
- if (s) {
- this.currentPart = s, this.usedHederFooterParts.includes(s.path) || (this.processElement(s.rootElement), this.usedHederFooterParts.push(s.path));
- const [l] = this.renderElements([s.rootElement], e);
- g != null && g.pageMargins && (s.rootElement.type === Yg.Header ? (l.style.marginTop = `calc(${g.pageMargins.header} - ${g.pageMargins.top})`, l.style.minHeight = `calc(${g.pageMargins.top} - ${g.pageMargins.header})`) : s.rootElement.type === Yg.Footer && (l.style.marginBottom = `calc(${g.pageMargins.footer} - ${g.pageMargins.bottom})`, l.style.minHeight = `calc(${g.pageMargins.bottom} - ${g.pageMargins.footer})`)), this.currentPart = null;
- }
- }
- }
- isPageBreakElement(I) {
- return I.type != Yg.Break ? !1 : I.break == "lastRenderedPageBreak" ? !this.options.ignoreLastRenderedPageBreak : I.break == "page";
- }
- isPageBreakSection(I, g) {
- var C, i, e, A, s, l;
- return !I || !g ? !1 : ((C = I.pageSize) == null ? void 0 : C.orientation) != ((i = g.pageSize) == null ? void 0 : i.orientation) || ((e = I.pageSize) == null ? void 0 : e.width) != ((A = g.pageSize) == null ? void 0 : A.width) || ((s = I.pageSize) == null ? void 0 : s.height) != ((l = g.pageSize) == null ? void 0 : l.height);
- }
- splitBySection(I, g) {
- var d;
- var C = { sectProps: null, elements: [], pageBreak: !1 }, i = [C];
- for (let o of I) {
- if (o.type == Yg.Paragraph) {
- const c = this.findStyle(o.styleName);
- (d = c == null ? void 0 : c.paragraphProps) != null && d.pageBreakBefore && (C.sectProps = e, C.pageBreak = !0, C = { sectProps: null, elements: [], pageBreak: !1 }, i.push(C));
- }
- if (C.elements.push(o), o.type == Yg.Paragraph) {
- const c = o;
- var e = c.sectionProps, A = -1, s = -1;
- if (this.options.breakPages && c.children && (A = c.children.findIndex((r) => {
- var h;
- return s = ((h = r.children) == null ? void 0 : h.findIndex(this.isPageBreakElement.bind(this))) ?? -1, s != -1;
- })), (e || A != -1) && (C.sectProps = e, C.pageBreak = A != -1, C = { sectProps: null, elements: [], pageBreak: !1 }, i.push(C)), A != -1) {
- let r = c.children[A], h = s < r.children.length - 1;
- if (A < c.children.length - 1 || h) {
- var l = o.children, n = { ...o, children: l.slice(A) };
- if (o.children = l.slice(0, A), C.elements.push(n), h) {
- let b = r.children, u = { ...r, children: b.slice(0, s) };
- o.children.push(u), r.children = b.slice(s);
- }
- }
- }
- }
- }
- let a = null;
- for (let o = i.length - 1; o >= 0; o--)
- i[o].sectProps == null ? i[o].sectProps = a ?? g : a = i[o].sectProps;
- return i;
- }
- groupByPageBreaks(I) {
- let g = [], C;
- const i = [g];
- for (let e of I)
- g.push(e), (this.options.ignoreLastRenderedPageBreak || e.pageBreak || this.isPageBreakSection(C, e.sectProps)) && i.push(g = []), C = e.sectProps;
- return i.filter((e) => e.length > 0);
- }
- renderWrapper(I) {
- return this.createElement("div", { className: `${this.className}-wrapper` }, I);
- }
- renderDefaultStyle() {
- var I = this.className, g = `
- .${I}-wrapper { background: gray; padding: 30px; padding-bottom: 0px; display: flex; flex-flow: column; align-items: center; }
- .${I}-wrapper>section.${I} { background: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); margin-bottom: 30px; }`;
- this.options.hideWrapperOnPrint && (g = `@media not print { ${g} }`);
- var C = `${g}
- .${I} { color: black; hyphens: auto; text-underline-position: from-font; }
- section.${I} { box-sizing: border-box; display: flex; flex-flow: column nowrap; position: relative; overflow: hidden; }
- section.${I}>article { margin-bottom: auto; z-index: 1; }
- section.${I}>footer { z-index: 1; }
- .${I} table { border-collapse: collapse; }
- .${I} table td, .${I} table th { vertical-align: top; }
- .${I} p { margin: 0pt; min-height: 1em; }
- .${I} span { white-space: pre-wrap; overflow-wrap: break-word; }
- .${I} a { color: inherit; text-decoration: inherit; }
- .${I} svg { fill: transparent; }
- `;
- return this.options.renderComments && (C += `
- .${I}-comment-ref { cursor: default; }
- .${I}-comment-popover { display: none; z-index: 1000; padding: 0.5rem; background: white; position: absolute; box-shadow: 0 0 0.25rem rgba(0, 0, 0, 0.25); width: 30ch; }
- .${I}-comment-ref:hover~.${I}-comment-popover { display: block; }
- .${I}-comment-author,.${I}-comment-date { font-size: 0.875rem; color: #888; }
- `), this.createStyleElement(C);
- }
- renderNumbering(I, g) {
- var C = "", i = [];
- for (var e of I) {
- var A = `p.${this.numberingClass(e.id, e.level)}`, s = "none";
- if (e.bullet) {
- let l = `--${this.className}-${e.bullet.src}`.toLowerCase();
- C += this.styleToString(`${A}:before`, {
- content: "' '",
- display: "inline-block",
- background: `var(${l})`
- }, e.bullet.style), this.tasks.push(this.document.loadNumberingImage(e.bullet.src).then((n) => {
- var a = `${this.rootSelector} { ${l}: url(${n}) }`;
- g.appendChild(this.createStyleElement(a));
- }));
- } else if (e.levelText) {
- let l = this.numberingCounter(e.id, e.level);
- const n = l + " " + (e.start - 1);
- e.level > 0 && (C += this.styleToString(`p.${this.numberingClass(e.id, e.level - 1)}`, {
- "counter-set": n
- })), i.push(n), C += this.styleToString(`${A}:before`, {
- content: this.levelTextToContent(e.levelText, e.suff, e.id, this.numFormatToCssValue(e.format)),
- "counter-increment": l,
- ...e.rStyle
- });
- } else
- s = this.numFormatToCssValue(e.format);
- C += this.styleToString(A, {
- display: "list-item",
- "list-style-position": "inside",
- "list-style-type": s,
- ...e.pStyle
- });
- }
- return i.length > 0 && (C += this.styleToString(this.rootSelector, {
- "counter-reset": i.join(" ")
- })), this.createStyleElement(C);
- }
- renderStyles(I) {
- var g = "";
- const C = this.styleMap, i = ea(I.filter((l) => l.isDefault), (l) => l.target);
- for (const l of I) {
- var e = l.styles;
- if (l.linked) {
- var A = l.linked && C[l.linked];
- A ? e = e.concat(A.styles) : this.options.debug && console.warn(`Can't find linked style ${l.linked}`);
- }
- for (const n of e) {
- var s = `${l.target ?? ""}.${l.cssName}`;
- l.target != n.target && (s += ` ${n.target}`), i[l.target] == l && (s = `.${this.className} ${l.target}, ` + s), g += this.styleToString(s, n.values);
- }
- }
- return this.createStyleElement(g);
- }
- renderNotes(I, g, C) {
- var i = I.map((A) => g[A]).filter((A) => A);
- if (i.length > 0) {
- var e = this.createElement("ol", null, this.renderElements(i));
- C.appendChild(e);
- }
- }
- renderElement(I) {
- switch (I.type) {
- case Yg.Paragraph:
- return this.renderParagraph(I);
- case Yg.BookmarkStart:
- return this.renderBookmarkStart(I);
- case Yg.BookmarkEnd:
- return null;
- case Yg.Run:
- return this.renderRun(I);
- case Yg.Table:
- return this.renderTable(I);
- case Yg.Row:
- return this.renderTableRow(I);
- case Yg.Cell:
- return this.renderTableCell(I);
- case Yg.Hyperlink:
- return this.renderHyperlink(I);
- case Yg.SmartTag:
- return this.renderSmartTag(I);
- case Yg.Drawing:
- return this.renderDrawing(I);
- case Yg.Image:
- return this.renderImage(I);
- case Yg.Text:
- return this.renderText(I);
- case Yg.Text:
- return this.renderText(I);
- case Yg.DeletedText:
- return this.renderDeletedText(I);
- case Yg.Tab:
- return this.renderTab(I);
- case Yg.Symbol:
- return this.renderSymbol(I);
- case Yg.Break:
- return this.renderBreak(I);
- case Yg.Footer:
- return this.renderContainer(I, "footer");
- case Yg.Header:
- return this.renderContainer(I, "header");
- case Yg.Footnote:
- case Yg.Endnote:
- return this.renderContainer(I, "li");
- case Yg.FootnoteReference:
- return this.renderFootnoteReference(I);
- case Yg.EndnoteReference:
- return this.renderEndnoteReference(I);
- case Yg.NoBreakHyphen:
- return this.createElement("wbr");
- case Yg.VmlPicture:
- return this.renderVmlPicture(I);
- case Yg.VmlElement:
- return this.renderVmlElement(I);
- case Yg.MmlMath:
- return this.renderContainerNS(I, OI.mathML, "math", { xmlns: OI.mathML });
- case Yg.MmlMathParagraph:
- return this.renderContainer(I, "span");
- case Yg.MmlFraction:
- return this.renderContainerNS(I, OI.mathML, "mfrac");
- case Yg.MmlBase:
- return this.renderContainerNS(I, OI.mathML, I.parent.type == Yg.MmlMatrixRow ? "mtd" : "mrow");
- case Yg.MmlNumerator:
- case Yg.MmlDenominator:
- case Yg.MmlFunction:
- case Yg.MmlLimit:
- case Yg.MmlBox:
- return this.renderContainerNS(I, OI.mathML, "mrow");
- case Yg.MmlGroupChar:
- return this.renderMmlGroupChar(I);
- case Yg.MmlLimitLower:
- return this.renderContainerNS(I, OI.mathML, "munder");
- case Yg.MmlMatrix:
- return this.renderContainerNS(I, OI.mathML, "mtable");
- case Yg.MmlMatrixRow:
- return this.renderContainerNS(I, OI.mathML, "mtr");
- case Yg.MmlRadical:
- return this.renderMmlRadical(I);
- case Yg.MmlSuperscript:
- return this.renderContainerNS(I, OI.mathML, "msup");
- case Yg.MmlSubscript:
- return this.renderContainerNS(I, OI.mathML, "msub");
- case Yg.MmlDegree:
- case Yg.MmlSuperArgument:
- case Yg.MmlSubArgument:
- return this.renderContainerNS(I, OI.mathML, "mn");
- case Yg.MmlFunctionName:
- return this.renderContainerNS(I, OI.mathML, "ms");
- case Yg.MmlDelimiter:
- return this.renderMmlDelimiter(I);
- case Yg.MmlRun:
- return this.renderMmlRun(I);
- case Yg.MmlNary:
- return this.renderMmlNary(I);
- case Yg.MmlPreSubSuper:
- return this.renderMmlPreSubSuper(I);
- case Yg.MmlBar:
- return this.renderMmlBar(I);
- case Yg.MmlEquationArray:
- return this.renderMllList(I);
- case Yg.Inserted:
- return this.renderInserted(I);
- case Yg.Deleted:
- return this.renderDeleted(I);
- case Yg.CommentRangeStart:
- return this.renderCommentRangeStart(I);
- case Yg.CommentRangeEnd:
- return this.renderCommentRangeEnd(I);
- case Yg.CommentReference:
- return this.renderCommentReference(I);
- case Yg.AltChunk:
- return this.renderAltChunk(I);
- }
- return null;
- }
- renderElements(I, g) {
- if (I == null)
- return null;
- var C = I.flatMap((i) => this.renderElement(i)).filter((i) => i != null);
- return g && JH(g, C), C;
- }
- renderContainer(I, g, C) {
- return this.createElement(g, C, this.renderElements(I.children));
- }
- renderContainerNS(I, g, C, i) {
- return this.createElementNS(g, C, i, this.renderElements(I.children));
- }
- renderParagraph(I) {
- var e, A;
- var g = this.renderContainer(I, "p");
- const C = this.findStyle(I.styleName);
- I.tabs ?? (I.tabs = (e = C == null ? void 0 : C.paragraphProps) == null ? void 0 : e.tabs), this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), this.renderCommonProperties(g.style, I);
- const i = I.numbering ?? ((A = C == null ? void 0 : C.paragraphProps) == null ? void 0 : A.numbering);
- return i && g.classList.add(this.numberingClass(i.id, i.level)), g;
- }
- renderRunProperties(I, g) {
- this.renderCommonProperties(I, g);
- }
- renderCommonProperties(I, g) {
- g != null && (g.color && (I.color = g.color), g.fontSize && (I["font-size"] = g.fontSize));
- }
- renderHyperlink(I) {
- var g = this.renderContainer(I, "a");
- this.renderStyleValues(I.cssStyle, g);
- let C = "";
- if (I.id) {
- const i = this.document.documentPart.rels.find((e) => e.id == I.id && e.targetMode === "External");
- C = (i == null ? void 0 : i.target) ?? C;
- }
- return I.anchor && (C += `#${I.anchor}`), g.href = C, g;
- }
- renderSmartTag(I) {
- return this.renderContainer(I, "span");
- }
- renderCommentRangeStart(I) {
- var i;
- if (!this.options.renderComments)
- return null;
- const g = new Range();
- (i = this.commentHighlight) == null || i.add(g);
- const C = this.htmlDocument.createComment(`start of comment #${I.id}`);
- return this.later(() => g.setStart(C, 0)), this.commentMap[I.id] = g, C;
- }
- renderCommentRangeEnd(I) {
- if (!this.options.renderComments)
- return null;
- const g = this.commentMap[I.id], C = this.htmlDocument.createComment(`end of comment #${I.id}`);
- return this.later(() => g == null ? void 0 : g.setEnd(C, 0)), C;
- }
- renderCommentReference(I) {
- var A;
- if (!this.options.renderComments)
- return null;
- var g = (A = this.document.commentsPart) == null ? void 0 : A.commentMap[I.id];
- if (!g)
- return null;
- const C = new DocumentFragment(), i = this.createElement("span", { className: `${this.className}-comment-ref` }, ["💬"]), e = this.createElement("div", { className: `${this.className}-comment-popover` });
- return this.renderCommentContent(g, e), C.appendChild(this.htmlDocument.createComment(`comment #${g.id} by ${g.author} on ${g.date}`)), C.appendChild(i), C.appendChild(e), C;
- }
- renderAltChunk(I) {
- if (!this.options.renderAltChunks)
- return null;
- var g = this.createElement("iframe");
- return this.tasks.push(this.document.loadAltChunk(I.id, this.currentPart).then((C) => {
- g.srcdoc = C;
- })), g;
- }
- renderCommentContent(I, g) {
- g.appendChild(this.createElement("div", { className: `${this.className}-comment-author` }, [I.author])), g.appendChild(this.createElement("div", { className: `${this.className}-comment-date` }, [new Date(I.date).toLocaleString()])), this.renderElements(I.children, g);
- }
- renderDrawing(I) {
- var g = this.renderContainer(I, "div");
- return g.style.display = "inline-block", g.style.position = "relative", g.style.textIndent = "0px", this.renderStyleValues(I.cssStyle, g), g;
- }
- renderImage(I) {
- let g = this.createElement("img");
- return this.renderStyleValues(I.cssStyle, g), this.document && this.tasks.push(this.document.loadDocumentImage(I.src, this.currentPart).then((C) => {
- g.src = C;
- })), g;
- }
- renderText(I) {
- return this.htmlDocument.createTextNode(I.text);
- }
- renderDeletedText(I) {
- return this.options.renderEndnotes ? this.htmlDocument.createTextNode(I.text) : null;
- }
- renderBreak(I) {
- return I.break == "textWrapping" ? this.createElement("br") : null;
- }
- renderInserted(I) {
- return this.options.renderChanges ? this.renderContainer(I, "ins") : this.renderElements(I.children);
- }
- renderDeleted(I) {
- return this.options.renderChanges ? this.renderContainer(I, "del") : null;
- }
- renderSymbol(I) {
- var g = this.createElement("span");
- return g.style.fontFamily = I.font, g.innerHTML = `&#x${I.char};`, g;
- }
- renderFootnoteReference(I) {
- var g = this.createElement("sup");
- return this.currentFootnoteIds.push(I.id), g.textContent = `${this.currentFootnoteIds.length}`, g;
- }
- renderEndnoteReference(I) {
- var g = this.createElement("sup");
- return this.currentEndnoteIds.push(I.id), g.textContent = `${this.currentEndnoteIds.length}`, g;
- }
- renderTab(I) {
- var i;
- var g = this.createElement("span");
- if (g.innerHTML = " ", this.options.experimental) {
- g.className = this.tabStopClass();
- var C = (i = Sog(I, Yg.Paragraph)) == null ? void 0 : i.tabs;
- this.currentTabs.push({ stops: C, span: g });
- }
- return g;
- }
- renderBookmarkStart(I) {
- return this.createElement("span", { id: I.name });
- }
- renderRun(I) {
- if (I.fieldRun)
- return null;
- const g = this.createElement("span");
- if (I.id && (g.id = I.id), this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), I.verticalAlign) {
- const C = this.createElement(I.verticalAlign);
- this.renderElements(I.children, C), g.appendChild(C);
- } else
- this.renderElements(I.children, g);
- return g;
- }
- renderTable(I) {
- let g = this.createElement("table");
- return this.tableCellPositions.push(this.currentCellPosition), this.tableVerticalMerges.push(this.currentVerticalMerge), this.currentVerticalMerge = {}, this.currentCellPosition = { col: 0, row: 0 }, I.columns && g.appendChild(this.renderTableColumns(I.columns)), this.renderClass(I, g), this.renderElements(I.children, g), this.renderStyleValues(I.cssStyle, g), this.currentVerticalMerge = this.tableVerticalMerges.pop(), this.currentCellPosition = this.tableCellPositions.pop(), g;
- }
- renderTableColumns(I) {
- let g = this.createElement("colgroup");
- for (let C of I) {
- let i = this.createElement("col");
- C.width && (i.style.width = C.width), g.appendChild(i);
- }
- return g;
- }
- renderTableRow(I) {
- let g = this.renderContainer(I, "tr");
- return this.currentCellPosition.col = 0, this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), this.currentCellPosition.row++, g;
- }
- renderTableCell(I) {
- let g = this.renderContainer(I, "td");
- const C = this.currentCellPosition.col;
- return I.verticalMerge ? I.verticalMerge == "restart" ? (this.currentVerticalMerge[C] = g, g.rowSpan = 1) : this.currentVerticalMerge[C] && (this.currentVerticalMerge[C].rowSpan += 1, g.style.display = "none") : this.currentVerticalMerge[C] = null, this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), I.span && (g.colSpan = I.span), this.currentCellPosition.col += g.colSpan, g;
- }
- renderVmlPicture(I) {
- return this.renderContainer(I, "div");
- }
- renderVmlElement(I) {
- var i, e;
- var g = this.createSvgElement("svg");
- g.setAttribute("style", I.cssStyleText);
- const C = this.renderVmlChildElement(I);
- return (i = I.imageHref) != null && i.id && this.tasks.push((e = this.document) == null ? void 0 : e.loadDocumentImage(I.imageHref.id, this.currentPart).then((A) => C.setAttribute("href", A))), g.appendChild(C), requestAnimationFrame(() => {
- const A = g.firstElementChild.getBBox();
- g.setAttribute("width", `${Math.ceil(A.x + A.width)}`), g.setAttribute("height", `${Math.ceil(A.y + A.height)}`);
- }), g;
- }
- renderVmlChildElement(I) {
- const g = this.createSvgElement(I.tagName);
- Object.entries(I.attrs).forEach(([C, i]) => g.setAttribute(C, i));
- for (let C of I.children)
- C.type == Yg.VmlElement ? g.appendChild(this.renderVmlChildElement(C)) : g.appendChild(...Ru(this.renderElement(C)));
- return g;
- }
- renderMmlRadical(I) {
- var i;
- const g = I.children.find((e) => e.type == Yg.MmlBase);
- if ((i = I.props) != null && i.hideDegree)
- return this.createElementNS(OI.mathML, "msqrt", null, this.renderElements([g]));
- const C = I.children.find((e) => e.type == Yg.MmlDegree);
- return this.createElementNS(OI.mathML, "mroot", null, this.renderElements([g, C]));
- }
- renderMmlDelimiter(I) {
- const g = [];
- return g.push(this.createElementNS(OI.mathML, "mo", null, [I.props.beginChar ?? "("])), g.push(...this.renderElements(I.children)), g.push(this.createElementNS(OI.mathML, "mo", null, [I.props.endChar ?? ")"])), this.createElementNS(OI.mathML, "mrow", null, g);
- }
- renderMmlNary(I) {
- var n;
- const g = [], C = ea(I.children, (a) => a.type), i = C[Yg.MmlSuperArgument], e = C[Yg.MmlSubArgument], A = i ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(i))) : null, s = e ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(e))) : null, l = this.createElementNS(OI.mathML, "mo", null, [((n = I.props) == null ? void 0 : n.char) ?? "∫"]);
- return A || s ? g.push(this.createElementNS(OI.mathML, "munderover", null, [l, s, A])) : A ? g.push(this.createElementNS(OI.mathML, "mover", null, [l, A])) : s ? g.push(this.createElementNS(OI.mathML, "munder", null, [l, s])) : g.push(l), g.push(...this.renderElements(C[Yg.MmlBase].children)), this.createElementNS(OI.mathML, "mrow", null, g);
- }
- renderMmlPreSubSuper(I) {
- const g = [], C = ea(I.children, (n) => n.type), i = C[Yg.MmlSuperArgument], e = C[Yg.MmlSubArgument], A = i ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(i))) : null, s = e ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(e))) : null, l = this.createElementNS(OI.mathML, "mo", null);
- return g.push(this.createElementNS(OI.mathML, "msubsup", null, [l, s, A])), g.push(...this.renderElements(C[Yg.MmlBase].children)), this.createElementNS(OI.mathML, "mrow", null, g);
- }
- renderMmlGroupChar(I) {
- const g = I.props.verticalJustification === "bot" ? "mover" : "munder", C = this.renderContainerNS(I, OI.mathML, g);
- return I.props.char && C.appendChild(this.createElementNS(OI.mathML, "mo", null, [I.props.char])), C;
- }
- renderMmlBar(I) {
- const g = this.renderContainerNS(I, OI.mathML, "mrow");
- switch (I.props.position) {
- case "top":
- g.style.textDecoration = "overline";
- break;
- case "bottom":
- g.style.textDecoration = "underline";
- break;
- }
- return g;
- }
- renderMmlRun(I) {
- const g = this.createElementNS(OI.mathML, "ms", null, this.renderElements(I.children));
- return this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), g;
- }
- renderMllList(I) {
- const g = this.createElementNS(OI.mathML, "mtable");
- this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g);
- for (let C of this.renderElements(I.children))
- g.appendChild(this.createElementNS(OI.mathML, "mtr", null, [
- this.createElementNS(OI.mathML, "mtd", null, [C])
- ]));
- return g;
- }
- renderStyleValues(I, g) {
- for (let C in I)
- C.startsWith("$") ? g.setAttribute(C.slice(1), I[C]) : g.style[C] = I[C];
- }
- renderClass(I, g) {
- I.className && (g.className = I.className), I.styleName && g.classList.add(this.processStyleName(I.styleName));
- }
- findStyle(I) {
- var g;
- return I && ((g = this.styleMap) == null ? void 0 : g[I]);
- }
- numberingClass(I, g) {
- return `${this.className}-num-${I}-${g}`;
- }
- tabStopClass() {
- return `${this.className}-tab-stop`;
- }
- styleToString(I, g, C = null) {
- let i = `${I} {\r
- `;
- for (const e in g)
- e.startsWith("$") || (i += ` ${e}: ${g[e]};\r
- `);
- return C && (i += C), i + `}\r
- `;
- }
- numberingCounter(I, g) {
- return `${this.className}-num-${I}-${g}`;
- }
- levelTextToContent(I, g, C, i) {
- const e = {
- tab: "\\9",
- space: "\\a0"
- };
- var A = I.replace(/%\d*/g, (s) => {
- let l = parseInt(s.substring(1), 10) - 1;
- return `"counter(${this.numberingCounter(C, l)}, ${i})"`;
- });
- return `"${A}${e[g] ?? ""}"`;
- }
- numFormatToCssValue(I) {
- var g = {
- none: "none",
- bullet: "disc",
- decimal: "decimal",
- lowerLetter: "lower-alpha",
- upperLetter: "upper-alpha",
- lowerRoman: "lower-roman",
- upperRoman: "upper-roman",
- decimalZero: "decimal-leading-zero",
- aiueo: "katakana",
- aiueoFullWidth: "katakana",
- chineseCounting: "simp-chinese-informal",
- chineseCountingThousand: "simp-chinese-informal",
- chineseLegalSimplified: "simp-chinese-formal",
- chosung: "hangul-consonant",
- ideographDigital: "cjk-ideographic",
- ideographTraditional: "cjk-heavenly-stem",
- ideographLegalTraditional: "trad-chinese-formal",
- ideographZodiac: "cjk-earthly-branch",
- iroha: "katakana-iroha",
- irohaFullWidth: "katakana-iroha",
- japaneseCounting: "japanese-informal",
- japaneseDigitalTenThousand: "cjk-decimal",
- japaneseLegal: "japanese-formal",
- thaiNumbers: "thai",
- koreanCounting: "korean-hangul-formal",
- koreanDigital: "korean-hangul-formal",
- koreanDigital2: "korean-hanja-informal",
- hebrew1: "hebrew",
- hebrew2: "hebrew",
- hindiNumbers: "devanagari",
- ganada: "hangul",
- taiwaneseCounting: "cjk-ideographic",
- taiwaneseCountingThousand: "cjk-ideographic",
- taiwaneseDigital: "cjk-decimal"
- };
- return g[I] ?? I;
- }
- refreshTabStops() {
- this.options.experimental && setTimeout(() => {
- const I = fog();
- for (let g of this.currentTabs)
- Hog(g.span, g.stops, this.defaultTabSize, I);
- }, 500);
- }
- createElementNS(I, g, C, i) {
- var e = I ? this.htmlDocument.createElementNS(I, g) : this.htmlDocument.createElement(g);
- return Object.assign(e, C), i && JH(e, i), e;
- }
- createElement(I, g, C) {
- return this.createElementNS(void 0, I, g, C);
- }
- createSvgElement(I, g, C) {
- return this.createElementNS(OI.svg, I, g, C);
- }
- createStyleElement(I) {
- return this.createElement("style", { innerHTML: I });
- }
- createComment(I) {
- return this.htmlDocument.createComment(I);
- }
- later(I) {
- this.postRenderTasks.push(I);
- }
- }
- function P6(t) {
- t.innerHTML = "";
- }
- function JH(t, I) {
- I.forEach((g) => t.appendChild(Zag(g) ? document.createTextNode(g) : g));
- }
- function Sog(t, I) {
- for (var g = t.parent; g != null && g.type != I; )
- g = g.parent;
- return g;
- }
- const o9 = {
- ignoreHeight: !1,
- ignoreWidth: !1,
- ignoreFonts: !1,
- breakPages: !0,
- debug: !1,
- experimental: !1,
- className: "docx",
- inWrapper: !0,
- hideWrapperOnPrint: !1,
- trimXmlDeclaration: !0,
- ignoreLastRenderedPageBreak: !0,
- renderHeaders: !0,
- renderFooters: !0,
- renderFootnotes: !0,
- renderEndnotes: !0,
- useBase64URL: !1,
- renderChanges: !1,
- renderComments: !1,
- renderAltChunks: !0
- };
- function Dog(t, I) {
- const g = { ...o9, ...I };
- return a9.load(t, new Vog(g), g);
- }
- async function Kog(t, I, g, C) {
- const i = { ...o9, ...C };
- return await new Xog(window.document).render(t, I, g, i);
- }
- async function Fog(t, I, g, C) {
- const i = await Dog(t, C);
- return await Kog(i, I, g, C), i;
- }
- var mm = {};
- mm.d = (t, I) => {
- for (var g in I)
- mm.o(I, g) && !mm.o(t, g) && Object.defineProperty(t, g, { enumerable: !0, get: I[g] });
- };
- mm.o = (t, I) => Object.prototype.hasOwnProperty.call(t, I);
- var pI = globalThis.pdfjsLib = {};
- mm.d(pI, {
- AbortException: () => (
- /* reexport */
- Ea
- ),
- AnnotationEditorLayer: () => (
- /* reexport */
- tD
- ),
- AnnotationEditorParamsType: () => (
- /* reexport */
- iC
- ),
- AnnotationEditorType: () => (
- /* reexport */
- XI
- ),
- AnnotationEditorUIManager: () => (
- /* reexport */
- dd
- ),
- AnnotationLayer: () => (
- /* reexport */
- HS
- ),
- AnnotationMode: () => (
- /* reexport */
- la
- ),
- AnnotationType: () => (
- /* reexport */
- dt
- ),
- ColorPicker: () => (
- /* reexport */
- sV
- ),
- DOMSVGFactory: () => (
- /* reexport */
- eV
- ),
- DrawLayer: () => (
- /* reexport */
- AD
- ),
- FeatureTest: () => (
- /* reexport */
- Ai
- ),
- GlobalWorkerOptions: () => (
- /* reexport */
- Ql
- ),
- ImageKind: () => (
- /* reexport */
- aN
- ),
- InvalidPDFException: () => (
- /* reexport */
- QX
- ),
- MathClamp: () => (
- /* reexport */
- fi
- ),
- OPS: () => (
- /* reexport */
- IV
- ),
- OutputScale: () => (
- /* reexport */
- In
- ),
- PDFDataRangeTransport: () => (
- /* reexport */
- Hgg
- ),
- PDFDateString: () => (
- /* reexport */
- b9
- ),
- PDFWorker: () => (
- /* reexport */
- ch
- ),
- PasswordResponses: () => (
- /* reexport */
- Jog
- ),
- PermissionFlag: () => (
- /* reexport */
- zog
- ),
- PixelsPerInch: () => (
- /* reexport */
- Pa
- ),
- RenderingCancelledException: () => (
- /* reexport */
- r9
- ),
- ResponseException: () => (
- /* reexport */
- CV
- ),
- SignatureExtractor: () => (
- /* reexport */
- Ol
- ),
- SupportedImageMimeTypes: () => (
- /* reexport */
- UX
- ),
- TextLayer: () => (
- /* reexport */
- Mm
- ),
- TouchManager: () => (
- /* reexport */
- iV
- ),
- Util: () => (
- /* reexport */
- AI
- ),
- VerbosityLevel: () => (
- /* reexport */
- PV
- ),
- XfaLayer: () => (
- /* reexport */
- Sgg
- ),
- build: () => (
- /* reexport */
- ldg
- ),
- createValidAbsoluteUrl: () => (
- /* reexport */
- xog
- ),
- fetchData: () => (
- /* reexport */
- AG
- ),
- getDocument: () => (
- /* reexport */
- _cg
- ),
- getFilenameFromUrl: () => (
- /* reexport */
- $og
- ),
- getPdfFilenameFromUrl: () => (
- /* reexport */
- gcg
- ),
- getUuid: () => (
- /* reexport */
- H$
- ),
- getXfaPageViewport: () => (
- /* reexport */
- Icg
- ),
- isDataScheme: () => (
- /* reexport */
- $V
- ),
- isPdfFile: () => (
- /* reexport */
- h9
- ),
- isValidExplicitDest: () => (
- /* reexport */
- Idg
- ),
- noContextMenu: () => (
- /* reexport */
- zA
- ),
- normalizeUnicode: () => (
- /* reexport */
- Pog
- ),
- setLayerDimensions: () => (
- /* reexport */
- cd
- ),
- shadow: () => (
- /* reexport */
- UI
- ),
- stopEvent: () => (
- /* reexport */
- ht
- ),
- version: () => (
- /* reexport */
- sdg
- )
- });
- const $t = typeof process == "object" && process + "" == "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"), R$ = [1, 0, 0, 1, 0, 0], jX = [1e-3, 0, 0, 1e-3, 0, 0], LH = 1.35, ye = {
- ANY: 1,
- DISPLAY: 2,
- PRINT: 4,
- ANNOTATIONS_FORMS: 16,
- ANNOTATIONS_STORAGE: 32,
- ANNOTATIONS_DISABLE: 64,
- IS_EDITING: 128,
- OPLIST: 256
- }, la = {
- DISABLE: 0,
- ENABLE: 1,
- ENABLE_FORMS: 2,
- ENABLE_STORAGE: 3
- }, kog = "pdfjs_internal_editor_", XI = {
- DISABLE: -1,
- NONE: 0,
- FREETEXT: 3,
- HIGHLIGHT: 9,
- STAMP: 13,
- INK: 15,
- SIGNATURE: 101
- }, iC = {
- RESIZE: 1,
- CREATE: 2,
- FREETEXT_SIZE: 11,
- FREETEXT_COLOR: 12,
- FREETEXT_OPACITY: 13,
- INK_COLOR: 21,
- INK_THICKNESS: 22,
- INK_OPACITY: 23,
- HIGHLIGHT_COLOR: 31,
- HIGHLIGHT_DEFAULT_COLOR: 32,
- HIGHLIGHT_THICKNESS: 33,
- HIGHLIGHT_FREE: 34,
- HIGHLIGHT_SHOW_ALL: 35,
- DRAW_STEP: 41
- }, zog = {
- PRINT: 4,
- MODIFY_CONTENTS: 8,
- COPY: 16,
- MODIFY_ANNOTATIONS: 32,
- FILL_INTERACTIVE_FORMS: 256,
- COPY_FOR_ACCESSIBILITY: 512,
- ASSEMBLE: 1024,
- PRINT_HIGH_QUALITY: 2048
- }, hi = {
- FILL: 0,
- STROKE: 1,
- FILL_STROKE: 2,
- INVISIBLE: 3,
- FILL_STROKE_MASK: 3,
- ADD_TO_PATH_FLAG: 4
- }, aN = {
- GRAYSCALE_1BPP: 1,
- RGB_24BPP: 2,
- RGBA_32BPP: 3
- }, dt = {
- TEXT: 1,
- LINK: 2,
- FREETEXT: 3,
- LINE: 4,
- SQUARE: 5,
- CIRCLE: 6,
- POLYGON: 7,
- POLYLINE: 8,
- HIGHLIGHT: 9,
- UNDERLINE: 10,
- SQUIGGLY: 11,
- STRIKEOUT: 12,
- STAMP: 13,
- CARET: 14,
- INK: 15,
- POPUP: 16,
- FILEATTACHMENT: 17,
- SOUND: 18,
- MOVIE: 19,
- WIDGET: 20,
- SCREEN: 21,
- PRINTERMARK: 22,
- TRAPNET: 23,
- WATERMARK: 24,
- THREED: 25,
- REDACT: 26
- }, Qr = {
- SOLID: 1,
- DASHED: 2,
- BEVELED: 3,
- INSET: 4,
- UNDERLINE: 5
- }, PV = {
- ERRORS: 0,
- WARNINGS: 1,
- INFOS: 5
- }, IV = {
- dependency: 1,
- setLineWidth: 2,
- setLineCap: 3,
- setLineJoin: 4,
- setMiterLimit: 5,
- setDash: 6,
- setRenderingIntent: 7,
- setFlatness: 8,
- setGState: 9,
- save: 10,
- restore: 11,
- transform: 12,
- moveTo: 13,
- lineTo: 14,
- curveTo: 15,
- curveTo2: 16,
- curveTo3: 17,
- closePath: 18,
- rectangle: 19,
- stroke: 20,
- closeStroke: 21,
- fill: 22,
- eoFill: 23,
- fillStroke: 24,
- eoFillStroke: 25,
- closeFillStroke: 26,
- closeEOFillStroke: 27,
- endPath: 28,
- clip: 29,
- eoClip: 30,
- beginText: 31,
- endText: 32,
- setCharSpacing: 33,
- setWordSpacing: 34,
- setHScale: 35,
- setLeading: 36,
- setFont: 37,
- setTextRenderingMode: 38,
- setTextRise: 39,
- moveText: 40,
- setLeadingMoveText: 41,
- setTextMatrix: 42,
- nextLine: 43,
- showText: 44,
- showSpacedText: 45,
- nextLineShowText: 46,
- nextLineSetSpacingShowText: 47,
- setCharWidth: 48,
- setCharWidthAndBounds: 49,
- setStrokeColorSpace: 50,
- setFillColorSpace: 51,
- setStrokeColor: 52,
- setStrokeColorN: 53,
- setFillColor: 54,
- setFillColorN: 55,
- setStrokeGray: 56,
- setFillGray: 57,
- setStrokeRGBColor: 58,
- setFillRGBColor: 59,
- setStrokeCMYKColor: 60,
- setFillCMYKColor: 61,
- shadingFill: 62,
- beginInlineImage: 63,
- beginImageData: 64,
- endInlineImage: 65,
- paintXObject: 66,
- markPoint: 67,
- markPointProps: 68,
- beginMarkedContent: 69,
- beginMarkedContentProps: 70,
- endMarkedContent: 71,
- beginCompat: 72,
- endCompat: 73,
- paintFormXObjectBegin: 74,
- paintFormXObjectEnd: 75,
- beginGroup: 76,
- endGroup: 77,
- beginAnnotation: 80,
- endAnnotation: 81,
- paintImageMaskXObject: 83,
- paintImageMaskXObjectGroup: 84,
- paintImageXObject: 85,
- paintInlineImageXObject: 86,
- paintInlineImageXObjectGroup: 87,
- paintImageXObjectRepeat: 88,
- paintImageMaskXObjectRepeat: 89,
- paintSolidColorImageMask: 90,
- constructPath: 91,
- setStrokeTransparent: 92,
- setFillTransparent: 93
- }, FY = {
- moveTo: 0,
- lineTo: 1,
- curveTo: 2,
- closePath: 3
- }, Jog = {
- NEED_PASSWORD: 1,
- INCORRECT_PASSWORD: 2
- };
- let _V = PV.WARNINGS;
- function Log(t) {
- Number.isInteger(t) && (_V = t);
- }
- function vog() {
- return _V;
- }
- function qV(t) {
- _V >= PV.INFOS && console.log(`Info: ${t}`);
- }
- function DI(t) {
- _V >= PV.WARNINGS && console.log(`Warning: ${t}`);
- }
- function BC(t) {
- throw new Error(t);
- }
- function ut(t, I) {
- t || BC(I);
- }
- function Tog(t) {
- switch (t == null ? void 0 : t.protocol) {
- case "http:":
- case "https:":
- case "ftp:":
- case "mailto:":
- case "tel:":
- return !0;
- default:
- return !1;
- }
- }
- function xog(t, I = null, g = null) {
- if (!t)
- return null;
- if (g && typeof t == "string") {
- if (g.addDefaultProtocol && t.startsWith("www.")) {
- const i = t.match(/\./g);
- (i == null ? void 0 : i.length) >= 2 && (t = `http://${t}`);
- }
- if (g.tryConvertEncoding)
- try {
- t = Eog(t);
- } catch {
- }
- }
- const C = I ? URL.parse(t, I) : URL.parse(t);
- return Tog(C) ? C : null;
- }
- function UI(t, I, g, C = !1) {
- return Object.defineProperty(t, I, {
- value: g,
- enumerable: !C,
- configurable: !0,
- writable: !1
- }), g;
- }
- const ud = function() {
- function I(g, C) {
- this.message = g, this.name = C;
- }
- return I.prototype = new Error(), I.constructor = I, I;
- }();
- class _6 extends ud {
- constructor(I, g) {
- super(I, "PasswordException"), this.code = g;
- }
- }
- class vH extends ud {
- constructor(I, g) {
- super(I, "UnknownErrorException"), this.details = g;
- }
- }
- class QX extends ud {
- constructor(I) {
- super(I, "InvalidPDFException");
- }
- }
- class CV extends ud {
- constructor(I, g, C) {
- super(I, "ResponseException"), this.status = g, this.missing = C;
- }
- }
- class jog extends ud {
- constructor(I) {
- super(I, "FormatError");
- }
- }
- class Ea extends ud {
- constructor(I) {
- super(I, "AbortException");
- }
- }
- function f$(t) {
- (typeof t != "object" || (t == null ? void 0 : t.length) === void 0) && BC("Invalid argument for bytesToString");
- const I = t.length, g = 8192;
- if (I < g)
- return String.fromCharCode.apply(null, t);
- const C = [];
- for (let i = 0; i < I; i += g) {
- const e = Math.min(i + g, I), A = t.subarray(i, e);
- C.push(String.fromCharCode.apply(null, A));
- }
- return C.join("");
- }
- function eG(t) {
- typeof t != "string" && BC("Invalid argument for stringToBytes");
- const I = t.length, g = new Uint8Array(I);
- for (let C = 0; C < I; ++C)
- g[C] = t.charCodeAt(C) & 255;
- return g;
- }
- function Qog(t) {
- return String.fromCharCode(t >> 24 & 255, t >> 16 & 255, t >> 8 & 255, t & 255);
- }
- function c9(t) {
- const I = /* @__PURE__ */ Object.create(null);
- for (const [g, C] of t)
- I[g] = C;
- return I;
- }
- function Oog() {
- const t = new Uint8Array(4);
- return t[0] = 1, new Uint32Array(t.buffer, 0, 1)[0] === 1;
- }
- function Uog() {
- try {
- return new Function(""), !0;
- } catch {
- return !1;
- }
- }
- class Ai {
- static get isLittleEndian() {
- return UI(this, "isLittleEndian", Oog());
- }
- static get isEvalSupported() {
- return UI(this, "isEvalSupported", Uog());
- }
- static get isOffscreenCanvasSupported() {
- return UI(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas < "u");
- }
- static get isImageDecoderSupported() {
- return UI(this, "isImageDecoderSupported", typeof ImageDecoder < "u");
- }
- static get platform() {
- if (typeof navigator < "u" && typeof (navigator == null ? void 0 : navigator.platform) == "string" && typeof (navigator == null ? void 0 : navigator.userAgent) == "string") {
- const {
- platform: I,
- userAgent: g
- } = navigator;
- return UI(this, "platform", {
- isAndroid: g.includes("Android"),
- isLinux: I.includes("Linux"),
- isMac: I.includes("Mac"),
- isWindows: I.includes("Win"),
- isFirefox: g.includes("Firefox")
- });
- }
- return UI(this, "platform", {
- isAndroid: !1,
- isLinux: !1,
- isMac: !1,
- isWindows: !1,
- isFirefox: !1
- });
- }
- static get isCSSRoundSupported() {
- var I, g;
- return UI(this, "isCSSRoundSupported", (g = (I = globalThis.CSS) == null ? void 0 : I.supports) == null ? void 0 : g.call(I, "width: round(1.5px, 1px)"));
- }
- }
- const TH = Array.from(Array(256).keys(), (t) => t.toString(16).padStart(2, "0"));
- var $l, oN, OX;
- class AI {
- static makeHexColor(I, g, C) {
- return `#${TH[I]}${TH[g]}${TH[C]}`;
- }
- static transform(I, g) {
- return [I[0] * g[0] + I[2] * g[1], I[1] * g[0] + I[3] * g[1], I[0] * g[2] + I[2] * g[3], I[1] * g[2] + I[3] * g[3], I[0] * g[4] + I[2] * g[5] + I[4], I[1] * g[4] + I[3] * g[5] + I[5]];
- }
- static applyTransform(I, g) {
- const C = I[0] * g[0] + I[1] * g[2] + g[4], i = I[0] * g[1] + I[1] * g[3] + g[5];
- return [C, i];
- }
- static applyInverseTransform(I, g) {
- const C = g[0] * g[3] - g[1] * g[2], i = (I[0] * g[3] - I[1] * g[2] + g[2] * g[5] - g[4] * g[3]) / C, e = (-I[0] * g[1] + I[1] * g[0] + g[4] * g[1] - g[5] * g[0]) / C;
- return [i, e];
- }
- static getAxialAlignedBoundingBox(I, g) {
- const C = this.applyTransform(I, g), i = this.applyTransform(I.slice(2, 4), g), e = this.applyTransform([I[0], I[3]], g), A = this.applyTransform([I[2], I[1]], g);
- return [Math.min(C[0], i[0], e[0], A[0]), Math.min(C[1], i[1], e[1], A[1]), Math.max(C[0], i[0], e[0], A[0]), Math.max(C[1], i[1], e[1], A[1])];
- }
- static inverseTransform(I) {
- const g = I[0] * I[3] - I[1] * I[2];
- return [I[3] / g, -I[1] / g, -I[2] / g, I[0] / g, (I[2] * I[5] - I[4] * I[3]) / g, (I[4] * I[1] - I[5] * I[0]) / g];
- }
- static singularValueDecompose2dScale(I) {
- const g = [I[0], I[2], I[1], I[3]], C = I[0] * g[0] + I[1] * g[2], i = I[0] * g[1] + I[1] * g[3], e = I[2] * g[0] + I[3] * g[2], A = I[2] * g[1] + I[3] * g[3], s = (C + A) / 2, l = Math.sqrt((C + A) ** 2 - 4 * (C * A - e * i)) / 2, n = s + l || 1, a = s - l || 1;
- return [Math.sqrt(n), Math.sqrt(a)];
- }
- static normalizeRect(I) {
- const g = I.slice(0);
- return I[0] > I[2] && (g[0] = I[2], g[2] = I[0]), I[1] > I[3] && (g[1] = I[3], g[3] = I[1]), g;
- }
- static intersect(I, g) {
- const C = Math.max(Math.min(I[0], I[2]), Math.min(g[0], g[2])), i = Math.min(Math.max(I[0], I[2]), Math.max(g[0], g[2]));
- if (C > i)
- return null;
- const e = Math.max(Math.min(I[1], I[3]), Math.min(g[1], g[3])), A = Math.min(Math.max(I[1], I[3]), Math.max(g[1], g[3]));
- return e > A ? null : [C, e, i, A];
- }
- static pointBoundingBox(I, g, C) {
- C[0] = Math.min(C[0], I), C[1] = Math.min(C[1], g), C[2] = Math.max(C[2], I), C[3] = Math.max(C[3], g);
- }
- static rectBoundingBox(I, g, C, i, e) {
- e[0] = Math.min(e[0], I, C), e[1] = Math.min(e[1], g, i), e[2] = Math.max(e[2], I, C), e[3] = Math.max(e[3], g, i);
- }
- static bezierBoundingBox(I, g, C, i, e, A, s, l, n) {
- n[0] = Math.min(n[0], I, s), n[1] = Math.min(n[1], g, l), n[2] = Math.max(n[2], I, s), n[3] = Math.max(n[3], g, l), ig(this, $l, OX).call(this, I, C, e, s, g, i, A, l, 3 * (-I + 3 * (C - e) + s), 6 * (I - 2 * C + e), 3 * (C - I), n), ig(this, $l, OX).call(this, I, C, e, s, g, i, A, l, 3 * (-g + 3 * (i - A) + l), 6 * (g - 2 * i + A), 3 * (i - g), n);
- }
- }
- $l = new WeakSet(), oN = function(I, g, C, i, e, A, s, l, n, a) {
- if (n <= 0 || n >= 1)
- return;
- const d = 1 - n, o = n * n, c = o * n, r = d * (d * (d * I + 3 * n * g) + 3 * o * C) + c * i, h = d * (d * (d * e + 3 * n * A) + 3 * o * s) + c * l;
- a[0] = Math.min(a[0], r), a[1] = Math.min(a[1], h), a[2] = Math.max(a[2], r), a[3] = Math.max(a[3], h);
- }, OX = function(I, g, C, i, e, A, s, l, n, a, d, o) {
- if (Math.abs(n) < 1e-12) {
- Math.abs(a) >= 1e-12 && ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, -d / a, o);
- return;
- }
- const c = a ** 2 - 4 * d * n;
- if (c < 0)
- return;
- const r = Math.sqrt(c), h = 2 * n;
- ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, (-a + r) / h, o), ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, (-a - r) / h, o);
- }, tg(AI, $l);
- function Eog(t) {
- return decodeURIComponent(escape(t));
- }
- let xH = null, q6 = null;
- function Pog(t) {
- return xH || (xH = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu, q6 = /* @__PURE__ */ new Map([["ſt", "ſt"]])), t.replaceAll(xH, (I, g, C) => g ? g.normalize("NFKC") : q6.get(C));
- }
- function H$() {
- if (typeof crypto.randomUUID == "function")
- return crypto.randomUUID();
- const t = new Uint8Array(32);
- return crypto.getRandomValues(t), f$(t);
- }
- const d9 = "pdfjs_internal_id_";
- function _og(t, I, g) {
- if (!Array.isArray(g) || g.length < 2)
- return !1;
- const [C, i, ...e] = g;
- if (!t(C) && !Number.isInteger(C) || !I(i))
- return !1;
- const A = e.length;
- let s = !0;
- switch (i.name) {
- case "XYZ":
- if (A < 2 || A > 3)
- return !1;
- break;
- case "Fit":
- case "FitB":
- return A === 0;
- case "FitH":
- case "FitBH":
- case "FitV":
- case "FitBV":
- if (A > 1)
- return !1;
- break;
- case "FitR":
- if (A !== 4)
- return !1;
- s = !1;
- break;
- default:
- return !1;
- }
- for (const l of e)
- if (!(typeof l == "number" || s && l === null))
- return !1;
- return !0;
- }
- function fi(t, I, g) {
- return Math.min(Math.max(t, I), g);
- }
- function X$(t) {
- return Uint8Array.prototype.toBase64 ? t.toBase64() : btoa(f$(t));
- }
- function qog(t) {
- return Uint8Array.fromBase64 ? Uint8Array.fromBase64(t) : eG(atob(t));
- }
- typeof Promise.try != "function" && (Promise.try = function(t, ...I) {
- return new Promise((g) => {
- g(t(...I));
- });
- });
- typeof Math.sumPrecise != "function" && (Math.sumPrecise = function(t) {
- return t.reduce((I, g) => I + g, 0);
- });
- const dl = "http://www.w3.org/2000/svg", _o = class _o {
- };
- iI(_o, "CSS", 96), iI(_o, "PDF", 72), iI(_o, "PDF_TO_CSS_UNITS", _o.CSS / _o.PDF);
- let Pa = _o;
- async function AG(t, I = "text") {
- if (Or(t, document.baseURI)) {
- const g = await fetch(t);
- if (!g.ok)
- throw new Error(g.statusText);
- switch (I) {
- case "arraybuffer":
- return g.arrayBuffer();
- case "blob":
- return g.blob();
- case "json":
- return g.json();
- }
- return g.text();
- }
- return new Promise((g, C) => {
- const i = new XMLHttpRequest();
- i.open("GET", t, !0), i.responseType = I, i.onreadystatechange = () => {
- if (i.readyState === XMLHttpRequest.DONE) {
- if (i.status === 200 || i.status === 0) {
- switch (I) {
- case "arraybuffer":
- case "blob":
- case "json":
- g(i.response);
- return;
- }
- g(i.responseText);
- return;
- }
- C(new Error(i.statusText));
- }
- }, i.send(null);
- });
- }
- class sG {
- constructor({
- viewBox: I,
- userUnit: g,
- scale: C,
- rotation: i,
- offsetX: e = 0,
- offsetY: A = 0,
- dontFlip: s = !1
- }) {
- this.viewBox = I, this.userUnit = g, this.scale = C, this.rotation = i, this.offsetX = e, this.offsetY = A, C *= g;
- const l = (I[2] + I[0]) / 2, n = (I[3] + I[1]) / 2;
- let a, d, o, c;
- switch (i %= 360, i < 0 && (i += 360), i) {
- case 180:
- a = -1, d = 0, o = 0, c = 1;
- break;
- case 90:
- a = 0, d = 1, o = 1, c = 0;
- break;
- case 270:
- a = 0, d = -1, o = -1, c = 0;
- break;
- case 0:
- a = 1, d = 0, o = 0, c = -1;
- break;
- default:
- throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.");
- }
- s && (o = -o, c = -c);
- let r, h, b, u;
- a === 0 ? (r = Math.abs(n - I[1]) * C + e, h = Math.abs(l - I[0]) * C + A, b = (I[3] - I[1]) * C, u = (I[2] - I[0]) * C) : (r = Math.abs(l - I[0]) * C + e, h = Math.abs(n - I[1]) * C + A, b = (I[2] - I[0]) * C, u = (I[3] - I[1]) * C), this.transform = [a * C, d * C, o * C, c * C, r - a * C * l - o * C * n, h - d * C * l - c * C * n], this.width = b, this.height = u;
- }
- get rawDims() {
- const I = this.viewBox;
- return UI(this, "rawDims", {
- pageWidth: I[2] - I[0],
- pageHeight: I[3] - I[1],
- pageX: I[0],
- pageY: I[1]
- });
- }
- clone({
- scale: I = this.scale,
- rotation: g = this.rotation,
- offsetX: C = this.offsetX,
- offsetY: i = this.offsetY,
- dontFlip: e = !1
- } = {}) {
- return new sG({
- viewBox: this.viewBox.slice(),
- userUnit: this.userUnit,
- scale: I,
- rotation: g,
- offsetX: C,
- offsetY: i,
- dontFlip: e
- });
- }
- convertToViewportPoint(I, g) {
- return AI.applyTransform([I, g], this.transform);
- }
- convertToViewportRectangle(I) {
- const g = AI.applyTransform([I[0], I[1]], this.transform), C = AI.applyTransform([I[2], I[3]], this.transform);
- return [g[0], g[1], C[0], C[1]];
- }
- convertToPdfPoint(I, g) {
- return AI.applyInverseTransform([I, g], this.transform);
- }
- }
- class r9 extends ud {
- constructor(I, g = 0) {
- super(I, "RenderingCancelledException"), this.extraDelay = g;
- }
- }
- function $V(t) {
- const I = t.length;
- let g = 0;
- for (; g < I && t[g].trim() === ""; )
- g++;
- return t.substring(g, g + 5).toLowerCase() === "data:";
- }
- function h9(t) {
- return typeof t == "string" && /\.pdf$/i.test(t);
- }
- function $og(t) {
- return [t] = t.split(/[#?]/, 1), t.substring(t.lastIndexOf("/") + 1);
- }
- function gcg(t, I = "document.pdf") {
- if (typeof t != "string")
- return I;
- if ($V(t))
- return DI('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'), I;
- const g = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/, C = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i, i = g.exec(t);
- let e = C.exec(i[1]) || C.exec(i[2]) || C.exec(i[3]);
- if (e && (e = e[0], e.includes("%")))
- try {
- e = C.exec(decodeURIComponent(e))[0];
- } catch {
- }
- return e || I;
- }
- class $6 {
- constructor() {
- iI(this, "started", /* @__PURE__ */ Object.create(null));
- iI(this, "times", []);
- }
- time(I) {
- I in this.started && DI(`Timer is already running for ${I}`), this.started[I] = Date.now();
- }
- timeEnd(I) {
- I in this.started || DI(`Timer has not been started for ${I}`), this.times.push({
- name: I,
- start: this.started[I],
- end: Date.now()
- }), delete this.started[I];
- }
- toString() {
- const I = [];
- let g = 0;
- for (const {
- name: C
- } of this.times)
- g = Math.max(C.length, g);
- for (const {
- name: C,
- start: i,
- end: e
- } of this.times)
- I.push(`${C.padEnd(g)} ${e - i}ms
- `);
- return I.join("");
- }
- }
- function Or(t, I) {
- const g = I ? URL.parse(t, I) : URL.parse(t);
- return (g == null ? void 0 : g.protocol) === "http:" || (g == null ? void 0 : g.protocol) === "https:";
- }
- function zA(t) {
- t.preventDefault();
- }
- function ht(t) {
- t.preventDefault(), t.stopPropagation();
- }
- var Sm;
- class b9 {
- static toDateObject(I) {
- if (!I || typeof I != "string")
- return null;
- M(this, Sm) || $(this, Sm, new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?"));
- const g = M(this, Sm).exec(I);
- if (!g)
- return null;
- const C = parseInt(g[1], 10);
- let i = parseInt(g[2], 10);
- i = i >= 1 && i <= 12 ? i - 1 : 0;
- let e = parseInt(g[3], 10);
- e = e >= 1 && e <= 31 ? e : 1;
- let A = parseInt(g[4], 10);
- A = A >= 0 && A <= 23 ? A : 0;
- let s = parseInt(g[5], 10);
- s = s >= 0 && s <= 59 ? s : 0;
- let l = parseInt(g[6], 10);
- l = l >= 0 && l <= 59 ? l : 0;
- const n = g[7] || "Z";
- let a = parseInt(g[8], 10);
- a = a >= 0 && a <= 23 ? a : 0;
- let d = parseInt(g[9], 10) || 0;
- return d = d >= 0 && d <= 59 ? d : 0, n === "-" ? (A += a, s += d) : n === "+" && (A -= a, s -= d), new Date(Date.UTC(C, i, e, A, s, l));
- }
- }
- Sm = new WeakMap(), tg(b9, Sm);
- function Icg(t, {
- scale: I = 1,
- rotation: g = 0
- }) {
- const {
- width: C,
- height: i
- } = t.attributes.style, e = [0, 0, parseInt(C), parseInt(i)];
- return new sG({
- viewBox: e,
- userUnit: 1,
- scale: I,
- rotation: g
- });
- }
- function u9(t) {
- if (t.startsWith("#")) {
- const I = parseInt(t.slice(1), 16);
- return [(I & 16711680) >> 16, (I & 65280) >> 8, I & 255];
- }
- return t.startsWith("rgb(") ? t.slice(4, -1).split(",").map((I) => parseInt(I)) : t.startsWith("rgba(") ? t.slice(5, -1).split(",").map((I) => parseInt(I)).slice(0, 3) : (DI(`Not a valid color format: "${t}"`), [0, 0, 0]);
- }
- function Ccg(t) {
- const I = document.createElement("span");
- I.style.visibility = "hidden", document.body.append(I);
- for (const g of t.keys()) {
- I.style.color = g;
- const C = window.getComputedStyle(I).color;
- t.set(g, u9(C));
- }
- I.remove();
- }
- function zC(t) {
- const {
- a: I,
- b: g,
- c: C,
- d: i,
- e,
- f: A
- } = t.getTransform();
- return [I, g, C, i, e, A];
- }
- function ss(t) {
- const {
- a: I,
- b: g,
- c: C,
- d: i,
- e,
- f: A
- } = t.getTransform().invertSelf();
- return [I, g, C, i, e, A];
- }
- function cd(t, I, g = !1, C = !0) {
- if (I instanceof sG) {
- const {
- pageWidth: i,
- pageHeight: e
- } = I.rawDims, {
- style: A
- } = t, s = Ai.isCSSRoundSupported, l = `var(--total-scale-factor) * ${i}px`, n = `var(--total-scale-factor) * ${e}px`, a = s ? `round(down, ${l}, var(--scale-round-x))` : `calc(${l})`, d = s ? `round(down, ${n}, var(--scale-round-y))` : `calc(${n})`;
- !g || I.rotation % 180 === 0 ? (A.width = a, A.height = d) : (A.width = d, A.height = a);
- }
- C && t.setAttribute("data-main-rotation", I.rotation);
- }
- class In {
- constructor() {
- const {
- pixelRatio: I
- } = In;
- this.sx = I, this.sy = I;
- }
- get scaled() {
- return this.sx !== 1 || this.sy !== 1;
- }
- get symmetric() {
- return this.sx === this.sy;
- }
- limitCanvas(I, g, C, i) {
- let e = 1 / 0, A = 1 / 0, s = 1 / 0;
- C > 0 && (e = Math.sqrt(C / (I * g))), i !== -1 && (A = i / I, s = i / g);
- const l = Math.min(e, A, s);
- return this.sx > l || this.sy > l ? (this.sx = l, this.sy = l, !0) : !1;
- }
- static get pixelRatio() {
- return globalThis.devicePixelRatio || 1;
- }
- }
- const UX = ["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"];
- var aa, Cc, je, oa, Dm, mh, Km, fV, S$, ei, D$, K$, vu, F$, cN;
- const ul = class ul {
- constructor(I) {
- tg(this, ei);
- tg(this, aa, null);
- tg(this, Cc, null);
- tg(this, je);
- tg(this, oa, null);
- tg(this, Dm, null);
- tg(this, mh, null);
- $(this, je, I), M(ul, Km) || $(ul, Km, Object.freeze({
- freetext: "pdfjs-editor-remove-freetext-button",
- highlight: "pdfjs-editor-remove-highlight-button",
- ink: "pdfjs-editor-remove-ink-button",
- stamp: "pdfjs-editor-remove-stamp-button",
- signature: "pdfjs-editor-remove-signature-button"
- }));
- }
- render() {
- const I = $(this, aa, document.createElement("div"));
- I.classList.add("editToolbar", "hidden"), I.setAttribute("role", "toolbar");
- const g = M(this, je)._uiManager._signal;
- I.addEventListener("contextmenu", zA, {
- signal: g
- }), I.addEventListener("pointerdown", ig(ul, fV, S$), {
- signal: g
- });
- const C = $(this, oa, document.createElement("div"));
- C.className = "buttons", I.append(C);
- const i = M(this, je).toolbarPosition;
- if (i) {
- const {
- style: e
- } = I, A = M(this, je)._uiManager.direction === "ltr" ? 1 - i[0] : i[0];
- e.insetInlineEnd = `${100 * A}%`, e.top = `calc(${100 * i[1]}% + var(--editor-toolbar-vert-offset))`;
- }
- return ig(this, ei, F$).call(this), I;
- }
- get div() {
- return M(this, aa);
- }
- hide() {
- var I;
- M(this, aa).classList.add("hidden"), (I = M(this, Cc)) == null || I.hideDropdown();
- }
- show() {
- var I;
- M(this, aa).classList.remove("hidden"), (I = M(this, Dm)) == null || I.shown();
- }
- async addAltText(I) {
- const g = await I.render();
- ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN)), $(this, Dm, I);
- }
- addColorPicker(I) {
- $(this, Cc, I);
- const g = I.renderButton();
- ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN));
- }
- async addEditSignatureButton(I) {
- const g = $(this, mh, await I.renderEditButton(M(this, je)));
- ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN));
- }
- updateEditSignatureButton(I) {
- M(this, mh) && (M(this, mh).title = I);
- }
- remove() {
- var I;
- M(this, aa).remove(), (I = M(this, Cc)) == null || I.destroy(), $(this, Cc, null);
- }
- };
- aa = new WeakMap(), Cc = new WeakMap(), je = new WeakMap(), oa = new WeakMap(), Dm = new WeakMap(), mh = new WeakMap(), Km = new WeakMap(), fV = new WeakSet(), S$ = function(I) {
- I.stopPropagation();
- }, ei = new WeakSet(), D$ = function(I) {
- M(this, je)._focusEventsAllowed = !1, ht(I);
- }, K$ = function(I) {
- M(this, je)._focusEventsAllowed = !0, ht(I);
- }, vu = function(I) {
- const g = M(this, je)._uiManager._signal;
- I.addEventListener("focusin", ig(this, ei, D$).bind(this), {
- capture: !0,
- signal: g
- }), I.addEventListener("focusout", ig(this, ei, K$).bind(this), {
- capture: !0,
- signal: g
- }), I.addEventListener("contextmenu", zA, {
- signal: g
- });
- }, F$ = function() {
- const {
- editorType: I,
- _uiManager: g
- } = M(this, je), C = document.createElement("button");
- C.className = "delete", C.tabIndex = 0, C.setAttribute("data-l10n-id", M(ul, Km)[I]), ig(this, ei, vu).call(this, C), C.addEventListener("click", (i) => {
- g.delete();
- }, {
- signal: g._signal
- }), M(this, oa).append(C);
- }, cN = function() {
- const I = document.createElement("div");
- return I.className = "divider", I;
- }, tg(ul, fV), tg(ul, Km, null);
- let EX = ul;
- var Fm, tc, ic, qa, k$, z$, J$;
- class tcg {
- constructor(I) {
- tg(this, qa);
- tg(this, Fm, null);
- tg(this, tc, null);
- tg(this, ic);
- $(this, ic, I);
- }
- show(I, g, C) {
- const [i, e] = ig(this, qa, z$).call(this, g, C), {
- style: A
- } = M(this, tc) || $(this, tc, ig(this, qa, k$).call(this));
- I.append(M(this, tc)), A.insetInlineEnd = `${100 * i}%`, A.top = `calc(${100 * e}% + var(--editor-toolbar-vert-offset))`;
- }
- hide() {
- M(this, tc).remove();
- }
- }
- Fm = new WeakMap(), tc = new WeakMap(), ic = new WeakMap(), qa = new WeakSet(), k$ = function() {
- const I = $(this, tc, document.createElement("div"));
- I.className = "editToolbar", I.setAttribute("role", "toolbar"), I.addEventListener("contextmenu", zA, {
- signal: M(this, ic)._signal
- });
- const g = $(this, Fm, document.createElement("div"));
- return g.className = "buttons", I.append(g), ig(this, qa, J$).call(this), I;
- }, z$ = function(I, g) {
- let C = 0, i = 0;
- for (const e of I) {
- const A = e.y + e.height;
- if (A < C)
- continue;
- const s = e.x + (g ? e.width : 0);
- if (A > C) {
- i = s, C = A;
- continue;
- }
- g ? s > i && (i = s) : s < i && (i = s);
- }
- return [g ? 1 - i : i, C];
- }, J$ = function() {
- const I = document.createElement("button");
- I.className = "highlightButton", I.tabIndex = 0, I.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button1");
- const g = document.createElement("span");
- I.append(g), g.className = "visuallyHidden", g.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label");
- const C = M(this, ic)._signal;
- I.addEventListener("contextmenu", zA, {
- signal: C
- }), I.addEventListener("click", () => {
- M(this, ic).highlightSelection("floating_button");
- }, {
- signal: C
- }), M(this, Fm).append(I);
- };
- function m9(t, I, g) {
- for (const C of g)
- I.addEventListener(C, t[C].bind(t));
- }
- var HV;
- class icg {
- constructor() {
- tg(this, HV, 0);
- }
- get id() {
- return `${kog}${Wi(this, HV)._++}`;
- }
- }
- HV = new WeakMap();
- var Zh, km, ui, Gh, dN;
- const C1 = class C1 {
- constructor() {
- tg(this, Gh);
- tg(this, Zh, H$());
- tg(this, km, 0);
- tg(this, ui, null);
- }
- static get _isSVGFittingCanvas() {
- const I = 'data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 1 1" width="1" height="1" xmlns="http://www.w3.org/2000/svg"><rect width="1" height="1" style="fill:red;"/></svg>', C = new OffscreenCanvas(1, 3).getContext("2d", {
- willReadFrequently: !0
- }), i = new Image();
- i.src = I;
- const e = i.decode().then(() => (C.drawImage(i, 0, 0, 1, 1, 0, 0, 1, 3), new Uint32Array(C.getImageData(0, 0, 1, 1).data.buffer)[0] === 0));
- return UI(this, "_isSVGFittingCanvas", e);
- }
- async getFromFile(I) {
- const {
- lastModified: g,
- name: C,
- size: i,
- type: e
- } = I;
- return ig(this, Gh, dN).call(this, `${g}_${C}_${i}_${e}`, I);
- }
- async getFromUrl(I) {
- return ig(this, Gh, dN).call(this, I, I);
- }
- async getFromBlob(I, g) {
- const C = await g;
- return ig(this, Gh, dN).call(this, I, C);
- }
- async getFromId(I) {
- M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
- const g = M(this, ui).get(I);
- if (!g)
- return null;
- if (g.bitmap)
- return g.refCounter += 1, g;
- if (g.file)
- return this.getFromFile(g.file);
- if (g.blobPromise) {
- const {
- blobPromise: C
- } = g;
- return delete g.blobPromise, this.getFromBlob(g.id, C);
- }
- return this.getFromUrl(g.url);
- }
- getFromCanvas(I, g) {
- M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
- let C = M(this, ui).get(I);
- if (C != null && C.bitmap)
- return C.refCounter += 1, C;
- const i = new OffscreenCanvas(g.width, g.height);
- return i.getContext("2d").drawImage(g, 0, 0), C = {
- bitmap: i.transferToImageBitmap(),
- id: `image_${M(this, Zh)}_${Wi(this, km)._++}`,
- refCounter: 1,
- isSvg: !1
- }, M(this, ui).set(I, C), M(this, ui).set(C.id, C), C;
- }
- getSvgUrl(I) {
- const g = M(this, ui).get(I);
- return g != null && g.isSvg ? g.svgUrl : null;
- }
- deleteId(I) {
- var i;
- M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
- const g = M(this, ui).get(I);
- if (!g || (g.refCounter -= 1, g.refCounter !== 0))
- return;
- const {
- bitmap: C
- } = g;
- if (!g.url && !g.file) {
- const e = new OffscreenCanvas(C.width, C.height);
- e.getContext("bitmaprenderer").transferFromImageBitmap(C), g.blobPromise = e.convertToBlob();
- }
- (i = C.close) == null || i.call(C), g.bitmap = null;
- }
- isValidId(I) {
- return I.startsWith(`image_${M(this, Zh)}_`);
- }
- };
- Zh = new WeakMap(), km = new WeakMap(), ui = new WeakMap(), Gh = new WeakSet(), dN = async function(I, g) {
- M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
- let C = M(this, ui).get(I);
- if (C === null)
- return null;
- if (C != null && C.bitmap)
- return C.refCounter += 1, C;
- try {
- C || (C = {
- bitmap: null,
- id: `image_${M(this, Zh)}_${Wi(this, km)._++}`,
- refCounter: 0,
- isSvg: !1
- });
- let i;
- if (typeof g == "string" ? (C.url = g, i = await AG(g, "blob")) : g instanceof File ? i = C.file = g : g instanceof Blob && (i = g), i.type === "image/svg+xml") {
- const e = C1._isSVGFittingCanvas, A = new FileReader(), s = new Image(), l = new Promise((n, a) => {
- s.onload = () => {
- C.bitmap = s, C.isSvg = !0, n();
- }, A.onload = async () => {
- const d = C.svgUrl = A.result;
- s.src = await e ? `${d}#svgView(preserveAspectRatio(none))` : d;
- }, s.onerror = A.onerror = a;
- });
- A.readAsDataURL(i), await l;
- } else
- C.bitmap = await createImageBitmap(i);
- C.refCounter = 1;
- } catch (i) {
- DI(i), C = null;
- }
- return M(this, ui).set(I, C), C && M(this, ui).set(C.id, C), C;
- };
- let PX = C1;
- var it, ca, zm, EC;
- class ecg {
- constructor(I = 128) {
- tg(this, it, []);
- tg(this, ca, !1);
- tg(this, zm);
- tg(this, EC, -1);
- $(this, zm, I);
- }
- add({
- cmd: I,
- undo: g,
- post: C,
- mustExec: i,
- type: e = NaN,
- overwriteIfSameType: A = !1,
- keepUndo: s = !1
- }) {
- if (i && I(), M(this, ca))
- return;
- const l = {
- cmd: I,
- undo: g,
- post: C,
- type: e
- };
- if (M(this, EC) === -1) {
- M(this, it).length > 0 && (M(this, it).length = 0), $(this, EC, 0), M(this, it).push(l);
- return;
- }
- if (A && M(this, it)[M(this, EC)].type === e) {
- s && (l.undo = M(this, it)[M(this, EC)].undo), M(this, it)[M(this, EC)] = l;
- return;
- }
- const n = M(this, EC) + 1;
- n === M(this, zm) ? M(this, it).splice(0, 1) : ($(this, EC, n), n < M(this, it).length && M(this, it).splice(n)), M(this, it).push(l);
- }
- undo() {
- if (M(this, EC) === -1)
- return;
- $(this, ca, !0);
- const {
- undo: I,
- post: g
- } = M(this, it)[M(this, EC)];
- I(), g == null || g(), $(this, ca, !1), $(this, EC, M(this, EC) - 1);
- }
- redo() {
- if (M(this, EC) < M(this, it).length - 1) {
- $(this, EC, M(this, EC) + 1), $(this, ca, !0);
- const {
- cmd: I,
- post: g
- } = M(this, it)[M(this, EC)];
- I(), g == null || g(), $(this, ca, !1);
- }
- }
- hasSomethingToUndo() {
- return M(this, EC) !== -1;
- }
- hasSomethingToRedo() {
- return M(this, EC) < M(this, it).length - 1;
- }
- cleanType(I) {
- if (M(this, EC) !== -1) {
- for (let g = M(this, EC); g >= 0; g--)
- if (M(this, it)[g].type !== I) {
- M(this, it).splice(g + 1, M(this, EC) - g), $(this, EC, g);
- return;
- }
- M(this, it).length = 0, $(this, EC, -1);
- }
- }
- destroy() {
- $(this, it, null);
- }
- }
- it = new WeakMap(), ca = new WeakMap(), zm = new WeakMap(), EC = new WeakMap();
- var XV, L$;
- class lG {
- constructor(I) {
- tg(this, XV);
- this.buffer = [], this.callbacks = /* @__PURE__ */ new Map(), this.allKeys = /* @__PURE__ */ new Set();
- const {
- isMac: g
- } = Ai.platform;
- for (const [C, i, e = {}] of I)
- for (const A of C) {
- const s = A.startsWith("mac+");
- g && s ? (this.callbacks.set(A.slice(4), {
- callback: i,
- options: e
- }), this.allKeys.add(A.split("+").at(-1))) : !g && !s && (this.callbacks.set(A, {
- callback: i,
- options: e
- }), this.allKeys.add(A.split("+").at(-1)));
- }
- }
- exec(I, g) {
- if (!this.allKeys.has(g.key))
- return;
- const C = this.callbacks.get(ig(this, XV, L$).call(this, g));
- if (!C)
- return;
- const {
- callback: i,
- options: {
- bubbles: e = !1,
- args: A = [],
- checker: s = null
- }
- } = C;
- s && !s(I, g) || (i.bind(I, ...A, g)(), e || ht(g));
- }
- }
- XV = new WeakSet(), L$ = function(I) {
- I.altKey && this.buffer.push("alt"), I.ctrlKey && this.buffer.push("ctrl"), I.metaKey && this.buffer.push("meta"), I.shiftKey && this.buffer.push("shift"), this.buffer.push(I.key);
- const g = this.buffer.join("+");
- return this.buffer.length = 0, g;
- };
- const SV = class SV {
- get _colors() {
- const I = /* @__PURE__ */ new Map([["CanvasText", null], ["Canvas", null]]);
- return Ccg(I), UI(this, "_colors", I);
- }
- convert(I) {
- const g = u9(I);
- if (!window.matchMedia("(forced-colors: active)").matches)
- return g;
- for (const [C, i] of this._colors)
- if (i.every((e, A) => e === g[A]))
- return SV._colorsMapping.get(C);
- return g;
- }
- getHexCode(I) {
- const g = this._colors.get(I);
- return g ? AI.makeHexColor(...g) : I;
- }
- };
- iI(SV, "_colorsMapping", /* @__PURE__ */ new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]));
- let _X = SV;
- var wh, ce, Bt, Et, ph, Zl, Bh, Qe, da, ec, Wh, Ac, bs, pA, sc, Jm, Lm, yh, vm, us, ra, Yh, ha, ms, DV, ba, Tm, ua, lc, nc, ma, xm, St, hC, Gl, Za, ac, jm, Qm, Ga, Zs, wl, Om, Oe, Og, rN, qX, v$, T$, hN, x$, j$, Q$, $X, O$, gS, IS, U$, Yi, rl, E$, P$, CS, _$, Tu, tS;
- const lh = class lh {
- constructor(I, g, C, i, e, A, s, l, n, a, d, o, c, r) {
- tg(this, Og);
- tg(this, wh, new AbortController());
- tg(this, ce, null);
- tg(this, Bt, /* @__PURE__ */ new Map());
- tg(this, Et, /* @__PURE__ */ new Map());
- tg(this, ph, null);
- tg(this, Zl, null);
- tg(this, Bh, null);
- tg(this, Qe, new ecg());
- tg(this, da, null);
- tg(this, ec, null);
- tg(this, Wh, 0);
- tg(this, Ac, /* @__PURE__ */ new Set());
- tg(this, bs, null);
- tg(this, pA, null);
- tg(this, sc, /* @__PURE__ */ new Set());
- iI(this, "_editorUndoBar", null);
- tg(this, Jm, !1);
- tg(this, Lm, !1);
- tg(this, yh, !1);
- tg(this, vm, null);
- tg(this, us, null);
- tg(this, ra, null);
- tg(this, Yh, null);
- tg(this, ha, !1);
- tg(this, ms, null);
- tg(this, DV, new icg());
- tg(this, ba, !1);
- tg(this, Tm, !1);
- tg(this, ua, null);
- tg(this, lc, null);
- tg(this, nc, null);
- tg(this, ma, null);
- tg(this, xm, null);
- tg(this, St, XI.NONE);
- tg(this, hC, /* @__PURE__ */ new Set());
- tg(this, Gl, null);
- tg(this, Za, null);
- tg(this, ac, null);
- tg(this, jm, null);
- tg(this, Qm, {
- isEditing: !1,
- isEmpty: !0,
- hasSomethingToUndo: !1,
- hasSomethingToRedo: !1,
- hasSelectedEditor: !1,
- hasSelectedText: !1
- });
- tg(this, Ga, [0, 0]);
- tg(this, Zs, null);
- tg(this, wl, null);
- tg(this, Om, null);
- tg(this, Oe, null);
- const h = this._signal = M(this, wh).signal;
- $(this, wl, I), $(this, Om, g), $(this, ph, C), $(this, Za, i), this._eventBus = e, e._on("editingaction", this.onEditingAction.bind(this), {
- signal: h
- }), e._on("pagechanging", this.onPageChanging.bind(this), {
- signal: h
- }), e._on("scalechanging", this.onScaleChanging.bind(this), {
- signal: h
- }), e._on("rotationchanging", this.onRotationChanging.bind(this), {
- signal: h
- }), e._on("setpreference", this.onSetPreference.bind(this), {
- signal: h
- }), e._on("switchannotationeditorparams", (b) => this.updateParams(b.type, b.value), {
- signal: h
- }), ig(this, Og, x$).call(this), ig(this, Og, U$).call(this), ig(this, Og, $X).call(this), $(this, Zl, A.annotationStorage), $(this, vm, A.filterFactory), $(this, ac, s), $(this, Yh, l || null), $(this, Jm, n), $(this, Lm, a), $(this, yh, d), $(this, xm, o || null), this.viewParameters = {
- realScale: Pa.PDF_TO_CSS_UNITS,
- rotation: 0
- }, this.isShiftKeyDown = !1, this._editorUndoBar = c || null, this._supportsPinchToZoom = r !== !1;
- }
- static get _keyboardManager() {
- const I = lh.prototype, g = (A) => M(A, wl).contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && A.hasSomethingToControl(), C = (A, {
- target: s
- }) => {
- if (s instanceof HTMLInputElement) {
- const {
- type: l
- } = s;
- return l !== "text" && l !== "number";
- }
- return !0;
- }, i = this.TRANSLATE_SMALL, e = this.TRANSLATE_BIG;
- return UI(this, "_keyboardManager", new lG([[["ctrl+a", "mac+meta+a"], I.selectAll, {
- checker: C
- }], [["ctrl+z", "mac+meta+z"], I.undo, {
- checker: C
- }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], I.redo, {
- checker: C
- }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], I.delete, {
- checker: C
- }], [["Enter", "mac+Enter"], I.addNewEditorFromKeyboard, {
- checker: (A, {
- target: s
- }) => !(s instanceof HTMLButtonElement) && M(A, wl).contains(s) && !A.isEnterHandled
- }], [[" ", "mac+ "], I.addNewEditorFromKeyboard, {
- checker: (A, {
- target: s
- }) => !(s instanceof HTMLButtonElement) && M(A, wl).contains(document.activeElement)
- }], [["Escape", "mac+Escape"], I.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], I.translateSelectedEditors, {
- args: [-i, 0],
- checker: g
- }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], I.translateSelectedEditors, {
- args: [-e, 0],
- checker: g
- }], [["ArrowRight", "mac+ArrowRight"], I.translateSelectedEditors, {
- args: [i, 0],
- checker: g
- }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], I.translateSelectedEditors, {
- args: [e, 0],
- checker: g
- }], [["ArrowUp", "mac+ArrowUp"], I.translateSelectedEditors, {
- args: [0, -i],
- checker: g
- }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], I.translateSelectedEditors, {
- args: [0, -e],
- checker: g
- }], [["ArrowDown", "mac+ArrowDown"], I.translateSelectedEditors, {
- args: [0, i],
- checker: g
- }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], I.translateSelectedEditors, {
- args: [0, e],
- checker: g
- }]]));
- }
- destroy() {
- var I, g, C, i, e, A, s, l;
- (I = M(this, Oe)) == null || I.resolve(), $(this, Oe, null), (g = M(this, wh)) == null || g.abort(), $(this, wh, null), this._signal = null;
- for (const n of M(this, Et).values())
- n.destroy();
- M(this, Et).clear(), M(this, Bt).clear(), M(this, sc).clear(), (C = M(this, ma)) == null || C.clear(), $(this, ce, null), M(this, hC).clear(), M(this, Qe).destroy(), (i = M(this, ph)) == null || i.destroy(), (e = M(this, Za)) == null || e.destroy(), (A = M(this, ms)) == null || A.hide(), $(this, ms, null), (s = M(this, nc)) == null || s.destroy(), $(this, nc, null), M(this, us) && (clearTimeout(M(this, us)), $(this, us, null)), M(this, Zs) && (clearTimeout(M(this, Zs)), $(this, Zs, null)), (l = this._editorUndoBar) == null || l.destroy();
- }
- combinedSignal(I) {
- return AbortSignal.any([this._signal, I.signal]);
- }
- get mlManager() {
- return M(this, xm);
- }
- get useNewAltTextFlow() {
- return M(this, Lm);
- }
- get useNewAltTextWhenAddingImage() {
- return M(this, yh);
- }
- get hcmFilter() {
- return UI(this, "hcmFilter", M(this, ac) ? M(this, vm).addHCMFilter(M(this, ac).foreground, M(this, ac).background) : "none");
- }
- get direction() {
- return UI(this, "direction", getComputedStyle(M(this, wl)).direction);
- }
- get highlightColors() {
- return UI(this, "highlightColors", M(this, Yh) ? new Map(M(this, Yh).split(",").map((I) => I.split("=").map((g) => g.trim()))) : null);
- }
- get highlightColorNames() {
- return UI(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, (I) => I.reverse())) : null);
- }
- setCurrentDrawingSession(I) {
- I ? (this.unselectAll(), this.disableUserSelect(!0)) : this.disableUserSelect(!1), $(this, ec, I);
- }
- setMainHighlightColorPicker(I) {
- $(this, nc, I);
- }
- editAltText(I, g = !1) {
- var C;
- (C = M(this, ph)) == null || C.editAltText(this, I, g);
- }
- getSignature(I) {
- var g;
- (g = M(this, Za)) == null || g.getSignature({
- uiManager: this,
- editor: I
- });
- }
- get signatureManager() {
- return M(this, Za);
- }
- switchToMode(I, g) {
- this._eventBus.on("annotationeditormodechanged", g, {
- once: !0,
- signal: this._signal
- }), this._eventBus.dispatch("showannotationeditorui", {
- source: this,
- mode: I
- });
- }
- setPreference(I, g) {
- this._eventBus.dispatch("setpreference", {
- source: this,
- name: I,
- value: g
- });
- }
- onSetPreference({
- name: I,
- value: g
- }) {
- switch (I) {
- case "enableNewAltTextWhenAddingImage":
- $(this, yh, g);
- break;
- }
- }
- onPageChanging({
- pageNumber: I
- }) {
- $(this, Wh, I - 1);
- }
- focusMainContainer() {
- M(this, wl).focus();
- }
- findParent(I, g) {
- for (const C of M(this, Et).values()) {
- const {
- x: i,
- y: e,
- width: A,
- height: s
- } = C.div.getBoundingClientRect();
- if (I >= i && I <= i + A && g >= e && g <= e + s)
- return C;
- }
- return null;
- }
- disableUserSelect(I = !1) {
- M(this, Om).classList.toggle("noUserSelect", I);
- }
- addShouldRescale(I) {
- M(this, sc).add(I);
- }
- removeShouldRescale(I) {
- M(this, sc).delete(I);
- }
- onScaleChanging({
- scale: I
- }) {
- var g;
- this.commitOrRemove(), this.viewParameters.realScale = I * Pa.PDF_TO_CSS_UNITS;
- for (const C of M(this, sc))
- C.onScaleChanging();
- (g = M(this, ec)) == null || g.onScaleChanging();
- }
- onRotationChanging({
- pagesRotation: I
- }) {
- this.commitOrRemove(), this.viewParameters.rotation = I;
- }
- highlightSelection(I = "") {
- const g = document.getSelection();
- if (!g || g.isCollapsed)
- return;
- const {
- anchorNode: C,
- anchorOffset: i,
- focusNode: e,
- focusOffset: A
- } = g, s = g.toString(), n = ig(this, Og, rN).call(this, g).closest(".textLayer"), a = this.getSelectionBoxes(n);
- if (!a)
- return;
- g.empty();
- const d = ig(this, Og, qX).call(this, n), o = M(this, St) === XI.NONE, c = () => {
- d == null || d.createAndAddNewEditor({
- x: 0,
- y: 0
- }, !1, {
- methodOfCreation: I,
- boxes: a,
- anchorNode: C,
- anchorOffset: i,
- focusNode: e,
- focusOffset: A,
- text: s
- }), o && this.showAllEditors("highlight", !0, !0);
- };
- if (o) {
- this.switchToMode(XI.HIGHLIGHT, c);
- return;
- }
- c();
- }
- addToAnnotationStorage(I) {
- !I.isEmpty() && M(this, Zl) && !M(this, Zl).has(I.id) && M(this, Zl).setValue(I.id, I);
- }
- blur() {
- if (this.isShiftKeyDown = !1, M(this, ha) && ($(this, ha, !1), ig(this, Og, hN).call(this, "main_toolbar")), !this.hasSelection)
- return;
- const {
- activeElement: I
- } = document;
- for (const g of M(this, hC))
- if (g.div.contains(I)) {
- $(this, lc, [g, I]), g._focusEventsAllowed = !1;
- break;
- }
- }
- focus() {
- if (!M(this, lc))
- return;
- const [I, g] = M(this, lc);
- $(this, lc, null), g.addEventListener("focusin", () => {
- I._focusEventsAllowed = !0;
- }, {
- once: !0,
- signal: this._signal
- }), g.focus();
- }
- addEditListeners() {
- ig(this, Og, $X).call(this), ig(this, Og, gS).call(this);
- }
- removeEditListeners() {
- ig(this, Og, O$).call(this), ig(this, Og, IS).call(this);
- }
- dragOver(I) {
- for (const {
- type: g
- } of I.dataTransfer.items)
- for (const C of M(this, pA))
- if (C.isHandlingMimeForPasting(g)) {
- I.dataTransfer.dropEffect = "copy", I.preventDefault();
- return;
- }
- }
- drop(I) {
- for (const g of I.dataTransfer.items)
- for (const C of M(this, pA))
- if (C.isHandlingMimeForPasting(g.type)) {
- C.paste(g, this.currentLayer), I.preventDefault();
- return;
- }
- }
- copy(I) {
- var C;
- if (I.preventDefault(), (C = M(this, ce)) == null || C.commitOrRemove(), !this.hasSelection)
- return;
- const g = [];
- for (const i of M(this, hC)) {
- const e = i.serialize(!0);
- e && g.push(e);
- }
- g.length !== 0 && I.clipboardData.setData("application/pdfjs", JSON.stringify(g));
- }
- cut(I) {
- this.copy(I), this.delete();
- }
- async paste(I) {
- I.preventDefault();
- const {
- clipboardData: g
- } = I;
- for (const e of g.items)
- for (const A of M(this, pA))
- if (A.isHandlingMimeForPasting(e.type)) {
- A.paste(e, this.currentLayer);
- return;
- }
- let C = g.getData("application/pdfjs");
- if (!C)
- return;
- try {
- C = JSON.parse(C);
- } catch (e) {
- DI(`paste: "${e.message}".`);
- return;
- }
- if (!Array.isArray(C))
- return;
- this.unselectAll();
- const i = this.currentLayer;
- try {
- const e = [];
- for (const l of C) {
- const n = await i.deserialize(l);
- if (!n)
- return;
- e.push(n);
- }
- const A = () => {
- for (const l of e)
- ig(this, Og, CS).call(this, l);
- ig(this, Og, tS).call(this, e);
- }, s = () => {
- for (const l of e)
- l.remove();
- };
- this.addCommands({
- cmd: A,
- undo: s,
- mustExec: !0
- });
- } catch (e) {
- DI(`paste: "${e.message}".`);
- }
- }
- keydown(I) {
- !this.isShiftKeyDown && I.key === "Shift" && (this.isShiftKeyDown = !0), M(this, St) !== XI.NONE && !this.isEditorHandlingKeyboard && lh._keyboardManager.exec(this, I);
- }
- keyup(I) {
- this.isShiftKeyDown && I.key === "Shift" && (this.isShiftKeyDown = !1, M(this, ha) && ($(this, ha, !1), ig(this, Og, hN).call(this, "main_toolbar")));
- }
- onEditingAction({
- name: I
- }) {
- switch (I) {
- case "undo":
- case "redo":
- case "delete":
- case "selectAll":
- this[I]();
- break;
- case "highlightSelection":
- this.highlightSelection("context_menu");
- break;
- }
- }
- setEditingState(I) {
- I ? (ig(this, Og, j$).call(this), ig(this, Og, gS).call(this), ig(this, Og, Yi).call(this, {
- isEditing: M(this, St) !== XI.NONE,
- isEmpty: ig(this, Og, Tu).call(this),
- hasSomethingToUndo: M(this, Qe).hasSomethingToUndo(),
- hasSomethingToRedo: M(this, Qe).hasSomethingToRedo(),
- hasSelectedEditor: !1
- })) : (ig(this, Og, Q$).call(this), ig(this, Og, IS).call(this), ig(this, Og, Yi).call(this, {
- isEditing: !1
- }), this.disableUserSelect(!1));
- }
- registerEditorTypes(I) {
- if (!M(this, pA)) {
- $(this, pA, I);
- for (const g of M(this, pA))
- ig(this, Og, rl).call(this, g.defaultPropertiesToUpdate);
- }
- }
- getId() {
- return M(this, DV).id;
- }
- get currentLayer() {
- return M(this, Et).get(M(this, Wh));
- }
- getLayer(I) {
- return M(this, Et).get(I);
- }
- get currentPageIndex() {
- return M(this, Wh);
- }
- addLayer(I) {
- M(this, Et).set(I.pageIndex, I), M(this, ba) ? I.enable() : I.disable();
- }
- removeLayer(I) {
- M(this, Et).delete(I.pageIndex);
- }
- async updateMode(I, g = null, C = !1) {
- var i, e;
- if (M(this, St) !== I && !(M(this, Oe) && (await M(this, Oe).promise, !M(this, Oe)))) {
- if ($(this, Oe, Promise.withResolvers()), $(this, St, I), I === XI.NONE) {
- this.setEditingState(!1), ig(this, Og, P$).call(this), (i = this._editorUndoBar) == null || i.hide(), M(this, Oe).resolve();
- return;
- }
- I === XI.SIGNATURE && await ((e = M(this, Za)) == null ? void 0 : e.loadSignatures()), this.setEditingState(!0), await ig(this, Og, E$).call(this), this.unselectAll();
- for (const A of M(this, Et).values())
- A.updateMode(I);
- if (!g) {
- C && this.addNewEditorFromKeyboard(), M(this, Oe).resolve();
- return;
- }
- for (const A of M(this, Bt).values())
- A.annotationElementId === g ? (this.setSelected(A), A.enterInEditMode()) : A.unselect();
- M(this, Oe).resolve();
- }
- }
- addNewEditorFromKeyboard() {
- this.currentLayer.canCreateNewEmptyEditor() && this.currentLayer.addNewEditor();
- }
- updateToolbar(I) {
- I !== M(this, St) && this._eventBus.dispatch("switchannotationeditormode", {
- source: this,
- mode: I
- });
- }
- updateParams(I, g) {
- var C;
- if (M(this, pA)) {
- switch (I) {
- case iC.CREATE:
- this.currentLayer.addNewEditor(g);
- return;
- case iC.HIGHLIGHT_DEFAULT_COLOR:
- (C = M(this, nc)) == null || C.updateColor(g);
- break;
- case iC.HIGHLIGHT_SHOW_ALL:
- this._eventBus.dispatch("reporttelemetry", {
- source: this,
- details: {
- type: "editing",
- data: {
- type: "highlight",
- action: "toggle_visibility"
- }
- }
- }), (M(this, jm) || $(this, jm, /* @__PURE__ */ new Map())).set(I, g), this.showAllEditors("highlight", g);
- break;
- }
- for (const i of M(this, hC))
- i.updateParams(I, g);
- for (const i of M(this, pA))
- i.updateDefaultParams(I, g);
- }
- }
- showAllEditors(I, g, C = !1) {
- var e;
- for (const A of M(this, Bt).values())
- A.editorType === I && A.show(g);
- (((e = M(this, jm)) == null ? void 0 : e.get(iC.HIGHLIGHT_SHOW_ALL)) ?? !0) !== g && ig(this, Og, rl).call(this, [[iC.HIGHLIGHT_SHOW_ALL, g]]);
- }
- enableWaiting(I = !1) {
- if (M(this, Tm) !== I) {
- $(this, Tm, I);
- for (const g of M(this, Et).values())
- I ? g.disableClick() : g.enableClick(), g.div.classList.toggle("waiting", I);
- }
- }
- getEditors(I) {
- const g = [];
- for (const C of M(this, Bt).values())
- C.pageIndex === I && g.push(C);
- return g;
- }
- getEditor(I) {
- return M(this, Bt).get(I);
- }
- addEditor(I) {
- M(this, Bt).set(I.id, I);
- }
- removeEditor(I) {
- var g, C;
- I.div.contains(document.activeElement) && (M(this, us) && clearTimeout(M(this, us)), $(this, us, setTimeout(() => {
- this.focusMainContainer(), $(this, us, null);
- }, 0))), M(this, Bt).delete(I.id), I.annotationElementId && ((g = M(this, ma)) == null || g.delete(I.annotationElementId)), this.unselect(I), (!I.annotationElementId || !M(this, Ac).has(I.annotationElementId)) && ((C = M(this, Zl)) == null || C.remove(I.id));
- }
- addDeletedAnnotationElement(I) {
- M(this, Ac).add(I.annotationElementId), this.addChangedExistingAnnotation(I), I.deleted = !0;
- }
- isDeletedAnnotationElement(I) {
- return M(this, Ac).has(I);
- }
- removeDeletedAnnotationElement(I) {
- M(this, Ac).delete(I.annotationElementId), this.removeChangedExistingAnnotation(I), I.deleted = !1;
- }
- setActiveEditor(I) {
- M(this, ce) !== I && ($(this, ce, I), I && ig(this, Og, rl).call(this, I.propertiesToUpdate));
- }
- updateUI(I) {
- M(this, Og, _$) === I && ig(this, Og, rl).call(this, I.propertiesToUpdate);
- }
- updateUIForDefaultProperties(I) {
- ig(this, Og, rl).call(this, I.defaultPropertiesToUpdate);
- }
- toggleSelected(I) {
- if (M(this, hC).has(I)) {
- M(this, hC).delete(I), I.unselect(), ig(this, Og, Yi).call(this, {
- hasSelectedEditor: this.hasSelection
- });
- return;
- }
- M(this, hC).add(I), I.select(), ig(this, Og, rl).call(this, I.propertiesToUpdate), ig(this, Og, Yi).call(this, {
- hasSelectedEditor: !0
- });
- }
- setSelected(I) {
- var g;
- (g = M(this, ec)) == null || g.commitOrRemove();
- for (const C of M(this, hC))
- C !== I && C.unselect();
- M(this, hC).clear(), M(this, hC).add(I), I.select(), ig(this, Og, rl).call(this, I.propertiesToUpdate), ig(this, Og, Yi).call(this, {
- hasSelectedEditor: !0
- });
- }
- isSelected(I) {
- return M(this, hC).has(I);
- }
- get firstSelectedEditor() {
- return M(this, hC).values().next().value;
- }
- unselect(I) {
- I.unselect(), M(this, hC).delete(I), ig(this, Og, Yi).call(this, {
- hasSelectedEditor: this.hasSelection
- });
- }
- get hasSelection() {
- return M(this, hC).size !== 0;
- }
- get isEnterHandled() {
- return M(this, hC).size === 1 && this.firstSelectedEditor.isEnterHandled;
- }
- undo() {
- var I;
- M(this, Qe).undo(), ig(this, Og, Yi).call(this, {
- hasSomethingToUndo: M(this, Qe).hasSomethingToUndo(),
- hasSomethingToRedo: !0,
- isEmpty: ig(this, Og, Tu).call(this)
- }), (I = this._editorUndoBar) == null || I.hide();
- }
- redo() {
- M(this, Qe).redo(), ig(this, Og, Yi).call(this, {
- hasSomethingToUndo: !0,
- hasSomethingToRedo: M(this, Qe).hasSomethingToRedo(),
- isEmpty: ig(this, Og, Tu).call(this)
- });
- }
- addCommands(I) {
- M(this, Qe).add(I), ig(this, Og, Yi).call(this, {
- hasSomethingToUndo: !0,
- hasSomethingToRedo: !1,
- isEmpty: ig(this, Og, Tu).call(this)
- });
- }
- cleanUndoStack(I) {
- M(this, Qe).cleanType(I);
- }
- delete() {
- var e;
- this.commitOrRemove();
- const I = (e = this.currentLayer) == null ? void 0 : e.endDrawingSession(!0);
- if (!this.hasSelection && !I)
- return;
- const g = I ? [I] : [...M(this, hC)], C = () => {
- var A;
- (A = this._editorUndoBar) == null || A.show(i, g.length === 1 ? g[0].editorType : g.length);
- for (const s of g)
- s.remove();
- }, i = () => {
- for (const A of g)
- ig(this, Og, CS).call(this, A);
- };
- this.addCommands({
- cmd: C,
- undo: i,
- mustExec: !0
- });
- }
- commitOrRemove() {
- var I;
- (I = M(this, ce)) == null || I.commitOrRemove();
- }
- hasSomethingToControl() {
- return M(this, ce) || this.hasSelection;
- }
- selectAll() {
- for (const I of M(this, hC))
- I.commit();
- ig(this, Og, tS).call(this, M(this, Bt).values());
- }
- unselectAll() {
- var I;
- if (!(M(this, ce) && (M(this, ce).commitOrRemove(), M(this, St) !== XI.NONE)) && !((I = M(this, ec)) != null && I.commitOrRemove()) && this.hasSelection) {
- for (const g of M(this, hC))
- g.unselect();
- M(this, hC).clear(), ig(this, Og, Yi).call(this, {
- hasSelectedEditor: !1
- });
- }
- }
- translateSelectedEditors(I, g, C = !1) {
- if (C || this.commitOrRemove(), !this.hasSelection)
- return;
- M(this, Ga)[0] += I, M(this, Ga)[1] += g;
- const [i, e] = M(this, Ga), A = [...M(this, hC)], s = 1e3;
- M(this, Zs) && clearTimeout(M(this, Zs)), $(this, Zs, setTimeout(() => {
- $(this, Zs, null), M(this, Ga)[0] = M(this, Ga)[1] = 0, this.addCommands({
- cmd: () => {
- for (const l of A)
- M(this, Bt).has(l.id) && (l.translateInPage(i, e), l.translationDone());
- },
- undo: () => {
- for (const l of A)
- M(this, Bt).has(l.id) && (l.translateInPage(-i, -e), l.translationDone());
- },
- mustExec: !1
- });
- }, s));
- for (const l of A)
- l.translateInPage(I, g), l.translationDone();
- }
- setUpDragSession() {
- if (this.hasSelection) {
- this.disableUserSelect(!0), $(this, bs, /* @__PURE__ */ new Map());
- for (const I of M(this, hC))
- M(this, bs).set(I, {
- savedX: I.x,
- savedY: I.y,
- savedPageIndex: I.pageIndex,
- newX: 0,
- newY: 0,
- newPageIndex: -1
- });
- }
- }
- endDragSession() {
- if (!M(this, bs))
- return !1;
- this.disableUserSelect(!1);
- const I = M(this, bs);
- $(this, bs, null);
- let g = !1;
- for (const [{
- x: i,
- y: e,
- pageIndex: A
- }, s] of I)
- s.newX = i, s.newY = e, s.newPageIndex = A, g || (g = i !== s.savedX || e !== s.savedY || A !== s.savedPageIndex);
- if (!g)
- return !1;
- const C = (i, e, A, s) => {
- if (M(this, Bt).has(i.id)) {
- const l = M(this, Et).get(s);
- l ? i._setParentAndPosition(l, e, A) : (i.pageIndex = s, i.x = e, i.y = A);
- }
- };
- return this.addCommands({
- cmd: () => {
- for (const [i, {
- newX: e,
- newY: A,
- newPageIndex: s
- }] of I)
- C(i, e, A, s);
- },
- undo: () => {
- for (const [i, {
- savedX: e,
- savedY: A,
- savedPageIndex: s
- }] of I)
- C(i, e, A, s);
- },
- mustExec: !0
- }), !0;
- }
- dragSelectedEditors(I, g) {
- if (M(this, bs))
- for (const C of M(this, bs).keys())
- C.drag(I, g);
- }
- rebuild(I) {
- if (I.parent === null) {
- const g = this.getLayer(I.pageIndex);
- g ? (g.changeParent(I), g.addOrRebuild(I)) : (this.addEditor(I), this.addToAnnotationStorage(I), I.rebuild());
- } else
- I.parent.addOrRebuild(I);
- }
- get isEditorHandlingKeyboard() {
- var I;
- return ((I = this.getActive()) == null ? void 0 : I.shouldGetKeyboardEvents()) || M(this, hC).size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents();
- }
- isActive(I) {
- return M(this, ce) === I;
- }
- getActive() {
- return M(this, ce);
- }
- getMode() {
- return M(this, St);
- }
- get imageManager() {
- return UI(this, "imageManager", new PX());
- }
- getSelectionBoxes(I) {
- if (!I)
- return null;
- const g = document.getSelection();
- for (let n = 0, a = g.rangeCount; n < a; n++)
- if (!I.contains(g.getRangeAt(n).commonAncestorContainer))
- return null;
- const {
- x: C,
- y: i,
- width: e,
- height: A
- } = I.getBoundingClientRect();
- let s;
- switch (I.getAttribute("data-main-rotation")) {
- case "90":
- s = (n, a, d, o) => ({
- x: (a - i) / A,
- y: 1 - (n + d - C) / e,
- width: o / A,
- height: d / e
- });
- break;
- case "180":
- s = (n, a, d, o) => ({
- x: 1 - (n + d - C) / e,
- y: 1 - (a + o - i) / A,
- width: d / e,
- height: o / A
- });
- break;
- case "270":
- s = (n, a, d, o) => ({
- x: 1 - (a + o - i) / A,
- y: (n - C) / e,
- width: o / A,
- height: d / e
- });
- break;
- default:
- s = (n, a, d, o) => ({
- x: (n - C) / e,
- y: (a - i) / A,
- width: d / e,
- height: o / A
- });
- break;
- }
- const l = [];
- for (let n = 0, a = g.rangeCount; n < a; n++) {
- const d = g.getRangeAt(n);
- if (!d.collapsed)
- for (const {
- x: o,
- y: c,
- width: r,
- height: h
- } of d.getClientRects())
- r === 0 || h === 0 || l.push(s(o, c, r, h));
- }
- return l.length === 0 ? null : l;
- }
- addChangedExistingAnnotation({
- annotationElementId: I,
- id: g
- }) {
- (M(this, Bh) || $(this, Bh, /* @__PURE__ */ new Map())).set(I, g);
- }
- removeChangedExistingAnnotation({
- annotationElementId: I
- }) {
- var g;
- (g = M(this, Bh)) == null || g.delete(I);
- }
- renderAnnotationElement(I) {
- var i;
- const g = (i = M(this, Bh)) == null ? void 0 : i.get(I.data.id);
- if (!g)
- return;
- const C = M(this, Zl).getRawValue(g);
- C && (M(this, St) === XI.NONE && !C.hasBeenModified || C.renderAnnotationElement(I));
- }
- setMissingCanvas(I, g, C) {
- var e;
- const i = (e = M(this, ma)) == null ? void 0 : e.get(I);
- i && (i.setCanvas(g, C), M(this, ma).delete(I));
- }
- addMissingCanvas(I, g) {
- (M(this, ma) || $(this, ma, /* @__PURE__ */ new Map())).set(I, g);
- }
- };
- wh = new WeakMap(), ce = new WeakMap(), Bt = new WeakMap(), Et = new WeakMap(), ph = new WeakMap(), Zl = new WeakMap(), Bh = new WeakMap(), Qe = new WeakMap(), da = new WeakMap(), ec = new WeakMap(), Wh = new WeakMap(), Ac = new WeakMap(), bs = new WeakMap(), pA = new WeakMap(), sc = new WeakMap(), Jm = new WeakMap(), Lm = new WeakMap(), yh = new WeakMap(), vm = new WeakMap(), us = new WeakMap(), ra = new WeakMap(), Yh = new WeakMap(), ha = new WeakMap(), ms = new WeakMap(), DV = new WeakMap(), ba = new WeakMap(), Tm = new WeakMap(), ua = new WeakMap(), lc = new WeakMap(), nc = new WeakMap(), ma = new WeakMap(), xm = new WeakMap(), St = new WeakMap(), hC = new WeakMap(), Gl = new WeakMap(), Za = new WeakMap(), ac = new WeakMap(), jm = new WeakMap(), Qm = new WeakMap(), Ga = new WeakMap(), Zs = new WeakMap(), wl = new WeakMap(), Om = new WeakMap(), Oe = new WeakMap(), Og = new WeakSet(), rN = function({
- anchorNode: I
- }) {
- return I.nodeType === Node.TEXT_NODE ? I.parentElement : I;
- }, qX = function(I) {
- const {
- currentLayer: g
- } = this;
- if (g.hasTextLayer(I))
- return g;
- for (const C of M(this, Et).values())
- if (C.hasTextLayer(I))
- return C;
- return null;
- }, v$ = function() {
- const I = document.getSelection();
- if (!I || I.isCollapsed)
- return;
- const C = ig(this, Og, rN).call(this, I).closest(".textLayer"), i = this.getSelectionBoxes(C);
- i && (M(this, ms) || $(this, ms, new tcg(this)), M(this, ms).show(C, i, this.direction === "ltr"));
- }, T$ = function() {
- var e, A, s;
- const I = document.getSelection();
- if (!I || I.isCollapsed) {
- M(this, Gl) && ((e = M(this, ms)) == null || e.hide(), $(this, Gl, null), ig(this, Og, Yi).call(this, {
- hasSelectedText: !1
- }));
- return;
- }
- const {
- anchorNode: g
- } = I;
- if (g === M(this, Gl))
- return;
- const i = ig(this, Og, rN).call(this, I).closest(".textLayer");
- if (!i) {
- M(this, Gl) && ((A = M(this, ms)) == null || A.hide(), $(this, Gl, null), ig(this, Og, Yi).call(this, {
- hasSelectedText: !1
- }));
- return;
- }
- if ((s = M(this, ms)) == null || s.hide(), $(this, Gl, g), ig(this, Og, Yi).call(this, {
- hasSelectedText: !0
- }), !(M(this, St) !== XI.HIGHLIGHT && M(this, St) !== XI.NONE) && (M(this, St) === XI.HIGHLIGHT && this.showAllEditors("highlight", !0, !0), $(this, ha, this.isShiftKeyDown), !this.isShiftKeyDown)) {
- const l = M(this, St) === XI.HIGHLIGHT ? ig(this, Og, qX).call(this, i) : null;
- l == null || l.toggleDrawing();
- const n = new AbortController(), a = this.combinedSignal(n), d = (o) => {
- o.type === "pointerup" && o.button !== 0 || (n.abort(), l == null || l.toggleDrawing(!0), o.type === "pointerup" && ig(this, Og, hN).call(this, "main_toolbar"));
- };
- window.addEventListener("pointerup", d, {
- signal: a
- }), window.addEventListener("blur", d, {
- signal: a
- });
- }
- }, hN = function(I = "") {
- M(this, St) === XI.HIGHLIGHT ? this.highlightSelection(I) : M(this, Jm) && ig(this, Og, v$).call(this);
- }, x$ = function() {
- document.addEventListener("selectionchange", ig(this, Og, T$).bind(this), {
- signal: this._signal
- });
- }, j$ = function() {
- if (M(this, ra))
- return;
- $(this, ra, new AbortController());
- const I = this.combinedSignal(M(this, ra));
- window.addEventListener("focus", this.focus.bind(this), {
- signal: I
- }), window.addEventListener("blur", this.blur.bind(this), {
- signal: I
- });
- }, Q$ = function() {
- var I;
- (I = M(this, ra)) == null || I.abort(), $(this, ra, null);
- }, $X = function() {
- if (M(this, ua))
- return;
- $(this, ua, new AbortController());
- const I = this.combinedSignal(M(this, ua));
- window.addEventListener("keydown", this.keydown.bind(this), {
- signal: I
- }), window.addEventListener("keyup", this.keyup.bind(this), {
- signal: I
- });
- }, O$ = function() {
- var I;
- (I = M(this, ua)) == null || I.abort(), $(this, ua, null);
- }, gS = function() {
- if (M(this, da))
- return;
- $(this, da, new AbortController());
- const I = this.combinedSignal(M(this, da));
- document.addEventListener("copy", this.copy.bind(this), {
- signal: I
- }), document.addEventListener("cut", this.cut.bind(this), {
- signal: I
- }), document.addEventListener("paste", this.paste.bind(this), {
- signal: I
- });
- }, IS = function() {
- var I;
- (I = M(this, da)) == null || I.abort(), $(this, da, null);
- }, U$ = function() {
- const I = this._signal;
- document.addEventListener("dragover", this.dragOver.bind(this), {
- signal: I
- }), document.addEventListener("drop", this.drop.bind(this), {
- signal: I
- });
- }, Yi = function(I) {
- Object.entries(I).some(([C, i]) => M(this, Qm)[C] !== i) && (this._eventBus.dispatch("annotationeditorstateschanged", {
- source: this,
- details: Object.assign(M(this, Qm), I)
- }), M(this, St) === XI.HIGHLIGHT && I.hasSelectedEditor === !1 && ig(this, Og, rl).call(this, [[iC.HIGHLIGHT_FREE, !0]]));
- }, rl = function(I) {
- this._eventBus.dispatch("annotationeditorparamschanged", {
- source: this,
- details: I
- });
- }, E$ = async function() {
- if (!M(this, ba)) {
- $(this, ba, !0);
- const I = [];
- for (const g of M(this, Et).values())
- I.push(g.enable());
- await Promise.all(I);
- for (const g of M(this, Bt).values())
- g.enable();
- }
- }, P$ = function() {
- if (this.unselectAll(), M(this, ba)) {
- $(this, ba, !1);
- for (const I of M(this, Et).values())
- I.disable();
- for (const I of M(this, Bt).values())
- I.disable();
- }
- }, CS = function(I) {
- const g = M(this, Et).get(I.pageIndex);
- g ? g.addOrRebuild(I) : (this.addEditor(I), this.addToAnnotationStorage(I));
- }, _$ = function() {
- let I = null;
- for (I of M(this, hC))
- ;
- return I;
- }, Tu = function() {
- if (M(this, Bt).size === 0)
- return !0;
- if (M(this, Bt).size === 1)
- for (const I of M(this, Bt).values())
- return I.isEmpty();
- return !1;
- }, tS = function(I) {
- for (const g of M(this, hC))
- g.unselect();
- M(this, hC).clear();
- for (const g of I)
- g.isEmpty() || (M(this, hC).add(g), g.select());
- ig(this, Og, Yi).call(this, {
- hasSelectedEditor: this.hasSelection
- });
- }, iI(lh, "TRANSLATE_SMALL", 1), iI(lh, "TRANSLATE_BIG", 10);
- let dd = lh;
- var Dt, Gs, BA, Nh, ws, de, Vh, ps, Qi, pl, oc, Bs, wa, kA, xu, bN;
- const Ni = class Ni {
- constructor(I) {
- tg(this, kA);
- tg(this, Dt, null);
- tg(this, Gs, !1);
- tg(this, BA, null);
- tg(this, Nh, null);
- tg(this, ws, null);
- tg(this, de, null);
- tg(this, Vh, !1);
- tg(this, ps, null);
- tg(this, Qi, null);
- tg(this, pl, null);
- tg(this, oc, null);
- tg(this, Bs, !1);
- $(this, Qi, I), $(this, Bs, I._uiManager.useNewAltTextFlow), M(Ni, wa) || $(Ni, wa, Object.freeze({
- added: "pdfjs-editor-new-alt-text-added-button",
- "added-label": "pdfjs-editor-new-alt-text-added-button-label",
- missing: "pdfjs-editor-new-alt-text-missing-button",
- "missing-label": "pdfjs-editor-new-alt-text-missing-button-label",
- review: "pdfjs-editor-new-alt-text-to-review-button",
- "review-label": "pdfjs-editor-new-alt-text-to-review-button-label"
- }));
- }
- static initialize(I) {
- Ni._l10n ?? (Ni._l10n = I);
- }
- async render() {
- const I = $(this, BA, document.createElement("button"));
- I.className = "altText", I.tabIndex = "0";
- const g = $(this, Nh, document.createElement("span"));
- I.append(g), M(this, Bs) ? (I.classList.add("new"), I.setAttribute("data-l10n-id", M(Ni, wa).missing), g.setAttribute("data-l10n-id", M(Ni, wa)["missing-label"])) : (I.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"), g.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"));
- const C = M(this, Qi)._uiManager._signal;
- I.addEventListener("contextmenu", zA, {
- signal: C
- }), I.addEventListener("pointerdown", (e) => e.stopPropagation(), {
- signal: C
- });
- const i = (e) => {
- e.preventDefault(), M(this, Qi)._uiManager.editAltText(M(this, Qi)), M(this, Bs) && M(this, Qi)._reportTelemetry({
- action: "pdfjs.image.alt_text.image_status_label_clicked",
- data: {
- label: M(this, kA, xu)
- }
- });
- };
- return I.addEventListener("click", i, {
- capture: !0,
- signal: C
- }), I.addEventListener("keydown", (e) => {
- e.target === I && e.key === "Enter" && ($(this, Vh, !0), i(e));
- }, {
- signal: C
- }), await ig(this, kA, bN).call(this), I;
- }
- finish() {
- M(this, BA) && (M(this, BA).focus({
- focusVisible: M(this, Vh)
- }), $(this, Vh, !1));
- }
- isEmpty() {
- return M(this, Bs) ? M(this, Dt) === null : !M(this, Dt) && !M(this, Gs);
- }
- hasData() {
- return M(this, Bs) ? M(this, Dt) !== null || !!M(this, pl) : this.isEmpty();
- }
- get guessedText() {
- return M(this, pl);
- }
- async setGuessedText(I) {
- M(this, Dt) === null && ($(this, pl, I), $(this, oc, await Ni._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", {
- generatedAltText: I
- })), ig(this, kA, bN).call(this));
- }
- toggleAltTextBadge(I = !1) {
- var g;
- if (!M(this, Bs) || M(this, Dt)) {
- (g = M(this, ps)) == null || g.remove(), $(this, ps, null);
- return;
- }
- if (!M(this, ps)) {
- const C = $(this, ps, document.createElement("div"));
- C.className = "noAltTextBadge", M(this, Qi).div.append(C);
- }
- M(this, ps).classList.toggle("hidden", !I);
- }
- serialize(I) {
- let g = M(this, Dt);
- return !I && M(this, pl) === g && (g = M(this, oc)), {
- altText: g,
- decorative: M(this, Gs),
- guessedText: M(this, pl),
- textWithDisclaimer: M(this, oc)
- };
- }
- get data() {
- return {
- altText: M(this, Dt),
- decorative: M(this, Gs)
- };
- }
- set data({
- altText: I,
- decorative: g,
- guessedText: C,
- textWithDisclaimer: i,
- cancel: e = !1
- }) {
- C && ($(this, pl, C), $(this, oc, i)), !(M(this, Dt) === I && M(this, Gs) === g) && (e || ($(this, Dt, I), $(this, Gs, g)), ig(this, kA, bN).call(this));
- }
- toggle(I = !1) {
- M(this, BA) && (!I && M(this, de) && (clearTimeout(M(this, de)), $(this, de, null)), M(this, BA).disabled = !I);
- }
- shown() {
- M(this, Qi)._reportTelemetry({
- action: "pdfjs.image.alt_text.image_status_label_displayed",
- data: {
- label: M(this, kA, xu)
- }
- });
- }
- destroy() {
- var I, g;
- (I = M(this, BA)) == null || I.remove(), $(this, BA, null), $(this, Nh, null), $(this, ws, null), (g = M(this, ps)) == null || g.remove(), $(this, ps, null);
- }
- };
- Dt = new WeakMap(), Gs = new WeakMap(), BA = new WeakMap(), Nh = new WeakMap(), ws = new WeakMap(), de = new WeakMap(), Vh = new WeakMap(), ps = new WeakMap(), Qi = new WeakMap(), pl = new WeakMap(), oc = new WeakMap(), Bs = new WeakMap(), wa = new WeakMap(), kA = new WeakSet(), xu = function() {
- return M(this, Dt) && "added" || M(this, Dt) === null && this.guessedText && "review" || "missing";
- }, bN = async function() {
- var i, e, A;
- const I = M(this, BA);
- if (!I)
- return;
- if (M(this, Bs)) {
- if (I.classList.toggle("done", !!M(this, Dt)), I.setAttribute("data-l10n-id", M(Ni, wa)[M(this, kA, xu)]), (i = M(this, Nh)) == null || i.setAttribute("data-l10n-id", M(Ni, wa)[`${M(this, kA, xu)}-label`]), !M(this, Dt)) {
- (e = M(this, ws)) == null || e.remove();
- return;
- }
- } else {
- if (!M(this, Dt) && !M(this, Gs)) {
- I.classList.remove("done"), (A = M(this, ws)) == null || A.remove();
- return;
- }
- I.classList.add("done"), I.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button");
- }
- let g = M(this, ws);
- if (!g) {
- $(this, ws, g = document.createElement("span")), g.className = "tooltip", g.setAttribute("role", "tooltip"), g.id = `alt-text-tooltip-${M(this, Qi).id}`;
- const s = 100, l = M(this, Qi)._uiManager._signal;
- l.addEventListener("abort", () => {
- clearTimeout(M(this, de)), $(this, de, null);
- }, {
- once: !0
- }), I.addEventListener("mouseenter", () => {
- $(this, de, setTimeout(() => {
- $(this, de, null), M(this, ws).classList.add("show"), M(this, Qi)._reportTelemetry({
- action: "alt_text_tooltip"
- });
- }, s));
- }, {
- signal: l
- }), I.addEventListener("mouseleave", () => {
- var n;
- M(this, de) && (clearTimeout(M(this, de)), $(this, de, null)), (n = M(this, ws)) == null || n.classList.remove("show");
- }, {
- signal: l
- });
- }
- M(this, Gs) ? g.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip") : (g.removeAttribute("data-l10n-id"), g.textContent = M(this, Dt)), g.parentNode || I.append(g);
- const C = M(this, Qi).getElementForAltText();
- C == null || C.setAttribute("aria-describedby", g.id);
- }, tg(Ni, wa, null), iI(Ni, "_l10n", null);
- let tV = Ni;
- var Mh, cc, Um, Em, Pm, _m, qm, Bl, dc, Wl, rc, pa, $a, q$, $$, ggg;
- const t1 = class t1 {
- constructor({
- container: I,
- isPinchingDisabled: g = null,
- isPinchingStopped: C = null,
- onPinchStart: i = null,
- onPinching: e = null,
- onPinchEnd: A = null,
- signal: s
- }) {
- tg(this, $a);
- tg(this, Mh);
- tg(this, cc, !1);
- tg(this, Um, null);
- tg(this, Em);
- tg(this, Pm);
- tg(this, _m);
- tg(this, qm);
- tg(this, Bl, null);
- tg(this, dc);
- tg(this, Wl, null);
- tg(this, rc);
- tg(this, pa, null);
- $(this, Mh, I), $(this, Um, C), $(this, Em, g), $(this, Pm, i), $(this, _m, e), $(this, qm, A), $(this, rc, new AbortController()), $(this, dc, AbortSignal.any([s, M(this, rc).signal])), I.addEventListener("touchstart", ig(this, $a, q$).bind(this), {
- passive: !1,
- signal: M(this, dc)
- });
- }
- get MIN_TOUCH_DISTANCE_TO_PINCH() {
- return 35 / In.pixelRatio;
- }
- destroy() {
- var I, g;
- (I = M(this, rc)) == null || I.abort(), $(this, rc, null), (g = M(this, Bl)) == null || g.abort(), $(this, Bl, null);
- }
- };
- Mh = new WeakMap(), cc = new WeakMap(), Um = new WeakMap(), Em = new WeakMap(), Pm = new WeakMap(), _m = new WeakMap(), qm = new WeakMap(), Bl = new WeakMap(), dc = new WeakMap(), Wl = new WeakMap(), rc = new WeakMap(), pa = new WeakMap(), $a = new WeakSet(), q$ = function(I) {
- var i, e, A;
- if ((i = M(this, Em)) != null && i.call(this))
- return;
- if (I.touches.length === 1) {
- if (M(this, Bl))
- return;
- const s = $(this, Bl, new AbortController()), l = AbortSignal.any([M(this, dc), s.signal]), n = M(this, Mh), a = {
- capture: !0,
- signal: l,
- passive: !1
- }, d = (o) => {
- var c;
- o.pointerType === "touch" && ((c = M(this, Bl)) == null || c.abort(), $(this, Bl, null));
- };
- n.addEventListener("pointerdown", (o) => {
- o.pointerType === "touch" && (ht(o), d(o));
- }, a), n.addEventListener("pointerup", d, a), n.addEventListener("pointercancel", d, a);
- return;
- }
- if (!M(this, pa)) {
- $(this, pa, new AbortController());
- const s = AbortSignal.any([M(this, dc), M(this, pa).signal]), l = M(this, Mh), n = {
- signal: s,
- capture: !1,
- passive: !1
- };
- l.addEventListener("touchmove", ig(this, $a, $$).bind(this), n);
- const a = ig(this, $a, ggg).bind(this);
- l.addEventListener("touchend", a, n), l.addEventListener("touchcancel", a, n), n.capture = !0, l.addEventListener("pointerdown", ht, n), l.addEventListener("pointermove", ht, n), l.addEventListener("pointercancel", ht, n), l.addEventListener("pointerup", ht, n), (e = M(this, Pm)) == null || e.call(this);
- }
- if (ht(I), I.touches.length !== 2 || (A = M(this, Um)) != null && A.call(this)) {
- $(this, Wl, null);
- return;
- }
- let [g, C] = I.touches;
- g.identifier > C.identifier && ([g, C] = [C, g]), $(this, Wl, {
- touch0X: g.screenX,
- touch0Y: g.screenY,
- touch1X: C.screenX,
- touch1Y: C.screenY
- });
- }, $$ = function(I) {
- var p;
- if (!M(this, Wl) || I.touches.length !== 2)
- return;
- ht(I);
- let [g, C] = I.touches;
- g.identifier > C.identifier && ([g, C] = [C, g]);
- const {
- screenX: i,
- screenY: e
- } = g, {
- screenX: A,
- screenY: s
- } = C, l = M(this, Wl), {
- touch0X: n,
- touch0Y: a,
- touch1X: d,
- touch1Y: o
- } = l, c = d - n, r = o - a, h = A - i, b = s - e, u = Math.hypot(h, b) || 1, m = Math.hypot(c, r) || 1;
- if (!M(this, cc) && Math.abs(m - u) <= t1.MIN_TOUCH_DISTANCE_TO_PINCH)
- return;
- if (l.touch0X = i, l.touch0Y = e, l.touch1X = A, l.touch1Y = s, !M(this, cc)) {
- $(this, cc, !0);
- return;
- }
- const Z = [(i + A) / 2, (e + s) / 2];
- (p = M(this, _m)) == null || p.call(this, Z, m, u);
- }, ggg = function(I) {
- var g;
- I.touches.length >= 2 || (M(this, pa).abort(), $(this, pa, null), (g = M(this, qm)) == null || g.call(this), M(this, Wl) && (ht(I), $(this, Wl, null), $(this, cc, !1)));
- };
- let iV = t1;
- var hc, WA, XC, Rh, Ba, $m, bc, Pt, uc, yl, Wa, gZ, mc, re, IZ, Zc, Yl, Ws, fh, Hh, Ue, Gc, CZ, KV, wI, iS, tZ, eS, uN, Igg, Cgg, AS, mN, sS, tgg, igg, egg, lS, Agg, nS, sgg, lgg, ngg, aS, ju;
- const zI = class zI {
- constructor(I) {
- tg(this, wI);
- tg(this, hc, null);
- tg(this, WA, null);
- tg(this, XC, null);
- tg(this, Rh, !1);
- tg(this, Ba, null);
- tg(this, $m, "");
- tg(this, bc, !1);
- tg(this, Pt, null);
- tg(this, uc, null);
- tg(this, yl, null);
- tg(this, Wa, null);
- tg(this, gZ, "");
- tg(this, mc, !1);
- tg(this, re, null);
- tg(this, IZ, !1);
- tg(this, Zc, !1);
- tg(this, Yl, !1);
- tg(this, Ws, null);
- tg(this, fh, 0);
- tg(this, Hh, 0);
- tg(this, Ue, null);
- tg(this, Gc, null);
- iI(this, "_isCopy", !1);
- iI(this, "_editToolbar", null);
- iI(this, "_initialOptions", /* @__PURE__ */ Object.create(null));
- iI(this, "_initialData", null);
- iI(this, "_isVisible", !0);
- iI(this, "_uiManager", null);
- iI(this, "_focusEventsAllowed", !0);
- tg(this, CZ, !1);
- tg(this, KV, zI._zIndex++);
- this.parent = I.parent, this.id = I.id, this.width = this.height = null, this.pageIndex = I.parent.pageIndex, this.name = I.name, this.div = null, this._uiManager = I.uiManager, this.annotationElementId = null, this._willKeepAspectRatio = !1, this._initialOptions.isCentered = I.isCentered, this._structTreeParentId = null;
- const {
- rotation: g,
- rawDims: {
- pageWidth: C,
- pageHeight: i,
- pageX: e,
- pageY: A
- }
- } = this.parent.viewport;
- this.rotation = g, this.pageRotation = (360 + g - this._uiManager.viewParameters.rotation) % 360, this.pageDimensions = [C, i], this.pageTranslation = [e, A];
- const [s, l] = this.parentDimensions;
- this.x = I.x / s, this.y = I.y / l, this.isAttachedToDOM = !1, this.deleted = !1;
- }
- static get _resizerKeyboardManager() {
- const I = zI.prototype._resizeWithKeyboard, g = dd.TRANSLATE_SMALL, C = dd.TRANSLATE_BIG;
- return UI(this, "_resizerKeyboardManager", new lG([[["ArrowLeft", "mac+ArrowLeft"], I, {
- args: [-g, 0]
- }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], I, {
- args: [-C, 0]
- }], [["ArrowRight", "mac+ArrowRight"], I, {
- args: [g, 0]
- }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], I, {
- args: [C, 0]
- }], [["ArrowUp", "mac+ArrowUp"], I, {
- args: [0, -g]
- }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], I, {
- args: [0, -C]
- }], [["ArrowDown", "mac+ArrowDown"], I, {
- args: [0, g]
- }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], I, {
- args: [0, C]
- }], [["Escape", "mac+Escape"], zI.prototype._stopResizingWithKeyboard]]));
- }
- get editorType() {
- return Object.getPrototypeOf(this).constructor._type;
- }
- static get isDrawer() {
- return !1;
- }
- static get _defaultLineColor() {
- return UI(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText"));
- }
- static deleteAnnotationElement(I) {
- const g = new Acg({
- id: I.parent.getNextId(),
- parent: I.parent,
- uiManager: I._uiManager
- });
- g.annotationElementId = I.annotationElementId, g.deleted = !0, g._uiManager.addToAnnotationStorage(g);
- }
- static initialize(I, g) {
- if (zI._l10n ?? (zI._l10n = I), zI._l10nResizer || (zI._l10nResizer = Object.freeze({
- topLeft: "pdfjs-editor-resizer-top-left",
- topMiddle: "pdfjs-editor-resizer-top-middle",
- topRight: "pdfjs-editor-resizer-top-right",
- middleRight: "pdfjs-editor-resizer-middle-right",
- bottomRight: "pdfjs-editor-resizer-bottom-right",
- bottomMiddle: "pdfjs-editor-resizer-bottom-middle",
- bottomLeft: "pdfjs-editor-resizer-bottom-left",
- middleLeft: "pdfjs-editor-resizer-middle-left"
- })), zI._borderLineWidth !== -1)
- return;
- const C = getComputedStyle(document.documentElement);
- zI._borderLineWidth = parseFloat(C.getPropertyValue("--outline-width")) || 0;
- }
- static updateDefaultParams(I, g) {
- }
- static get defaultPropertiesToUpdate() {
- return [];
- }
- static isHandlingMimeForPasting(I) {
- return !1;
- }
- static paste(I, g) {
- BC("Not implemented");
- }
- get propertiesToUpdate() {
- return [];
- }
- get _isDraggable() {
- return M(this, CZ);
- }
- set _isDraggable(I) {
- var g;
- $(this, CZ, I), (g = this.div) == null || g.classList.toggle("draggable", I);
- }
- get isEnterHandled() {
- return !0;
- }
- center() {
- const [I, g] = this.pageDimensions;
- switch (this.parentRotation) {
- case 90:
- this.x -= this.height * g / (I * 2), this.y += this.width * I / (g * 2);
- break;
- case 180:
- this.x += this.width / 2, this.y += this.height / 2;
- break;
- case 270:
- this.x += this.height * g / (I * 2), this.y -= this.width * I / (g * 2);
- break;
- default:
- this.x -= this.width / 2, this.y -= this.height / 2;
- break;
- }
- this.fixAndSetPosition();
- }
- addCommands(I) {
- this._uiManager.addCommands(I);
- }
- get currentLayer() {
- return this._uiManager.currentLayer;
- }
- setInBackground() {
- this.div.style.zIndex = 0;
- }
- setInForeground() {
- this.div.style.zIndex = M(this, KV);
- }
- setParent(I) {
- I !== null ? (this.pageIndex = I.pageIndex, this.pageDimensions = I.pageDimensions) : ig(this, wI, ju).call(this), this.parent = I;
- }
- focusin(I) {
- this._focusEventsAllowed && (M(this, mc) ? $(this, mc, !1) : this.parent.setSelected(this));
- }
- focusout(I) {
- var C;
- if (!this._focusEventsAllowed || !this.isAttachedToDOM)
- return;
- const g = I.relatedTarget;
- g != null && g.closest(`#${this.id}`) || (I.preventDefault(), (C = this.parent) != null && C.isMultipleSelection || this.commitOrRemove());
- }
- commitOrRemove() {
- this.isEmpty() ? this.remove() : this.commit();
- }
- commit() {
- this.addToAnnotationStorage();
- }
- addToAnnotationStorage() {
- this._uiManager.addToAnnotationStorage(this);
- }
- setAt(I, g, C, i) {
- const [e, A] = this.parentDimensions;
- [C, i] = this.screenToPageTranslation(C, i), this.x = (I + C) / e, this.y = (g + i) / A, this.fixAndSetPosition();
- }
- _moveAfterPaste(I, g) {
- const [C, i] = this.parentDimensions;
- this.setAt(I * C, g * i, this.width * C, this.height * i), this._onTranslated();
- }
- translate(I, g) {
- ig(this, wI, iS).call(this, this.parentDimensions, I, g);
- }
- translateInPage(I, g) {
- M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]), ig(this, wI, iS).call(this, this.pageDimensions, I, g), this.div.scrollIntoView({
- block: "nearest"
- });
- }
- translationDone() {
- this._onTranslated(this.x, this.y);
- }
- drag(I, g) {
- M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]);
- const {
- div: C,
- parentDimensions: [i, e]
- } = this;
- if (this.x += I / i, this.y += g / e, this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {
- const {
- x: d,
- y: o
- } = this.div.getBoundingClientRect();
- this.parent.findNewParent(this, d, o) && (this.x -= Math.floor(this.x), this.y -= Math.floor(this.y));
- }
- let {
- x: A,
- y: s
- } = this;
- const [l, n] = this.getBaseTranslation();
- A += l, s += n;
- const {
- style: a
- } = C;
- a.left = `${(100 * A).toFixed(2)}%`, a.top = `${(100 * s).toFixed(2)}%`, this._onTranslating(A, s), C.scrollIntoView({
- block: "nearest"
- });
- }
- _onTranslating(I, g) {
- }
- _onTranslated(I, g) {
- }
- get _hasBeenMoved() {
- return !!M(this, re) && (M(this, re)[0] !== this.x || M(this, re)[1] !== this.y);
- }
- get _hasBeenResized() {
- return !!M(this, re) && (M(this, re)[2] !== this.width || M(this, re)[3] !== this.height);
- }
- getBaseTranslation() {
- const [I, g] = this.parentDimensions, {
- _borderLineWidth: C
- } = zI, i = C / I, e = C / g;
- switch (this.rotation) {
- case 90:
- return [-i, e];
- case 180:
- return [i, e];
- case 270:
- return [i, -e];
- default:
- return [-i, -e];
- }
- }
- get _mustFixPosition() {
- return !0;
- }
- fixAndSetPosition(I = this.rotation) {
- const {
- div: {
- style: g
- },
- pageDimensions: [C, i]
- } = this;
- let {
- x: e,
- y: A,
- width: s,
- height: l
- } = this;
- if (s *= C, l *= i, e *= C, A *= i, this._mustFixPosition)
- switch (I) {
- case 0:
- e = fi(e, 0, C - s), A = fi(A, 0, i - l);
- break;
- case 90:
- e = fi(e, 0, C - l), A = fi(A, s, i);
- break;
- case 180:
- e = fi(e, s, C), A = fi(A, l, i);
- break;
- case 270:
- e = fi(e, l, C), A = fi(A, 0, i - s);
- break;
- }
- this.x = e /= C, this.y = A /= i;
- const [n, a] = this.getBaseTranslation();
- e += n, A += a, g.left = `${(100 * e).toFixed(2)}%`, g.top = `${(100 * A).toFixed(2)}%`, this.moveInDOM();
- }
- screenToPageTranslation(I, g) {
- var C;
- return ig(C = zI, tZ, eS).call(C, I, g, this.parentRotation);
- }
- pageTranslationToScreen(I, g) {
- var C;
- return ig(C = zI, tZ, eS).call(C, I, g, 360 - this.parentRotation);
- }
- get parentScale() {
- return this._uiManager.viewParameters.realScale;
- }
- get parentRotation() {
- return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;
- }
- get parentDimensions() {
- const {
- parentScale: I,
- pageDimensions: [g, C]
- } = this;
- return [g * I, C * I];
- }
- setDims(I, g) {
- const [C, i] = this.parentDimensions, {
- style: e
- } = this.div;
- e.width = `${(100 * I / C).toFixed(2)}%`, M(this, bc) || (e.height = `${(100 * g / i).toFixed(2)}%`);
- }
- fixDims() {
- const {
- style: I
- } = this.div, {
- height: g,
- width: C
- } = I, i = C.endsWith("%"), e = !M(this, bc) && g.endsWith("%");
- if (i && e)
- return;
- const [A, s] = this.parentDimensions;
- i || (I.width = `${(100 * parseFloat(C) / A).toFixed(2)}%`), !M(this, bc) && !e && (I.height = `${(100 * parseFloat(g) / s).toFixed(2)}%`);
- }
- getInitialTranslation() {
- return [0, 0];
- }
- _onResized() {
- }
- static _round(I) {
- return Math.round(I * 1e4) / 1e4;
- }
- _onResizing() {
- }
- altTextFinish() {
- var I;
- (I = M(this, XC)) == null || I.finish();
- }
- async addEditToolbar() {
- return this._editToolbar || M(this, Zc) ? this._editToolbar : (this._editToolbar = new EX(this), this.div.append(this._editToolbar.render()), M(this, XC) && await this._editToolbar.addAltText(M(this, XC)), this._editToolbar);
- }
- removeEditToolbar() {
- var I;
- this._editToolbar && (this._editToolbar.remove(), this._editToolbar = null, (I = M(this, XC)) == null || I.destroy());
- }
- addContainer(I) {
- var C;
- const g = (C = this._editToolbar) == null ? void 0 : C.div;
- g ? g.before(I) : this.div.append(I);
- }
- getClientDimensions() {
- return this.div.getBoundingClientRect();
- }
- async addAltTextButton() {
- M(this, XC) || (tV.initialize(zI._l10n), $(this, XC, new tV(this)), M(this, hc) && (M(this, XC).data = M(this, hc), $(this, hc, null)), await this.addEditToolbar());
- }
- get altTextData() {
- var I;
- return (I = M(this, XC)) == null ? void 0 : I.data;
- }
- set altTextData(I) {
- M(this, XC) && (M(this, XC).data = I);
- }
- get guessedAltText() {
- var I;
- return (I = M(this, XC)) == null ? void 0 : I.guessedText;
- }
- async setGuessedAltText(I) {
- var g;
- await ((g = M(this, XC)) == null ? void 0 : g.setGuessedText(I));
- }
- serializeAltText(I) {
- var g;
- return (g = M(this, XC)) == null ? void 0 : g.serialize(I);
- }
- hasAltText() {
- return !!M(this, XC) && !M(this, XC).isEmpty();
- }
- hasAltTextData() {
- var I;
- return ((I = M(this, XC)) == null ? void 0 : I.hasData()) ?? !1;
- }
- render() {
- var A;
- const I = this.div = document.createElement("div");
- I.setAttribute("data-editor-rotation", (360 - this.rotation) % 360), I.className = this.name, I.setAttribute("id", this.id), I.tabIndex = M(this, Rh) ? -1 : 0, I.setAttribute("role", "application"), this.defaultL10nId && I.setAttribute("data-l10n-id", this.defaultL10nId), this._isVisible || I.classList.add("hidden"), this.setInForeground(), ig(this, wI, nS).call(this);
- const [g, C] = this.parentDimensions;
- this.parentRotation % 180 !== 0 && (I.style.maxWidth = `${(100 * C / g).toFixed(2)}%`, I.style.maxHeight = `${(100 * g / C).toFixed(2)}%`);
- const [i, e] = this.getInitialTranslation();
- return this.translate(i, e), m9(this, I, ["keydown", "pointerdown"]), this.isResizable && this._uiManager._supportsPinchToZoom && (M(this, Gc) || $(this, Gc, new iV({
- container: I,
- isPinchingDisabled: () => !this.isSelected,
- onPinchStart: ig(this, wI, tgg).bind(this),
- onPinching: ig(this, wI, igg).bind(this),
- onPinchEnd: ig(this, wI, egg).bind(this),
- signal: this._uiManager._signal
- }))), (A = this._uiManager._editorUndoBar) == null || A.hide(), I;
- }
- pointerdown(I) {
- const {
- isMac: g
- } = Ai.platform;
- if (I.button !== 0 || I.ctrlKey && g) {
- I.preventDefault();
- return;
- }
- if ($(this, mc, !0), this._isDraggable) {
- ig(this, wI, Agg).call(this, I);
- return;
- }
- ig(this, wI, lS).call(this, I);
- }
- get isSelected() {
- return this._uiManager.isSelected(this);
- }
- _onStartDragging() {
- }
- _onStopDragging() {
- }
- moveInDOM() {
- M(this, Ws) && clearTimeout(M(this, Ws)), $(this, Ws, setTimeout(() => {
- var I;
- $(this, Ws, null), (I = this.parent) == null || I.moveEditorInDOM(this);
- }, 0));
- }
- _setParentAndPosition(I, g, C) {
- I.changeParent(this), this.x = g, this.y = C, this.fixAndSetPosition(), this._onTranslated();
- }
- getRect(I, g, C = this.rotation) {
- const i = this.parentScale, [e, A] = this.pageDimensions, [s, l] = this.pageTranslation, n = I / i, a = g / i, d = this.x * e, o = this.y * A, c = this.width * e, r = this.height * A;
- switch (C) {
- case 0:
- return [d + n + s, A - o - a - r + l, d + n + c + s, A - o - a + l];
- case 90:
- return [d + a + s, A - o + n + l, d + a + r + s, A - o + n + c + l];
- case 180:
- return [d - n - c + s, A - o + a + l, d - n + s, A - o + a + r + l];
- case 270:
- return [d - a - r + s, A - o - n - c + l, d - a + s, A - o - n + l];
- default:
- throw new Error("Invalid rotation");
- }
- }
- getRectInCurrentCoords(I, g) {
- const [C, i, e, A] = I, s = e - C, l = A - i;
- switch (this.rotation) {
- case 0:
- return [C, g - A, s, l];
- case 90:
- return [C, g - i, l, s];
- case 180:
- return [e, g - i, s, l];
- case 270:
- return [e, g - A, l, s];
- default:
- throw new Error("Invalid rotation");
- }
- }
- onceAdded(I) {
- }
- isEmpty() {
- return !1;
- }
- enableEditMode() {
- $(this, Zc, !0);
- }
- disableEditMode() {
- $(this, Zc, !1);
- }
- isInEditMode() {
- return M(this, Zc);
- }
- shouldGetKeyboardEvents() {
- return M(this, Yl);
- }
- needsToBeRebuilt() {
- return this.div && !this.isAttachedToDOM;
- }
- get isOnScreen() {
- const {
- top: I,
- left: g,
- bottom: C,
- right: i
- } = this.getClientDimensions(), {
- innerHeight: e,
- innerWidth: A
- } = window;
- return g < A && i > 0 && I < e && C > 0;
- }
- rebuild() {
- ig(this, wI, nS).call(this);
- }
- rotate(I) {
- }
- resize() {
- }
- serializeDeleted() {
- var I;
- return {
- id: this.annotationElementId,
- deleted: !0,
- pageIndex: this.pageIndex,
- popupRef: ((I = this._initialData) == null ? void 0 : I.popupRef) || ""
- };
- }
- serialize(I = !1, g = null) {
- BC("An editor must be serializable");
- }
- static async deserialize(I, g, C) {
- const i = new this.prototype.constructor({
- parent: g,
- id: g.getNextId(),
- uiManager: C
- });
- i.rotation = I.rotation, $(i, hc, I.accessibilityData), i._isCopy = I.isCopy || !1;
- const [e, A] = i.pageDimensions, [s, l, n, a] = i.getRectInCurrentCoords(I.rect, A);
- return i.x = s / e, i.y = l / A, i.width = n / e, i.height = a / A, i;
- }
- get hasBeenModified() {
- return !!this.annotationElementId && (this.deleted || this.serialize() !== null);
- }
- remove() {
- var I, g;
- if ((I = M(this, Wa)) == null || I.abort(), $(this, Wa, null), this.isEmpty() || this.commit(), this.parent ? this.parent.remove(this) : this._uiManager.removeEditor(this), M(this, Ws) && (clearTimeout(M(this, Ws)), $(this, Ws, null)), ig(this, wI, ju).call(this), this.removeEditToolbar(), M(this, Ue)) {
- for (const C of M(this, Ue).values())
- clearTimeout(C);
- $(this, Ue, null);
- }
- this.parent = null, (g = M(this, Gc)) == null || g.destroy(), $(this, Gc, null);
- }
- get isResizable() {
- return !1;
- }
- makeResizable() {
- this.isResizable && (ig(this, wI, Igg).call(this), M(this, Pt).classList.remove("hidden"));
- }
- get toolbarPosition() {
- return null;
- }
- keydown(I) {
- if (!this.isResizable || I.target !== this.div || I.key !== "Enter")
- return;
- this._uiManager.setSelected(this), $(this, yl, {
- savedX: this.x,
- savedY: this.y,
- savedWidth: this.width,
- savedHeight: this.height
- });
- const g = M(this, Pt).children;
- if (!M(this, WA)) {
- $(this, WA, Array.from(g));
- const A = ig(this, wI, sgg).bind(this), s = ig(this, wI, lgg).bind(this), l = this._uiManager._signal;
- for (const n of M(this, WA)) {
- const a = n.getAttribute("data-resizer-name");
- n.setAttribute("role", "spinbutton"), n.addEventListener("keydown", A, {
- signal: l
- }), n.addEventListener("blur", s, {
- signal: l
- }), n.addEventListener("focus", ig(this, wI, ngg).bind(this, a), {
- signal: l
- }), n.setAttribute("data-l10n-id", zI._l10nResizer[a]);
- }
- }
- const C = M(this, WA)[0];
- let i = 0;
- for (const A of g) {
- if (A === C)
- break;
- i++;
- }
- const e = (360 - this.rotation + this.parentRotation) % 360 / 90 * (M(this, WA).length / 4);
- if (e !== i) {
- if (e < i)
- for (let s = 0; s < i - e; s++)
- M(this, Pt).append(M(this, Pt).firstChild);
- else if (e > i)
- for (let s = 0; s < e - i; s++)
- M(this, Pt).firstChild.before(M(this, Pt).lastChild);
- let A = 0;
- for (const s of g) {
- const n = M(this, WA)[A++].getAttribute("data-resizer-name");
- s.setAttribute("data-l10n-id", zI._l10nResizer[n]);
- }
- }
- ig(this, wI, aS).call(this, 0), $(this, Yl, !0), M(this, Pt).firstChild.focus({
- focusVisible: !0
- }), I.preventDefault(), I.stopImmediatePropagation();
- }
- _resizeWithKeyboard(I, g) {
- M(this, Yl) && ig(this, wI, sS).call(this, M(this, gZ), {
- deltaX: I,
- deltaY: g,
- fromKeyboard: !0
- });
- }
- _stopResizingWithKeyboard() {
- ig(this, wI, ju).call(this), this.div.focus();
- }
- select() {
- var I, g, C;
- if (this.makeResizable(), (I = this.div) == null || I.classList.add("selectedEditor"), !this._editToolbar) {
- this.addEditToolbar().then(() => {
- var i, e;
- (i = this.div) != null && i.classList.contains("selectedEditor") && ((e = this._editToolbar) == null || e.show());
- });
- return;
- }
- (g = this._editToolbar) == null || g.show(), (C = M(this, XC)) == null || C.toggleAltTextBadge(!1);
- }
- unselect() {
- var I, g, C, i, e;
- (I = M(this, Pt)) == null || I.classList.add("hidden"), (g = this.div) == null || g.classList.remove("selectedEditor"), (C = this.div) != null && C.contains(document.activeElement) && this._uiManager.currentLayer.div.focus({
- preventScroll: !0
- }), (i = this._editToolbar) == null || i.hide(), (e = M(this, XC)) == null || e.toggleAltTextBadge(!0);
- }
- updateParams(I, g) {
- }
- disableEditing() {
- }
- enableEditing() {
- }
- enterInEditMode() {
- }
- getElementForAltText() {
- return this.div;
- }
- get contentDiv() {
- return this.div;
- }
- get isEditing() {
- return M(this, IZ);
- }
- set isEditing(I) {
- $(this, IZ, I), this.parent && (I ? (this.parent.setSelected(this), this.parent.setActiveEditor(this)) : this.parent.setActiveEditor(null));
- }
- setAspectRatio(I, g) {
- $(this, bc, !0);
- const C = I / g, {
- style: i
- } = this.div;
- i.aspectRatio = C, i.height = "auto";
- }
- static get MIN_SIZE() {
- return 16;
- }
- static canCreateNewEmptyEditor() {
- return !0;
- }
- get telemetryInitialData() {
- return {
- action: "added"
- };
- }
- get telemetryFinalData() {
- return null;
- }
- _reportTelemetry(I, g = !1) {
- if (g) {
- M(this, Ue) || $(this, Ue, /* @__PURE__ */ new Map());
- const {
- action: C
- } = I;
- let i = M(this, Ue).get(C);
- i && clearTimeout(i), i = setTimeout(() => {
- this._reportTelemetry(I), M(this, Ue).delete(C), M(this, Ue).size === 0 && $(this, Ue, null);
- }, zI._telemetryTimeout), M(this, Ue).set(C, i);
- return;
- }
- I.type || (I.type = this.editorType), this._uiManager._eventBus.dispatch("reporttelemetry", {
- source: this,
- details: {
- type: "editing",
- data: I
- }
- });
- }
- show(I = this._isVisible) {
- this.div.classList.toggle("hidden", !I), this._isVisible = I;
- }
- enable() {
- this.div && (this.div.tabIndex = 0), $(this, Rh, !1);
- }
- disable() {
- this.div && (this.div.tabIndex = -1), $(this, Rh, !0);
- }
- renderAnnotationElement(I) {
- let g = I.container.querySelector(".annotationContent");
- if (!g)
- g = document.createElement("div"), g.classList.add("annotationContent", this.editorType), I.container.prepend(g);
- else if (g.nodeName === "CANVAS") {
- const C = g;
- g = document.createElement("div"), g.classList.add("annotationContent", this.editorType), C.before(g);
- }
- return g;
- }
- resetAnnotationElement(I) {
- const {
- firstChild: g
- } = I.container;
- (g == null ? void 0 : g.nodeName) === "DIV" && g.classList.contains("annotationContent") && g.remove();
- }
- };
- hc = new WeakMap(), WA = new WeakMap(), XC = new WeakMap(), Rh = new WeakMap(), Ba = new WeakMap(), $m = new WeakMap(), bc = new WeakMap(), Pt = new WeakMap(), uc = new WeakMap(), yl = new WeakMap(), Wa = new WeakMap(), gZ = new WeakMap(), mc = new WeakMap(), re = new WeakMap(), IZ = new WeakMap(), Zc = new WeakMap(), Yl = new WeakMap(), Ws = new WeakMap(), fh = new WeakMap(), Hh = new WeakMap(), Ue = new WeakMap(), Gc = new WeakMap(), CZ = new WeakMap(), KV = new WeakMap(), wI = new WeakSet(), iS = function([I, g], C, i) {
- [C, i] = this.screenToPageTranslation(C, i), this.x += C / I, this.y += i / g, this._onTranslating(this.x, this.y), this.fixAndSetPosition();
- }, tZ = new WeakSet(), eS = function(I, g, C) {
- switch (C) {
- case 90:
- return [g, -I];
- case 180:
- return [-I, -g];
- case 270:
- return [-g, I];
- default:
- return [I, g];
- }
- }, uN = function(I) {
- switch (I) {
- case 90: {
- const [g, C] = this.pageDimensions;
- return [0, -g / C, C / g, 0];
- }
- case 180:
- return [-1, 0, 0, -1];
- case 270: {
- const [g, C] = this.pageDimensions;
- return [0, g / C, -C / g, 0];
- }
- default:
- return [1, 0, 0, 1];
- }
- }, Igg = function() {
- if (M(this, Pt))
- return;
- $(this, Pt, document.createElement("div")), M(this, Pt).classList.add("resizers");
- const I = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"], g = this._uiManager._signal;
- for (const C of I) {
- const i = document.createElement("div");
- M(this, Pt).append(i), i.classList.add("resizer", C), i.setAttribute("data-resizer-name", C), i.addEventListener("pointerdown", ig(this, wI, Cgg).bind(this, C), {
- signal: g
- }), i.addEventListener("contextmenu", zA, {
- signal: g
- }), i.tabIndex = -1;
- }
- this.div.prepend(M(this, Pt));
- }, Cgg = function(I, g) {
- var a;
- g.preventDefault();
- const {
- isMac: C
- } = Ai.platform;
- if (g.button !== 0 || g.ctrlKey && C)
- return;
- (a = M(this, XC)) == null || a.toggle(!1);
- const i = this._isDraggable;
- this._isDraggable = !1, $(this, uc, [g.screenX, g.screenY]);
- const e = new AbortController(), A = this._uiManager.combinedSignal(e);
- this.parent.togglePointerEvents(!1), window.addEventListener("pointermove", ig(this, wI, sS).bind(this, I), {
- passive: !0,
- capture: !0,
- signal: A
- }), window.addEventListener("touchmove", ht, {
- passive: !1,
- signal: A
- }), window.addEventListener("contextmenu", zA, {
- signal: A
- }), $(this, yl, {
- savedX: this.x,
- savedY: this.y,
- savedWidth: this.width,
- savedHeight: this.height
- });
- const s = this.parent.div.style.cursor, l = this.div.style.cursor;
- this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(g.target).cursor;
- const n = () => {
- var d;
- e.abort(), this.parent.togglePointerEvents(!0), (d = M(this, XC)) == null || d.toggle(!0), this._isDraggable = i, this.parent.div.style.cursor = s, this.div.style.cursor = l, ig(this, wI, mN).call(this);
- };
- window.addEventListener("pointerup", n, {
- signal: A
- }), window.addEventListener("blur", n, {
- signal: A
- });
- }, AS = function(I, g, C, i) {
- this.width = C, this.height = i, this.x = I, this.y = g;
- const [e, A] = this.parentDimensions;
- this.setDims(e * C, A * i), this.fixAndSetPosition(), this._onResized();
- }, mN = function() {
- if (!M(this, yl))
- return;
- const {
- savedX: I,
- savedY: g,
- savedWidth: C,
- savedHeight: i
- } = M(this, yl);
- $(this, yl, null);
- const e = this.x, A = this.y, s = this.width, l = this.height;
- e === I && A === g && s === C && l === i || this.addCommands({
- cmd: ig(this, wI, AS).bind(this, e, A, s, l),
- undo: ig(this, wI, AS).bind(this, I, g, C, i),
- mustExec: !0
- });
- }, sS = function(I, g) {
- const [C, i] = this.parentDimensions, e = this.x, A = this.y, s = this.width, l = this.height, n = zI.MIN_SIZE / C, a = zI.MIN_SIZE / i, d = ig(this, wI, uN).call(this, this.rotation), o = (G, w) => [d[0] * G + d[2] * w, d[1] * G + d[3] * w], c = ig(this, wI, uN).call(this, 360 - this.rotation), r = (G, w) => [c[0] * G + c[2] * w, c[1] * G + c[3] * w];
- let h, b, u = !1, m = !1;
- switch (I) {
- case "topLeft":
- u = !0, h = (G, w) => [0, 0], b = (G, w) => [G, w];
- break;
- case "topMiddle":
- h = (G, w) => [G / 2, 0], b = (G, w) => [G / 2, w];
- break;
- case "topRight":
- u = !0, h = (G, w) => [G, 0], b = (G, w) => [0, w];
- break;
- case "middleRight":
- m = !0, h = (G, w) => [G, w / 2], b = (G, w) => [0, w / 2];
- break;
- case "bottomRight":
- u = !0, h = (G, w) => [G, w], b = (G, w) => [0, 0];
- break;
- case "bottomMiddle":
- h = (G, w) => [G / 2, w], b = (G, w) => [G / 2, 0];
- break;
- case "bottomLeft":
- u = !0, h = (G, w) => [0, w], b = (G, w) => [G, 0];
- break;
- case "middleLeft":
- m = !0, h = (G, w) => [0, w / 2], b = (G, w) => [G, w / 2];
- break;
- }
- const Z = h(s, l), p = b(s, l);
- let Y = o(...p);
- const R = zI._round(e + Y[0]), X = zI._round(A + Y[1]);
- let H = 1, S = 1, z, v;
- if (g.fromKeyboard)
- ({
- deltaX: z,
- deltaY: v
- } = g);
- else {
- const {
- screenX: G,
- screenY: w
- } = g, [W, y] = M(this, uc);
- [z, v] = this.screenToPageTranslation(G - W, w - y), M(this, uc)[0] = G, M(this, uc)[1] = w;
- }
- if ([z, v] = r(z / C, v / i), u) {
- const G = Math.hypot(s, l);
- H = S = Math.max(Math.min(Math.hypot(p[0] - Z[0] - z, p[1] - Z[1] - v) / G, 1 / s, 1 / l), n / s, a / l);
- } else m ? H = fi(Math.abs(p[0] - Z[0] - z), n, 1) / s : S = fi(Math.abs(p[1] - Z[1] - v), a, 1) / l;
- const K = zI._round(s * H), V = zI._round(l * S);
- Y = o(...b(K, V));
- const N = R - Y[0], B = X - Y[1];
- M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]), this.width = K, this.height = V, this.x = N, this.y = B, this.setDims(C * K, i * V), this.fixAndSetPosition(), this._onResizing();
- }, tgg = function() {
- var I;
- $(this, yl, {
- savedX: this.x,
- savedY: this.y,
- savedWidth: this.width,
- savedHeight: this.height
- }), (I = M(this, XC)) == null || I.toggle(!1), this.parent.togglePointerEvents(!1);
- }, igg = function(I, g, C) {
- let e = 0.7 * (C / g) + 1 - 0.7;
- if (e === 1)
- return;
- const A = ig(this, wI, uN).call(this, this.rotation), s = (R, X) => [A[0] * R + A[2] * X, A[1] * R + A[3] * X], [l, n] = this.parentDimensions, a = this.x, d = this.y, o = this.width, c = this.height, r = zI.MIN_SIZE / l, h = zI.MIN_SIZE / n;
- e = Math.max(Math.min(e, 1 / o, 1 / c), r / o, h / c);
- const b = zI._round(o * e), u = zI._round(c * e);
- if (b === o && u === c)
- return;
- M(this, re) || $(this, re, [a, d, o, c]);
- const m = s(o / 2, c / 2), Z = zI._round(a + m[0]), p = zI._round(d + m[1]), Y = s(b / 2, u / 2);
- this.x = Z - Y[0], this.y = p - Y[1], this.width = b, this.height = u, this.setDims(l * b, n * u), this.fixAndSetPosition(), this._onResizing();
- }, egg = function() {
- var I;
- (I = M(this, XC)) == null || I.toggle(!0), this.parent.togglePointerEvents(!0), ig(this, wI, mN).call(this);
- }, lS = function(I) {
- const {
- isMac: g
- } = Ai.platform;
- I.ctrlKey && !g || I.shiftKey || I.metaKey && g ? this.parent.toggleSelected(this) : this.parent.setSelected(this);
- }, Agg = function(I) {
- const {
- isSelected: g
- } = this;
- this._uiManager.setUpDragSession();
- let C = !1;
- const i = new AbortController(), e = this._uiManager.combinedSignal(i), A = {
- capture: !0,
- passive: !1,
- signal: e
- }, s = (n) => {
- i.abort(), $(this, Ba, null), $(this, mc, !1), this._uiManager.endDragSession() || ig(this, wI, lS).call(this, n), C && this._onStopDragging();
- };
- g && ($(this, fh, I.clientX), $(this, Hh, I.clientY), $(this, Ba, I.pointerId), $(this, $m, I.pointerType), window.addEventListener("pointermove", (n) => {
- C || (C = !0, this._onStartDragging());
- const {
- clientX: a,
- clientY: d,
- pointerId: o
- } = n;
- if (o !== M(this, Ba)) {
- ht(n);
- return;
- }
- const [c, r] = this.screenToPageTranslation(a - M(this, fh), d - M(this, Hh));
- $(this, fh, a), $(this, Hh, d), this._uiManager.dragSelectedEditors(c, r);
- }, A), window.addEventListener("touchmove", ht, A), window.addEventListener("pointerdown", (n) => {
- n.pointerType === M(this, $m) && (M(this, Gc) || n.isPrimary) && s(n), ht(n);
- }, A));
- const l = (n) => {
- if (!M(this, Ba) || M(this, Ba) === n.pointerId) {
- s(n);
- return;
- }
- ht(n);
- };
- window.addEventListener("pointerup", l, {
- signal: e
- }), window.addEventListener("blur", l, {
- signal: e
- });
- }, nS = function() {
- if (M(this, Wa) || !this.div)
- return;
- $(this, Wa, new AbortController());
- const I = this._uiManager.combinedSignal(M(this, Wa));
- this.div.addEventListener("focusin", this.focusin.bind(this), {
- signal: I
- }), this.div.addEventListener("focusout", this.focusout.bind(this), {
- signal: I
- });
- }, sgg = function(I) {
- zI._resizerKeyboardManager.exec(this, I);
- }, lgg = function(I) {
- var g;
- M(this, Yl) && ((g = I.relatedTarget) == null ? void 0 : g.parentNode) !== M(this, Pt) && ig(this, wI, ju).call(this);
- }, ngg = function(I) {
- $(this, gZ, M(this, Yl) ? I : "");
- }, aS = function(I) {
- if (M(this, WA))
- for (const g of M(this, WA))
- g.tabIndex = I;
- }, ju = function() {
- $(this, Yl, !1), ig(this, wI, aS).call(this, -1), ig(this, wI, mN).call(this);
- }, tg(zI, tZ), iI(zI, "_l10n", null), iI(zI, "_l10nResizer", null), iI(zI, "_borderLineWidth", -1), iI(zI, "_colorManager", new _X()), iI(zI, "_zIndex", 1), iI(zI, "_telemetryTimeout", 1e3);
- let TC = zI;
- class Acg extends TC {
- constructor(I) {
- super(I), this.annotationElementId = I.annotationElementId, this.deleted = !0;
- }
- serialize() {
- return this.serializeDeleted();
- }
- }
- const g8 = 3285377520, Te = 4294901760, ls = 65535;
- class agg {
- constructor(I) {
- this.h1 = I ? I & 4294967295 : g8, this.h2 = I ? I & 4294967295 : g8;
- }
- update(I) {
- let g, C;
- if (typeof I == "string") {
- g = new Uint8Array(I.length * 2), C = 0;
- for (let h = 0, b = I.length; h < b; h++) {
- const u = I.charCodeAt(h);
- u <= 255 ? g[C++] = u : (g[C++] = u >>> 8, g[C++] = u & 255);
- }
- } else if (ArrayBuffer.isView(I))
- g = I.slice(), C = g.byteLength;
- else
- throw new Error("Invalid data format, must be a string or TypedArray.");
- const i = C >> 2, e = C - i * 4, A = new Uint32Array(g.buffer, 0, i);
- let s = 0, l = 0, n = this.h1, a = this.h2;
- const d = 3432918353, o = 461845907, c = d & ls, r = o & ls;
- for (let h = 0; h < i; h++)
- h & 1 ? (s = A[h], s = s * d & Te | s * c & ls, s = s << 15 | s >>> 17, s = s * o & Te | s * r & ls, n ^= s, n = n << 13 | n >>> 19, n = n * 5 + 3864292196) : (l = A[h], l = l * d & Te | l * c & ls, l = l << 15 | l >>> 17, l = l * o & Te | l * r & ls, a ^= l, a = a << 13 | a >>> 19, a = a * 5 + 3864292196);
- switch (s = 0, e) {
- case 3:
- s ^= g[i * 4 + 2] << 16;
- case 2:
- s ^= g[i * 4 + 1] << 8;
- case 1:
- s ^= g[i * 4], s = s * d & Te | s * c & ls, s = s << 15 | s >>> 17, s = s * o & Te | s * r & ls, i & 1 ? n ^= s : a ^= s;
- }
- this.h1 = n, this.h2 = a;
- }
- hexdigest() {
- let I = this.h1, g = this.h2;
- return I ^= g >>> 1, I = I * 3981806797 & Te | I * 36045 & ls, g = g * 4283543511 & Te | ((g << 16 | I >>> 16) * 2950163797 & Te) >>> 16, I ^= g >>> 1, I = I * 444984403 & Te | I * 60499 & ls, g = g * 3301882366 & Te | ((g << 16 | I >>> 16) * 3120437893 & Te) >>> 16, I ^= g >>> 1, (I >>> 0).toString(16).padStart(8, "0") + (g >>> 0).toString(16).padStart(8, "0");
- }
- }
- const oS = Object.freeze({
- map: null,
- hash: "",
- transfer: void 0
- });
- var wc, pc, Kt, FV, ogg;
- class Z9 {
- constructor() {
- tg(this, FV);
- tg(this, wc, !1);
- tg(this, pc, null);
- tg(this, Kt, /* @__PURE__ */ new Map());
- this.onSetModified = null, this.onResetModified = null, this.onAnnotationEditor = null;
- }
- getValue(I, g) {
- const C = M(this, Kt).get(I);
- return C === void 0 ? g : Object.assign(g, C);
- }
- getRawValue(I) {
- return M(this, Kt).get(I);
- }
- remove(I) {
- if (M(this, Kt).delete(I), M(this, Kt).size === 0 && this.resetModified(), typeof this.onAnnotationEditor == "function") {
- for (const g of M(this, Kt).values())
- if (g instanceof TC)
- return;
- this.onAnnotationEditor(null);
- }
- }
- setValue(I, g) {
- const C = M(this, Kt).get(I);
- let i = !1;
- if (C !== void 0)
- for (const [e, A] of Object.entries(g))
- C[e] !== A && (i = !0, C[e] = A);
- else
- i = !0, M(this, Kt).set(I, g);
- i && ig(this, FV, ogg).call(this), g instanceof TC && typeof this.onAnnotationEditor == "function" && this.onAnnotationEditor(g.constructor._type);
- }
- has(I) {
- return M(this, Kt).has(I);
- }
- getAll() {
- return M(this, Kt).size > 0 ? c9(M(this, Kt)) : null;
- }
- setAll(I) {
- for (const [g, C] of Object.entries(I))
- this.setValue(g, C);
- }
- get size() {
- return M(this, Kt).size;
- }
- resetModified() {
- M(this, wc) && ($(this, wc, !1), typeof this.onResetModified == "function" && this.onResetModified());
- }
- get print() {
- return new cgg(this);
- }
- get serializable() {
- if (M(this, Kt).size === 0)
- return oS;
- const I = /* @__PURE__ */ new Map(), g = new agg(), C = [], i = /* @__PURE__ */ Object.create(null);
- let e = !1;
- for (const [A, s] of M(this, Kt)) {
- const l = s instanceof TC ? s.serialize(!1, i) : s;
- l && (I.set(A, l), g.update(`${A}:${JSON.stringify(l)}`), e || (e = !!l.bitmap));
- }
- if (e)
- for (const A of I.values())
- A.bitmap && C.push(A.bitmap);
- return I.size > 0 ? {
- map: I,
- hash: g.hexdigest(),
- transfer: C
- } : oS;
- }
- get editorStats() {
- let I = null;
- const g = /* @__PURE__ */ new Map();
- for (const C of M(this, Kt).values()) {
- if (!(C instanceof TC))
- continue;
- const i = C.telemetryFinalData;
- if (!i)
- continue;
- const {
- type: e
- } = i;
- g.has(e) || g.set(e, Object.getPrototypeOf(C).constructor), I || (I = /* @__PURE__ */ Object.create(null));
- const A = I[e] || (I[e] = /* @__PURE__ */ new Map());
- for (const [s, l] of Object.entries(i)) {
- if (s === "type")
- continue;
- let n = A.get(s);
- n || (n = /* @__PURE__ */ new Map(), A.set(s, n));
- const a = n.get(l) ?? 0;
- n.set(l, a + 1);
- }
- }
- for (const [C, i] of g)
- I[C] = i.computeTelemetryFinalData(I[C]);
- return I;
- }
- resetModifiedIds() {
- $(this, pc, null);
- }
- get modifiedIds() {
- if (M(this, pc))
- return M(this, pc);
- const I = [];
- for (const g of M(this, Kt).values())
- !(g instanceof TC) || !g.annotationElementId || !g.serialize() || I.push(g.annotationElementId);
- return $(this, pc, {
- ids: new Set(I),
- hash: I.join(",")
- });
- }
- }
- wc = new WeakMap(), pc = new WeakMap(), Kt = new WeakMap(), FV = new WeakSet(), ogg = function() {
- M(this, wc) || ($(this, wc, !0), typeof this.onSetModified == "function" && this.onSetModified());
- };
- var iZ;
- class cgg extends Z9 {
- constructor(g) {
- super();
- tg(this, iZ);
- const {
- map: C,
- hash: i,
- transfer: e
- } = g.serializable, A = structuredClone(C, e ? {
- transfer: e
- } : null);
- $(this, iZ, {
- map: A,
- hash: i,
- transfer: e
- });
- }
- get print() {
- BC("Should not call PrintAnnotationStorage.print");
- }
- get serializable() {
- return M(this, iZ);
- }
- get modifiedIds() {
- return UI(this, "modifiedIds", {
- ids: /* @__PURE__ */ new Set(),
- hash: ""
- });
- }
- }
- iZ = new WeakMap();
- var Xh;
- class scg {
- constructor({
- ownerDocument: I = globalThis.document,
- styleElement: g = null
- }) {
- tg(this, Xh, /* @__PURE__ */ new Set());
- this._document = I, this.nativeFontFaces = /* @__PURE__ */ new Set(), this.styleElement = null, this.loadingRequests = [], this.loadTestFontId = 0;
- }
- addNativeFontFace(I) {
- this.nativeFontFaces.add(I), this._document.fonts.add(I);
- }
- removeNativeFontFace(I) {
- this.nativeFontFaces.delete(I), this._document.fonts.delete(I);
- }
- insertRule(I) {
- this.styleElement || (this.styleElement = this._document.createElement("style"), this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement));
- const g = this.styleElement.sheet;
- g.insertRule(I, g.cssRules.length);
- }
- clear() {
- for (const I of this.nativeFontFaces)
- this._document.fonts.delete(I);
- this.nativeFontFaces.clear(), M(this, Xh).clear(), this.styleElement && (this.styleElement.remove(), this.styleElement = null);
- }
- async loadSystemFont({
- systemFontInfo: I,
- disableFontFace: g,
- _inspectFont: C
- }) {
- if (!(!I || M(this, Xh).has(I.loadedName))) {
- if (ut(!g, "loadSystemFont shouldn't be called when `disableFontFace` is set."), this.isFontLoadingAPISupported) {
- const {
- loadedName: i,
- src: e,
- style: A
- } = I, s = new FontFace(i, e, A);
- this.addNativeFontFace(s);
- try {
- await s.load(), M(this, Xh).add(i), C == null || C(I);
- } catch {
- DI(`Cannot load system font: ${I.baseFontName}, installing it could help to improve PDF rendering.`), this.removeNativeFontFace(s);
- }
- return;
- }
- BC("Not implemented: loadSystemFont without the Font Loading API.");
- }
- }
- async bind(I) {
- if (I.attached || I.missingFile && !I.systemFontInfo)
- return;
- if (I.attached = !0, I.systemFontInfo) {
- await this.loadSystemFont(I);
- return;
- }
- if (this.isFontLoadingAPISupported) {
- const C = I.createNativeFontFace();
- if (C) {
- this.addNativeFontFace(C);
- try {
- await C.loaded;
- } catch (i) {
- throw DI(`Failed to load font '${C.family}': '${i}'.`), I.disableFontFace = !0, i;
- }
- }
- return;
- }
- const g = I.createFontFaceRule();
- if (g) {
- if (this.insertRule(g), this.isSyncFontLoadingSupported)
- return;
- await new Promise((C) => {
- const i = this._queueLoadingCallback(C);
- this._prepareFontLoadEvent(I, i);
- });
- }
- }
- get isFontLoadingAPISupported() {
- var g;
- const I = !!((g = this._document) != null && g.fonts);
- return UI(this, "isFontLoadingAPISupported", I);
- }
- get isSyncFontLoadingSupported() {
- return UI(this, "isSyncFontLoadingSupported", $t || Ai.platform.isFirefox);
- }
- _queueLoadingCallback(I) {
- function g() {
- for (ut(!i.done, "completeRequest() cannot be called twice."), i.done = !0; C.length > 0 && C[0].done; ) {
- const e = C.shift();
- setTimeout(e.callback, 0);
- }
- }
- const {
- loadingRequests: C
- } = this, i = {
- done: !1,
- complete: g,
- callback: I
- };
- return C.push(i), i;
- }
- get _loadTestFont() {
- const I = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==");
- return UI(this, "_loadTestFont", I);
- }
- _prepareFontLoadEvent(I, g) {
- function C(p, Y) {
- return p.charCodeAt(Y) << 24 | p.charCodeAt(Y + 1) << 16 | p.charCodeAt(Y + 2) << 8 | p.charCodeAt(Y + 3) & 255;
- }
- function i(p, Y, R, X) {
- const H = p.substring(0, Y), S = p.substring(Y + R);
- return H + X + S;
- }
- let e, A;
- const s = this._document.createElement("canvas");
- s.width = 1, s.height = 1;
- const l = s.getContext("2d");
- let n = 0;
- function a(p, Y) {
- if (++n > 30) {
- DI("Load test font never loaded."), Y();
- return;
- }
- if (l.font = "30px " + p, l.fillText(".", 0, 20), l.getImageData(0, 0, 1, 1).data[3] > 0) {
- Y();
- return;
- }
- setTimeout(a.bind(null, p, Y));
- }
- const d = `lt${Date.now()}${this.loadTestFontId++}`;
- let o = this._loadTestFont;
- o = i(o, 976, d.length, d);
- const r = 16, h = 1482184792;
- let b = C(o, r);
- for (e = 0, A = d.length - 3; e < A; e += 4)
- b = b - h + C(d, e) | 0;
- e < d.length && (b = b - h + C(d + "XXX", e) | 0), o = i(o, r, 4, Qog(b));
- const u = `url(data:font/opentype;base64,${btoa(o)});`, m = `@font-face {font-family:"${d}";src:${u}}`;
- this.insertRule(m);
- const Z = this._document.createElement("div");
- Z.style.visibility = "hidden", Z.style.width = Z.style.height = "10px", Z.style.position = "absolute", Z.style.top = Z.style.left = "0px";
- for (const p of [I.loadedName, d]) {
- const Y = this._document.createElement("span");
- Y.textContent = "Hi", Y.style.fontFamily = p, Z.append(Y);
- }
- this._document.body.append(Z), a(d, () => {
- Z.remove(), g.complete();
- });
- }
- }
- Xh = new WeakMap();
- class lcg {
- constructor(I, g = null) {
- this.compiledGlyphs = /* @__PURE__ */ Object.create(null);
- for (const C in I)
- this[C] = I[C];
- this._inspectFont = g;
- }
- createNativeFontFace() {
- var g;
- if (!this.data || this.disableFontFace)
- return null;
- let I;
- if (!this.cssFontInfo)
- I = new FontFace(this.loadedName, this.data, {});
- else {
- const C = {
- weight: this.cssFontInfo.fontWeight
- };
- this.cssFontInfo.italicAngle && (C.style = `oblique ${this.cssFontInfo.italicAngle}deg`), I = new FontFace(this.cssFontInfo.fontFamily, this.data, C);
- }
- return (g = this._inspectFont) == null || g.call(this, this), I;
- }
- createFontFaceRule() {
- var C;
- if (!this.data || this.disableFontFace)
- return null;
- const I = `url(data:${this.mimetype};base64,${X$(this.data)});`;
- let g;
- if (!this.cssFontInfo)
- g = `@font-face {font-family:"${this.loadedName}";src:${I}}`;
- else {
- let i = `font-weight: ${this.cssFontInfo.fontWeight};`;
- this.cssFontInfo.italicAngle && (i += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`), g = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${i}src:${I}}`;
- }
- return (C = this._inspectFont) == null || C.call(this, this, I), g;
- }
- getPathGenerator(I, g) {
- if (this.compiledGlyphs[g] !== void 0)
- return this.compiledGlyphs[g];
- const C = this.loadedName + "_path_" + g;
- let i;
- try {
- i = I.get(C);
- } catch (A) {
- DI(`getPathGenerator - ignoring character: "${A}".`);
- }
- const e = new Path2D(i || "");
- return this.fontExtraProperties || I.delete(C), this.compiledGlyphs[g] = e;
- }
- }
- const kY = {
- DATA: 1,
- ERROR: 2
- }, ot = {
- CANCEL: 1,
- CANCEL_COMPLETE: 2,
- CLOSE: 3,
- ENQUEUE: 4,
- ERROR: 5,
- PULL: 6,
- PULL_COMPLETE: 7,
- START_COMPLETE: 8
- };
- function I8() {
- }
- function xi(t) {
- if (t instanceof Ea || t instanceof QX || t instanceof _6 || t instanceof CV || t instanceof vH)
- return t;
- switch (t instanceof Error || typeof t == "object" && t !== null || BC('wrapReason: Expected "reason" to be a (possibly cloned) Error.'), t.name) {
- case "AbortException":
- return new Ea(t.message);
- case "InvalidPDFException":
- return new QX(t.message);
- case "PasswordException":
- return new _6(t.message, t.code);
- case "ResponseException":
- return new CV(t.message, t.status, t.missing);
- case "UnknownErrorException":
- return new vH(t.message, t.details);
- }
- return new vH(t.message, t.toString());
- }
- var Sh, iA, dgg, rgg, hgg, ZN;
- class Qu {
- constructor(I, g, C) {
- tg(this, iA);
- tg(this, Sh, new AbortController());
- this.sourceName = I, this.targetName = g, this.comObj = C, this.callbackId = 1, this.streamId = 1, this.streamSinks = /* @__PURE__ */ Object.create(null), this.streamControllers = /* @__PURE__ */ Object.create(null), this.callbackCapabilities = /* @__PURE__ */ Object.create(null), this.actionHandler = /* @__PURE__ */ Object.create(null), C.addEventListener("message", ig(this, iA, dgg).bind(this), {
- signal: M(this, Sh).signal
- });
- }
- on(I, g) {
- const C = this.actionHandler;
- if (C[I])
- throw new Error(`There is already an actionName called "${I}"`);
- C[I] = g;
- }
- send(I, g, C) {
- this.comObj.postMessage({
- sourceName: this.sourceName,
- targetName: this.targetName,
- action: I,
- data: g
- }, C);
- }
- sendWithPromise(I, g, C) {
- const i = this.callbackId++, e = Promise.withResolvers();
- this.callbackCapabilities[i] = e;
- try {
- this.comObj.postMessage({
- sourceName: this.sourceName,
- targetName: this.targetName,
- action: I,
- callbackId: i,
- data: g
- }, C);
- } catch (A) {
- e.reject(A);
- }
- return e.promise;
- }
- sendWithStream(I, g, C, i) {
- const e = this.streamId++, A = this.sourceName, s = this.targetName, l = this.comObj;
- return new ReadableStream({
- start: (n) => {
- const a = Promise.withResolvers();
- return this.streamControllers[e] = {
- controller: n,
- startCall: a,
- pullCall: null,
- cancelCall: null,
- isClosed: !1
- }, l.postMessage({
- sourceName: A,
- targetName: s,
- action: I,
- streamId: e,
- data: g,
- desiredSize: n.desiredSize
- }, i), a.promise;
- },
- pull: (n) => {
- const a = Promise.withResolvers();
- return this.streamControllers[e].pullCall = a, l.postMessage({
- sourceName: A,
- targetName: s,
- stream: ot.PULL,
- streamId: e,
- desiredSize: n.desiredSize
- }), a.promise;
- },
- cancel: (n) => {
- ut(n instanceof Error, "cancel must have a valid reason");
- const a = Promise.withResolvers();
- return this.streamControllers[e].cancelCall = a, this.streamControllers[e].isClosed = !0, l.postMessage({
- sourceName: A,
- targetName: s,
- stream: ot.CANCEL,
- streamId: e,
- reason: xi(n)
- }), a.promise;
- }
- }, C);
- }
- destroy() {
- var I;
- (I = M(this, Sh)) == null || I.abort(), $(this, Sh, null);
- }
- }
- Sh = new WeakMap(), iA = new WeakSet(), dgg = function({
- data: I
- }) {
- if (I.targetName !== this.sourceName)
- return;
- if (I.stream) {
- ig(this, iA, hgg).call(this, I);
- return;
- }
- if (I.callback) {
- const C = I.callbackId, i = this.callbackCapabilities[C];
- if (!i)
- throw new Error(`Cannot resolve callback ${C}`);
- if (delete this.callbackCapabilities[C], I.callback === kY.DATA)
- i.resolve(I.data);
- else if (I.callback === kY.ERROR)
- i.reject(xi(I.reason));
- else
- throw new Error("Unexpected callback case");
- return;
- }
- const g = this.actionHandler[I.action];
- if (!g)
- throw new Error(`Unknown action from worker: ${I.action}`);
- if (I.callbackId) {
- const C = this.sourceName, i = I.sourceName, e = this.comObj;
- Promise.try(g, I.data).then(function(A) {
- e.postMessage({
- sourceName: C,
- targetName: i,
- callback: kY.DATA,
- callbackId: I.callbackId,
- data: A
- });
- }, function(A) {
- e.postMessage({
- sourceName: C,
- targetName: i,
- callback: kY.ERROR,
- callbackId: I.callbackId,
- reason: xi(A)
- });
- });
- return;
- }
- if (I.streamId) {
- ig(this, iA, rgg).call(this, I);
- return;
- }
- g(I.data);
- }, rgg = function(I) {
- const g = I.streamId, C = this.sourceName, i = I.sourceName, e = this.comObj, A = this, s = this.actionHandler[I.action], l = {
- enqueue(n, a = 1, d) {
- if (this.isCancelled)
- return;
- const o = this.desiredSize;
- this.desiredSize -= a, o > 0 && this.desiredSize <= 0 && (this.sinkCapability = Promise.withResolvers(), this.ready = this.sinkCapability.promise), e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.ENQUEUE,
- streamId: g,
- chunk: n
- }, d);
- },
- close() {
- this.isCancelled || (this.isCancelled = !0, e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.CLOSE,
- streamId: g
- }), delete A.streamSinks[g]);
- },
- error(n) {
- ut(n instanceof Error, "error must have a valid reason"), !this.isCancelled && (this.isCancelled = !0, e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.ERROR,
- streamId: g,
- reason: xi(n)
- }));
- },
- sinkCapability: Promise.withResolvers(),
- onPull: null,
- onCancel: null,
- isCancelled: !1,
- desiredSize: I.desiredSize,
- ready: null
- };
- l.sinkCapability.resolve(), l.ready = l.sinkCapability.promise, this.streamSinks[g] = l, Promise.try(s, I.data, l).then(function() {
- e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.START_COMPLETE,
- streamId: g,
- success: !0
- });
- }, function(n) {
- e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.START_COMPLETE,
- streamId: g,
- reason: xi(n)
- });
- });
- }, hgg = function(I) {
- const g = I.streamId, C = this.sourceName, i = I.sourceName, e = this.comObj, A = this.streamControllers[g], s = this.streamSinks[g];
- switch (I.stream) {
- case ot.START_COMPLETE:
- I.success ? A.startCall.resolve() : A.startCall.reject(xi(I.reason));
- break;
- case ot.PULL_COMPLETE:
- I.success ? A.pullCall.resolve() : A.pullCall.reject(xi(I.reason));
- break;
- case ot.PULL:
- if (!s) {
- e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.PULL_COMPLETE,
- streamId: g,
- success: !0
- });
- break;
- }
- s.desiredSize <= 0 && I.desiredSize > 0 && s.sinkCapability.resolve(), s.desiredSize = I.desiredSize, Promise.try(s.onPull || I8).then(function() {
- e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.PULL_COMPLETE,
- streamId: g,
- success: !0
- });
- }, function(n) {
- e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.PULL_COMPLETE,
- streamId: g,
- reason: xi(n)
- });
- });
- break;
- case ot.ENQUEUE:
- if (ut(A, "enqueue should have stream controller"), A.isClosed)
- break;
- A.controller.enqueue(I.chunk);
- break;
- case ot.CLOSE:
- if (ut(A, "close should have stream controller"), A.isClosed)
- break;
- A.isClosed = !0, A.controller.close(), ig(this, iA, ZN).call(this, A, g);
- break;
- case ot.ERROR:
- ut(A, "error should have stream controller"), A.controller.error(xi(I.reason)), ig(this, iA, ZN).call(this, A, g);
- break;
- case ot.CANCEL_COMPLETE:
- I.success ? A.cancelCall.resolve() : A.cancelCall.reject(xi(I.reason)), ig(this, iA, ZN).call(this, A, g);
- break;
- case ot.CANCEL:
- if (!s)
- break;
- const l = xi(I.reason);
- Promise.try(s.onCancel || I8, l).then(function() {
- e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.CANCEL_COMPLETE,
- streamId: g,
- success: !0
- });
- }, function(n) {
- e.postMessage({
- sourceName: C,
- targetName: i,
- stream: ot.CANCEL_COMPLETE,
- streamId: g,
- reason: xi(n)
- });
- }), s.sinkCapability.reject(l), s.isCancelled = !0, delete this.streamSinks[g];
- break;
- default:
- throw new Error("Unexpected stream case");
- }
- }, ZN = async function(I, g) {
- var C, i, e;
- await Promise.allSettled([(C = I.startCall) == null ? void 0 : C.promise, (i = I.pullCall) == null ? void 0 : i.promise, (e = I.cancelCall) == null ? void 0 : e.promise]), delete this.streamControllers[g];
- };
- var eZ;
- class bgg {
- constructor({
- enableHWA: I = !1
- }) {
- tg(this, eZ, !1);
- $(this, eZ, I);
- }
- create(I, g) {
- if (I <= 0 || g <= 0)
- throw new Error("Invalid canvas size");
- const C = this._createCanvas(I, g);
- return {
- canvas: C,
- context: C.getContext("2d", {
- willReadFrequently: !M(this, eZ)
- })
- };
- }
- reset(I, g, C) {
- if (!I.canvas)
- throw new Error("Canvas is not specified");
- if (g <= 0 || C <= 0)
- throw new Error("Invalid canvas size");
- I.canvas.width = g, I.canvas.height = C;
- }
- destroy(I) {
- if (!I.canvas)
- throw new Error("Canvas is not specified");
- I.canvas.width = 0, I.canvas.height = 0, I.canvas = null, I.context = null;
- }
- _createCanvas(I, g) {
- BC("Abstract method `_createCanvas` called.");
- }
- }
- eZ = new WeakMap();
- class ncg extends bgg {
- constructor({
- ownerDocument: I = globalThis.document,
- enableHWA: g = !1
- }) {
- super({
- enableHWA: g
- }), this._document = I;
- }
- _createCanvas(I, g) {
- const C = this._document.createElement("canvas");
- return C.width = I, C.height = g, C;
- }
- }
- class ugg {
- constructor({
- baseUrl: I = null,
- isCompressed: g = !0
- }) {
- this.baseUrl = I, this.isCompressed = g;
- }
- async fetch({
- name: I
- }) {
- if (!this.baseUrl)
- throw new Error("Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided.");
- if (!I)
- throw new Error("CMap name must be specified.");
- const g = this.baseUrl + I + (this.isCompressed ? ".bcmap" : "");
- return this._fetch(g).then((C) => ({
- cMapData: C,
- isCompressed: this.isCompressed
- })).catch((C) => {
- throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${g}`);
- });
- }
- async _fetch(I) {
- BC("Abstract method `_fetch` called.");
- }
- }
- class C8 extends ugg {
- async _fetch(I) {
- const g = await AG(I, this.isCompressed ? "arraybuffer" : "text");
- return g instanceof ArrayBuffer ? new Uint8Array(g) : eG(g);
- }
- }
- class mgg {
- addFilter(I) {
- return "none";
- }
- addHCMFilter(I, g) {
- return "none";
- }
- addAlphaFilter(I) {
- return "none";
- }
- addLuminosityFilter(I) {
- return "none";
- }
- addHighlightHCMFilter(I, g, C, i, e) {
- return "none";
- }
- destroy(I = !1) {
- }
- }
- var Bc, Dh, Nl, Vl, mi, Wc, yc, qg, bi, Ou, Ur, GN, Er, Zgg, cS, Pr, Uu, Eu, dS, Pu;
- class acg extends mgg {
- constructor({
- docId: g,
- ownerDocument: C = globalThis.document
- }) {
- super();
- tg(this, qg);
- tg(this, Bc);
- tg(this, Dh);
- tg(this, Nl);
- tg(this, Vl);
- tg(this, mi);
- tg(this, Wc);
- tg(this, yc, 0);
- $(this, Vl, g), $(this, mi, C);
- }
- addFilter(g) {
- if (!g)
- return "none";
- let C = M(this, qg, bi).get(g);
- if (C)
- return C;
- const [i, e, A] = ig(this, qg, GN).call(this, g), s = g.length === 1 ? i : `${i}${e}${A}`;
- if (C = M(this, qg, bi).get(s), C)
- return M(this, qg, bi).set(g, C), C;
- const l = `g_${M(this, Vl)}_transfer_map_${Wi(this, yc)._++}`, n = ig(this, qg, Er).call(this, l);
- M(this, qg, bi).set(g, n), M(this, qg, bi).set(s, n);
- const a = ig(this, qg, Pr).call(this, l);
- return ig(this, qg, Eu).call(this, i, e, A, a), n;
- }
- addHCMFilter(g, C) {
- var r;
- const i = `${g}-${C}`, e = "base";
- let A = M(this, qg, Ou).get(e);
- if ((A == null ? void 0 : A.key) === i || (A ? ((r = A.filter) == null || r.remove(), A.key = i, A.url = "none", A.filter = null) : (A = {
- key: i,
- url: "none",
- filter: null
- }, M(this, qg, Ou).set(e, A)), !g || !C))
- return A.url;
- const s = ig(this, qg, Pu).call(this, g);
- g = AI.makeHexColor(...s);
- const l = ig(this, qg, Pu).call(this, C);
- if (C = AI.makeHexColor(...l), M(this, qg, Ur).style.color = "", g === "#000000" && C === "#ffffff" || g === C)
- return A.url;
- const n = new Array(256);
- for (let h = 0; h <= 255; h++) {
- const b = h / 255;
- n[h] = b <= 0.03928 ? b / 12.92 : ((b + 0.055) / 1.055) ** 2.4;
- }
- const a = n.join(","), d = `g_${M(this, Vl)}_hcm_filter`, o = A.filter = ig(this, qg, Pr).call(this, d);
- ig(this, qg, Eu).call(this, a, a, a, o), ig(this, qg, cS).call(this, o);
- const c = (h, b) => {
- const u = s[h] / 255, m = l[h] / 255, Z = new Array(b + 1);
- for (let p = 0; p <= b; p++)
- Z[p] = u + p / b * (m - u);
- return Z.join(",");
- };
- return ig(this, qg, Eu).call(this, c(0, 5), c(1, 5), c(2, 5), o), A.url = ig(this, qg, Er).call(this, d), A.url;
- }
- addAlphaFilter(g) {
- let C = M(this, qg, bi).get(g);
- if (C)
- return C;
- const [i] = ig(this, qg, GN).call(this, [g]), e = `alpha_${i}`;
- if (C = M(this, qg, bi).get(e), C)
- return M(this, qg, bi).set(g, C), C;
- const A = `g_${M(this, Vl)}_alpha_map_${Wi(this, yc)._++}`, s = ig(this, qg, Er).call(this, A);
- M(this, qg, bi).set(g, s), M(this, qg, bi).set(e, s);
- const l = ig(this, qg, Pr).call(this, A);
- return ig(this, qg, dS).call(this, i, l), s;
- }
- addLuminosityFilter(g) {
- let C = M(this, qg, bi).get(g || "luminosity");
- if (C)
- return C;
- let i, e;
- if (g ? ([i] = ig(this, qg, GN).call(this, [g]), e = `luminosity_${i}`) : e = "luminosity", C = M(this, qg, bi).get(e), C)
- return M(this, qg, bi).set(g, C), C;
- const A = `g_${M(this, Vl)}_luminosity_map_${Wi(this, yc)._++}`, s = ig(this, qg, Er).call(this, A);
- M(this, qg, bi).set(g, s), M(this, qg, bi).set(e, s);
- const l = ig(this, qg, Pr).call(this, A);
- return ig(this, qg, Zgg).call(this, l), g && ig(this, qg, dS).call(this, i, l), s;
- }
- addHighlightHCMFilter(g, C, i, e, A) {
- var m;
- const s = `${C}-${i}-${e}-${A}`;
- let l = M(this, qg, Ou).get(g);
- if ((l == null ? void 0 : l.key) === s || (l ? ((m = l.filter) == null || m.remove(), l.key = s, l.url = "none", l.filter = null) : (l = {
- key: s,
- url: "none",
- filter: null
- }, M(this, qg, Ou).set(g, l)), !C || !i))
- return l.url;
- const [n, a] = [C, i].map(ig(this, qg, Pu).bind(this));
- let d = Math.round(0.2126 * n[0] + 0.7152 * n[1] + 0.0722 * n[2]), o = Math.round(0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2]), [c, r] = [e, A].map(ig(this, qg, Pu).bind(this));
- o < d && ([d, o, c, r] = [o, d, r, c]), M(this, qg, Ur).style.color = "";
- const h = (Z, p, Y) => {
- const R = new Array(256), X = (o - d) / Y, H = Z / 255, S = (p - Z) / (255 * Y);
- let z = 0;
- for (let v = 0; v <= Y; v++) {
- const K = Math.round(d + v * X), V = H + v * S;
- for (let N = z; N <= K; N++)
- R[N] = V;
- z = K + 1;
- }
- for (let v = z; v < 256; v++)
- R[v] = R[z - 1];
- return R.join(",");
- }, b = `g_${M(this, Vl)}_hcm_${g}_filter`, u = l.filter = ig(this, qg, Pr).call(this, b);
- return ig(this, qg, cS).call(this, u), ig(this, qg, Eu).call(this, h(c[0], r[0], 5), h(c[1], r[1], 5), h(c[2], r[2], 5), u), l.url = ig(this, qg, Er).call(this, b), l.url;
- }
- destroy(g = !1) {
- var C, i, e, A;
- g && ((C = M(this, Wc)) != null && C.size) || ((i = M(this, Nl)) == null || i.parentNode.parentNode.remove(), $(this, Nl, null), (e = M(this, Dh)) == null || e.clear(), $(this, Dh, null), (A = M(this, Wc)) == null || A.clear(), $(this, Wc, null), $(this, yc, 0));
- }
- }
- Bc = new WeakMap(), Dh = new WeakMap(), Nl = new WeakMap(), Vl = new WeakMap(), mi = new WeakMap(), Wc = new WeakMap(), yc = new WeakMap(), qg = new WeakSet(), bi = function() {
- return M(this, Dh) || $(this, Dh, /* @__PURE__ */ new Map());
- }, Ou = function() {
- return M(this, Wc) || $(this, Wc, /* @__PURE__ */ new Map());
- }, Ur = function() {
- if (!M(this, Nl)) {
- const g = M(this, mi).createElement("div"), {
- style: C
- } = g;
- C.visibility = "hidden", C.contain = "strict", C.width = C.height = 0, C.position = "absolute", C.top = C.left = 0, C.zIndex = -1;
- const i = M(this, mi).createElementNS(dl, "svg");
- i.setAttribute("width", 0), i.setAttribute("height", 0), $(this, Nl, M(this, mi).createElementNS(dl, "defs")), g.append(i), i.append(M(this, Nl)), M(this, mi).body.append(g);
- }
- return M(this, Nl);
- }, GN = function(g) {
- if (g.length === 1) {
- const n = g[0], a = new Array(256);
- for (let o = 0; o < 256; o++)
- a[o] = n[o] / 255;
- const d = a.join(",");
- return [d, d, d];
- }
- const [C, i, e] = g, A = new Array(256), s = new Array(256), l = new Array(256);
- for (let n = 0; n < 256; n++)
- A[n] = C[n] / 255, s[n] = i[n] / 255, l[n] = e[n] / 255;
- return [A.join(","), s.join(","), l.join(",")];
- }, Er = function(g) {
- if (M(this, Bc) === void 0) {
- $(this, Bc, "");
- const C = M(this, mi).URL;
- C !== M(this, mi).baseURI && ($V(C) ? DI('#createUrl: ignore "data:"-URL for performance reasons.') : $(this, Bc, C.split("#", 1)[0]));
- }
- return `url(${M(this, Bc)}#${g})`;
- }, Zgg = function(g) {
- const C = M(this, mi).createElementNS(dl, "feColorMatrix");
- C.setAttribute("type", "matrix"), C.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"), g.append(C);
- }, cS = function(g) {
- const C = M(this, mi).createElementNS(dl, "feColorMatrix");
- C.setAttribute("type", "matrix"), C.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"), g.append(C);
- }, Pr = function(g) {
- const C = M(this, mi).createElementNS(dl, "filter");
- return C.setAttribute("color-interpolation-filters", "sRGB"), C.setAttribute("id", g), M(this, qg, Ur).append(C), C;
- }, Uu = function(g, C, i) {
- const e = M(this, mi).createElementNS(dl, C);
- e.setAttribute("type", "discrete"), e.setAttribute("tableValues", i), g.append(e);
- }, Eu = function(g, C, i, e) {
- const A = M(this, mi).createElementNS(dl, "feComponentTransfer");
- e.append(A), ig(this, qg, Uu).call(this, A, "feFuncR", g), ig(this, qg, Uu).call(this, A, "feFuncG", C), ig(this, qg, Uu).call(this, A, "feFuncB", i);
- }, dS = function(g, C) {
- const i = M(this, mi).createElementNS(dl, "feComponentTransfer");
- C.append(i), ig(this, qg, Uu).call(this, i, "feFuncA", g);
- }, Pu = function(g) {
- return M(this, qg, Ur).style.color = g, u9(getComputedStyle(M(this, qg, Ur)).getPropertyValue("color"));
- };
- class Ggg {
- constructor({
- baseUrl: I = null
- }) {
- this.baseUrl = I;
- }
- async fetch({
- filename: I
- }) {
- if (!this.baseUrl)
- throw new Error("Ensure that the `standardFontDataUrl` API parameter is provided.");
- if (!I)
- throw new Error("Font filename must be specified.");
- const g = `${this.baseUrl}${I}`;
- return this._fetch(g).catch((C) => {
- throw new Error(`Unable to load font data at: ${g}`);
- });
- }
- async _fetch(I) {
- BC("Abstract method `_fetch` called.");
- }
- }
- class t8 extends Ggg {
- async _fetch(I) {
- const g = await AG(I, "arraybuffer");
- return new Uint8Array(g);
- }
- }
- class wgg {
- constructor({
- baseUrl: I = null
- }) {
- this.baseUrl = I;
- }
- async fetch({
- filename: I
- }) {
- if (!this.baseUrl)
- throw new Error("Ensure that the `wasmUrl` API parameter is provided.");
- if (!I)
- throw new Error("Wasm filename must be specified.");
- const g = `${this.baseUrl}${I}`;
- return this._fetch(g).catch((C) => {
- throw new Error(`Unable to load wasm data at: ${g}`);
- });
- }
- async _fetch(I) {
- BC("Abstract method `_fetch` called.");
- }
- }
- class i8 extends wgg {
- async _fetch(I) {
- const g = await AG(I, "arraybuffer");
- return new Uint8Array(g);
- }
- }
- $t && DI("Please use the `legacy` build in Node.js environments.");
- async function G9(t) {
- const g = await process.getBuiltinModule("fs").promises.readFile(t);
- return new Uint8Array(g);
- }
- class ocg extends mgg {
- }
- class ccg extends bgg {
- _createCanvas(I, g) {
- return process.getBuiltinModule("module").createRequire(import.meta.url)("@napi-rs/canvas").createCanvas(I, g);
- }
- }
- class dcg extends ugg {
- async _fetch(I) {
- return G9(I);
- }
- }
- class rcg extends Ggg {
- async _fetch(I) {
- return G9(I);
- }
- }
- class hcg extends wgg {
- async _fetch(I) {
- return G9(I);
- }
- }
- const Ci = {
- FILL: "Fill",
- STROKE: "Stroke",
- SHADING: "Shading"
- };
- function rS(t, I) {
- if (!I)
- return;
- const g = I[2] - I[0], C = I[3] - I[1], i = new Path2D();
- i.rect(I[0], I[1], g, C), t.clip(i);
- }
- class w9 {
- isModifyingCurrentTransform() {
- return !1;
- }
- getPattern() {
- BC("Abstract method `getPattern` called.");
- }
- }
- class bcg extends w9 {
- constructor(I) {
- super(), this._type = I[1], this._bbox = I[2], this._colorStops = I[3], this._p0 = I[4], this._p1 = I[5], this._r0 = I[6], this._r1 = I[7], this.matrix = null;
- }
- _createGradient(I) {
- let g;
- this._type === "axial" ? g = I.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]) : this._type === "radial" && (g = I.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1));
- for (const C of this._colorStops)
- g.addColorStop(C[0], C[1]);
- return g;
- }
- getPattern(I, g, C, i) {
- let e;
- if (i === Ci.STROKE || i === Ci.FILL) {
- const A = g.current.getClippedPathBoundingBox(i, zC(I)) || [0, 0, 0, 0], s = Math.ceil(A[2] - A[0]) || 1, l = Math.ceil(A[3] - A[1]) || 1, n = g.cachedCanvases.getCanvas("pattern", s, l), a = n.context;
- a.clearRect(0, 0, a.canvas.width, a.canvas.height), a.beginPath(), a.rect(0, 0, a.canvas.width, a.canvas.height), a.translate(-A[0], -A[1]), C = AI.transform(C, [1, 0, 0, 1, A[0], A[1]]), a.transform(...g.baseTransform), this.matrix && a.transform(...this.matrix), rS(a, this._bbox), a.fillStyle = this._createGradient(a), a.fill(), e = I.createPattern(n.canvas, "no-repeat");
- const d = new DOMMatrix(C);
- e.setTransform(d);
- } else
- rS(I, this._bbox), e = this._createGradient(I);
- return e;
- }
- }
- function jH(t, I, g, C, i, e, A, s) {
- const l = I.coords, n = I.colors, a = t.data, d = t.width * 4;
- let o;
- l[g + 1] > l[C + 1] && (o = g, g = C, C = o, o = e, e = A, A = o), l[C + 1] > l[i + 1] && (o = C, C = i, i = o, o = A, A = s, s = o), l[g + 1] > l[C + 1] && (o = g, g = C, C = o, o = e, e = A, A = o);
- const c = (l[g] + I.offsetX) * I.scaleX, r = (l[g + 1] + I.offsetY) * I.scaleY, h = (l[C] + I.offsetX) * I.scaleX, b = (l[C + 1] + I.offsetY) * I.scaleY, u = (l[i] + I.offsetX) * I.scaleX, m = (l[i + 1] + I.offsetY) * I.scaleY;
- if (r >= m)
- return;
- const Z = n[e], p = n[e + 1], Y = n[e + 2], R = n[A], X = n[A + 1], H = n[A + 2], S = n[s], z = n[s + 1], v = n[s + 2], K = Math.round(r), V = Math.round(m);
- let N, B, G, w, W, y, f, D;
- for (let F = K; F <= V; F++) {
- if (F < b) {
- const E = F < r ? 0 : (r - F) / (r - b);
- N = c - (c - h) * E, B = Z - (Z - R) * E, G = p - (p - X) * E, w = Y - (Y - H) * E;
- } else {
- let E;
- F > m ? E = 1 : b === m ? E = 0 : E = (b - F) / (b - m), N = h - (h - u) * E, B = R - (R - S) * E, G = X - (X - z) * E, w = H - (H - v) * E;
- }
- let T;
- F < r ? T = 0 : F > m ? T = 1 : T = (r - F) / (r - m), W = c - (c - u) * T, y = Z - (Z - S) * T, f = p - (p - z) * T, D = Y - (Y - v) * T;
- const Q = Math.round(Math.min(N, W)), P = Math.round(Math.max(N, W));
- let L = d * F + Q * 4;
- for (let E = Q; E <= P; E++)
- T = (N - E) / (N - W), T < 0 ? T = 0 : T > 1 && (T = 1), a[L++] = B - (B - y) * T | 0, a[L++] = G - (G - f) * T | 0, a[L++] = w - (w - D) * T | 0, a[L++] = 255;
- }
- }
- function ucg(t, I, g) {
- const C = I.coords, i = I.colors;
- let e, A;
- switch (I.type) {
- case "lattice":
- const s = I.verticesPerRow, l = Math.floor(C.length / s) - 1, n = s - 1;
- for (e = 0; e < l; e++) {
- let a = e * s;
- for (let d = 0; d < n; d++, a++)
- jH(t, g, C[a], C[a + 1], C[a + s], i[a], i[a + 1], i[a + s]), jH(t, g, C[a + s + 1], C[a + 1], C[a + s], i[a + s + 1], i[a + 1], i[a + s]);
- }
- break;
- case "triangles":
- for (e = 0, A = C.length; e < A; e += 3)
- jH(t, g, C[e], C[e + 1], C[e + 2], i[e], i[e + 1], i[e + 2]);
- break;
- default:
- throw new Error("illegal figure");
- }
- }
- class mcg extends w9 {
- constructor(I) {
- super(), this._coords = I[2], this._colors = I[3], this._figures = I[4], this._bounds = I[5], this._bbox = I[6], this._background = I[7], this.matrix = null;
- }
- _createMeshCanvas(I, g, C) {
- const s = Math.floor(this._bounds[0]), l = Math.floor(this._bounds[1]), n = Math.ceil(this._bounds[2]) - s, a = Math.ceil(this._bounds[3]) - l, d = Math.min(Math.ceil(Math.abs(n * I[0] * 1.1)), 3e3), o = Math.min(Math.ceil(Math.abs(a * I[1] * 1.1)), 3e3), c = n / d, r = a / o, h = {
- coords: this._coords,
- colors: this._colors,
- offsetX: -s,
- offsetY: -l,
- scaleX: 1 / c,
- scaleY: 1 / r
- }, b = d + 2 * 2, u = o + 2 * 2, m = C.getCanvas("mesh", b, u), Z = m.context, p = Z.createImageData(d, o);
- if (g) {
- const R = p.data;
- for (let X = 0, H = R.length; X < H; X += 4)
- R[X] = g[0], R[X + 1] = g[1], R[X + 2] = g[2], R[X + 3] = 255;
- }
- for (const R of this._figures)
- ucg(p, R, h);
- return Z.putImageData(p, 2, 2), {
- canvas: m.canvas,
- offsetX: s - 2 * c,
- offsetY: l - 2 * r,
- scaleX: c,
- scaleY: r
- };
- }
- isModifyingCurrentTransform() {
- return !0;
- }
- getPattern(I, g, C, i) {
- rS(I, this._bbox);
- let e;
- if (i === Ci.SHADING)
- e = AI.singularValueDecompose2dScale(zC(I));
- else if (e = AI.singularValueDecompose2dScale(g.baseTransform), this.matrix) {
- const s = AI.singularValueDecompose2dScale(this.matrix);
- e = [e[0] * s[0], e[1] * s[1]];
- }
- const A = this._createMeshCanvas(e, i === Ci.SHADING ? null : this._background, g.cachedCanvases);
- return i !== Ci.SHADING && (I.setTransform(...g.baseTransform), this.matrix && I.transform(...this.matrix)), I.translate(A.offsetX, A.offsetY), I.scale(A.scaleX, A.scaleY), I.createPattern(A.canvas, "no-repeat");
- }
- }
- class Zcg extends w9 {
- getPattern() {
- return "hotpink";
- }
- }
- function Gcg(t) {
- switch (t[0]) {
- case "RadialAxial":
- return new bcg(t);
- case "Mesh":
- return new mcg(t);
- case "Dummy":
- return new Zcg();
- }
- throw new Error(`Unknown IR type: ${t[0]}`);
- }
- const e8 = {
- COLORED: 1,
- UNCOLORED: 2
- }, kV = class kV {
- constructor(I, g, C, i) {
- this.color = I[1], this.operatorList = I[2], this.matrix = I[3], this.bbox = I[4], this.xstep = I[5], this.ystep = I[6], this.paintType = I[7], this.tilingType = I[8], this.ctx = g, this.canvasGraphicsFactory = C, this.baseTransform = i;
- }
- createPatternCanvas(I) {
- const {
- bbox: g,
- operatorList: C,
- paintType: i,
- tilingType: e,
- color: A,
- canvasGraphicsFactory: s
- } = this;
- let {
- xstep: l,
- ystep: n
- } = this;
- l = Math.abs(l), n = Math.abs(n), qV("TilingType: " + e);
- const a = g[0], d = g[1], o = g[2], c = g[3], r = o - a, h = c - d, b = AI.singularValueDecompose2dScale(this.matrix), u = AI.singularValueDecompose2dScale(this.baseTransform), m = b[0] * u[0], Z = b[1] * u[1];
- let p = r, Y = h, R = !1, X = !1;
- const H = Math.ceil(l * m), S = Math.ceil(n * Z), z = Math.ceil(r * m), v = Math.ceil(h * Z);
- H >= z ? p = l : R = !0, S >= v ? Y = n : X = !0;
- const K = this.getSizeAndScale(p, this.ctx.canvas.width, m), V = this.getSizeAndScale(Y, this.ctx.canvas.height, Z), N = I.cachedCanvases.getCanvas("pattern", K.size, V.size), B = N.context, G = s.createCanvasGraphics(B);
- if (G.groupLevel = I.groupLevel, this.setFillAndStrokeStyleToContext(G, i, A), B.translate(-K.scale * a, -V.scale * d), G.transform(K.scale, 0, 0, V.scale, 0, 0), B.save(), this.clipBbox(G, a, d, o, c), G.baseTransform = zC(G.ctx), G.executeOperatorList(C), G.endDrawing(), B.restore(), R || X) {
- const w = N.canvas;
- R && (p = l), X && (Y = n);
- const W = this.getSizeAndScale(p, this.ctx.canvas.width, m), y = this.getSizeAndScale(Y, this.ctx.canvas.height, Z), f = W.size, D = y.size, F = I.cachedCanvases.getCanvas("pattern-workaround", f, D), T = F.context, Q = R ? Math.floor(r / l) : 0, P = X ? Math.floor(h / n) : 0;
- for (let L = 0; L <= Q; L++)
- for (let E = 0; E <= P; E++)
- T.drawImage(w, f * L, D * E, f, D, 0, 0, f, D);
- return {
- canvas: F.canvas,
- scaleX: W.scale,
- scaleY: y.scale,
- offsetX: a,
- offsetY: d
- };
- }
- return {
- canvas: N.canvas,
- scaleX: K.scale,
- scaleY: V.scale,
- offsetX: a,
- offsetY: d
- };
- }
- getSizeAndScale(I, g, C) {
- const i = Math.max(kV.MAX_PATTERN_SIZE, g);
- let e = Math.ceil(I * C);
- return e >= i ? e = i : C = e / I, {
- scale: C,
- size: e
- };
- }
- clipBbox(I, g, C, i, e) {
- const A = i - g, s = e - C;
- I.ctx.rect(g, C, A, s), I.current.updateRectMinMax(zC(I.ctx), [g, C, i, e]), I.clip(), I.endPath();
- }
- setFillAndStrokeStyleToContext(I, g, C) {
- const i = I.ctx, e = I.current;
- switch (g) {
- case e8.COLORED:
- const A = this.ctx;
- i.fillStyle = A.fillStyle, i.strokeStyle = A.strokeStyle, e.fillColor = A.fillStyle, e.strokeColor = A.strokeStyle;
- break;
- case e8.UNCOLORED:
- const s = AI.makeHexColor(C[0], C[1], C[2]);
- i.fillStyle = s, i.strokeStyle = s, e.fillColor = s, e.strokeColor = s;
- break;
- default:
- throw new jog(`Unsupported paint type: ${g}`);
- }
- }
- isModifyingCurrentTransform() {
- return !1;
- }
- getPattern(I, g, C, i) {
- let e = C;
- i !== Ci.SHADING && (e = AI.transform(e, g.baseTransform), this.matrix && (e = AI.transform(e, this.matrix)));
- const A = this.createPatternCanvas(g);
- let s = new DOMMatrix(e);
- s = s.translate(A.offsetX, A.offsetY), s = s.scale(1 / A.scaleX, 1 / A.scaleY);
- const l = I.createPattern(A.canvas, "repeat");
- return l.setTransform(s), l;
- }
- };
- iI(kV, "MAX_PATTERN_SIZE", 3e3);
- let hS = kV;
- function wcg({
- src: t,
- srcPos: I = 0,
- dest: g,
- width: C,
- height: i,
- nonBlackColor: e = 4294967295,
- inverseDecode: A = !1
- }) {
- const s = Ai.isLittleEndian ? 4278190080 : 255, [l, n] = A ? [e, s] : [s, e], a = C >> 3, d = C & 7, o = t.length;
- g = new Uint32Array(g.buffer);
- let c = 0;
- for (let r = 0; r < i; r++) {
- for (const b = I + a; I < b; I++) {
- const u = I < o ? t[I] : 255;
- g[c++] = u & 128 ? n : l, g[c++] = u & 64 ? n : l, g[c++] = u & 32 ? n : l, g[c++] = u & 16 ? n : l, g[c++] = u & 8 ? n : l, g[c++] = u & 4 ? n : l, g[c++] = u & 2 ? n : l, g[c++] = u & 1 ? n : l;
- }
- if (d === 0)
- continue;
- const h = I < o ? t[I++] : 255;
- for (let b = 0; b < d; b++)
- g[c++] = h & 1 << 7 - b ? n : l;
- }
- return {
- srcPos: I,
- destPos: c
- };
- }
- const A8 = 16, s8 = 100, pcg = 15, l8 = 10, n8 = 1e3, Ei = 16, QH = new DOMMatrix();
- function Bcg(t, I) {
- if (t._removeMirroring)
- throw new Error("Context is already forwarding operations.");
- t.__originalSave = t.save, t.__originalRestore = t.restore, t.__originalRotate = t.rotate, t.__originalScale = t.scale, t.__originalTranslate = t.translate, t.__originalTransform = t.transform, t.__originalSetTransform = t.setTransform, t.__originalResetTransform = t.resetTransform, t.__originalClip = t.clip, t.__originalMoveTo = t.moveTo, t.__originalLineTo = t.lineTo, t.__originalBezierCurveTo = t.bezierCurveTo, t.__originalRect = t.rect, t.__originalClosePath = t.closePath, t.__originalBeginPath = t.beginPath, t._removeMirroring = () => {
- t.save = t.__originalSave, t.restore = t.__originalRestore, t.rotate = t.__originalRotate, t.scale = t.__originalScale, t.translate = t.__originalTranslate, t.transform = t.__originalTransform, t.setTransform = t.__originalSetTransform, t.resetTransform = t.__originalResetTransform, t.clip = t.__originalClip, t.moveTo = t.__originalMoveTo, t.lineTo = t.__originalLineTo, t.bezierCurveTo = t.__originalBezierCurveTo, t.rect = t.__originalRect, t.closePath = t.__originalClosePath, t.beginPath = t.__originalBeginPath, delete t._removeMirroring;
- }, t.save = function() {
- I.save(), this.__originalSave();
- }, t.restore = function() {
- I.restore(), this.__originalRestore();
- }, t.translate = function(C, i) {
- I.translate(C, i), this.__originalTranslate(C, i);
- }, t.scale = function(C, i) {
- I.scale(C, i), this.__originalScale(C, i);
- }, t.transform = function(C, i, e, A, s, l) {
- I.transform(C, i, e, A, s, l), this.__originalTransform(C, i, e, A, s, l);
- }, t.setTransform = function(C, i, e, A, s, l) {
- I.setTransform(C, i, e, A, s, l), this.__originalSetTransform(C, i, e, A, s, l);
- }, t.resetTransform = function() {
- I.resetTransform(), this.__originalResetTransform();
- }, t.rotate = function(C) {
- I.rotate(C), this.__originalRotate(C);
- }, t.clip = function(C) {
- I.clip(C), this.__originalClip(C);
- }, t.moveTo = function(g, C) {
- I.moveTo(g, C), this.__originalMoveTo(g, C);
- }, t.lineTo = function(g, C) {
- I.lineTo(g, C), this.__originalLineTo(g, C);
- }, t.bezierCurveTo = function(g, C, i, e, A, s) {
- I.bezierCurveTo(g, C, i, e, A, s), this.__originalBezierCurveTo(g, C, i, e, A, s);
- }, t.rect = function(g, C, i, e) {
- I.rect(g, C, i, e), this.__originalRect(g, C, i, e);
- }, t.closePath = function() {
- I.closePath(), this.__originalClosePath();
- }, t.beginPath = function() {
- I.beginPath(), this.__originalBeginPath();
- };
- }
- class Wcg {
- constructor(I) {
- this.canvasFactory = I, this.cache = /* @__PURE__ */ Object.create(null);
- }
- getCanvas(I, g, C) {
- let i;
- return this.cache[I] !== void 0 ? (i = this.cache[I], this.canvasFactory.reset(i, g, C)) : (i = this.canvasFactory.create(g, C), this.cache[I] = i), i;
- }
- delete(I) {
- delete this.cache[I];
- }
- clear() {
- for (const I in this.cache) {
- const g = this.cache[I];
- this.canvasFactory.destroy(g), delete this.cache[I];
- }
- }
- }
- function zY(t, I, g, C, i, e, A, s, l, n) {
- const [a, d, o, c, r, h] = zC(t);
- if (d === 0 && o === 0) {
- const m = A * a + r, Z = Math.round(m), p = s * c + h, Y = Math.round(p), R = (A + l) * a + r, X = Math.abs(Math.round(R) - Z) || 1, H = (s + n) * c + h, S = Math.abs(Math.round(H) - Y) || 1;
- return t.setTransform(Math.sign(a), 0, 0, Math.sign(c), Z, Y), t.drawImage(I, g, C, i, e, 0, 0, X, S), t.setTransform(a, d, o, c, r, h), [X, S];
- }
- if (a === 0 && c === 0) {
- const m = s * o + r, Z = Math.round(m), p = A * d + h, Y = Math.round(p), R = (s + n) * o + r, X = Math.abs(Math.round(R) - Z) || 1, H = (A + l) * d + h, S = Math.abs(Math.round(H) - Y) || 1;
- return t.setTransform(0, Math.sign(d), Math.sign(o), 0, Z, Y), t.drawImage(I, g, C, i, e, 0, 0, S, X), t.setTransform(a, d, o, c, r, h), [S, X];
- }
- t.drawImage(I, g, C, i, e, A, s, l, n);
- const b = Math.hypot(a, d), u = Math.hypot(o, c);
- return [b * l, u * n];
- }
- function ycg(t) {
- const {
- width: I,
- height: g
- } = t;
- if (I > n8 || g > n8)
- return null;
- const C = 1e3, i = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]), e = I + 1, A = new Uint8Array(e * (g + 1));
- let s, l, n;
- const a = I + 7 & -8, d = new Uint8Array(a * g);
- let o = 0;
- for (const R of t.data) {
- let X = 128;
- for (; X > 0; )
- d[o++] = R & X ? 0 : 255, X >>= 1;
- }
- let c = 0;
- for (o = 0, d[o] !== 0 && (A[0] = 1, ++c), l = 1; l < I; l++)
- d[o] !== d[o + 1] && (A[l] = d[o] ? 2 : 1, ++c), o++;
- for (d[o] !== 0 && (A[l] = 2, ++c), s = 1; s < g; s++) {
- o = s * a, n = s * e, d[o - a] !== d[o] && (A[n] = d[o] ? 1 : 8, ++c);
- let R = (d[o] ? 4 : 0) + (d[o - a] ? 8 : 0);
- for (l = 1; l < I; l++)
- R = (R >> 2) + (d[o + 1] ? 4 : 0) + (d[o - a + 1] ? 8 : 0), i[R] && (A[n + l] = i[R], ++c), o++;
- if (d[o - a] !== d[o] && (A[n + l] = d[o] ? 2 : 4, ++c), c > C)
- return null;
- }
- for (o = a * (g - 1), n = s * e, d[o] !== 0 && (A[n] = 8, ++c), l = 1; l < I; l++)
- d[o] !== d[o + 1] && (A[n + l] = d[o] ? 4 : 8, ++c), o++;
- if (d[o] !== 0 && (A[n + l] = 4, ++c), c > C)
- return null;
- const r = new Int32Array([0, e, -1, 0, -e, 0, 0, 0, 1]), h = new Path2D(), {
- a: b,
- b: u,
- c: m,
- d: Z,
- e: p,
- f: Y
- } = new DOMMatrix().scaleSelf(1 / I, -1 / g).translateSelf(0, -g);
- for (s = 0; c && s <= g; s++) {
- let R = s * e;
- const X = R + I;
- for (; R < X && !A[R]; )
- R++;
- if (R === X)
- continue;
- let H = R % e, S = s;
- h.moveTo(b * H + m * S + p, u * H + Z * S + Y);
- const z = R;
- let v = A[R];
- do {
- const K = r[v];
- do
- R += K;
- while (!A[R]);
- const V = A[R];
- V !== 5 && V !== 10 ? (v = V, A[R] = 0) : (v = V & 51 * v >> 4, A[R] &= v >> 2 | v << 2), H = R % e, S = R / e | 0, h.lineTo(b * H + m * S + p, u * H + Z * S + Y), A[R] || --c;
- } while (z !== R);
- --s;
- }
- return h;
- }
- class a8 {
- constructor(I, g) {
- this.alphaIsShape = !1, this.fontSize = 0, this.fontSizeScale = 1, this.textMatrix = R$, this.textMatrixScale = 1, this.fontMatrix = jX, this.leading = 0, this.x = 0, this.y = 0, this.lineX = 0, this.lineY = 0, this.charSpacing = 0, this.wordSpacing = 0, this.textHScale = 1, this.textRenderingMode = hi.FILL, this.textRise = 0, this.fillColor = "#000000", this.strokeColor = "#000000", this.patternFill = !1, this.patternStroke = !1, this.fillAlpha = 1, this.strokeAlpha = 1, this.lineWidth = 1, this.activeSMask = null, this.transferMaps = "none", this.startNewPathAndClipBox([0, 0, I, g]);
- }
- clone() {
- const I = Object.create(this);
- return I.clipBox = this.clipBox.slice(), I;
- }
- updateRectMinMax(I, g) {
- const C = AI.applyTransform(g, I), i = AI.applyTransform(g.slice(2), I), e = AI.applyTransform([g[0], g[3]], I), A = AI.applyTransform([g[2], g[1]], I);
- this.minX = Math.min(this.minX, C[0], i[0], e[0], A[0]), this.minY = Math.min(this.minY, C[1], i[1], e[1], A[1]), this.maxX = Math.max(this.maxX, C[0], i[0], e[0], A[0]), this.maxY = Math.max(this.maxY, C[1], i[1], e[1], A[1]);
- }
- getPathBoundingBox(I = Ci.FILL, g = null) {
- const C = [this.minX, this.minY, this.maxX, this.maxY];
- if (I === Ci.STROKE) {
- g || BC("Stroke bounding box must include transform.");
- const i = AI.singularValueDecompose2dScale(g), e = i[0] * this.lineWidth / 2, A = i[1] * this.lineWidth / 2;
- C[0] -= e, C[1] -= A, C[2] += e, C[3] += A;
- }
- return C;
- }
- updateClipFromPath() {
- const I = AI.intersect(this.clipBox, this.getPathBoundingBox());
- this.startNewPathAndClipBox(I || [0, 0, 0, 0]);
- }
- isEmptyClip() {
- return this.minX === 1 / 0;
- }
- startNewPathAndClipBox(I) {
- this.clipBox = I, this.minX = 1 / 0, this.minY = 1 / 0, this.maxX = 0, this.maxY = 0;
- }
- getClippedPathBoundingBox(I = Ci.FILL, g = null) {
- return AI.intersect(this.clipBox, this.getPathBoundingBox(I, g));
- }
- }
- function o8(t, I) {
- if (I instanceof ImageData) {
- t.putImageData(I, 0, 0);
- return;
- }
- const g = I.height, C = I.width, i = g % Ei, e = (g - i) / Ei, A = i === 0 ? e : e + 1, s = t.createImageData(C, Ei);
- let l = 0, n;
- const a = I.data, d = s.data;
- let o, c, r, h;
- if (I.kind === aN.GRAYSCALE_1BPP) {
- const b = a.byteLength, u = new Uint32Array(d.buffer, 0, d.byteLength >> 2), m = u.length, Z = C + 7 >> 3, p = 4294967295, Y = Ai.isLittleEndian ? 4278190080 : 255;
- for (o = 0; o < A; o++) {
- for (r = o < e ? Ei : i, n = 0, c = 0; c < r; c++) {
- const R = b - l;
- let X = 0;
- const H = R > Z ? C : R * 8 - 7, S = H & -8;
- let z = 0, v = 0;
- for (; X < S; X += 8)
- v = a[l++], u[n++] = v & 128 ? p : Y, u[n++] = v & 64 ? p : Y, u[n++] = v & 32 ? p : Y, u[n++] = v & 16 ? p : Y, u[n++] = v & 8 ? p : Y, u[n++] = v & 4 ? p : Y, u[n++] = v & 2 ? p : Y, u[n++] = v & 1 ? p : Y;
- for (; X < H; X++)
- z === 0 && (v = a[l++], z = 128), u[n++] = v & z ? p : Y, z >>= 1;
- }
- for (; n < m; )
- u[n++] = 0;
- t.putImageData(s, 0, o * Ei);
- }
- } else if (I.kind === aN.RGBA_32BPP) {
- for (c = 0, h = C * Ei * 4, o = 0; o < e; o++)
- d.set(a.subarray(l, l + h)), l += h, t.putImageData(s, 0, c), c += Ei;
- o < A && (h = C * i * 4, d.set(a.subarray(l, l + h)), t.putImageData(s, 0, c));
- } else if (I.kind === aN.RGB_24BPP)
- for (r = Ei, h = C * r, o = 0; o < A; o++) {
- for (o >= e && (r = i, h = C * r), n = 0, c = h; c--; )
- d[n++] = a[l++], d[n++] = a[l++], d[n++] = a[l++], d[n++] = 255;
- t.putImageData(s, 0, o * Ei);
- }
- else
- throw new Error(`bad image kind: ${I.kind}`);
- }
- function c8(t, I) {
- if (I.bitmap) {
- t.drawImage(I.bitmap, 0, 0);
- return;
- }
- const g = I.height, C = I.width, i = g % Ei, e = (g - i) / Ei, A = i === 0 ? e : e + 1, s = t.createImageData(C, Ei);
- let l = 0;
- const n = I.data, a = s.data;
- for (let d = 0; d < A; d++) {
- const o = d < e ? Ei : i;
- ({
- srcPos: l
- } = wcg({
- src: n,
- srcPos: l,
- dest: a,
- width: C,
- height: o,
- nonBlackColor: 0
- })), t.putImageData(s, 0, d * Ei);
- }
- }
- function Hu(t, I) {
- const g = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"];
- for (const C of g)
- t[C] !== void 0 && (I[C] = t[C]);
- t.setLineDash !== void 0 && (I.setLineDash(t.getLineDash()), I.lineDashOffset = t.lineDashOffset);
- }
- function JY(t) {
- if (t.strokeStyle = t.fillStyle = "#000000", t.fillRule = "nonzero", t.globalAlpha = 1, t.lineWidth = 1, t.lineCap = "butt", t.lineJoin = "miter", t.miterLimit = 10, t.globalCompositeOperation = "source-over", t.font = "10px sans-serif", t.setLineDash !== void 0 && (t.setLineDash([]), t.lineDashOffset = 0), !$t) {
- const {
- filter: I
- } = t;
- I !== "none" && I !== "" && (t.filter = "none");
- }
- }
- function d8(t, I) {
- if (I)
- return !0;
- const g = AI.singularValueDecompose2dScale(t);
- g[0] = Math.fround(g[0]), g[1] = Math.fround(g[1]);
- const C = Math.fround(In.pixelRatio * Pa.PDF_TO_CSS_UNITS);
- return g[0] <= C && g[1] <= C;
- }
- const Ycg = ["butt", "round", "square"], Ncg = ["miter", "round", "bevel"], Vcg = {}, r8 = {};
- var JA, bS, uS, mS;
- const i1 = class i1 {
- constructor(I, g, C, i, e, {
- optionalContentConfig: A,
- markedContentStack: s = null
- }, l, n) {
- tg(this, JA);
- this.ctx = I, this.current = new a8(this.ctx.canvas.width, this.ctx.canvas.height), this.stateStack = [], this.pendingClip = null, this.pendingEOFill = !1, this.res = null, this.xobjs = null, this.commonObjs = g, this.objs = C, this.canvasFactory = i, this.filterFactory = e, this.groupStack = [], this.processingType3 = null, this.baseTransform = null, this.baseTransformStack = [], this.groupLevel = 0, this.smaskStack = [], this.smaskCounter = 0, this.tempSMask = null, this.suspendedCtx = null, this.contentVisible = !0, this.markedContentStack = s || [], this.optionalContentConfig = A, this.cachedCanvases = new Wcg(this.canvasFactory), this.cachedPatterns = /* @__PURE__ */ new Map(), this.annotationCanvasMap = l, this.viewportScale = 1, this.outputScaleX = 1, this.outputScaleY = 1, this.pageColors = n, this._cachedScaleForStroking = [-1, 0], this._cachedGetSinglePixelWidth = null, this._cachedBitmapsMap = /* @__PURE__ */ new Map();
- }
- getObject(I, g = null) {
- return typeof I == "string" ? I.startsWith("g_") ? this.commonObjs.get(I) : this.objs.get(I) : g;
- }
- beginDrawing({
- transform: I,
- viewport: g,
- transparency: C = !1,
- background: i = null
- }) {
- const e = this.ctx.canvas.width, A = this.ctx.canvas.height, s = this.ctx.fillStyle;
- if (this.ctx.fillStyle = i || "#ffffff", this.ctx.fillRect(0, 0, e, A), this.ctx.fillStyle = s, C) {
- const l = this.cachedCanvases.getCanvas("transparent", e, A);
- this.compositeCtx = this.ctx, this.transparentCanvas = l.canvas, this.ctx = l.context, this.ctx.save(), this.ctx.transform(...zC(this.compositeCtx));
- }
- this.ctx.save(), JY(this.ctx), I && (this.ctx.transform(...I), this.outputScaleX = I[0], this.outputScaleY = I[0]), this.ctx.transform(...g.transform), this.viewportScale = g.scale, this.baseTransform = zC(this.ctx);
- }
- executeOperatorList(I, g, C, i) {
- const e = I.argsArray, A = I.fnArray;
- let s = g || 0;
- const l = e.length;
- if (l === s)
- return s;
- const n = l - s > l8 && typeof C == "function", a = n ? Date.now() + pcg : 0;
- let d = 0;
- const o = this.commonObjs, c = this.objs;
- let r;
- for (; ; ) {
- if (i !== void 0 && s === i.nextBreakPoint)
- return i.breakIt(s, C), s;
- if (r = A[s], r !== IV.dependency)
- this[r].apply(this, e[s]);
- else
- for (const h of e[s]) {
- const b = h.startsWith("g_") ? o : c;
- if (!b.has(h))
- return b.get(h, C), s;
- }
- if (s++, s === l)
- return s;
- if (n && ++d > l8) {
- if (Date.now() > a)
- return C(), s;
- d = 0;
- }
- }
- }
- endDrawing() {
- ig(this, JA, bS).call(this), this.cachedCanvases.clear(), this.cachedPatterns.clear();
- for (const I of this._cachedBitmapsMap.values()) {
- for (const g of I.values())
- typeof HTMLCanvasElement < "u" && g instanceof HTMLCanvasElement && (g.width = g.height = 0);
- I.clear();
- }
- this._cachedBitmapsMap.clear(), ig(this, JA, uS).call(this);
- }
- _scaleImage(I, g) {
- const C = I.width ?? I.displayWidth, i = I.height ?? I.displayHeight;
- let e = Math.max(Math.hypot(g[0], g[1]), 1), A = Math.max(Math.hypot(g[2], g[3]), 1), s = C, l = i, n = "prescale1", a, d;
- for (; e > 2 && s > 1 || A > 2 && l > 1; ) {
- let o = s, c = l;
- e > 2 && s > 1 && (o = s >= 16384 ? Math.floor(s / 2) - 1 || 1 : Math.ceil(s / 2), e /= s / o), A > 2 && l > 1 && (c = l >= 16384 ? Math.floor(l / 2) - 1 || 1 : Math.ceil(l) / 2, A /= l / c), a = this.cachedCanvases.getCanvas(n, o, c), d = a.context, d.clearRect(0, 0, o, c), d.drawImage(I, 0, 0, s, l, 0, 0, o, c), I = a.canvas, s = o, l = c, n = n === "prescale1" ? "prescale2" : "prescale1";
- }
- return {
- img: I,
- paintWidth: s,
- paintHeight: l
- };
- }
- _createMaskCanvas(I) {
- const g = this.ctx, {
- width: C,
- height: i
- } = I, e = this.current.fillColor, A = this.current.patternFill, s = zC(g);
- let l, n, a, d;
- if ((I.bitmap || I.data) && I.count > 1) {
- const H = I.bitmap || I.data.buffer;
- n = JSON.stringify(A ? s : [s.slice(0, 4), e]), l = this._cachedBitmapsMap.get(H), l || (l = /* @__PURE__ */ new Map(), this._cachedBitmapsMap.set(H, l));
- const S = l.get(n);
- if (S && !A) {
- const z = Math.round(Math.min(s[0], s[2]) + s[4]), v = Math.round(Math.min(s[1], s[3]) + s[5]);
- return {
- canvas: S,
- offsetX: z,
- offsetY: v
- };
- }
- a = S;
- }
- a || (d = this.cachedCanvases.getCanvas("maskCanvas", C, i), c8(d.context, I));
- let o = AI.transform(s, [1 / C, 0, 0, -1 / i, 0, 0]);
- o = AI.transform(o, [1, 0, 0, 1, 0, -i]);
- const [c, r, h, b] = AI.getAxialAlignedBoundingBox([0, 0, C, i], o), u = Math.round(h - c) || 1, m = Math.round(b - r) || 1, Z = this.cachedCanvases.getCanvas("fillCanvas", u, m), p = Z.context, Y = c, R = r;
- p.translate(-Y, -R), p.transform(...o), a || (a = this._scaleImage(d.canvas, ss(p)), a = a.img, l && A && l.set(n, a)), p.imageSmoothingEnabled = d8(zC(p), I.interpolate), zY(p, a, 0, 0, a.width, a.height, 0, 0, C, i), p.globalCompositeOperation = "source-in";
- const X = AI.transform(ss(p), [1, 0, 0, 1, -Y, -R]);
- return p.fillStyle = A ? e.getPattern(g, this, X, Ci.FILL) : e, p.fillRect(0, 0, C, i), l && !A && (this.cachedCanvases.delete("fillCanvas"), l.set(n, Z.canvas)), {
- canvas: Z.canvas,
- offsetX: Math.round(Y),
- offsetY: Math.round(R)
- };
- }
- setLineWidth(I) {
- I !== this.current.lineWidth && (this._cachedScaleForStroking[0] = -1), this.current.lineWidth = I, this.ctx.lineWidth = I;
- }
- setLineCap(I) {
- this.ctx.lineCap = Ycg[I];
- }
- setLineJoin(I) {
- this.ctx.lineJoin = Ncg[I];
- }
- setMiterLimit(I) {
- this.ctx.miterLimit = I;
- }
- setDash(I, g) {
- const C = this.ctx;
- C.setLineDash !== void 0 && (C.setLineDash(I), C.lineDashOffset = g);
- }
- setRenderingIntent(I) {
- }
- setFlatness(I) {
- }
- setGState(I) {
- for (const [g, C] of I)
- switch (g) {
- case "LW":
- this.setLineWidth(C);
- break;
- case "LC":
- this.setLineCap(C);
- break;
- case "LJ":
- this.setLineJoin(C);
- break;
- case "ML":
- this.setMiterLimit(C);
- break;
- case "D":
- this.setDash(C[0], C[1]);
- break;
- case "RI":
- this.setRenderingIntent(C);
- break;
- case "FL":
- this.setFlatness(C);
- break;
- case "Font":
- this.setFont(C[0], C[1]);
- break;
- case "CA":
- this.current.strokeAlpha = C;
- break;
- case "ca":
- this.ctx.globalAlpha = this.current.fillAlpha = C;
- break;
- case "BM":
- this.ctx.globalCompositeOperation = C;
- break;
- case "SMask":
- this.current.activeSMask = C ? this.tempSMask : null, this.tempSMask = null, this.checkSMaskState();
- break;
- case "TR":
- this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(C);
- break;
- }
- }
- get inSMaskMode() {
- return !!this.suspendedCtx;
- }
- checkSMaskState() {
- const I = this.inSMaskMode;
- this.current.activeSMask && !I ? this.beginSMaskMode() : !this.current.activeSMask && I && this.endSMaskMode();
- }
- beginSMaskMode() {
- if (this.inSMaskMode)
- throw new Error("beginSMaskMode called while already in smask mode");
- const I = this.ctx.canvas.width, g = this.ctx.canvas.height, C = "smaskGroupAt" + this.groupLevel, i = this.cachedCanvases.getCanvas(C, I, g);
- this.suspendedCtx = this.ctx;
- const e = this.ctx = i.context;
- e.setTransform(this.suspendedCtx.getTransform()), Hu(this.suspendedCtx, e), Bcg(e, this.suspendedCtx), this.setGState([["BM", "source-over"]]);
- }
- endSMaskMode() {
- if (!this.inSMaskMode)
- throw new Error("endSMaskMode called while not in smask mode");
- this.ctx._removeMirroring(), Hu(this.ctx, this.suspendedCtx), this.ctx = this.suspendedCtx, this.suspendedCtx = null;
- }
- compose(I) {
- if (!this.current.activeSMask)
- return;
- I ? (I[0] = Math.floor(I[0]), I[1] = Math.floor(I[1]), I[2] = Math.ceil(I[2]), I[3] = Math.ceil(I[3])) : I = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];
- const g = this.current.activeSMask, C = this.suspendedCtx;
- this.composeSMask(C, g, this.ctx, I), this.ctx.save(), this.ctx.setTransform(1, 0, 0, 1, 0, 0), this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height), this.ctx.restore();
- }
- composeSMask(I, g, C, i) {
- const e = i[0], A = i[1], s = i[2] - e, l = i[3] - A;
- s === 0 || l === 0 || (this.genericComposeSMask(g.context, C, s, l, g.subtype, g.backdrop, g.transferMap, e, A, g.offsetX, g.offsetY), I.save(), I.globalAlpha = 1, I.globalCompositeOperation = "source-over", I.setTransform(1, 0, 0, 1, 0, 0), I.drawImage(C.canvas, 0, 0), I.restore());
- }
- genericComposeSMask(I, g, C, i, e, A, s, l, n, a, d) {
- let o = I.canvas, c = l - a, r = n - d;
- if (A) {
- const b = AI.makeHexColor(...A);
- if (c < 0 || r < 0 || c + C > o.width || r + i > o.height) {
- const u = this.cachedCanvases.getCanvas("maskExtension", C, i), m = u.context;
- m.drawImage(o, -c, -r), m.globalCompositeOperation = "destination-atop", m.fillStyle = b, m.fillRect(0, 0, C, i), m.globalCompositeOperation = "source-over", o = u.canvas, c = r = 0;
- } else {
- I.save(), I.globalAlpha = 1, I.setTransform(1, 0, 0, 1, 0, 0);
- const u = new Path2D();
- u.rect(c, r, C, i), I.clip(u), I.globalCompositeOperation = "destination-atop", I.fillStyle = b, I.fillRect(c, r, C, i), I.restore();
- }
- }
- g.save(), g.globalAlpha = 1, g.setTransform(1, 0, 0, 1, 0, 0), e === "Alpha" && s ? g.filter = this.filterFactory.addAlphaFilter(s) : e === "Luminosity" && (g.filter = this.filterFactory.addLuminosityFilter(s));
- const h = new Path2D();
- h.rect(l, n, C, i), g.clip(h), g.globalCompositeOperation = "destination-in", g.drawImage(o, c, r, C, i, l, n, C, i), g.restore();
- }
- save() {
- this.inSMaskMode && Hu(this.ctx, this.suspendedCtx), this.ctx.save();
- const I = this.current;
- this.stateStack.push(I), this.current = I.clone();
- }
- restore() {
- if (this.stateStack.length === 0) {
- this.inSMaskMode && this.endSMaskMode();
- return;
- }
- this.current = this.stateStack.pop(), this.ctx.restore(), this.inSMaskMode && Hu(this.suspendedCtx, this.ctx), this.checkSMaskState(), this.pendingClip = null, this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null;
- }
- transform(I, g, C, i, e, A) {
- this.ctx.transform(I, g, C, i, e, A), this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null;
- }
- constructPath(I, g, C) {
- let [i] = g;
- if (!C) {
- i || (i = g[0] = new Path2D()), this[I](i);
- return;
- }
- if (!(i instanceof Path2D)) {
- const e = g[0] = new Path2D();
- for (let A = 0, s = i.length; A < s; )
- switch (i[A++]) {
- case FY.moveTo:
- e.moveTo(i[A++], i[A++]);
- break;
- case FY.lineTo:
- e.lineTo(i[A++], i[A++]);
- break;
- case FY.curveTo:
- e.bezierCurveTo(i[A++], i[A++], i[A++], i[A++], i[A++], i[A++]);
- break;
- case FY.closePath:
- e.closePath();
- break;
- default:
- DI(`Unrecognized drawing path operator: ${i[A - 1]}`);
- break;
- }
- i = e;
- }
- this.current.updateRectMinMax(zC(this.ctx), C), this[I](i);
- }
- closePath() {
- this.ctx.closePath();
- }
- stroke(I, g = !0) {
- const C = this.ctx, i = this.current.strokeColor;
- if (C.globalAlpha = this.current.strokeAlpha, this.contentVisible)
- if (typeof i == "object" && (i != null && i.getPattern)) {
- const e = i.isModifyingCurrentTransform() ? C.getTransform() : null;
- if (C.save(), C.strokeStyle = i.getPattern(C, this, ss(C), Ci.STROKE), e) {
- const A = new Path2D();
- A.addPath(I, C.getTransform().invertSelf().multiplySelf(e)), I = A;
- }
- this.rescaleAndStroke(I, !1), C.restore();
- } else
- this.rescaleAndStroke(I, !0);
- g && this.consumePath(I, this.current.getClippedPathBoundingBox(Ci.STROKE, zC(this.ctx))), C.globalAlpha = this.current.fillAlpha;
- }
- closeStroke(I) {
- this.stroke(I);
- }
- fill(I, g = !0) {
- const C = this.ctx, i = this.current.fillColor, e = this.current.patternFill;
- let A = !1;
- if (e) {
- const l = i.isModifyingCurrentTransform() ? C.getTransform() : null;
- if (C.save(), C.fillStyle = i.getPattern(C, this, ss(C), Ci.FILL), l) {
- const n = new Path2D();
- n.addPath(I, C.getTransform().invertSelf().multiplySelf(l)), I = n;
- }
- A = !0;
- }
- const s = this.current.getClippedPathBoundingBox();
- this.contentVisible && s !== null && (this.pendingEOFill ? (C.fill(I, "evenodd"), this.pendingEOFill = !1) : C.fill(I)), A && C.restore(), g && this.consumePath(I, s);
- }
- eoFill(I) {
- this.pendingEOFill = !0, this.fill(I);
- }
- fillStroke(I) {
- this.fill(I, !1), this.stroke(I, !1), this.consumePath(I);
- }
- eoFillStroke(I) {
- this.pendingEOFill = !0, this.fillStroke(I);
- }
- closeFillStroke(I) {
- this.fillStroke(I);
- }
- closeEOFillStroke(I) {
- this.pendingEOFill = !0, this.fillStroke(I);
- }
- endPath(I) {
- this.consumePath(I);
- }
- clip() {
- this.pendingClip = Vcg;
- }
- eoClip() {
- this.pendingClip = r8;
- }
- beginText() {
- this.current.textMatrix = R$, this.current.textMatrixScale = 1, this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0;
- }
- endText() {
- const I = this.pendingTextPaths, g = this.ctx;
- if (I === void 0) {
- g.beginPath();
- return;
- }
- const C = new Path2D(), i = g.getTransform().invertSelf();
- for (const {
- transform: e,
- x: A,
- y: s,
- fontSize: l,
- path: n
- } of I)
- C.addPath(n, new DOMMatrix(e).preMultiplySelf(i).translate(A, s).scale(l, -l));
- g.clip(C), g.beginPath(), delete this.pendingTextPaths;
- }
- setCharSpacing(I) {
- this.current.charSpacing = I;
- }
- setWordSpacing(I) {
- this.current.wordSpacing = I;
- }
- setHScale(I) {
- this.current.textHScale = I / 100;
- }
- setLeading(I) {
- this.current.leading = -I;
- }
- setFont(I, g) {
- var a;
- const C = this.commonObjs.get(I), i = this.current;
- if (!C)
- throw new Error(`Can't find font for ${I}`);
- if (i.fontMatrix = C.fontMatrix || jX, (i.fontMatrix[0] === 0 || i.fontMatrix[3] === 0) && DI("Invalid font matrix for font " + I), g < 0 ? (g = -g, i.fontDirection = -1) : i.fontDirection = 1, this.current.font = C, this.current.fontSize = g, C.isType3Font)
- return;
- const e = C.loadedName || "sans-serif", A = ((a = C.systemFontInfo) == null ? void 0 : a.css) || `"${e}", ${C.fallbackName}`;
- let s = "normal";
- C.black ? s = "900" : C.bold && (s = "bold");
- const l = C.italic ? "italic" : "normal";
- let n = g;
- g < A8 ? n = A8 : g > s8 && (n = s8), this.current.fontSizeScale = g / n, this.ctx.font = `${l} ${s} ${n}px ${A}`;
- }
- setTextRenderingMode(I) {
- this.current.textRenderingMode = I;
- }
- setTextRise(I) {
- this.current.textRise = I;
- }
- moveText(I, g) {
- this.current.x = this.current.lineX += I, this.current.y = this.current.lineY += g;
- }
- setLeadingMoveText(I, g) {
- this.setLeading(-g), this.moveText(I, g);
- }
- setTextMatrix(I, g, C, i, e, A) {
- this.current.textMatrix = [I, g, C, i, e, A], this.current.textMatrixScale = Math.hypot(I, g), this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0;
- }
- nextLine() {
- this.moveText(0, this.current.leading);
- }
- paintChar(I, g, C, i, e) {
- const A = this.ctx, s = this.current, l = s.font, n = s.textRenderingMode, a = s.fontSize / s.fontSizeScale, d = n & hi.FILL_STROKE_MASK, o = !!(n & hi.ADD_TO_PATH_FLAG), c = s.patternFill && !l.missingFile, r = s.patternStroke && !l.missingFile;
- let h;
- if ((l.disableFontFace || o || c || r) && (h = l.getPathGenerator(this.commonObjs, I)), l.disableFontFace || c || r) {
- A.save(), A.translate(g, C), A.scale(a, -a);
- let b;
- if ((d === hi.FILL || d === hi.FILL_STROKE) && (i ? (b = A.getTransform(), A.setTransform(...i), A.fill(ig(this, JA, mS).call(this, h, b, i))) : A.fill(h)), d === hi.STROKE || d === hi.FILL_STROKE)
- if (e) {
- b || (b = A.getTransform()), A.setTransform(...e);
- const {
- a: u,
- b: m,
- c: Z,
- d: p
- } = b, Y = AI.inverseTransform(e), R = AI.transform([u, m, Z, p, 0, 0], Y), [X, H] = AI.singularValueDecompose2dScale(R);
- A.lineWidth *= Math.max(X, H) / a, A.stroke(ig(this, JA, mS).call(this, h, b, e));
- } else
- A.lineWidth /= a, A.stroke(h);
- A.restore();
- } else
- (d === hi.FILL || d === hi.FILL_STROKE) && A.fillText(I, g, C), (d === hi.STROKE || d === hi.FILL_STROKE) && A.strokeText(I, g, C);
- o && (this.pendingTextPaths || (this.pendingTextPaths = [])).push({
- transform: zC(A),
- x: g,
- y: C,
- fontSize: a,
- path: h
- });
- }
- get isFontSubpixelAAEnabled() {
- const {
- context: I
- } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10);
- I.scale(1.5, 1), I.fillText("I", 0, 10);
- const g = I.getImageData(0, 0, 10, 10).data;
- let C = !1;
- for (let i = 3; i < g.length; i += 4)
- if (g[i] > 0 && g[i] < 255) {
- C = !0;
- break;
- }
- return UI(this, "isFontSubpixelAAEnabled", C);
- }
- showText(I) {
- const g = this.current, C = g.font;
- if (C.isType3Font)
- return this.showType3Text(I);
- const i = g.fontSize;
- if (i === 0)
- return;
- const e = this.ctx, A = g.fontSizeScale, s = g.charSpacing, l = g.wordSpacing, n = g.fontDirection, a = g.textHScale * n, d = I.length, o = C.vertical, c = o ? 1 : -1, r = C.defaultVMetrics, h = i * g.fontMatrix[0], b = g.textRenderingMode === hi.FILL && !C.disableFontFace && !g.patternFill;
- e.save(), e.transform(...g.textMatrix), e.translate(g.x, g.y + g.textRise), n > 0 ? e.scale(a, -1) : e.scale(a, 1);
- let u, m;
- if (g.patternFill) {
- e.save();
- const X = g.fillColor.getPattern(e, this, ss(e), Ci.FILL);
- u = zC(e), e.restore(), e.fillStyle = X;
- }
- if (g.patternStroke) {
- e.save();
- const X = g.strokeColor.getPattern(e, this, ss(e), Ci.STROKE);
- m = zC(e), e.restore(), e.strokeStyle = X;
- }
- let Z = g.lineWidth;
- const p = g.textMatrixScale;
- if (p === 0 || Z === 0) {
- const X = g.textRenderingMode & hi.FILL_STROKE_MASK;
- (X === hi.STROKE || X === hi.FILL_STROKE) && (Z = this.getSinglePixelWidth());
- } else
- Z /= p;
- if (A !== 1 && (e.scale(A, A), Z /= A), e.lineWidth = Z, C.isInvalidPDFjsFont) {
- const X = [];
- let H = 0;
- for (const S of I)
- X.push(S.unicode), H += S.width;
- e.fillText(X.join(""), 0, 0), g.x += H * h * a, e.restore(), this.compose();
- return;
- }
- let Y = 0, R;
- for (R = 0; R < d; ++R) {
- const X = I[R];
- if (typeof X == "number") {
- Y += c * X * i / 1e3;
- continue;
- }
- let H = !1;
- const S = (X.isSpace ? l : 0) + s, z = X.fontChar, v = X.accent;
- let K, V, N = X.width;
- if (o) {
- const G = X.vmetric || r, w = -(X.vmetric ? G[1] : N * 0.5) * h, W = G[2] * h;
- N = G ? -G[0] : N, K = w / A, V = (Y + W) / A;
- } else
- K = Y / A, V = 0;
- if (C.remeasure && N > 0) {
- const G = e.measureText(z).width * 1e3 / i * A;
- if (N < G && this.isFontSubpixelAAEnabled) {
- const w = N / G;
- H = !0, e.save(), e.scale(w, 1), K /= w;
- } else N !== G && (K += (N - G) / 2e3 * i / A);
- }
- if (this.contentVisible && (X.isInFont || C.missingFile)) {
- if (b && !v)
- e.fillText(z, K, V);
- else if (this.paintChar(z, K, V, u, m), v) {
- const G = K + i * v.offset.x / A, w = V - i * v.offset.y / A;
- this.paintChar(v.fontChar, G, w, u, m);
- }
- }
- const B = o ? N * h - S * n : N * h + S * n;
- Y += B, H && e.restore();
- }
- o ? g.y -= Y : g.x += Y * a, e.restore(), this.compose();
- }
- showType3Text(I) {
- const g = this.ctx, C = this.current, i = C.font, e = C.fontSize, A = C.fontDirection, s = i.vertical ? 1 : -1, l = C.charSpacing, n = C.wordSpacing, a = C.textHScale * A, d = C.fontMatrix || jX, o = I.length, c = C.textRenderingMode === hi.INVISIBLE;
- let r, h, b, u;
- if (!(c || e === 0)) {
- for (this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null, g.save(), g.transform(...C.textMatrix), g.translate(C.x, C.y + C.textRise), g.scale(a, A), r = 0; r < o; ++r) {
- if (h = I[r], typeof h == "number") {
- u = s * h * e / 1e3, this.ctx.translate(u, 0), C.x += u * a;
- continue;
- }
- const m = (h.isSpace ? n : 0) + l, Z = i.charProcOperatorList[h.operatorListId];
- Z ? this.contentVisible && (this.processingType3 = h, this.save(), g.scale(e, e), g.transform(...d), this.executeOperatorList(Z), this.restore()) : DI(`Type3 character "${h.operatorListId}" is not available.`), b = AI.applyTransform([h.width, 0], d)[0] * e + m, g.translate(b, 0), C.x += b * a;
- }
- g.restore(), this.processingType3 = null;
- }
- }
- setCharWidth(I, g) {
- }
- setCharWidthAndBounds(I, g, C, i, e, A) {
- this.ctx.rect(C, i, e - C, A - i), this.ctx.clip(), this.endPath();
- }
- getColorN_Pattern(I) {
- let g;
- if (I[0] === "TilingPattern") {
- const C = this.baseTransform || zC(this.ctx), i = {
- createCanvasGraphics: (e) => new i1(e, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
- optionalContentConfig: this.optionalContentConfig,
- markedContentStack: this.markedContentStack
- })
- };
- g = new hS(I, this.ctx, i, C);
- } else
- g = this._getPattern(I[1], I[2]);
- return g;
- }
- setStrokeColorN() {
- this.current.strokeColor = this.getColorN_Pattern(arguments), this.current.patternStroke = !0;
- }
- setFillColorN() {
- this.current.fillColor = this.getColorN_Pattern(arguments), this.current.patternFill = !0;
- }
- setStrokeRGBColor(I, g, C) {
- this.ctx.strokeStyle = this.current.strokeColor = AI.makeHexColor(I, g, C), this.current.patternStroke = !1;
- }
- setStrokeTransparent() {
- this.ctx.strokeStyle = this.current.strokeColor = "transparent", this.current.patternStroke = !1;
- }
- setFillRGBColor(I, g, C) {
- this.ctx.fillStyle = this.current.fillColor = AI.makeHexColor(I, g, C), this.current.patternFill = !1;
- }
- setFillTransparent() {
- this.ctx.fillStyle = this.current.fillColor = "transparent", this.current.patternFill = !1;
- }
- _getPattern(I, g = null) {
- let C;
- return this.cachedPatterns.has(I) ? C = this.cachedPatterns.get(I) : (C = Gcg(this.getObject(I)), this.cachedPatterns.set(I, C)), g && (C.matrix = g), C;
- }
- shadingFill(I) {
- if (!this.contentVisible)
- return;
- const g = this.ctx;
- this.save();
- const C = this._getPattern(I);
- g.fillStyle = C.getPattern(g, this, ss(g), Ci.SHADING);
- const i = ss(g);
- if (i) {
- const {
- width: e,
- height: A
- } = g.canvas, [s, l, n, a] = AI.getAxialAlignedBoundingBox([0, 0, e, A], i);
- this.ctx.fillRect(s, l, n - s, a - l);
- } else
- this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
- this.compose(this.current.getClippedPathBoundingBox()), this.restore();
- }
- beginInlineImage() {
- BC("Should not call beginInlineImage");
- }
- beginImageData() {
- BC("Should not call beginImageData");
- }
- paintFormXObjectBegin(I, g) {
- if (this.contentVisible && (this.save(), this.baseTransformStack.push(this.baseTransform), I && this.transform(...I), this.baseTransform = zC(this.ctx), g)) {
- const C = g[2] - g[0], i = g[3] - g[1];
- this.ctx.rect(g[0], g[1], C, i), this.current.updateRectMinMax(zC(this.ctx), g), this.clip(), this.endPath();
- }
- }
- paintFormXObjectEnd() {
- this.contentVisible && (this.restore(), this.baseTransform = this.baseTransformStack.pop());
- }
- beginGroup(I) {
- if (!this.contentVisible)
- return;
- this.save(), this.inSMaskMode && (this.endSMaskMode(), this.current.activeSMask = null);
- const g = this.ctx;
- I.isolated || qV("TODO: Support non-isolated groups."), I.knockout && DI("Knockout groups not supported.");
- const C = zC(g);
- if (I.matrix && g.transform(...I.matrix), !I.bbox)
- throw new Error("Bounding box is required.");
- let i = AI.getAxialAlignedBoundingBox(I.bbox, zC(g));
- const e = [0, 0, g.canvas.width, g.canvas.height];
- i = AI.intersect(i, e) || [0, 0, 0, 0];
- const A = Math.floor(i[0]), s = Math.floor(i[1]), l = Math.max(Math.ceil(i[2]) - A, 1), n = Math.max(Math.ceil(i[3]) - s, 1);
- this.current.startNewPathAndClipBox([0, 0, l, n]);
- let a = "groupAt" + this.groupLevel;
- I.smask && (a += "_smask_" + this.smaskCounter++ % 2);
- const d = this.cachedCanvases.getCanvas(a, l, n), o = d.context;
- o.translate(-A, -s), o.transform(...C);
- let c = new Path2D();
- const [r, h, b, u] = I.bbox;
- if (c.rect(r, h, b - r, u - h), I.matrix) {
- const m = new Path2D();
- m.addPath(c, new DOMMatrix(I.matrix)), c = m;
- }
- o.clip(c), I.smask ? this.smaskStack.push({
- canvas: d.canvas,
- context: o,
- offsetX: A,
- offsetY: s,
- subtype: I.smask.subtype,
- backdrop: I.smask.backdrop,
- transferMap: I.smask.transferMap || null,
- startTransformInverse: null
- }) : (g.setTransform(1, 0, 0, 1, 0, 0), g.translate(A, s), g.save()), Hu(g, o), this.ctx = o, this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]), this.groupStack.push(g), this.groupLevel++;
- }
- endGroup(I) {
- if (!this.contentVisible)
- return;
- this.groupLevel--;
- const g = this.ctx, C = this.groupStack.pop();
- if (this.ctx = C, this.ctx.imageSmoothingEnabled = !1, I.smask)
- this.tempSMask = this.smaskStack.pop(), this.restore();
- else {
- this.ctx.restore();
- const i = zC(this.ctx);
- this.restore(), this.ctx.save(), this.ctx.setTransform(...i);
- const e = AI.getAxialAlignedBoundingBox([0, 0, g.canvas.width, g.canvas.height], i);
- this.ctx.drawImage(g.canvas, 0, 0), this.ctx.restore(), this.compose(e);
- }
- }
- beginAnnotation(I, g, C, i, e) {
- if (ig(this, JA, bS).call(this), JY(this.ctx), this.ctx.save(), this.save(), this.baseTransform && this.ctx.setTransform(...this.baseTransform), g) {
- const A = g[2] - g[0], s = g[3] - g[1];
- if (e && this.annotationCanvasMap) {
- C = C.slice(), C[4] -= g[0], C[5] -= g[1], g = g.slice(), g[0] = g[1] = 0, g[2] = A, g[3] = s;
- const [l, n] = AI.singularValueDecompose2dScale(zC(this.ctx)), {
- viewportScale: a
- } = this, d = Math.ceil(A * this.outputScaleX * a), o = Math.ceil(s * this.outputScaleY * a);
- this.annotationCanvas = this.canvasFactory.create(d, o);
- const {
- canvas: c,
- context: r
- } = this.annotationCanvas;
- this.annotationCanvasMap.set(I, c), this.annotationCanvas.savedCtx = this.ctx, this.ctx = r, this.ctx.save(), this.ctx.setTransform(l, 0, 0, -n, 0, s * n), JY(this.ctx);
- } else
- JY(this.ctx), this.endPath(), this.ctx.rect(g[0], g[1], A, s), this.ctx.clip(), this.ctx.beginPath();
- }
- this.current = new a8(this.ctx.canvas.width, this.ctx.canvas.height), this.transform(...C), this.transform(...i);
- }
- endAnnotation() {
- this.annotationCanvas && (this.ctx.restore(), ig(this, JA, uS).call(this), this.ctx = this.annotationCanvas.savedCtx, delete this.annotationCanvas.savedCtx, delete this.annotationCanvas);
- }
- paintImageMaskXObject(I) {
- if (!this.contentVisible)
- return;
- const g = I.count;
- I = this.getObject(I.data, I), I.count = g;
- const C = this.ctx, i = this.processingType3;
- if (i && (i.compiled === void 0 && (i.compiled = ycg(I)), i.compiled)) {
- C.fill(i.compiled);
- return;
- }
- const e = this._createMaskCanvas(I), A = e.canvas;
- C.save(), C.setTransform(1, 0, 0, 1, 0, 0), C.drawImage(A, e.offsetX, e.offsetY), C.restore(), this.compose();
- }
- paintImageMaskXObjectRepeat(I, g, C = 0, i = 0, e, A) {
- if (!this.contentVisible)
- return;
- I = this.getObject(I.data, I);
- const s = this.ctx;
- s.save();
- const l = zC(s);
- s.transform(g, C, i, e, 0, 0);
- const n = this._createMaskCanvas(I);
- s.setTransform(1, 0, 0, 1, n.offsetX - l[4], n.offsetY - l[5]);
- for (let a = 0, d = A.length; a < d; a += 2) {
- const o = AI.transform(l, [g, C, i, e, A[a], A[a + 1]]), [c, r] = AI.applyTransform([0, 0], o);
- s.drawImage(n.canvas, c, r);
- }
- s.restore(), this.compose();
- }
- paintImageMaskXObjectGroup(I) {
- if (!this.contentVisible)
- return;
- const g = this.ctx, C = this.current.fillColor, i = this.current.patternFill;
- for (const e of I) {
- const {
- data: A,
- width: s,
- height: l,
- transform: n
- } = e, a = this.cachedCanvases.getCanvas("maskCanvas", s, l), d = a.context;
- d.save();
- const o = this.getObject(A, e);
- c8(d, o), d.globalCompositeOperation = "source-in", d.fillStyle = i ? C.getPattern(d, this, ss(g), Ci.FILL) : C, d.fillRect(0, 0, s, l), d.restore(), g.save(), g.transform(...n), g.scale(1, -1), zY(g, a.canvas, 0, 0, s, l, 0, -1, 1, 1), g.restore();
- }
- this.compose();
- }
- paintImageXObject(I) {
- if (!this.contentVisible)
- return;
- const g = this.getObject(I);
- if (!g) {
- DI("Dependent image isn't ready yet");
- return;
- }
- this.paintInlineImageXObject(g);
- }
- paintImageXObjectRepeat(I, g, C, i) {
- if (!this.contentVisible)
- return;
- const e = this.getObject(I);
- if (!e) {
- DI("Dependent image isn't ready yet");
- return;
- }
- const A = e.width, s = e.height, l = [];
- for (let n = 0, a = i.length; n < a; n += 2)
- l.push({
- transform: [g, 0, 0, C, i[n], i[n + 1]],
- x: 0,
- y: 0,
- w: A,
- h: s
- });
- this.paintInlineImageXObjectGroup(e, l);
- }
- applyTransferMapsToCanvas(I) {
- return this.current.transferMaps !== "none" && (I.filter = this.current.transferMaps, I.drawImage(I.canvas, 0, 0), I.filter = "none"), I.canvas;
- }
- applyTransferMapsToBitmap(I) {
- if (this.current.transferMaps === "none")
- return I.bitmap;
- const {
- bitmap: g,
- width: C,
- height: i
- } = I, e = this.cachedCanvases.getCanvas("inlineImage", C, i), A = e.context;
- return A.filter = this.current.transferMaps, A.drawImage(g, 0, 0), A.filter = "none", e.canvas;
- }
- paintInlineImageXObject(I) {
- if (!this.contentVisible)
- return;
- const g = I.width, C = I.height, i = this.ctx;
- if (this.save(), !$t) {
- const {
- filter: s
- } = i;
- s !== "none" && s !== "" && (i.filter = "none");
- }
- i.scale(1 / g, -1 / C);
- let e;
- if (I.bitmap)
- e = this.applyTransferMapsToBitmap(I);
- else if (typeof HTMLElement == "function" && I instanceof HTMLElement || !I.data)
- e = I;
- else {
- const l = this.cachedCanvases.getCanvas("inlineImage", g, C).context;
- o8(l, I), e = this.applyTransferMapsToCanvas(l);
- }
- const A = this._scaleImage(e, ss(i));
- i.imageSmoothingEnabled = d8(zC(i), I.interpolate), zY(i, A.img, 0, 0, A.paintWidth, A.paintHeight, 0, -C, g, C), this.compose(), this.restore();
- }
- paintInlineImageXObjectGroup(I, g) {
- if (!this.contentVisible)
- return;
- const C = this.ctx;
- let i;
- if (I.bitmap)
- i = I.bitmap;
- else {
- const e = I.width, A = I.height, l = this.cachedCanvases.getCanvas("inlineImage", e, A).context;
- o8(l, I), i = this.applyTransferMapsToCanvas(l);
- }
- for (const e of g)
- C.save(), C.transform(...e.transform), C.scale(1, -1), zY(C, i, e.x, e.y, e.w, e.h, 0, -1, 1, 1), C.restore();
- this.compose();
- }
- paintSolidColorImageMask() {
- this.contentVisible && (this.ctx.fillRect(0, 0, 1, 1), this.compose());
- }
- markPoint(I) {
- }
- markPointProps(I, g) {
- }
- beginMarkedContent(I) {
- this.markedContentStack.push({
- visible: !0
- });
- }
- beginMarkedContentProps(I, g) {
- I === "OC" ? this.markedContentStack.push({
- visible: this.optionalContentConfig.isVisible(g)
- }) : this.markedContentStack.push({
- visible: !0
- }), this.contentVisible = this.isContentVisible();
- }
- endMarkedContent() {
- this.markedContentStack.pop(), this.contentVisible = this.isContentVisible();
- }
- beginCompat() {
- }
- endCompat() {
- }
- consumePath(I, g) {
- const C = this.current.isEmptyClip();
- this.pendingClip && this.current.updateClipFromPath(), this.pendingClip || this.compose(g);
- const i = this.ctx;
- this.pendingClip && (C || (this.pendingClip === r8 ? i.clip(I, "evenodd") : i.clip(I)), this.pendingClip = null), this.current.startNewPathAndClipBox(this.current.clipBox), i.beginPath();
- }
- getSinglePixelWidth() {
- if (!this._cachedGetSinglePixelWidth) {
- const I = zC(this.ctx);
- if (I[1] === 0 && I[2] === 0)
- this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(I[0]), Math.abs(I[3]));
- else {
- const g = Math.abs(I[0] * I[3] - I[2] * I[1]), C = Math.hypot(I[0], I[2]), i = Math.hypot(I[1], I[3]);
- this._cachedGetSinglePixelWidth = Math.max(C, i) / g;
- }
- }
- return this._cachedGetSinglePixelWidth;
- }
- getScaleForStroking() {
- if (this._cachedScaleForStroking[0] === -1) {
- const {
- lineWidth: I
- } = this.current, {
- a: g,
- b: C,
- c: i,
- d: e
- } = this.ctx.getTransform();
- let A, s;
- if (C === 0 && i === 0) {
- const l = Math.abs(g), n = Math.abs(e);
- if (l === n)
- if (I === 0)
- A = s = 1 / l;
- else {
- const a = l * I;
- A = s = a < 1 ? 1 / a : 1;
- }
- else if (I === 0)
- A = 1 / l, s = 1 / n;
- else {
- const a = l * I, d = n * I;
- A = a < 1 ? 1 / a : 1, s = d < 1 ? 1 / d : 1;
- }
- } else {
- const l = Math.abs(g * e - C * i), n = Math.hypot(g, C), a = Math.hypot(i, e);
- if (I === 0)
- A = a / l, s = n / l;
- else {
- const d = I * l;
- A = a > d ? a / d : 1, s = n > d ? n / d : 1;
- }
- }
- this._cachedScaleForStroking[0] = A, this._cachedScaleForStroking[1] = s;
- }
- return this._cachedScaleForStroking;
- }
- rescaleAndStroke(I, g) {
- const {
- ctx: C,
- current: {
- lineWidth: i
- }
- } = this, [e, A] = this.getScaleForStroking();
- if (e === A) {
- C.lineWidth = (i || 1) * e, C.stroke(I);
- return;
- }
- const s = C.getLineDash();
- g && C.save(), C.scale(e, A), QH.a = 1 / e, QH.d = 1 / A;
- const l = new Path2D();
- if (l.addPath(I, QH), s.length > 0) {
- const n = Math.max(e, A);
- C.setLineDash(s.map((a) => a / n)), C.lineDashOffset /= n;
- }
- C.lineWidth = i || 1, C.stroke(l), g && C.restore();
- }
- isContentVisible() {
- for (let I = this.markedContentStack.length - 1; I >= 0; I--)
- if (!this.markedContentStack[I].visible)
- return !1;
- return !0;
- }
- };
- JA = new WeakSet(), bS = function() {
- for (; this.stateStack.length || this.inSMaskMode; )
- this.restore();
- this.current.activeSMask = null, this.ctx.restore(), this.transparentCanvas && (this.ctx = this.compositeCtx, this.ctx.save(), this.ctx.setTransform(1, 0, 0, 1, 0, 0), this.ctx.drawImage(this.transparentCanvas, 0, 0), this.ctx.restore(), this.transparentCanvas = null);
- }, uS = function() {
- if (this.pageColors) {
- const I = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background);
- if (I !== "none") {
- const g = this.ctx.filter;
- this.ctx.filter = I, this.ctx.drawImage(this.ctx.canvas, 0, 0), this.ctx.filter = g;
- }
- }
- }, mS = function(I, g, C) {
- const i = new Path2D();
- return i.addPath(I, new DOMMatrix(C).invertSelf().multiplySelf(g)), i;
- };
- let oh = i1;
- for (const t in IV)
- oh.prototype[t] !== void 0 && (oh.prototype[IV[t]] = oh.prototype[t]);
- var AZ, sZ;
- class Ql {
- static get workerPort() {
- return M(this, AZ);
- }
- static set workerPort(I) {
- if (!(typeof Worker < "u" && I instanceof Worker) && I !== null)
- throw new Error("Invalid `workerPort` type.");
- $(this, AZ, I);
- }
- static get workerSrc() {
- return M(this, sZ);
- }
- static set workerSrc(I) {
- if (typeof I != "string")
- throw new Error("Invalid `workerSrc` type.");
- $(this, sZ, I);
- }
- }
- AZ = new WeakMap(), sZ = new WeakMap(), tg(Ql, AZ, null), tg(Ql, sZ, "");
- var Yc, lZ;
- class Mcg {
- constructor({
- parsedData: I,
- rawData: g
- }) {
- tg(this, Yc);
- tg(this, lZ);
- $(this, Yc, I), $(this, lZ, g);
- }
- getRaw() {
- return M(this, lZ);
- }
- get(I) {
- return M(this, Yc).get(I) ?? null;
- }
- getAll() {
- return c9(M(this, Yc));
- }
- has(I) {
- return M(this, Yc).has(I);
- }
- }
- Yc = new WeakMap(), lZ = new WeakMap();
- const _r = Symbol("INTERNAL");
- var nZ, aZ, oZ, Kh;
- class Rcg {
- constructor(I, {
- name: g,
- intent: C,
- usage: i,
- rbGroups: e
- }) {
- tg(this, nZ, !1);
- tg(this, aZ, !1);
- tg(this, oZ, !1);
- tg(this, Kh, !0);
- $(this, nZ, !!(I & ye.DISPLAY)), $(this, aZ, !!(I & ye.PRINT)), this.name = g, this.intent = C, this.usage = i, this.rbGroups = e;
- }
- get visible() {
- if (M(this, oZ))
- return M(this, Kh);
- if (!M(this, Kh))
- return !1;
- const {
- print: I,
- view: g
- } = this.usage;
- return M(this, nZ) ? (g == null ? void 0 : g.viewState) !== "OFF" : M(this, aZ) ? (I == null ? void 0 : I.printState) !== "OFF" : !0;
- }
- _setVisible(I, g, C = !1) {
- I !== _r && BC("Internal method `_setVisible` called."), $(this, oZ, C), $(this, Kh, g);
- }
- }
- nZ = new WeakMap(), aZ = new WeakMap(), oZ = new WeakMap(), Kh = new WeakMap();
- var ya, bC, Fh, kh, cZ, ZS;
- class fcg {
- constructor(I, g = ye.DISPLAY) {
- tg(this, cZ);
- tg(this, ya, null);
- tg(this, bC, /* @__PURE__ */ new Map());
- tg(this, Fh, null);
- tg(this, kh, null);
- if (this.renderingIntent = g, this.name = null, this.creator = null, I !== null) {
- this.name = I.name, this.creator = I.creator, $(this, kh, I.order);
- for (const C of I.groups)
- M(this, bC).set(C.id, new Rcg(g, C));
- if (I.baseState === "OFF")
- for (const C of M(this, bC).values())
- C._setVisible(_r, !1);
- for (const C of I.on)
- M(this, bC).get(C)._setVisible(_r, !0);
- for (const C of I.off)
- M(this, bC).get(C)._setVisible(_r, !1);
- $(this, Fh, this.getHash());
- }
- }
- isVisible(I) {
- if (M(this, bC).size === 0)
- return !0;
- if (!I)
- return qV("Optional content group not defined."), !0;
- if (I.type === "OCG")
- return M(this, bC).has(I.id) ? M(this, bC).get(I.id).visible : (DI(`Optional content group not found: ${I.id}`), !0);
- if (I.type === "OCMD") {
- if (I.expression)
- return ig(this, cZ, ZS).call(this, I.expression);
- if (!I.policy || I.policy === "AnyOn") {
- for (const g of I.ids) {
- if (!M(this, bC).has(g))
- return DI(`Optional content group not found: ${g}`), !0;
- if (M(this, bC).get(g).visible)
- return !0;
- }
- return !1;
- } else if (I.policy === "AllOn") {
- for (const g of I.ids) {
- if (!M(this, bC).has(g))
- return DI(`Optional content group not found: ${g}`), !0;
- if (!M(this, bC).get(g).visible)
- return !1;
- }
- return !0;
- } else if (I.policy === "AnyOff") {
- for (const g of I.ids) {
- if (!M(this, bC).has(g))
- return DI(`Optional content group not found: ${g}`), !0;
- if (!M(this, bC).get(g).visible)
- return !0;
- }
- return !1;
- } else if (I.policy === "AllOff") {
- for (const g of I.ids) {
- if (!M(this, bC).has(g))
- return DI(`Optional content group not found: ${g}`), !0;
- if (M(this, bC).get(g).visible)
- return !1;
- }
- return !0;
- }
- return DI(`Unknown optional content policy ${I.policy}.`), !0;
- }
- return DI(`Unknown group type ${I.type}.`), !0;
- }
- setVisibility(I, g = !0, C = !0) {
- var e;
- const i = M(this, bC).get(I);
- if (!i) {
- DI(`Optional content group not found: ${I}`);
- return;
- }
- if (C && g && i.rbGroups.length)
- for (const A of i.rbGroups)
- for (const s of A)
- s !== I && ((e = M(this, bC).get(s)) == null || e._setVisible(_r, !1, !0));
- i._setVisible(_r, !!g, !0), $(this, ya, null);
- }
- setOCGState({
- state: I,
- preserveRB: g
- }) {
- let C;
- for (const i of I) {
- switch (i) {
- case "ON":
- case "OFF":
- case "Toggle":
- C = i;
- continue;
- }
- const e = M(this, bC).get(i);
- if (e)
- switch (C) {
- case "ON":
- this.setVisibility(i, !0, g);
- break;
- case "OFF":
- this.setVisibility(i, !1, g);
- break;
- case "Toggle":
- this.setVisibility(i, !e.visible, g);
- break;
- }
- }
- $(this, ya, null);
- }
- get hasInitialVisibility() {
- return M(this, Fh) === null || this.getHash() === M(this, Fh);
- }
- getOrder() {
- return M(this, bC).size ? M(this, kh) ? M(this, kh).slice() : [...M(this, bC).keys()] : null;
- }
- getGroups() {
- return M(this, bC).size > 0 ? c9(M(this, bC)) : null;
- }
- getGroup(I) {
- return M(this, bC).get(I) || null;
- }
- getHash() {
- if (M(this, ya) !== null)
- return M(this, ya);
- const I = new agg();
- for (const [g, C] of M(this, bC))
- I.update(`${g}:${C.visible}`);
- return $(this, ya, I.hexdigest());
- }
- }
- ya = new WeakMap(), bC = new WeakMap(), Fh = new WeakMap(), kh = new WeakMap(), cZ = new WeakSet(), ZS = function(I) {
- const g = I.length;
- if (g < 2)
- return !0;
- const C = I[0];
- for (let i = 1; i < g; i++) {
- const e = I[i];
- let A;
- if (Array.isArray(e))
- A = ig(this, cZ, ZS).call(this, e);
- else if (M(this, bC).has(e))
- A = M(this, bC).get(e).visible;
- else
- return DI(`Optional content group not found: ${e}`), !0;
- switch (C) {
- case "And":
- if (!A)
- return !1;
- break;
- case "Or":
- if (A)
- return !0;
- break;
- case "Not":
- return !A;
- default:
- return !0;
- }
- }
- return C === "And";
- };
- class Hcg {
- constructor(I, {
- disableRange: g = !1,
- disableStream: C = !1
- }) {
- ut(I, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.');
- const {
- length: i,
- initialData: e,
- progressiveDone: A,
- contentDispositionFilename: s
- } = I;
- if (this._queuedChunks = [], this._progressiveDone = A, this._contentDispositionFilename = s, (e == null ? void 0 : e.length) > 0) {
- const l = e instanceof Uint8Array && e.byteLength === e.buffer.byteLength ? e.buffer : new Uint8Array(e).buffer;
- this._queuedChunks.push(l);
- }
- this._pdfDataRangeTransport = I, this._isStreamingSupported = !C, this._isRangeSupported = !g, this._contentLength = i, this._fullRequestReader = null, this._rangeReaders = [], I.addRangeListener((l, n) => {
- this._onReceiveData({
- begin: l,
- chunk: n
- });
- }), I.addProgressListener((l, n) => {
- this._onProgress({
- loaded: l,
- total: n
- });
- }), I.addProgressiveReadListener((l) => {
- this._onReceiveData({
- chunk: l
- });
- }), I.addProgressiveDoneListener(() => {
- this._onProgressiveDone();
- }), I.transportReady();
- }
- _onReceiveData({
- begin: I,
- chunk: g
- }) {
- const C = g instanceof Uint8Array && g.byteLength === g.buffer.byteLength ? g.buffer : new Uint8Array(g).buffer;
- if (I === void 0)
- this._fullRequestReader ? this._fullRequestReader._enqueue(C) : this._queuedChunks.push(C);
- else {
- const i = this._rangeReaders.some(function(e) {
- return e._begin !== I ? !1 : (e._enqueue(C), !0);
- });
- ut(i, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.");
- }
- }
- get _progressiveDataLength() {
- var I;
- return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
- }
- _onProgress(I) {
- var g, C, i, e;
- I.total === void 0 ? (C = (g = this._rangeReaders[0]) == null ? void 0 : g.onProgress) == null || C.call(g, {
- loaded: I.loaded
- }) : (e = (i = this._fullRequestReader) == null ? void 0 : i.onProgress) == null || e.call(i, {
- loaded: I.loaded,
- total: I.total
- });
- }
- _onProgressiveDone() {
- var I;
- (I = this._fullRequestReader) == null || I.progressiveDone(), this._progressiveDone = !0;
- }
- _removeRangeReader(I) {
- const g = this._rangeReaders.indexOf(I);
- g >= 0 && this._rangeReaders.splice(g, 1);
- }
- getFullReader() {
- ut(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once.");
- const I = this._queuedChunks;
- return this._queuedChunks = null, new Xcg(this, I, this._progressiveDone, this._contentDispositionFilename);
- }
- getRangeReader(I, g) {
- if (g <= this._progressiveDataLength)
- return null;
- const C = new Scg(this, I, g);
- return this._pdfDataRangeTransport.requestDataRange(I, g), this._rangeReaders.push(C), C;
- }
- cancelAllRequests(I) {
- var g;
- (g = this._fullRequestReader) == null || g.cancel(I);
- for (const C of this._rangeReaders.slice(0))
- C.cancel(I);
- this._pdfDataRangeTransport.abort();
- }
- }
- class Xcg {
- constructor(I, g, C = !1, i = null) {
- this._stream = I, this._done = C || !1, this._filename = h9(i) ? i : null, this._queuedChunks = g || [], this._loaded = 0;
- for (const e of this._queuedChunks)
- this._loaded += e.byteLength;
- this._requests = [], this._headersReady = Promise.resolve(), I._fullRequestReader = this, this.onProgress = null;
- }
- _enqueue(I) {
- this._done || (this._requests.length > 0 ? this._requests.shift().resolve({
- value: I,
- done: !1
- }) : this._queuedChunks.push(I), this._loaded += I.byteLength);
- }
- get headersReady() {
- return this._headersReady;
- }
- get filename() {
- return this._filename;
- }
- get isRangeSupported() {
- return this._stream._isRangeSupported;
- }
- get isStreamingSupported() {
- return this._stream._isStreamingSupported;
- }
- get contentLength() {
- return this._stream._contentLength;
- }
- async read() {
- if (this._queuedChunks.length > 0)
- return {
- value: this._queuedChunks.shift(),
- done: !1
- };
- if (this._done)
- return {
- value: void 0,
- done: !0
- };
- const I = Promise.withResolvers();
- return this._requests.push(I), I.promise;
- }
- cancel(I) {
- this._done = !0;
- for (const g of this._requests)
- g.resolve({
- value: void 0,
- done: !0
- });
- this._requests.length = 0;
- }
- progressiveDone() {
- this._done || (this._done = !0);
- }
- }
- class Scg {
- constructor(I, g, C) {
- this._stream = I, this._begin = g, this._end = C, this._queuedChunk = null, this._requests = [], this._done = !1, this.onProgress = null;
- }
- _enqueue(I) {
- if (!this._done) {
- if (this._requests.length === 0)
- this._queuedChunk = I;
- else {
- this._requests.shift().resolve({
- value: I,
- done: !1
- });
- for (const C of this._requests)
- C.resolve({
- value: void 0,
- done: !0
- });
- this._requests.length = 0;
- }
- this._done = !0, this._stream._removeRangeReader(this);
- }
- }
- get isStreamingSupported() {
- return !1;
- }
- async read() {
- if (this._queuedChunk) {
- const g = this._queuedChunk;
- return this._queuedChunk = null, {
- value: g,
- done: !1
- };
- }
- if (this._done)
- return {
- value: void 0,
- done: !0
- };
- const I = Promise.withResolvers();
- return this._requests.push(I), I.promise;
- }
- cancel(I) {
- this._done = !0;
- for (const g of this._requests)
- g.resolve({
- value: void 0,
- done: !0
- });
- this._requests.length = 0, this._stream._removeRangeReader(this);
- }
- }
- function Dcg(t) {
- let I = !0, g = C("filename\\*", "i").exec(t);
- if (g) {
- g = g[1];
- let a = s(g);
- return a = unescape(a), a = l(a), a = n(a), e(a);
- }
- if (g = A(t), g) {
- const a = n(g);
- return e(a);
- }
- if (g = C("filename", "i").exec(t), g) {
- g = g[1];
- let a = s(g);
- return a = n(a), e(a);
- }
- function C(a, d) {
- return new RegExp("(?:^|;)\\s*" + a + '\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)', d);
- }
- function i(a, d) {
- if (a) {
- if (!/^[\x00-\xFF]+$/.test(d))
- return d;
- try {
- const o = new TextDecoder(a, {
- fatal: !0
- }), c = eG(d);
- d = o.decode(c), I = !1;
- } catch {
- }
- }
- return d;
- }
- function e(a) {
- return I && /[\x80-\xff]/.test(a) && (a = i("utf-8", a), I && (a = i("iso-8859-1", a))), a;
- }
- function A(a) {
- const d = [];
- let o;
- const c = C("filename\\*((?!0\\d)\\d+)(\\*?)", "ig");
- for (; (o = c.exec(a)) !== null; ) {
- let [, h, b, u] = o;
- if (h = parseInt(h, 10), h in d) {
- if (h === 0)
- break;
- continue;
- }
- d[h] = [b, u];
- }
- const r = [];
- for (let h = 0; h < d.length && h in d; ++h) {
- let [b, u] = d[h];
- u = s(u), b && (u = unescape(u), h === 0 && (u = l(u))), r.push(u);
- }
- return r.join("");
- }
- function s(a) {
- if (a.startsWith('"')) {
- const d = a.slice(1).split('\\"');
- for (let o = 0; o < d.length; ++o) {
- const c = d[o].indexOf('"');
- c !== -1 && (d[o] = d[o].slice(0, c), d.length = o + 1), d[o] = d[o].replaceAll(/\\(.)/g, "$1");
- }
- a = d.join('"');
- }
- return a;
- }
- function l(a) {
- const d = a.indexOf("'");
- if (d === -1)
- return a;
- const o = a.slice(0, d), r = a.slice(d + 1).replace(/^[^']*'/, "");
- return i(o, r);
- }
- function n(a) {
- return !a.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(a) ? a : a.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function(d, o, c, r) {
- if (c === "q" || c === "Q")
- return r = r.replaceAll("_", " "), r = r.replaceAll(/=([0-9a-fA-F]{2})/g, function(h, b) {
- return String.fromCharCode(parseInt(b, 16));
- }), i(o, r);
- try {
- r = atob(r);
- } catch {
- }
- return i(o, r);
- });
- }
- return "";
- }
- function pgg(t, I) {
- const g = new Headers();
- if (!t || !I || typeof I != "object")
- return g;
- for (const C in I) {
- const i = I[C];
- i !== void 0 && g.append(C, i);
- }
- return g;
- }
- function gM(t) {
- var I;
- return ((I = URL.parse(t)) == null ? void 0 : I.origin) ?? null;
- }
- function Bgg({
- responseHeaders: t,
- isHttp: I,
- rangeChunkSize: g,
- disableRange: C
- }) {
- const i = {
- allowRangeRequests: !1,
- suggestedLength: void 0
- }, e = parseInt(t.get("Content-Length"), 10);
- return !Number.isInteger(e) || (i.suggestedLength = e, e <= 2 * g) || C || !I || t.get("Accept-Ranges") !== "bytes" || (t.get("Content-Encoding") || "identity") !== "identity" || (i.allowRangeRequests = !0), i;
- }
- function Wgg(t) {
- const I = t.get("Content-Disposition");
- if (I) {
- let g = Dcg(I);
- if (g.includes("%"))
- try {
- g = decodeURIComponent(g);
- } catch {
- }
- if (h9(g))
- return g;
- }
- return null;
- }
- function nG(t, I) {
- return new CV(`Unexpected server response (${t}) while retrieving PDF "${I}".`, t, t === 404 || t === 0 && I.startsWith("file:"));
- }
- function ygg(t) {
- return t === 200 || t === 206;
- }
- function Ygg(t, I, g) {
- return {
- method: "GET",
- headers: t,
- signal: g.signal,
- mode: "cors",
- credentials: I ? "include" : "same-origin",
- redirect: "follow"
- };
- }
- function Ngg(t) {
- return t instanceof Uint8Array ? t.buffer : t instanceof ArrayBuffer ? t : (DI(`getArrayBuffer - unexpected data format: ${t}`), new Uint8Array(t).buffer);
- }
- class h8 {
- constructor(I) {
- iI(this, "_responseOrigin", null);
- this.source = I, this.isHttp = /^https?:/i.test(I.url), this.headers = pgg(this.isHttp, I.httpHeaders), this._fullRequestReader = null, this._rangeRequestReaders = [];
- }
- get _progressiveDataLength() {
- var I;
- return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
- }
- getFullReader() {
- return ut(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."), this._fullRequestReader = new Kcg(this), this._fullRequestReader;
- }
- getRangeReader(I, g) {
- if (g <= this._progressiveDataLength)
- return null;
- const C = new Fcg(this, I, g);
- return this._rangeRequestReaders.push(C), C;
- }
- cancelAllRequests(I) {
- var g;
- (g = this._fullRequestReader) == null || g.cancel(I);
- for (const C of this._rangeRequestReaders.slice(0))
- C.cancel(I);
- }
- }
- class Kcg {
- constructor(I) {
- this._stream = I, this._reader = null, this._loaded = 0, this._filename = null;
- const g = I.source;
- this._withCredentials = g.withCredentials || !1, this._contentLength = g.length, this._headersCapability = Promise.withResolvers(), this._disableRange = g.disableRange || !1, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._abortController = new AbortController(), this._isStreamingSupported = !g.disableStream, this._isRangeSupported = !g.disableRange;
- const C = new Headers(I.headers), i = g.url;
- fetch(i, Ygg(C, this._withCredentials, this._abortController)).then((e) => {
- if (I._responseOrigin = gM(e.url), !ygg(e.status))
- throw nG(e.status, i);
- this._reader = e.body.getReader(), this._headersCapability.resolve();
- const A = e.headers, {
- allowRangeRequests: s,
- suggestedLength: l
- } = Bgg({
- responseHeaders: A,
- isHttp: I.isHttp,
- rangeChunkSize: this._rangeChunkSize,
- disableRange: this._disableRange
- });
- this._isRangeSupported = s, this._contentLength = l || this._contentLength, this._filename = Wgg(A), !this._isStreamingSupported && this._isRangeSupported && this.cancel(new Ea("Streaming is disabled."));
- }).catch(this._headersCapability.reject), this.onProgress = null;
- }
- get headersReady() {
- return this._headersCapability.promise;
- }
- get filename() {
- return this._filename;
- }
- get contentLength() {
- return this._contentLength;
- }
- get isRangeSupported() {
- return this._isRangeSupported;
- }
- get isStreamingSupported() {
- return this._isStreamingSupported;
- }
- async read() {
- var C;
- await this._headersCapability.promise;
- const {
- value: I,
- done: g
- } = await this._reader.read();
- return g ? {
- value: I,
- done: g
- } : (this._loaded += I.byteLength, (C = this.onProgress) == null || C.call(this, {
- loaded: this._loaded,
- total: this._contentLength
- }), {
- value: Ngg(I),
- done: !1
- });
- }
- cancel(I) {
- var g;
- (g = this._reader) == null || g.cancel(I), this._abortController.abort();
- }
- }
- class Fcg {
- constructor(I, g, C) {
- this._stream = I, this._reader = null, this._loaded = 0;
- const i = I.source;
- this._withCredentials = i.withCredentials || !1, this._readCapability = Promise.withResolvers(), this._isStreamingSupported = !i.disableStream, this._abortController = new AbortController();
- const e = new Headers(I.headers);
- e.append("Range", `bytes=${g}-${C - 1}`);
- const A = i.url;
- fetch(A, Ygg(e, this._withCredentials, this._abortController)).then((s) => {
- const l = gM(s.url);
- if (l !== I._responseOrigin)
- throw new Error(`Expected range response-origin "${l}" to match "${I._responseOrigin}".`);
- if (!ygg(s.status))
- throw nG(s.status, A);
- this._readCapability.resolve(), this._reader = s.body.getReader();
- }).catch(this._readCapability.reject), this.onProgress = null;
- }
- get isStreamingSupported() {
- return this._isStreamingSupported;
- }
- async read() {
- var C;
- await this._readCapability.promise;
- const {
- value: I,
- done: g
- } = await this._reader.read();
- return g ? {
- value: I,
- done: g
- } : (this._loaded += I.byteLength, (C = this.onProgress) == null || C.call(this, {
- loaded: this._loaded
- }), {
- value: Ngg(I),
- done: !1
- });
- }
- cancel(I) {
- var g;
- (g = this._reader) == null || g.cancel(I), this._abortController.abort();
- }
- }
- const OH = 200, UH = 206;
- function kcg(t) {
- const I = t.response;
- return typeof I != "string" ? I : eG(I).buffer;
- }
- class zcg {
- constructor({
- url: I,
- httpHeaders: g,
- withCredentials: C
- }) {
- iI(this, "_responseOrigin", null);
- this.url = I, this.isHttp = /^https?:/i.test(I), this.headers = pgg(this.isHttp, g), this.withCredentials = C || !1, this.currXhrId = 0, this.pendingRequests = /* @__PURE__ */ Object.create(null);
- }
- request(I) {
- const g = new XMLHttpRequest(), C = this.currXhrId++, i = this.pendingRequests[C] = {
- xhr: g
- };
- g.open("GET", this.url), g.withCredentials = this.withCredentials;
- for (const [e, A] of this.headers)
- g.setRequestHeader(e, A);
- return this.isHttp && "begin" in I && "end" in I ? (g.setRequestHeader("Range", `bytes=${I.begin}-${I.end - 1}`), i.expectedStatus = UH) : i.expectedStatus = OH, g.responseType = "arraybuffer", ut(I.onError, "Expected `onError` callback to be provided."), g.onerror = () => {
- I.onError(g.status);
- }, g.onreadystatechange = this.onStateChange.bind(this, C), g.onprogress = this.onProgress.bind(this, C), i.onHeadersReceived = I.onHeadersReceived, i.onDone = I.onDone, i.onError = I.onError, i.onProgress = I.onProgress, g.send(null), C;
- }
- onProgress(I, g) {
- var i;
- const C = this.pendingRequests[I];
- C && ((i = C.onProgress) == null || i.call(C, g));
- }
- onStateChange(I, g) {
- const C = this.pendingRequests[I];
- if (!C)
- return;
- const i = C.xhr;
- if (i.readyState >= 2 && C.onHeadersReceived && (C.onHeadersReceived(), delete C.onHeadersReceived), i.readyState !== 4 || !(I in this.pendingRequests))
- return;
- if (delete this.pendingRequests[I], i.status === 0 && this.isHttp) {
- C.onError(i.status);
- return;
- }
- const e = i.status || OH;
- if (!(e === OH && C.expectedStatus === UH) && e !== C.expectedStatus) {
- C.onError(i.status);
- return;
- }
- const s = kcg(i);
- if (e === UH) {
- const l = i.getResponseHeader("Content-Range"), n = /bytes (\d+)-(\d+)\/(\d+)/.exec(l);
- n ? C.onDone({
- begin: parseInt(n[1], 10),
- chunk: s
- }) : (DI('Missing or invalid "Content-Range" header.'), C.onError(0));
- } else s ? C.onDone({
- begin: 0,
- chunk: s
- }) : C.onError(i.status);
- }
- getRequestXhr(I) {
- return this.pendingRequests[I].xhr;
- }
- isPendingRequest(I) {
- return I in this.pendingRequests;
- }
- abortRequest(I) {
- const g = this.pendingRequests[I].xhr;
- delete this.pendingRequests[I], g.abort();
- }
- }
- class Jcg {
- constructor(I) {
- this._source = I, this._manager = new zcg(I), this._rangeChunkSize = I.rangeChunkSize, this._fullRequestReader = null, this._rangeRequestReaders = [];
- }
- _onRangeRequestReaderClosed(I) {
- const g = this._rangeRequestReaders.indexOf(I);
- g >= 0 && this._rangeRequestReaders.splice(g, 1);
- }
- getFullReader() {
- return ut(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."), this._fullRequestReader = new Lcg(this._manager, this._source), this._fullRequestReader;
- }
- getRangeReader(I, g) {
- const C = new vcg(this._manager, I, g);
- return C.onClosed = this._onRangeRequestReaderClosed.bind(this), this._rangeRequestReaders.push(C), C;
- }
- cancelAllRequests(I) {
- var g;
- (g = this._fullRequestReader) == null || g.cancel(I);
- for (const C of this._rangeRequestReaders.slice(0))
- C.cancel(I);
- }
- }
- class Lcg {
- constructor(I, g) {
- this._manager = I, this._url = g.url, this._fullRequestId = I.request({
- onHeadersReceived: this._onHeadersReceived.bind(this),
- onDone: this._onDone.bind(this),
- onError: this._onError.bind(this),
- onProgress: this._onProgress.bind(this)
- }), this._headersCapability = Promise.withResolvers(), this._disableRange = g.disableRange || !1, this._contentLength = g.length, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._isStreamingSupported = !1, this._isRangeSupported = !1, this._cachedChunks = [], this._requests = [], this._done = !1, this._storedError = void 0, this._filename = null, this.onProgress = null;
- }
- _onHeadersReceived() {
- const I = this._fullRequestId, g = this._manager.getRequestXhr(I);
- this._manager._responseOrigin = gM(g.responseURL);
- const C = g.getAllResponseHeaders(), i = new Headers(C ? C.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map((s) => {
- const [l, ...n] = s.split(": ");
- return [l, n.join(": ")];
- }) : []), {
- allowRangeRequests: e,
- suggestedLength: A
- } = Bgg({
- responseHeaders: i,
- isHttp: this._manager.isHttp,
- rangeChunkSize: this._rangeChunkSize,
- disableRange: this._disableRange
- });
- e && (this._isRangeSupported = !0), this._contentLength = A || this._contentLength, this._filename = Wgg(i), this._isRangeSupported && this._manager.abortRequest(I), this._headersCapability.resolve();
- }
- _onDone(I) {
- if (I && (this._requests.length > 0 ? this._requests.shift().resolve({
- value: I.chunk,
- done: !1
- }) : this._cachedChunks.push(I.chunk)), this._done = !0, !(this._cachedChunks.length > 0)) {
- for (const g of this._requests)
- g.resolve({
- value: void 0,
- done: !0
- });
- this._requests.length = 0;
- }
- }
- _onError(I) {
- this._storedError = nG(I, this._url), this._headersCapability.reject(this._storedError);
- for (const g of this._requests)
- g.reject(this._storedError);
- this._requests.length = 0, this._cachedChunks.length = 0;
- }
- _onProgress(I) {
- var g;
- (g = this.onProgress) == null || g.call(this, {
- loaded: I.loaded,
- total: I.lengthComputable ? I.total : this._contentLength
- });
- }
- get filename() {
- return this._filename;
- }
- get isRangeSupported() {
- return this._isRangeSupported;
- }
- get isStreamingSupported() {
- return this._isStreamingSupported;
- }
- get contentLength() {
- return this._contentLength;
- }
- get headersReady() {
- return this._headersCapability.promise;
- }
- async read() {
- if (await this._headersCapability.promise, this._storedError)
- throw this._storedError;
- if (this._cachedChunks.length > 0)
- return {
- value: this._cachedChunks.shift(),
- done: !1
- };
- if (this._done)
- return {
- value: void 0,
- done: !0
- };
- const I = Promise.withResolvers();
- return this._requests.push(I), I.promise;
- }
- cancel(I) {
- this._done = !0, this._headersCapability.reject(I);
- for (const g of this._requests)
- g.resolve({
- value: void 0,
- done: !0
- });
- this._requests.length = 0, this._manager.isPendingRequest(this._fullRequestId) && this._manager.abortRequest(this._fullRequestId), this._fullRequestReader = null;
- }
- }
- class vcg {
- constructor(I, g, C) {
- this._manager = I, this._url = I.url, this._requestId = I.request({
- begin: g,
- end: C,
- onHeadersReceived: this._onHeadersReceived.bind(this),
- onDone: this._onDone.bind(this),
- onError: this._onError.bind(this),
- onProgress: this._onProgress.bind(this)
- }), this._requests = [], this._queuedChunk = null, this._done = !1, this._storedError = void 0, this.onProgress = null, this.onClosed = null;
- }
- _onHeadersReceived() {
- var g;
- const I = gM((g = this._manager.getRequestXhr(this._requestId)) == null ? void 0 : g.responseURL);
- I !== this._manager._responseOrigin && (this._storedError = new Error(`Expected range response-origin "${I}" to match "${this._manager._responseOrigin}".`), this._onError(0));
- }
- _close() {
- var I;
- (I = this.onClosed) == null || I.call(this, this);
- }
- _onDone(I) {
- const g = I.chunk;
- this._requests.length > 0 ? this._requests.shift().resolve({
- value: g,
- done: !1
- }) : this._queuedChunk = g, this._done = !0;
- for (const C of this._requests)
- C.resolve({
- value: void 0,
- done: !0
- });
- this._requests.length = 0, this._close();
- }
- _onError(I) {
- this._storedError ?? (this._storedError = nG(I, this._url));
- for (const g of this._requests)
- g.reject(this._storedError);
- this._requests.length = 0, this._queuedChunk = null;
- }
- _onProgress(I) {
- var g;
- this.isStreamingSupported || (g = this.onProgress) == null || g.call(this, {
- loaded: I.loaded
- });
- }
- get isStreamingSupported() {
- return !1;
- }
- async read() {
- if (this._storedError)
- throw this._storedError;
- if (this._queuedChunk !== null) {
- const g = this._queuedChunk;
- return this._queuedChunk = null, {
- value: g,
- done: !1
- };
- }
- if (this._done)
- return {
- value: void 0,
- done: !0
- };
- const I = Promise.withResolvers();
- return this._requests.push(I), I.promise;
- }
- cancel(I) {
- this._done = !0;
- for (const g of this._requests)
- g.resolve({
- value: void 0,
- done: !0
- });
- this._requests.length = 0, this._manager.isPendingRequest(this._requestId) && this._manager.abortRequest(this._requestId), this._close();
- }
- }
- const Tcg = /^[a-z][a-z0-9\-+.]+:/i;
- function xcg(t) {
- if (Tcg.test(t))
- return new URL(t);
- const I = process.getBuiltinModule("url");
- return new URL(I.pathToFileURL(t));
- }
- class jcg {
- constructor(I) {
- this.source = I, this.url = xcg(I.url), ut(this.url.protocol === "file:", "PDFNodeStream only supports file:// URLs."), this._fullRequestReader = null, this._rangeRequestReaders = [];
- }
- get _progressiveDataLength() {
- var I;
- return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
- }
- getFullReader() {
- return ut(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."), this._fullRequestReader = new Qcg(this), this._fullRequestReader;
- }
- getRangeReader(I, g) {
- if (g <= this._progressiveDataLength)
- return null;
- const C = new Ocg(this, I, g);
- return this._rangeRequestReaders.push(C), C;
- }
- cancelAllRequests(I) {
- var g;
- (g = this._fullRequestReader) == null || g.cancel(I);
- for (const C of this._rangeRequestReaders.slice(0))
- C.cancel(I);
- }
- }
- class Qcg {
- constructor(I) {
- this._url = I.url, this._done = !1, this._storedError = null, this.onProgress = null;
- const g = I.source;
- this._contentLength = g.length, this._loaded = 0, this._filename = null, this._disableRange = g.disableRange || !1, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._isStreamingSupported = !g.disableStream, this._isRangeSupported = !g.disableRange, this._readableStream = null, this._readCapability = Promise.withResolvers(), this._headersCapability = Promise.withResolvers();
- const C = process.getBuiltinModule("fs");
- C.promises.lstat(this._url).then((i) => {
- this._contentLength = i.size, this._setReadableStream(C.createReadStream(this._url)), this._headersCapability.resolve();
- }, (i) => {
- i.code === "ENOENT" && (i = nG(0, this._url.href)), this._storedError = i, this._headersCapability.reject(i);
- });
- }
- get headersReady() {
- return this._headersCapability.promise;
- }
- get filename() {
- return this._filename;
- }
- get contentLength() {
- return this._contentLength;
- }
- get isRangeSupported() {
- return this._isRangeSupported;
- }
- get isStreamingSupported() {
- return this._isStreamingSupported;
- }
- async read() {
- var C;
- if (await this._readCapability.promise, this._done)
- return {
- value: void 0,
- done: !0
- };
- if (this._storedError)
- throw this._storedError;
- const I = this._readableStream.read();
- return I === null ? (this._readCapability = Promise.withResolvers(), this.read()) : (this._loaded += I.length, (C = this.onProgress) == null || C.call(this, {
- loaded: this._loaded,
- total: this._contentLength
- }), {
- value: new Uint8Array(I).buffer,
- done: !1
- });
- }
- cancel(I) {
- if (!this._readableStream) {
- this._error(I);
- return;
- }
- this._readableStream.destroy(I);
- }
- _error(I) {
- this._storedError = I, this._readCapability.resolve();
- }
- _setReadableStream(I) {
- this._readableStream = I, I.on("readable", () => {
- this._readCapability.resolve();
- }), I.on("end", () => {
- I.destroy(), this._done = !0, this._readCapability.resolve();
- }), I.on("error", (g) => {
- this._error(g);
- }), !this._isStreamingSupported && this._isRangeSupported && this._error(new Ea("streaming is disabled")), this._storedError && this._readableStream.destroy(this._storedError);
- }
- }
- class Ocg {
- constructor(I, g, C) {
- this._url = I.url, this._done = !1, this._storedError = null, this.onProgress = null, this._loaded = 0, this._readableStream = null, this._readCapability = Promise.withResolvers();
- const i = I.source;
- this._isStreamingSupported = !i.disableStream;
- const e = process.getBuiltinModule("fs");
- this._setReadableStream(e.createReadStream(this._url, {
- start: g,
- end: C - 1
- }));
- }
- get isStreamingSupported() {
- return this._isStreamingSupported;
- }
- async read() {
- var C;
- if (await this._readCapability.promise, this._done)
- return {
- value: void 0,
- done: !0
- };
- if (this._storedError)
- throw this._storedError;
- const I = this._readableStream.read();
- return I === null ? (this._readCapability = Promise.withResolvers(), this.read()) : (this._loaded += I.length, (C = this.onProgress) == null || C.call(this, {
- loaded: this._loaded
- }), {
- value: new Uint8Array(I).buffer,
- done: !1
- });
- }
- cancel(I) {
- if (!this._readableStream) {
- this._error(I);
- return;
- }
- this._readableStream.destroy(I);
- }
- _error(I) {
- this._storedError = I, this._readCapability.resolve();
- }
- _setReadableStream(I) {
- this._readableStream = I, I.on("readable", () => {
- this._readCapability.resolve();
- }), I.on("end", () => {
- I.destroy(), this._done = !0, this._readCapability.resolve();
- }), I.on("error", (g) => {
- this._error(g);
- }), this._storedError && this._readableStream.destroy(this._storedError);
- }
- }
- const Ucg = 1e5, b8 = 30;
- var c$, Ya, Oi, dZ, rZ, Nc, Ml, hZ, bZ, Vc, zh, Jh, Na, Lh, uZ, vh, Mc, mZ, ZZ, Th, Rc, GZ, Va, xh, Cn, Vgg, Mgg, GS, Me, wN, wS, Rgg, fgg;
- const wt = class wt {
- constructor({
- textContentSource: I,
- container: g,
- viewport: C
- }) {
- tg(this, Cn);
- tg(this, Ya, Promise.withResolvers());
- tg(this, Oi, null);
- tg(this, dZ, !1);
- tg(this, rZ, !!((c$ = globalThis.FontInspector) != null && c$.enabled));
- tg(this, Nc, null);
- tg(this, Ml, null);
- tg(this, hZ, 0);
- tg(this, bZ, 0);
- tg(this, Vc, null);
- tg(this, zh, null);
- tg(this, Jh, 0);
- tg(this, Na, 0);
- tg(this, Lh, /* @__PURE__ */ Object.create(null));
- tg(this, uZ, []);
- tg(this, vh, null);
- tg(this, Mc, []);
- tg(this, mZ, /* @__PURE__ */ new WeakMap());
- tg(this, ZZ, null);
- var l;
- if (I instanceof ReadableStream)
- $(this, vh, I);
- else if (typeof I == "object")
- $(this, vh, new ReadableStream({
- start(n) {
- n.enqueue(I), n.close();
- }
- }));
- else
- throw new Error('No "textContentSource" parameter specified.');
- $(this, Oi, $(this, zh, g)), $(this, Na, C.scale * In.pixelRatio), $(this, Jh, C.rotation), $(this, Ml, {
- div: null,
- properties: null,
- ctx: null
- });
- const {
- pageWidth: i,
- pageHeight: e,
- pageX: A,
- pageY: s
- } = C.rawDims;
- $(this, ZZ, [1, 0, 0, -1, -A, s + e]), $(this, bZ, i), $(this, hZ, e), ig(l = wt, Me, Rgg).call(l), cd(g, C), M(this, Ya).promise.finally(() => {
- M(wt, xh).delete(this), $(this, Ml, null), $(this, Lh, null);
- }).catch(() => {
- });
- }
- static get fontFamilyMap() {
- const {
- isWindows: I,
- isFirefox: g
- } = Ai.platform;
- return UI(this, "fontFamilyMap", /* @__PURE__ */ new Map([["sans-serif", `${I && g ? "Calibri, " : ""}sans-serif`], ["monospace", `${I && g ? "Lucida Console, " : ""}monospace`]]));
- }
- render() {
- const I = () => {
- M(this, Vc).read().then(({
- value: g,
- done: C
- }) => {
- if (C) {
- M(this, Ya).resolve();
- return;
- }
- M(this, Nc) ?? $(this, Nc, g.lang), Object.assign(M(this, Lh), g.styles), ig(this, Cn, Vgg).call(this, g.items), I();
- }, M(this, Ya).reject);
- };
- return $(this, Vc, M(this, vh).getReader()), M(wt, xh).add(this), I(), M(this, Ya).promise;
- }
- update({
- viewport: I,
- onBefore: g = null
- }) {
- var e;
- const C = I.scale * In.pixelRatio, i = I.rotation;
- if (i !== M(this, Jh) && (g == null || g(), $(this, Jh, i), cd(M(this, zh), {
- rotation: i
- })), C !== M(this, Na)) {
- g == null || g(), $(this, Na, C);
- const A = {
- div: null,
- properties: null,
- ctx: ig(e = wt, Me, wN).call(e, M(this, Nc))
- };
- for (const s of M(this, Mc))
- A.properties = M(this, mZ).get(s), A.div = s, ig(this, Cn, GS).call(this, A);
- }
- }
- cancel() {
- var g;
- const I = new Ea("TextLayer task cancelled.");
- (g = M(this, Vc)) == null || g.cancel(I).catch(() => {
- }), $(this, Vc, null), M(this, Ya).reject(I);
- }
- get textDivs() {
- return M(this, Mc);
- }
- get textContentItemsStr() {
- return M(this, uZ);
- }
- static cleanup() {
- if (!(M(this, xh).size > 0)) {
- M(this, Th).clear();
- for (const {
- canvas: I
- } of M(this, Rc).values())
- I.remove();
- M(this, Rc).clear();
- }
- }
- };
- Ya = new WeakMap(), Oi = new WeakMap(), dZ = new WeakMap(), rZ = new WeakMap(), Nc = new WeakMap(), Ml = new WeakMap(), hZ = new WeakMap(), bZ = new WeakMap(), Vc = new WeakMap(), zh = new WeakMap(), Jh = new WeakMap(), Na = new WeakMap(), Lh = new WeakMap(), uZ = new WeakMap(), vh = new WeakMap(), Mc = new WeakMap(), mZ = new WeakMap(), ZZ = new WeakMap(), Th = new WeakMap(), Rc = new WeakMap(), GZ = new WeakMap(), Va = new WeakMap(), xh = new WeakMap(), Cn = new WeakSet(), Vgg = function(I) {
- var i, e;
- if (M(this, dZ))
- return;
- (e = M(this, Ml)).ctx ?? (e.ctx = ig(i = wt, Me, wN).call(i, M(this, Nc)));
- const g = M(this, Mc), C = M(this, uZ);
- for (const A of I) {
- if (g.length > Ucg) {
- DI("Ignoring additional textDivs for performance reasons."), $(this, dZ, !0);
- return;
- }
- if (A.str === void 0) {
- if (A.type === "beginMarkedContentProps" || A.type === "beginMarkedContent") {
- const s = M(this, Oi);
- $(this, Oi, document.createElement("span")), M(this, Oi).classList.add("markedContent"), A.id !== null && M(this, Oi).setAttribute("id", `${A.id}`), s.append(M(this, Oi));
- } else A.type === "endMarkedContent" && $(this, Oi, M(this, Oi).parentNode);
- continue;
- }
- C.push(A.str), ig(this, Cn, Mgg).call(this, A);
- }
- }, Mgg = function(I) {
- var h;
- const g = document.createElement("span"), C = {
- angle: 0,
- canvasWidth: 0,
- hasText: I.str !== "",
- hasEOL: I.hasEOL,
- fontSize: 0
- };
- M(this, Mc).push(g);
- const i = AI.transform(M(this, ZZ), I.transform);
- let e = Math.atan2(i[1], i[0]);
- const A = M(this, Lh)[I.fontName];
- A.vertical && (e += Math.PI / 2);
- let s = M(this, rZ) && A.fontSubstitution || A.fontFamily;
- s = wt.fontFamilyMap.get(s) || s;
- const l = Math.hypot(i[2], i[3]), n = l * ig(h = wt, Me, fgg).call(h, s, A, M(this, Nc));
- let a, d;
- e === 0 ? (a = i[4], d = i[5] - n) : (a = i[4] + n * Math.sin(e), d = i[5] - n * Math.cos(e));
- const o = "calc(var(--total-scale-factor) *", c = g.style;
- M(this, Oi) === M(this, zh) ? (c.left = `${(100 * a / M(this, bZ)).toFixed(2)}%`, c.top = `${(100 * d / M(this, hZ)).toFixed(2)}%`) : (c.left = `${o}${a.toFixed(2)}px)`, c.top = `${o}${d.toFixed(2)}px)`), c.fontSize = `${o}${(M(wt, Va) * l).toFixed(2)}px)`, c.fontFamily = s, C.fontSize = l, g.setAttribute("role", "presentation"), g.textContent = I.str, g.dir = I.dir, M(this, rZ) && (g.dataset.fontName = A.fontSubstitutionLoadedName || I.fontName), e !== 0 && (C.angle = e * (180 / Math.PI));
- let r = !1;
- if (I.str.length > 1)
- r = !0;
- else if (I.str !== " " && I.transform[0] !== I.transform[3]) {
- const b = Math.abs(I.transform[0]), u = Math.abs(I.transform[3]);
- b !== u && Math.max(b, u) / Math.min(b, u) > 1.5 && (r = !0);
- }
- if (r && (C.canvasWidth = A.vertical ? I.height : I.width), M(this, mZ).set(g, C), M(this, Ml).div = g, M(this, Ml).properties = C, ig(this, Cn, GS).call(this, M(this, Ml)), C.hasText && M(this, Oi).append(g), C.hasEOL) {
- const b = document.createElement("br");
- b.setAttribute("role", "presentation"), M(this, Oi).append(b);
- }
- }, GS = function(I) {
- var s;
- const {
- div: g,
- properties: C,
- ctx: i
- } = I, {
- style: e
- } = g;
- let A = "";
- if (M(wt, Va) > 1 && (A = `scale(${1 / M(wt, Va)})`), C.canvasWidth !== 0 && C.hasText) {
- const {
- fontFamily: l
- } = e, {
- canvasWidth: n,
- fontSize: a
- } = C;
- ig(s = wt, Me, wS).call(s, i, a * M(this, Na), l);
- const {
- width: d
- } = i.measureText(g.textContent);
- d > 0 && (A = `scaleX(${n * M(this, Na) / d}) ${A}`);
- }
- C.angle !== 0 && (A = `rotate(${C.angle}deg) ${A}`), A.length > 0 && (e.transform = A);
- }, Me = new WeakSet(), wN = function(I = null) {
- let g = M(this, Rc).get(I || (I = ""));
- if (!g) {
- const C = document.createElement("canvas");
- C.className = "hiddenCanvasElement", C.lang = I, document.body.append(C), g = C.getContext("2d", {
- alpha: !1,
- willReadFrequently: !0
- }), M(this, Rc).set(I, g), M(this, GZ).set(g, {
- size: 0,
- family: ""
- });
- }
- return g;
- }, wS = function(I, g, C) {
- const i = M(this, GZ).get(I);
- g === i.size && C === i.family || (I.font = `${g}px ${C}`, i.size = g, i.family = C);
- }, Rgg = function() {
- if (M(this, Va) !== null)
- return;
- const I = document.createElement("div");
- I.style.opacity = 0, I.style.lineHeight = 1, I.style.fontSize = "1px", I.style.position = "absolute", I.textContent = "X", document.body.append(I), $(this, Va, I.getBoundingClientRect().height), I.remove();
- }, fgg = function(I, g, C) {
- const i = M(this, Th).get(I);
- if (i)
- return i;
- const e = ig(this, Me, wN).call(this, C);
- e.canvas.width = e.canvas.height = b8, ig(this, Me, wS).call(this, e, b8, I);
- const A = e.measureText(""), s = A.fontBoundingBoxAscent, l = Math.abs(A.fontBoundingBoxDescent);
- e.canvas.width = e.canvas.height = 0;
- let n = 0.8;
- return s ? n = s / (s + l) : (Ai.platform.isFirefox && DI("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference in `about:config` to improve TextLayer rendering."), g.ascent ? n = g.ascent : g.descent && (n = 1 + g.descent)), M(this, Th).set(I, n), n;
- }, tg(wt, Me), tg(wt, Th, /* @__PURE__ */ new Map()), tg(wt, Rc, /* @__PURE__ */ new Map()), tg(wt, GZ, /* @__PURE__ */ new WeakMap()), tg(wt, Va, null), tg(wt, xh, /* @__PURE__ */ new Set());
- let Mm = wt;
- class Rm {
- static textContent(I) {
- const g = [], C = {
- items: g,
- styles: /* @__PURE__ */ Object.create(null)
- };
- function i(e) {
- var l;
- if (!e)
- return;
- let A = null;
- const s = e.name;
- if (s === "#text")
- A = e.value;
- else if (Rm.shouldBuildText(s))
- (l = e == null ? void 0 : e.attributes) != null && l.textContent ? A = e.attributes.textContent : e.value && (A = e.value);
- else return;
- if (A !== null && g.push({
- str: A
- }), !!e.children)
- for (const n of e.children)
- i(n);
- }
- return i(I), C;
- }
- static shouldBuildText(I) {
- return !(I === "textarea" || I === "input" || I === "option" || I === "select");
- }
- }
- const Ecg = 65536, Pcg = 100;
- function _cg(t = {}) {
- typeof t == "string" || t instanceof URL ? t = {
- url: t
- } : (t instanceof ArrayBuffer || ArrayBuffer.isView(t)) && (t = {
- data: t
- });
- const I = new BS(), {
- docId: g
- } = I, C = t.url ? qcg(t.url) : null, i = t.data ? $cg(t.data) : null, e = t.httpHeaders || null, A = t.withCredentials === !0, s = t.password ?? null, l = t.range instanceof Hgg ? t.range : null, n = Number.isInteger(t.rangeChunkSize) && t.rangeChunkSize > 0 ? t.rangeChunkSize : Ecg;
- let a = t.worker instanceof ch ? t.worker : null;
- const d = t.verbosity, o = typeof t.docBaseUrl == "string" && !$V(t.docBaseUrl) ? t.docBaseUrl : null, c = LY(t.cMapUrl), r = t.cMapPacked !== !1, h = t.CMapReaderFactory || ($t ? dcg : C8), b = LY(t.iccUrl), u = LY(t.standardFontDataUrl), m = t.StandardFontDataFactory || ($t ? rcg : t8), Z = LY(t.wasmUrl), p = t.WasmFactory || ($t ? hcg : i8), Y = t.stopAtErrors !== !0, R = Number.isInteger(t.maxImageSize) && t.maxImageSize > -1 ? t.maxImageSize : -1, X = t.isEvalSupported !== !1, H = typeof t.isOffscreenCanvasSupported == "boolean" ? t.isOffscreenCanvasSupported : !$t, S = typeof t.isImageDecoderSupported == "boolean" ? t.isImageDecoderSupported : !$t && (Ai.platform.isFirefox || !globalThis.chrome), z = Number.isInteger(t.canvasMaxAreaInBytes) ? t.canvasMaxAreaInBytes : -1, v = typeof t.disableFontFace == "boolean" ? t.disableFontFace : $t, K = t.fontExtraProperties === !0, V = t.enableXfa === !0, N = t.ownerDocument || globalThis.document, B = t.disableRange === !0, G = t.disableStream === !0, w = t.disableAutoFetch === !0, W = t.pdfBug === !0, y = t.CanvasFactory || ($t ? ccg : ncg), f = t.FilterFactory || ($t ? ocg : acg), D = t.enableHWA === !0, F = t.useWasm !== !1, T = l ? l.length : t.length ?? NaN, Q = typeof t.useSystemFonts == "boolean" ? t.useSystemFonts : !$t && !v, P = typeof t.useWorkerFetch == "boolean" ? t.useWorkerFetch : !!(h === C8 && m === t8 && p === i8 && c && u && Z && Or(c, document.baseURI) && Or(u, document.baseURI) && Or(Z, document.baseURI)), L = null;
- Log(d);
- const E = {
- canvasFactory: new y({
- ownerDocument: N,
- enableHWA: D
- }),
- filterFactory: new f({
- docId: g,
- ownerDocument: N
- }),
- cMapReaderFactory: P ? null : new h({
- baseUrl: c,
- isCompressed: r
- }),
- standardFontDataFactory: P ? null : new m({
- baseUrl: u
- }),
- wasmFactory: P ? null : new p({
- baseUrl: Z
- })
- };
- if (!a) {
- const j = {
- verbosity: d,
- port: Ql.workerPort
- };
- a = j.port ? ch.fromPort(j) : new ch(j), I._worker = a;
- }
- const J = {
- docId: g,
- apiVersion: "5.1.91",
- data: i,
- password: s,
- disableAutoFetch: w,
- rangeChunkSize: n,
- length: T,
- docBaseUrl: o,
- enableXfa: V,
- evaluatorOptions: {
- maxImageSize: R,
- disableFontFace: v,
- ignoreErrors: Y,
- isEvalSupported: X,
- isOffscreenCanvasSupported: H,
- isImageDecoderSupported: S,
- canvasMaxAreaInBytes: z,
- fontExtraProperties: K,
- useSystemFonts: Q,
- useWasm: F,
- useWorkerFetch: P,
- cMapUrl: c,
- iccUrl: b,
- standardFontDataUrl: u,
- wasmUrl: Z
- }
- }, k = {
- ownerDocument: N,
- pdfBug: W,
- styleElement: L,
- loadingParams: {
- disableAutoFetch: w,
- enableXfa: V
- }
- };
- return a.promise.then(function() {
- if (I.destroyed)
- throw new Error("Loading aborted");
- if (a.destroyed)
- throw new Error("Worker was destroyed");
- const j = a.messageHandler.sendWithPromise("GetDocRequest", J, i ? [i.buffer] : null);
- let q;
- if (l)
- q = new Hcg(l, {
- disableRange: B,
- disableStream: G
- });
- else if (!i) {
- if (!C)
- throw new Error("getDocument - no `url` parameter provided.");
- let Cg;
- if ($t)
- if (Or(C)) {
- if (typeof fetch > "u" || typeof Response > "u" || !("body" in Response.prototype))
- throw new Error("getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`.");
- Cg = h8;
- } else
- Cg = jcg;
- else
- Cg = Or(C) ? h8 : Jcg;
- q = new Cg({
- url: C,
- length: T,
- httpHeaders: e,
- withCredentials: A,
- rangeChunkSize: n,
- disableRange: B,
- disableStream: G
- });
- }
- return j.then((Cg) => {
- if (I.destroyed)
- throw new Error("Loading aborted");
- if (a.destroyed)
- throw new Error("Worker was destroyed");
- const Ig = new Qu(g, Cg, a.port), x = new edg(Ig, I, q, k, E);
- I._transport = x, Ig.send("Ready", null);
- });
- }).catch(I._capability.reject), I;
- }
- function qcg(t) {
- if (t instanceof URL)
- return t.href;
- if (typeof t == "string") {
- if ($t)
- return t;
- const I = URL.parse(t, window.location);
- if (I)
- return I.href;
- }
- throw new Error("Invalid PDF url data: either string or URL-object is expected in the url property.");
- }
- function $cg(t) {
- if ($t && typeof Buffer < "u" && t instanceof Buffer)
- throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`.");
- if (t instanceof Uint8Array && t.byteLength === t.buffer.byteLength)
- return t;
- if (typeof t == "string")
- return eG(t);
- if (t instanceof ArrayBuffer || ArrayBuffer.isView(t) || typeof t == "object" && !isNaN(t == null ? void 0 : t.length))
- return new Uint8Array(t);
- throw new Error("Invalid PDF binary data: either TypedArray, string, or array-like object is expected in the data property.");
- }
- function LY(t) {
- if (typeof t != "string")
- return null;
- if (t.endsWith("/"))
- return t;
- throw new Error(`Invalid factory url: "${t}" must include trailing slash.`);
- }
- const pS = (t) => typeof t == "object" && Number.isInteger(t == null ? void 0 : t.num) && t.num >= 0 && Number.isInteger(t == null ? void 0 : t.gen) && t.gen >= 0, gdg = (t) => typeof t == "object" && typeof (t == null ? void 0 : t.name) == "string", Idg = _og.bind(null, pS, gdg);
- var zV;
- const JV = class JV {
- constructor() {
- iI(this, "_capability", Promise.withResolvers());
- iI(this, "_transport", null);
- iI(this, "_worker", null);
- iI(this, "docId", `d${Wi(JV, zV)._++}`);
- iI(this, "destroyed", !1);
- iI(this, "onPassword", null);
- iI(this, "onProgress", null);
- }
- get promise() {
- return this._capability.promise;
- }
- async destroy() {
- var I, g, C, i;
- this.destroyed = !0;
- try {
- (I = this._worker) != null && I.port && (this._worker._pendingDestroy = !0), await ((g = this._transport) == null ? void 0 : g.destroy());
- } catch (e) {
- throw (C = this._worker) != null && C.port && delete this._worker._pendingDestroy, e;
- }
- this._transport = null, (i = this._worker) == null || i.destroy(), this._worker = null;
- }
- async getData() {
- return this._transport.getData();
- }
- };
- zV = new WeakMap(), tg(JV, zV, 0);
- let BS = JV;
- class Hgg {
- constructor(I, g, C = !1, i = null) {
- this.length = I, this.initialData = g, this.progressiveDone = C, this.contentDispositionFilename = i, this._rangeListeners = [], this._progressListeners = [], this._progressiveReadListeners = [], this._progressiveDoneListeners = [], this._readyCapability = Promise.withResolvers();
- }
- addRangeListener(I) {
- this._rangeListeners.push(I);
- }
- addProgressListener(I) {
- this._progressListeners.push(I);
- }
- addProgressiveReadListener(I) {
- this._progressiveReadListeners.push(I);
- }
- addProgressiveDoneListener(I) {
- this._progressiveDoneListeners.push(I);
- }
- onDataRange(I, g) {
- for (const C of this._rangeListeners)
- C(I, g);
- }
- onDataProgress(I, g) {
- this._readyCapability.promise.then(() => {
- for (const C of this._progressListeners)
- C(I, g);
- });
- }
- onDataProgressiveRead(I) {
- this._readyCapability.promise.then(() => {
- for (const g of this._progressiveReadListeners)
- g(I);
- });
- }
- onDataProgressiveDone() {
- this._readyCapability.promise.then(() => {
- for (const I of this._progressiveDoneListeners)
- I();
- });
- }
- transportReady() {
- this._readyCapability.resolve();
- }
- requestDataRange(I, g) {
- BC("Abstract method PDFDataRangeTransport.requestDataRange");
- }
- abort() {
- }
- }
- class Cdg {
- constructor(I, g) {
- this._pdfInfo = I, this._transport = g;
- }
- get annotationStorage() {
- return this._transport.annotationStorage;
- }
- get canvasFactory() {
- return this._transport.canvasFactory;
- }
- get filterFactory() {
- return this._transport.filterFactory;
- }
- get numPages() {
- return this._pdfInfo.numPages;
- }
- get fingerprints() {
- return this._pdfInfo.fingerprints;
- }
- get isPureXfa() {
- return UI(this, "isPureXfa", !!this._transport._htmlForXfa);
- }
- get allXfaHtml() {
- return this._transport._htmlForXfa;
- }
- getPage(I) {
- return this._transport.getPage(I);
- }
- getPageIndex(I) {
- return this._transport.getPageIndex(I);
- }
- getDestinations() {
- return this._transport.getDestinations();
- }
- getDestination(I) {
- return this._transport.getDestination(I);
- }
- getPageLabels() {
- return this._transport.getPageLabels();
- }
- getPageLayout() {
- return this._transport.getPageLayout();
- }
- getPageMode() {
- return this._transport.getPageMode();
- }
- getViewerPreferences() {
- return this._transport.getViewerPreferences();
- }
- getOpenAction() {
- return this._transport.getOpenAction();
- }
- getAttachments() {
- return this._transport.getAttachments();
- }
- getJSActions() {
- return this._transport.getDocJSActions();
- }
- getOutline() {
- return this._transport.getOutline();
- }
- getOptionalContentConfig({
- intent: I = "display"
- } = {}) {
- const {
- renderingIntent: g
- } = this._transport.getRenderingIntent(I);
- return this._transport.getOptionalContentConfig(g);
- }
- getPermissions() {
- return this._transport.getPermissions();
- }
- getMetadata() {
- return this._transport.getMetadata();
- }
- getMarkInfo() {
- return this._transport.getMarkInfo();
- }
- getData() {
- return this._transport.getData();
- }
- saveDocument() {
- return this._transport.saveDocument();
- }
- getDownloadInfo() {
- return this._transport.downloadInfoCapability.promise;
- }
- cleanup(I = !1) {
- return this._transport.startCleanup(I || this.isPureXfa);
- }
- destroy() {
- return this.loadingTask.destroy();
- }
- cachedPageNumber(I) {
- return this._transport.cachedPageNumber(I);
- }
- get loadingParams() {
- return this._transport.loadingParams;
- }
- get loadingTask() {
- return this._transport.loadingTask;
- }
- getFieldObjects() {
- return this._transport.getFieldObjects();
- }
- hasJSActions() {
- return this._transport.hasJSActions();
- }
- getCalculationOrderIds() {
- return this._transport.getCalculationOrderIds();
- }
- }
- var Rl, fc, _u;
- class tdg {
- constructor(I, g, C, i = !1) {
- tg(this, fc);
- tg(this, Rl, !1);
- this._pageIndex = I, this._pageInfo = g, this._transport = C, this._stats = i ? new $6() : null, this._pdfBug = i, this.commonObjs = C.commonObjs, this.objs = new Xgg(), this._intentStates = /* @__PURE__ */ new Map(), this.destroyed = !1;
- }
- get pageNumber() {
- return this._pageIndex + 1;
- }
- get rotate() {
- return this._pageInfo.rotate;
- }
- get ref() {
- return this._pageInfo.ref;
- }
- get userUnit() {
- return this._pageInfo.userUnit;
- }
- get view() {
- return this._pageInfo.view;
- }
- getViewport({
- scale: I,
- rotation: g = this.rotate,
- offsetX: C = 0,
- offsetY: i = 0,
- dontFlip: e = !1
- } = {}) {
- return new sG({
- viewBox: this.view,
- userUnit: this.userUnit,
- scale: I,
- rotation: g,
- offsetX: C,
- offsetY: i,
- dontFlip: e
- });
- }
- getAnnotations({
- intent: I = "display"
- } = {}) {
- const {
- renderingIntent: g
- } = this._transport.getRenderingIntent(I);
- return this._transport.getAnnotations(this._pageIndex, g);
- }
- getJSActions() {
- return this._transport.getPageJSActions(this._pageIndex);
- }
- get filterFactory() {
- return this._transport.filterFactory;
- }
- get isPureXfa() {
- return UI(this, "isPureXfa", !!this._transport._htmlForXfa);
- }
- async getXfa() {
- var I;
- return ((I = this._transport._htmlForXfa) == null ? void 0 : I.children[this._pageIndex]) || null;
- }
- render({
- canvasContext: I,
- viewport: g,
- intent: C = "display",
- annotationMode: i = la.ENABLE,
- transform: e = null,
- background: A = null,
- optionalContentConfigPromise: s = null,
- annotationCanvasMap: l = null,
- pageColors: n = null,
- printAnnotationStorage: a = null,
- isEditing: d = !1
- }) {
- var p, Y;
- (p = this._stats) == null || p.time("Overall");
- const o = this._transport.getRenderingIntent(C, i, a, d), {
- renderingIntent: c,
- cacheKey: r
- } = o;
- $(this, Rl, !1), s || (s = this._transport.getOptionalContentConfig(c));
- let h = this._intentStates.get(r);
- h || (h = /* @__PURE__ */ Object.create(null), this._intentStates.set(r, h)), h.streamReaderCancelTimeout && (clearTimeout(h.streamReaderCancelTimeout), h.streamReaderCancelTimeout = null);
- const b = !!(c & ye.PRINT);
- h.displayReadyCapability || (h.displayReadyCapability = Promise.withResolvers(), h.operatorList = {
- fnArray: [],
- argsArray: [],
- lastChunk: !1,
- separateAnnots: null
- }, (Y = this._stats) == null || Y.time("Page Request"), this._pumpOperatorList(o));
- const u = (R) => {
- var X;
- h.renderTasks.delete(m), b && $(this, Rl, !0), ig(this, fc, _u).call(this), R ? (m.capability.reject(R), this._abortOperatorList({
- intentState: h,
- reason: R instanceof Error ? R : new Error(R)
- })) : m.capability.resolve(), this._stats && (this._stats.timeEnd("Rendering"), this._stats.timeEnd("Overall"), (X = globalThis.Stats) != null && X.enabled && globalThis.Stats.add(this.pageNumber, this._stats));
- }, m = new yS({
- callback: u,
- params: {
- canvasContext: I,
- viewport: g,
- transform: e,
- background: A
- },
- objs: this.objs,
- commonObjs: this.commonObjs,
- annotationCanvasMap: l,
- operatorList: h.operatorList,
- pageIndex: this._pageIndex,
- canvasFactory: this._transport.canvasFactory,
- filterFactory: this._transport.filterFactory,
- useRequestAnimationFrame: !b,
- pdfBug: this._pdfBug,
- pageColors: n
- });
- (h.renderTasks || (h.renderTasks = /* @__PURE__ */ new Set())).add(m);
- const Z = m.task;
- return Promise.all([h.displayReadyCapability.promise, s]).then(([R, X]) => {
- var H;
- if (this.destroyed) {
- u();
- return;
- }
- if ((H = this._stats) == null || H.time("Rendering"), !(X.renderingIntent & c))
- throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` and `PDFDocumentProxy.getOptionalContentConfig` methods.");
- m.initializeGraphics({
- transparency: R,
- optionalContentConfig: X
- }), m.operatorListChanged();
- }).catch(u), Z;
- }
- getOperatorList({
- intent: I = "display",
- annotationMode: g = la.ENABLE,
- printAnnotationStorage: C = null,
- isEditing: i = !1
- } = {}) {
- var n;
- function e() {
- s.operatorList.lastChunk && (s.opListReadCapability.resolve(s.operatorList), s.renderTasks.delete(l));
- }
- const A = this._transport.getRenderingIntent(I, g, C, i, !0);
- let s = this._intentStates.get(A.cacheKey);
- s || (s = /* @__PURE__ */ Object.create(null), this._intentStates.set(A.cacheKey, s));
- let l;
- return s.opListReadCapability || (l = /* @__PURE__ */ Object.create(null), l.operatorListChanged = e, s.opListReadCapability = Promise.withResolvers(), (s.renderTasks || (s.renderTasks = /* @__PURE__ */ new Set())).add(l), s.operatorList = {
- fnArray: [],
- argsArray: [],
- lastChunk: !1,
- separateAnnots: null
- }, (n = this._stats) == null || n.time("Page Request"), this._pumpOperatorList(A)), s.opListReadCapability.promise;
- }
- streamTextContent({
- includeMarkedContent: I = !1,
- disableNormalization: g = !1
- } = {}) {
- return this._transport.messageHandler.sendWithStream("GetTextContent", {
- pageIndex: this._pageIndex,
- includeMarkedContent: I === !0,
- disableNormalization: g === !0
- }, {
- highWaterMark: 100,
- size(i) {
- return i.items.length;
- }
- });
- }
- getTextContent(I = {}) {
- if (this._transport._htmlForXfa)
- return this.getXfa().then((C) => Rm.textContent(C));
- const g = this.streamTextContent(I);
- return new Promise(function(C, i) {
- function e() {
- A.read().then(function({
- value: l,
- done: n
- }) {
- if (n) {
- C(s);
- return;
- }
- s.lang ?? (s.lang = l.lang), Object.assign(s.styles, l.styles), s.items.push(...l.items), e();
- }, i);
- }
- const A = g.getReader(), s = {
- items: [],
- styles: /* @__PURE__ */ Object.create(null),
- lang: null
- };
- e();
- });
- }
- getStructTree() {
- return this._transport.getStructTree(this._pageIndex);
- }
- _destroy() {
- this.destroyed = !0;
- const I = [];
- for (const g of this._intentStates.values())
- if (this._abortOperatorList({
- intentState: g,
- reason: new Error("Page was destroyed."),
- force: !0
- }), !g.opListReadCapability)
- for (const C of g.renderTasks)
- I.push(C.completed), C.cancel();
- return this.objs.clear(), $(this, Rl, !1), Promise.all(I);
- }
- cleanup(I = !1) {
- $(this, Rl, !0);
- const g = ig(this, fc, _u).call(this);
- return I && g && this._stats && (this._stats = new $6()), g;
- }
- _startRenderPage(I, g) {
- var i, e;
- const C = this._intentStates.get(g);
- C && ((i = this._stats) == null || i.timeEnd("Page Request"), (e = C.displayReadyCapability) == null || e.resolve(I));
- }
- _renderPageChunk(I, g) {
- for (let C = 0, i = I.length; C < i; C++)
- g.operatorList.fnArray.push(I.fnArray[C]), g.operatorList.argsArray.push(I.argsArray[C]);
- g.operatorList.lastChunk = I.lastChunk, g.operatorList.separateAnnots = I.separateAnnots;
- for (const C of g.renderTasks)
- C.operatorListChanged();
- I.lastChunk && ig(this, fc, _u).call(this);
- }
- _pumpOperatorList({
- renderingIntent: I,
- cacheKey: g,
- annotationStorageSerializable: C,
- modifiedIds: i
- }) {
- const {
- map: e,
- transfer: A
- } = C, l = this._transport.messageHandler.sendWithStream("GetOperatorList", {
- pageIndex: this._pageIndex,
- intent: I,
- cacheKey: g,
- annotationStorage: e,
- modifiedIds: i
- }, A).getReader(), n = this._intentStates.get(g);
- n.streamReader = l;
- const a = () => {
- l.read().then(({
- value: d,
- done: o
- }) => {
- if (o) {
- n.streamReader = null;
- return;
- }
- this._transport.destroyed || (this._renderPageChunk(d, n), a());
- }, (d) => {
- if (n.streamReader = null, !this._transport.destroyed) {
- if (n.operatorList) {
- n.operatorList.lastChunk = !0;
- for (const o of n.renderTasks)
- o.operatorListChanged();
- ig(this, fc, _u).call(this);
- }
- if (n.displayReadyCapability)
- n.displayReadyCapability.reject(d);
- else if (n.opListReadCapability)
- n.opListReadCapability.reject(d);
- else
- throw d;
- }
- });
- };
- a();
- }
- _abortOperatorList({
- intentState: I,
- reason: g,
- force: C = !1
- }) {
- if (I.streamReader) {
- if (I.streamReaderCancelTimeout && (clearTimeout(I.streamReaderCancelTimeout), I.streamReaderCancelTimeout = null), !C) {
- if (I.renderTasks.size > 0)
- return;
- if (g instanceof r9) {
- let i = Pcg;
- g.extraDelay > 0 && g.extraDelay < 1e3 && (i += g.extraDelay), I.streamReaderCancelTimeout = setTimeout(() => {
- I.streamReaderCancelTimeout = null, this._abortOperatorList({
- intentState: I,
- reason: g,
- force: !0
- });
- }, i);
- return;
- }
- }
- if (I.streamReader.cancel(new Ea(g.message)).catch(() => {
- }), I.streamReader = null, !this._transport.destroyed) {
- for (const [i, e] of this._intentStates)
- if (e === I) {
- this._intentStates.delete(i);
- break;
- }
- this.cleanup();
- }
- }
- }
- get stats() {
- return this._stats;
- }
- }
- Rl = new WeakMap(), fc = new WeakSet(), _u = function() {
- if (!M(this, Rl) || this.destroyed)
- return !1;
- for (const {
- renderTasks: I,
- operatorList: g
- } of this._intentStates.values())
- if (I.size > 0 || !g.lastChunk)
- return !1;
- return this._intentStates.clear(), this.objs.clear(), $(this, Rl, !1), !0;
- };
- var fl, LV;
- class idg {
- constructor() {
- tg(this, fl, /* @__PURE__ */ new Map());
- tg(this, LV, Promise.resolve());
- }
- postMessage(I, g) {
- const C = {
- data: structuredClone(I, g ? {
- transfer: g
- } : null)
- };
- M(this, LV).then(() => {
- for (const [i] of M(this, fl))
- i.call(this, C);
- });
- }
- addEventListener(I, g, C = null) {
- let i = null;
- if ((C == null ? void 0 : C.signal) instanceof AbortSignal) {
- const {
- signal: e
- } = C;
- if (e.aborted) {
- DI("LoopbackPort - cannot use an `aborted` signal.");
- return;
- }
- const A = () => this.removeEventListener(I, g);
- i = () => e.removeEventListener("abort", A), e.addEventListener("abort", A);
- }
- M(this, fl).set(g, i);
- }
- removeEventListener(I, g) {
- const C = M(this, fl).get(g);
- C == null || C(), M(this, fl).delete(g);
- }
- terminate() {
- for (const [, I] of M(this, fl))
- I == null || I();
- M(this, fl).clear();
- }
- }
- fl = new WeakMap(), LV = new WeakMap();
- var vV, Hc, Xc, jh, pN, Qh, BN;
- const FC = class FC {
- constructor({
- name: I = null,
- port: g = null,
- verbosity: C = vog()
- } = {}) {
- tg(this, jh);
- var i;
- if (this.name = I, this.destroyed = !1, this.verbosity = C, this._readyCapability = Promise.withResolvers(), this._port = null, this._webWorker = null, this._messageHandler = null, g) {
- if ((i = M(FC, Xc)) != null && i.has(g))
- throw new Error("Cannot use more than one PDFWorker per port.");
- (M(FC, Xc) || $(FC, Xc, /* @__PURE__ */ new WeakMap())).set(g, this), this._initializeFromPort(g);
- return;
- }
- this._initialize();
- }
- get promise() {
- return this._readyCapability.promise;
- }
- get port() {
- return this._port;
- }
- get messageHandler() {
- return this._messageHandler;
- }
- _initializeFromPort(I) {
- this._port = I, this._messageHandler = new Qu("main", "worker", I), this._messageHandler.on("ready", function() {
- }), ig(this, jh, pN).call(this);
- }
- _initialize() {
- if (M(FC, Hc) || M(FC, Qh, BN)) {
- this._setupFakeWorker();
- return;
- }
- let {
- workerSrc: I
- } = FC;
- try {
- FC._isSameOrigin(window.location, I) || (I = FC._createCDNWrapper(new URL(I, window.location).href));
- const g = new Worker(I, {
- type: "module"
- }), C = new Qu("main", "worker", g), i = () => {
- e.abort(), C.destroy(), g.terminate(), this.destroyed ? this._readyCapability.reject(new Error("Worker was destroyed")) : this._setupFakeWorker();
- }, e = new AbortController();
- g.addEventListener("error", () => {
- this._webWorker || i();
- }, {
- signal: e.signal
- }), C.on("test", (s) => {
- if (e.abort(), this.destroyed || !s) {
- i();
- return;
- }
- this._messageHandler = C, this._port = g, this._webWorker = g, ig(this, jh, pN).call(this);
- }), C.on("ready", (s) => {
- if (e.abort(), this.destroyed) {
- i();
- return;
- }
- try {
- A();
- } catch {
- this._setupFakeWorker();
- }
- });
- const A = () => {
- const s = new Uint8Array();
- C.send("test", s, [s.buffer]);
- };
- A();
- return;
- } catch {
- qV("The worker has been disabled.");
- }
- this._setupFakeWorker();
- }
- _setupFakeWorker() {
- M(FC, Hc) || (DI("Setting up fake worker."), $(FC, Hc, !0)), FC._setupFakeWorkerGlobal.then((I) => {
- if (this.destroyed) {
- this._readyCapability.reject(new Error("Worker was destroyed"));
- return;
- }
- const g = new idg();
- this._port = g;
- const C = `fake${Wi(FC, vV)._++}`, i = new Qu(C + "_worker", C, g);
- I.setup(i, g), this._messageHandler = new Qu(C, C + "_worker", g), ig(this, jh, pN).call(this);
- }).catch((I) => {
- this._readyCapability.reject(new Error(`Setting up fake worker failed: "${I.message}".`));
- });
- }
- destroy() {
- var I, g, C;
- this.destroyed = !0, (I = this._webWorker) == null || I.terminate(), this._webWorker = null, (g = M(FC, Xc)) == null || g.delete(this._port), this._port = null, (C = this._messageHandler) == null || C.destroy(), this._messageHandler = null;
- }
- static fromPort(I) {
- var C;
- if (!(I != null && I.port))
- throw new Error("PDFWorker.fromPort - invalid method signature.");
- const g = (C = M(this, Xc)) == null ? void 0 : C.get(I.port);
- if (g) {
- if (g._pendingDestroy)
- throw new Error("PDFWorker.fromPort - the worker is being destroyed.\nPlease remember to await `PDFDocumentLoadingTask.destroy()`-calls.");
- return g;
- }
- return new FC(I);
- }
- static get workerSrc() {
- if (Ql.workerSrc)
- return Ql.workerSrc;
- throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
- }
- static get _setupFakeWorkerGlobal() {
- return UI(this, "_setupFakeWorkerGlobal", (async () => M(this, Qh, BN) ? M(this, Qh, BN) : (await import(
- /*webpackIgnore: true*/
- /*@vite-ignore*/
- this.workerSrc
- )).WorkerMessageHandler)());
- }
- };
- vV = new WeakMap(), Hc = new WeakMap(), Xc = new WeakMap(), jh = new WeakSet(), pN = function() {
- this._readyCapability.resolve(), this._messageHandler.send("configure", {
- verbosity: this.verbosity
- });
- }, Qh = new WeakSet(), BN = function() {
- var I;
- try {
- return ((I = globalThis.pdfjsWorker) == null ? void 0 : I.WorkerMessageHandler) || null;
- } catch {
- return null;
- }
- }, tg(FC, Qh), tg(FC, vV, 0), tg(FC, Hc, !1), tg(FC, Xc), $t && ($(FC, Hc, !0), Ql.workerSrc || (Ql.workerSrc = "./pdf.worker.mjs")), FC._isSameOrigin = (I, g) => {
- const C = URL.parse(I);
- if (!(C != null && C.origin) || C.origin === "null")
- return !1;
- const i = new URL(g, C);
- return C.origin === i.origin;
- }, FC._createCDNWrapper = (I) => {
- const g = `await import("${I}");`;
- return URL.createObjectURL(new Blob([g], {
- type: "text/javascript"
- }));
- };
- let ch = FC;
- var Hl, ys, Oh, Uh, Xl, Sc, qu;
- class edg {
- constructor(I, g, C, i, e) {
- tg(this, Sc);
- tg(this, Hl, /* @__PURE__ */ new Map());
- tg(this, ys, /* @__PURE__ */ new Map());
- tg(this, Oh, /* @__PURE__ */ new Map());
- tg(this, Uh, /* @__PURE__ */ new Map());
- tg(this, Xl, null);
- this.messageHandler = I, this.loadingTask = g, this.commonObjs = new Xgg(), this.fontLoader = new scg({
- ownerDocument: i.ownerDocument,
- styleElement: i.styleElement
- }), this.loadingParams = i.loadingParams, this._params = i, this.canvasFactory = e.canvasFactory, this.filterFactory = e.filterFactory, this.cMapReaderFactory = e.cMapReaderFactory, this.standardFontDataFactory = e.standardFontDataFactory, this.wasmFactory = e.wasmFactory, this.destroyed = !1, this.destroyCapability = null, this._networkStream = C, this._fullReader = null, this._lastProgress = null, this.downloadInfoCapability = Promise.withResolvers(), this.setupMessageHandler();
- }
- get annotationStorage() {
- return UI(this, "annotationStorage", new Z9());
- }
- getRenderingIntent(I, g = la.ENABLE, C = null, i = !1, e = !1) {
- let A = ye.DISPLAY, s = oS;
- switch (I) {
- case "any":
- A = ye.ANY;
- break;
- case "display":
- break;
- case "print":
- A = ye.PRINT;
- break;
- default:
- DI(`getRenderingIntent - invalid intent: ${I}`);
- }
- const l = A & ye.PRINT && C instanceof cgg ? C : this.annotationStorage;
- switch (g) {
- case la.DISABLE:
- A += ye.ANNOTATIONS_DISABLE;
- break;
- case la.ENABLE:
- break;
- case la.ENABLE_FORMS:
- A += ye.ANNOTATIONS_FORMS;
- break;
- case la.ENABLE_STORAGE:
- A += ye.ANNOTATIONS_STORAGE, s = l.serializable;
- break;
- default:
- DI(`getRenderingIntent - invalid annotationMode: ${g}`);
- }
- i && (A += ye.IS_EDITING), e && (A += ye.OPLIST);
- const {
- ids: n,
- hash: a
- } = l.modifiedIds, d = [A, s.hash, a];
- return {
- renderingIntent: A,
- cacheKey: d.join("_"),
- annotationStorageSerializable: s,
- modifiedIds: n
- };
- }
- destroy() {
- var C;
- if (this.destroyCapability)
- return this.destroyCapability.promise;
- this.destroyed = !0, this.destroyCapability = Promise.withResolvers(), (C = M(this, Xl)) == null || C.reject(new Error("Worker was destroyed during onPassword callback"));
- const I = [];
- for (const i of M(this, ys).values())
- I.push(i._destroy());
- M(this, ys).clear(), M(this, Oh).clear(), M(this, Uh).clear(), this.hasOwnProperty("annotationStorage") && this.annotationStorage.resetModified();
- const g = this.messageHandler.sendWithPromise("Terminate", null);
- return I.push(g), Promise.all(I).then(() => {
- var i, e;
- this.commonObjs.clear(), this.fontLoader.clear(), M(this, Hl).clear(), this.filterFactory.destroy(), Mm.cleanup(), (i = this._networkStream) == null || i.cancelAllRequests(new Ea("Worker was terminated.")), (e = this.messageHandler) == null || e.destroy(), this.messageHandler = null, this.destroyCapability.resolve();
- }, this.destroyCapability.reject), this.destroyCapability.promise;
- }
- setupMessageHandler() {
- const {
- messageHandler: I,
- loadingTask: g
- } = this;
- I.on("GetReader", (C, i) => {
- ut(this._networkStream, "GetReader - no `IPDFStream` instance available."), this._fullReader = this._networkStream.getFullReader(), this._fullReader.onProgress = (e) => {
- this._lastProgress = {
- loaded: e.loaded,
- total: e.total
- };
- }, i.onPull = () => {
- this._fullReader.read().then(function({
- value: e,
- done: A
- }) {
- if (A) {
- i.close();
- return;
- }
- ut(e instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."), i.enqueue(new Uint8Array(e), 1, [e]);
- }).catch((e) => {
- i.error(e);
- });
- }, i.onCancel = (e) => {
- this._fullReader.cancel(e), i.ready.catch((A) => {
- if (!this.destroyed)
- throw A;
- });
- };
- }), I.on("ReaderHeadersReady", async (C) => {
- var s;
- await this._fullReader.headersReady;
- const {
- isStreamingSupported: i,
- isRangeSupported: e,
- contentLength: A
- } = this._fullReader;
- return (!i || !e) && (this._lastProgress && ((s = g.onProgress) == null || s.call(g, this._lastProgress)), this._fullReader.onProgress = (l) => {
- var n;
- (n = g.onProgress) == null || n.call(g, {
- loaded: l.loaded,
- total: l.total
- });
- }), {
- isStreamingSupported: i,
- isRangeSupported: e,
- contentLength: A
- };
- }), I.on("GetRangeReader", (C, i) => {
- ut(this._networkStream, "GetRangeReader - no `IPDFStream` instance available.");
- const e = this._networkStream.getRangeReader(C.begin, C.end);
- if (!e) {
- i.close();
- return;
- }
- i.onPull = () => {
- e.read().then(function({
- value: A,
- done: s
- }) {
- if (s) {
- i.close();
- return;
- }
- ut(A instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."), i.enqueue(new Uint8Array(A), 1, [A]);
- }).catch((A) => {
- i.error(A);
- });
- }, i.onCancel = (A) => {
- e.cancel(A), i.ready.catch((s) => {
- if (!this.destroyed)
- throw s;
- });
- };
- }), I.on("GetDoc", ({
- pdfInfo: C
- }) => {
- this._numPages = C.numPages, this._htmlForXfa = C.htmlForXfa, delete C.htmlForXfa, g._capability.resolve(new Cdg(C, this));
- }), I.on("DocException", (C) => {
- g._capability.reject(xi(C));
- }), I.on("PasswordRequest", (C) => {
- $(this, Xl, Promise.withResolvers());
- try {
- if (!g.onPassword)
- throw xi(C);
- const i = (e) => {
- e instanceof Error ? M(this, Xl).reject(e) : M(this, Xl).resolve({
- password: e
- });
- };
- g.onPassword(i, C.code);
- } catch (i) {
- M(this, Xl).reject(i);
- }
- return M(this, Xl).promise;
- }), I.on("DataLoaded", (C) => {
- var i;
- (i = g.onProgress) == null || i.call(g, {
- loaded: C.length,
- total: C.length
- }), this.downloadInfoCapability.resolve(C);
- }), I.on("StartRenderPage", (C) => {
- if (this.destroyed)
- return;
- M(this, ys).get(C.pageIndex)._startRenderPage(C.transparency, C.cacheKey);
- }), I.on("commonobj", ([C, i, e]) => {
- var A;
- if (this.destroyed || this.commonObjs.has(C))
- return null;
- switch (i) {
- case "Font":
- if ("error" in e) {
- const a = e.error;
- DI(`Error during font loading: ${a}`), this.commonObjs.resolve(C, a);
- break;
- }
- const s = this._params.pdfBug && ((A = globalThis.FontInspector) != null && A.enabled) ? (a, d) => globalThis.FontInspector.fontAdded(a, d) : null, l = new lcg(e, s);
- this.fontLoader.bind(l).catch(() => I.sendWithPromise("FontFallback", {
- id: C
- })).finally(() => {
- !l.fontExtraProperties && l.data && (l.data = null), this.commonObjs.resolve(C, l);
- });
- break;
- case "CopyLocalImage":
- const {
- imageRef: n
- } = e;
- ut(n, "The imageRef must be defined.");
- for (const a of M(this, ys).values())
- for (const [, d] of a.objs)
- if ((d == null ? void 0 : d.ref) === n)
- return d.dataLen ? (this.commonObjs.resolve(C, structuredClone(d)), d.dataLen) : null;
- break;
- case "FontPath":
- case "Image":
- case "Pattern":
- this.commonObjs.resolve(C, e);
- break;
- default:
- throw new Error(`Got unknown common object type ${i}`);
- }
- return null;
- }), I.on("obj", ([C, i, e, A]) => {
- var l;
- if (this.destroyed)
- return;
- const s = M(this, ys).get(i);
- if (!s.objs.has(C)) {
- if (s._intentStates.size === 0) {
- (l = A == null ? void 0 : A.bitmap) == null || l.close();
- return;
- }
- switch (e) {
- case "Image":
- case "Pattern":
- s.objs.resolve(C, A);
- break;
- default:
- throw new Error(`Got unknown object type ${e}`);
- }
- }
- }), I.on("DocProgress", (C) => {
- var i;
- this.destroyed || (i = g.onProgress) == null || i.call(g, {
- loaded: C.loaded,
- total: C.total
- });
- }), I.on("FetchBinaryData", async (C) => {
- if (this.destroyed)
- throw new Error("Worker was destroyed.");
- const i = this[C.type];
- if (!i)
- throw new Error(`${C.type} not initialized, see the \`useWorkerFetch\` parameter.`);
- return i.fetch(C);
- });
- }
- getData() {
- return this.messageHandler.sendWithPromise("GetData", null);
- }
- saveDocument() {
- var C;
- this.annotationStorage.size <= 0 && DI("saveDocument called while `annotationStorage` is empty, please use the getData-method instead.");
- const {
- map: I,
- transfer: g
- } = this.annotationStorage.serializable;
- return this.messageHandler.sendWithPromise("SaveDocument", {
- isPureXfa: !!this._htmlForXfa,
- numPages: this._numPages,
- annotationStorage: I,
- filename: ((C = this._fullReader) == null ? void 0 : C.filename) ?? null
- }, g).finally(() => {
- this.annotationStorage.resetModified();
- });
- }
- getPage(I) {
- if (!Number.isInteger(I) || I <= 0 || I > this._numPages)
- return Promise.reject(new Error("Invalid page request."));
- const g = I - 1, C = M(this, Oh).get(g);
- if (C)
- return C;
- const i = this.messageHandler.sendWithPromise("GetPage", {
- pageIndex: g
- }).then((e) => {
- if (this.destroyed)
- throw new Error("Transport destroyed");
- e.refStr && M(this, Uh).set(e.refStr, I);
- const A = new tdg(g, e, this, this._params.pdfBug);
- return M(this, ys).set(g, A), A;
- });
- return M(this, Oh).set(g, i), i;
- }
- getPageIndex(I) {
- return pS(I) ? this.messageHandler.sendWithPromise("GetPageIndex", {
- num: I.num,
- gen: I.gen
- }) : Promise.reject(new Error("Invalid pageIndex request."));
- }
- getAnnotations(I, g) {
- return this.messageHandler.sendWithPromise("GetAnnotations", {
- pageIndex: I,
- intent: g
- });
- }
- getFieldObjects() {
- return ig(this, Sc, qu).call(this, "GetFieldObjects");
- }
- hasJSActions() {
- return ig(this, Sc, qu).call(this, "HasJSActions");
- }
- getCalculationOrderIds() {
- return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null);
- }
- getDestinations() {
- return this.messageHandler.sendWithPromise("GetDestinations", null);
- }
- getDestination(I) {
- return typeof I != "string" ? Promise.reject(new Error("Invalid destination request.")) : this.messageHandler.sendWithPromise("GetDestination", {
- id: I
- });
- }
- getPageLabels() {
- return this.messageHandler.sendWithPromise("GetPageLabels", null);
- }
- getPageLayout() {
- return this.messageHandler.sendWithPromise("GetPageLayout", null);
- }
- getPageMode() {
- return this.messageHandler.sendWithPromise("GetPageMode", null);
- }
- getViewerPreferences() {
- return this.messageHandler.sendWithPromise("GetViewerPreferences", null);
- }
- getOpenAction() {
- return this.messageHandler.sendWithPromise("GetOpenAction", null);
- }
- getAttachments() {
- return this.messageHandler.sendWithPromise("GetAttachments", null);
- }
- getDocJSActions() {
- return ig(this, Sc, qu).call(this, "GetDocJSActions");
- }
- getPageJSActions(I) {
- return this.messageHandler.sendWithPromise("GetPageJSActions", {
- pageIndex: I
- });
- }
- getStructTree(I) {
- return this.messageHandler.sendWithPromise("GetStructTree", {
- pageIndex: I
- });
- }
- getOutline() {
- return this.messageHandler.sendWithPromise("GetOutline", null);
- }
- getOptionalContentConfig(I) {
- return ig(this, Sc, qu).call(this, "GetOptionalContentConfig").then((g) => new fcg(g, I));
- }
- getPermissions() {
- return this.messageHandler.sendWithPromise("GetPermissions", null);
- }
- getMetadata() {
- const I = "GetMetadata", g = M(this, Hl).get(I);
- if (g)
- return g;
- const C = this.messageHandler.sendWithPromise(I, null).then((i) => {
- var e, A;
- return {
- info: i[0],
- metadata: i[1] ? new Mcg(i[1]) : null,
- contentDispositionFilename: ((e = this._fullReader) == null ? void 0 : e.filename) ?? null,
- contentLength: ((A = this._fullReader) == null ? void 0 : A.contentLength) ?? null
- };
- });
- return M(this, Hl).set(I, C), C;
- }
- getMarkInfo() {
- return this.messageHandler.sendWithPromise("GetMarkInfo", null);
- }
- async startCleanup(I = !1) {
- if (!this.destroyed) {
- await this.messageHandler.sendWithPromise("Cleanup", null);
- for (const g of M(this, ys).values())
- if (!g.cleanup())
- throw new Error(`startCleanup: Page ${g.pageNumber} is currently rendering.`);
- this.commonObjs.clear(), I || this.fontLoader.clear(), M(this, Hl).clear(), this.filterFactory.destroy(!0), Mm.cleanup();
- }
- }
- cachedPageNumber(I) {
- if (!pS(I))
- return null;
- const g = I.gen === 0 ? `${I.num}R` : `${I.num}R${I.gen}`;
- return M(this, Uh).get(g) ?? null;
- }
- }
- Hl = new WeakMap(), ys = new WeakMap(), Oh = new WeakMap(), Uh = new WeakMap(), Xl = new WeakMap(), Sc = new WeakSet(), qu = function(I, g = null) {
- const C = M(this, Hl).get(I);
- if (C)
- return C;
- const i = this.messageHandler.sendWithPromise(I, g);
- return M(this, Hl).set(I, i), i;
- };
- const Xu = Symbol("INITIAL_DATA");
- var he, wZ, WS;
- class Xgg {
- constructor() {
- tg(this, wZ);
- tg(this, he, /* @__PURE__ */ Object.create(null));
- }
- get(I, g = null) {
- if (g) {
- const i = ig(this, wZ, WS).call(this, I);
- return i.promise.then(() => g(i.data)), null;
- }
- const C = M(this, he)[I];
- if (!C || C.data === Xu)
- throw new Error(`Requesting object that isn't resolved yet ${I}.`);
- return C.data;
- }
- has(I) {
- const g = M(this, he)[I];
- return !!g && g.data !== Xu;
- }
- delete(I) {
- const g = M(this, he)[I];
- return !g || g.data === Xu ? !1 : (delete M(this, he)[I], !0);
- }
- resolve(I, g = null) {
- const C = ig(this, wZ, WS).call(this, I);
- C.data = g, C.resolve();
- }
- clear() {
- var I;
- for (const g in M(this, he)) {
- const {
- data: C
- } = M(this, he)[g];
- (I = C == null ? void 0 : C.bitmap) == null || I.close();
- }
- $(this, he, /* @__PURE__ */ Object.create(null));
- }
- *[Symbol.iterator]() {
- for (const I in M(this, he)) {
- const {
- data: g
- } = M(this, he)[I];
- g !== Xu && (yield [I, g]);
- }
- }
- }
- he = new WeakMap(), wZ = new WeakSet(), WS = function(I) {
- var g;
- return (g = M(this, he))[I] || (g[I] = {
- ...Promise.withResolvers(),
- data: Xu
- });
- };
- var Ma;
- class Adg {
- constructor(I) {
- tg(this, Ma, null);
- iI(this, "onContinue", null);
- iI(this, "onError", null);
- $(this, Ma, I);
- }
- get promise() {
- return M(this, Ma).capability.promise;
- }
- cancel(I = 0) {
- M(this, Ma).cancel(null, I);
- }
- get separateAnnots() {
- const {
- separateAnnots: I
- } = M(this, Ma).operatorList;
- if (!I)
- return !1;
- const {
- annotationCanvasMap: g
- } = M(this, Ma);
- return I.form || I.canvas && (g == null ? void 0 : g.size) > 0;
- }
- }
- Ma = new WeakMap();
- var Ra, Dc;
- const qo = class qo {
- constructor({
- callback: I,
- params: g,
- objs: C,
- commonObjs: i,
- annotationCanvasMap: e,
- operatorList: A,
- pageIndex: s,
- canvasFactory: l,
- filterFactory: n,
- useRequestAnimationFrame: a = !1,
- pdfBug: d = !1,
- pageColors: o = null
- }) {
- tg(this, Ra, null);
- this.callback = I, this.params = g, this.objs = C, this.commonObjs = i, this.annotationCanvasMap = e, this.operatorListIdx = null, this.operatorList = A, this._pageIndex = s, this.canvasFactory = l, this.filterFactory = n, this._pdfBug = d, this.pageColors = o, this.running = !1, this.graphicsReadyCallback = null, this.graphicsReady = !1, this._useRequestAnimationFrame = a === !0 && typeof window < "u", this.cancelled = !1, this.capability = Promise.withResolvers(), this.task = new Adg(this), this._cancelBound = this.cancel.bind(this), this._continueBound = this._continue.bind(this), this._scheduleNextBound = this._scheduleNext.bind(this), this._nextBound = this._next.bind(this), this._canvas = g.canvasContext.canvas;
- }
- get completed() {
- return this.capability.promise.catch(function() {
- });
- }
- initializeGraphics({
- transparency: I = !1,
- optionalContentConfig: g
- }) {
- var s, l;
- if (this.cancelled)
- return;
- if (this._canvas) {
- if (M(qo, Dc).has(this._canvas))
- throw new Error("Cannot use the same canvas during multiple render() operations. Use different canvas or ensure previous operations were cancelled or completed.");
- M(qo, Dc).add(this._canvas);
- }
- this._pdfBug && ((s = globalThis.StepperManager) != null && s.enabled) && (this.stepper = globalThis.StepperManager.create(this._pageIndex), this.stepper.init(this.operatorList), this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint());
- const {
- canvasContext: C,
- viewport: i,
- transform: e,
- background: A
- } = this.params;
- this.gfx = new oh(C, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
- optionalContentConfig: g
- }, this.annotationCanvasMap, this.pageColors), this.gfx.beginDrawing({
- transform: e,
- viewport: i,
- transparency: I,
- background: A
- }), this.operatorListIdx = 0, this.graphicsReady = !0, (l = this.graphicsReadyCallback) == null || l.call(this);
- }
- cancel(I = null, g = 0) {
- var C, i, e;
- this.running = !1, this.cancelled = !0, (C = this.gfx) == null || C.endDrawing(), M(this, Ra) && (window.cancelAnimationFrame(M(this, Ra)), $(this, Ra, null)), M(qo, Dc).delete(this._canvas), I || (I = new r9(`Rendering cancelled, page ${this._pageIndex + 1}`, g)), this.callback(I), (e = (i = this.task).onError) == null || e.call(i, I);
- }
- operatorListChanged() {
- var I;
- if (!this.graphicsReady) {
- this.graphicsReadyCallback || (this.graphicsReadyCallback = this._continueBound);
- return;
- }
- (I = this.stepper) == null || I.updateOperatorList(this.operatorList), !this.running && this._continue();
- }
- _continue() {
- this.running = !0, !this.cancelled && (this.task.onContinue ? this.task.onContinue(this._scheduleNextBound) : this._scheduleNext());
- }
- _scheduleNext() {
- this._useRequestAnimationFrame ? $(this, Ra, window.requestAnimationFrame(() => {
- $(this, Ra, null), this._nextBound().catch(this._cancelBound);
- })) : Promise.resolve().then(this._nextBound).catch(this._cancelBound);
- }
- async _next() {
- this.cancelled || (this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper), this.operatorListIdx === this.operatorList.argsArray.length && (this.running = !1, this.operatorList.lastChunk && (this.gfx.endDrawing(), M(qo, Dc).delete(this._canvas), this.callback())));
- }
- };
- Ra = new WeakMap(), Dc = new WeakMap(), tg(qo, Dc, /* @__PURE__ */ new WeakSet());
- let yS = qo;
- const sdg = "5.1.91", ldg = "45cbe8bb0";
- function u8(t) {
- return Math.floor(Math.max(0, Math.min(1, t)) * 255).toString(16).padStart(2, "0");
- }
- function Su(t) {
- return Math.max(0, Math.min(255, 255 * t));
- }
- class m8 {
- static CMYK_G([I, g, C, i]) {
- return ["G", 1 - Math.min(1, 0.3 * I + 0.59 * C + 0.11 * g + i)];
- }
- static G_CMYK([I]) {
- return ["CMYK", 0, 0, 0, 1 - I];
- }
- static G_RGB([I]) {
- return ["RGB", I, I, I];
- }
- static G_rgb([I]) {
- return I = Su(I), [I, I, I];
- }
- static G_HTML([I]) {
- const g = u8(I);
- return `#${g}${g}${g}`;
- }
- static RGB_G([I, g, C]) {
- return ["G", 0.3 * I + 0.59 * g + 0.11 * C];
- }
- static RGB_rgb(I) {
- return I.map(Su);
- }
- static RGB_HTML(I) {
- return `#${I.map(u8).join("")}`;
- }
- static T_HTML() {
- return "#00000000";
- }
- static T_rgb() {
- return [null];
- }
- static CMYK_RGB([I, g, C, i]) {
- return ["RGB", 1 - Math.min(1, I + i), 1 - Math.min(1, C + i), 1 - Math.min(1, g + i)];
- }
- static CMYK_rgb([I, g, C, i]) {
- return [Su(1 - Math.min(1, I + i)), Su(1 - Math.min(1, C + i)), Su(1 - Math.min(1, g + i))];
- }
- static CMYK_HTML(I) {
- const g = this.CMYK_RGB(I).slice(1);
- return this.RGB_HTML(g);
- }
- static RGB_CMYK([I, g, C]) {
- const i = 1 - I, e = 1 - g, A = 1 - C, s = Math.min(i, e, A);
- return ["CMYK", i, e, A, s];
- }
- }
- class ndg {
- create(I, g, C = !1) {
- if (I <= 0 || g <= 0)
- throw new Error("Invalid SVG dimensions");
- const i = this._createSVG("svg:svg");
- return i.setAttribute("version", "1.1"), C || (i.setAttribute("width", `${I}px`), i.setAttribute("height", `${g}px`)), i.setAttribute("preserveAspectRatio", "none"), i.setAttribute("viewBox", `0 0 ${I} ${g}`), i;
- }
- createElement(I) {
- if (typeof I != "string")
- throw new Error("Invalid SVG element type");
- return this._createSVG(I);
- }
- _createSVG(I) {
- BC("Abstract method `_createSVG` called.");
- }
- }
- class eV extends ndg {
- _createSVG(I) {
- return document.createElementNS(dl, I);
- }
- }
- class Sgg {
- static setupStorage(I, g, C, i, e) {
- const A = i.getValue(g, {
- value: null
- });
- switch (C.name) {
- case "textarea":
- if (A.value !== null && (I.textContent = A.value), e === "print")
- break;
- I.addEventListener("input", (s) => {
- i.setValue(g, {
- value: s.target.value
- });
- });
- break;
- case "input":
- if (C.attributes.type === "radio" || C.attributes.type === "checkbox") {
- if (A.value === C.attributes.xfaOn ? I.setAttribute("checked", !0) : A.value === C.attributes.xfaOff && I.removeAttribute("checked"), e === "print")
- break;
- I.addEventListener("change", (s) => {
- i.setValue(g, {
- value: s.target.checked ? s.target.getAttribute("xfaOn") : s.target.getAttribute("xfaOff")
- });
- });
- } else {
- if (A.value !== null && I.setAttribute("value", A.value), e === "print")
- break;
- I.addEventListener("input", (s) => {
- i.setValue(g, {
- value: s.target.value
- });
- });
- }
- break;
- case "select":
- if (A.value !== null) {
- I.setAttribute("value", A.value);
- for (const s of C.children)
- s.attributes.value === A.value ? s.attributes.selected = !0 : s.attributes.hasOwnProperty("selected") && delete s.attributes.selected;
- }
- I.addEventListener("input", (s) => {
- const l = s.target.options, n = l.selectedIndex === -1 ? "" : l[l.selectedIndex].value;
- i.setValue(g, {
- value: n
- });
- });
- break;
- }
- }
- static setAttributes({
- html: I,
- element: g,
- storage: C = null,
- intent: i,
- linkService: e
- }) {
- const {
- attributes: A
- } = g, s = I instanceof HTMLAnchorElement;
- A.type === "radio" && (A.name = `${A.name}-${i}`);
- for (const [l, n] of Object.entries(A))
- if (n != null)
- switch (l) {
- case "class":
- n.length && I.setAttribute(l, n.join(" "));
- break;
- case "dataId":
- break;
- case "id":
- I.setAttribute("data-element-id", n);
- break;
- case "style":
- Object.assign(I.style, n);
- break;
- case "textContent":
- I.textContent = n;
- break;
- default:
- (!s || l !== "href" && l !== "newWindow") && I.setAttribute(l, n);
- }
- s && e.addLinkAttributes(I, A.href, A.newWindow), C && A.dataId && this.setupStorage(I, A.dataId, g, C);
- }
- static render(I) {
- var d, o;
- const g = I.annotationStorage, C = I.linkService, i = I.xfaHtml, e = I.intent || "display", A = document.createElement(i.name);
- i.attributes && this.setAttributes({
- html: A,
- element: i,
- intent: e,
- linkService: C
- });
- const s = e !== "richText", l = I.div;
- if (l.append(A), I.viewport) {
- const c = `matrix(${I.viewport.transform.join(",")})`;
- l.style.transform = c;
- }
- s && l.setAttribute("class", "xfaLayer xfaFont");
- const n = [];
- if (i.children.length === 0) {
- if (i.value) {
- const c = document.createTextNode(i.value);
- A.append(c), s && Rm.shouldBuildText(i.name) && n.push(c);
- }
- return {
- textDivs: n
- };
- }
- const a = [[i, -1, A]];
- for (; a.length > 0; ) {
- const [c, r, h] = a.at(-1);
- if (r + 1 === c.children.length) {
- a.pop();
- continue;
- }
- const b = c.children[++a.at(-1)[1]];
- if (b === null)
- continue;
- const {
- name: u
- } = b;
- if (u === "#text") {
- const Z = document.createTextNode(b.value);
- n.push(Z), h.append(Z);
- continue;
- }
- const m = (d = b == null ? void 0 : b.attributes) != null && d.xmlns ? document.createElementNS(b.attributes.xmlns, u) : document.createElement(u);
- if (h.append(m), b.attributes && this.setAttributes({
- html: m,
- element: b,
- storage: g,
- intent: e,
- linkService: C
- }), ((o = b.children) == null ? void 0 : o.length) > 0)
- a.push([b, -1, m]);
- else if (b.value) {
- const Z = document.createTextNode(b.value);
- s && Rm.shouldBuildText(u) && n.push(Z), m.append(Z);
- }
- }
- for (const c of l.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea"))
- c.setAttribute("readOnly", !0);
- return {
- textDivs: n
- };
- }
- static update(I) {
- const g = `matrix(${I.viewport.transform.join(",")})`;
- I.div.style.transform = g, I.div.hidden = !1;
- }
- }
- const aG = 1e3, adg = 9, rd = /* @__PURE__ */ new WeakSet();
- class Z8 {
- static create(I) {
- switch (I.data.annotationType) {
- case dt.LINK:
- return new Dgg(I);
- case dt.TEXT:
- return new odg(I);
- case dt.WIDGET:
- switch (I.data.fieldType) {
- case "Tx":
- return new cdg(I);
- case "Btn":
- return I.data.radioButton ? new kgg(I) : I.data.checkBox ? new rdg(I) : new hdg(I);
- case "Ch":
- return new bdg(I);
- case "Sig":
- return new ddg(I);
- }
- return new md(I);
- case dt.POPUP:
- return new NS(I);
- case dt.FREETEXT:
- return new Tgg(I);
- case dt.LINE:
- return new mdg(I);
- case dt.SQUARE:
- return new Zdg(I);
- case dt.CIRCLE:
- return new Gdg(I);
- case dt.POLYLINE:
- return new xgg(I);
- case dt.CARET:
- return new pdg(I);
- case dt.INK:
- return new p9(I);
- case dt.POLYGON:
- return new wdg(I);
- case dt.HIGHLIGHT:
- return new jgg(I);
- case dt.UNDERLINE:
- return new Bdg(I);
- case dt.SQUIGGLY:
- return new Wdg(I);
- case dt.STRIKEOUT:
- return new ydg(I);
- case dt.STAMP:
- return new Qgg(I);
- case dt.FILEATTACHMENT:
- return new Ydg(I);
- default:
- return new nt(I);
- }
- }
- }
- var Kc, Eh, Ph, pZ, YS;
- const e1 = class e1 {
- constructor(I, {
- isRenderable: g = !1,
- ignoreBorder: C = !1,
- createQuadrilaterals: i = !1
- } = {}) {
- tg(this, pZ);
- tg(this, Kc, null);
- tg(this, Eh, !1);
- tg(this, Ph, null);
- this.isRenderable = g, this.data = I.data, this.layer = I.layer, this.linkService = I.linkService, this.downloadManager = I.downloadManager, this.imageResourcesPath = I.imageResourcesPath, this.renderForms = I.renderForms, this.svgFactory = I.svgFactory, this.annotationStorage = I.annotationStorage, this.enableScripting = I.enableScripting, this.hasJSActions = I.hasJSActions, this._fieldObjects = I.fieldObjects, this.parent = I.parent, g && (this.container = this._createContainer(C)), i && this._createQuadrilaterals();
- }
- static _hasPopupData({
- titleObj: I,
- contentsObj: g,
- richText: C
- }) {
- return !!(I != null && I.str || g != null && g.str || C != null && C.str);
- }
- get _isEditable() {
- return this.data.isEditable;
- }
- get hasPopupData() {
- return e1._hasPopupData(this.data);
- }
- updateEdited(I) {
- var C;
- if (!this.container)
- return;
- M(this, Kc) || $(this, Kc, {
- rect: this.data.rect.slice(0)
- });
- const {
- rect: g
- } = I;
- g && ig(this, pZ, YS).call(this, g), (C = M(this, Ph)) == null || C.popup.updateEdited(I);
- }
- resetEdited() {
- var I;
- M(this, Kc) && (ig(this, pZ, YS).call(this, M(this, Kc).rect), (I = M(this, Ph)) == null || I.popup.resetEdited(), $(this, Kc, null));
- }
- _createContainer(I) {
- const {
- data: g,
- parent: {
- page: C,
- viewport: i
- }
- } = this, e = document.createElement("section");
- e.setAttribute("data-annotation-id", g.id), this instanceof md || (e.tabIndex = aG);
- const {
- style: A
- } = e;
- if (A.zIndex = this.parent.zIndex++, g.alternativeText && (e.title = g.alternativeText), g.noRotate && e.classList.add("norotate"), !g.rect || this instanceof NS) {
- const {
- rotation: h
- } = g;
- return !g.hasOwnCanvas && h !== 0 && this.setRotation(h, e), e;
- }
- const {
- width: s,
- height: l
- } = this;
- if (!I && g.borderStyle.width > 0) {
- A.borderWidth = `${g.borderStyle.width}px`;
- const h = g.borderStyle.horizontalCornerRadius, b = g.borderStyle.verticalCornerRadius;
- if (h > 0 || b > 0) {
- const m = `calc(${h}px * var(--total-scale-factor)) / calc(${b}px * var(--total-scale-factor))`;
- A.borderRadius = m;
- } else if (this instanceof kgg) {
- const m = `calc(${s}px * var(--total-scale-factor)) / calc(${l}px * var(--total-scale-factor))`;
- A.borderRadius = m;
- }
- switch (g.borderStyle.style) {
- case Qr.SOLID:
- A.borderStyle = "solid";
- break;
- case Qr.DASHED:
- A.borderStyle = "dashed";
- break;
- case Qr.BEVELED:
- DI("Unimplemented border style: beveled");
- break;
- case Qr.INSET:
- DI("Unimplemented border style: inset");
- break;
- case Qr.UNDERLINE:
- A.borderBottomStyle = "solid";
- break;
- }
- const u = g.borderColor || null;
- u ? ($(this, Eh, !0), A.borderColor = AI.makeHexColor(u[0] | 0, u[1] | 0, u[2] | 0)) : A.borderWidth = 0;
- }
- const n = AI.normalizeRect([g.rect[0], C.view[3] - g.rect[1] + C.view[1], g.rect[2], C.view[3] - g.rect[3] + C.view[1]]), {
- pageWidth: a,
- pageHeight: d,
- pageX: o,
- pageY: c
- } = i.rawDims;
- A.left = `${100 * (n[0] - o) / a}%`, A.top = `${100 * (n[1] - c) / d}%`;
- const {
- rotation: r
- } = g;
- return g.hasOwnCanvas || r === 0 ? (A.width = `${100 * s / a}%`, A.height = `${100 * l / d}%`) : this.setRotation(r, e), e;
- }
- setRotation(I, g = this.container) {
- if (!this.data.rect)
- return;
- const {
- pageWidth: C,
- pageHeight: i
- } = this.parent.viewport.rawDims;
- let {
- width: e,
- height: A
- } = this;
- I % 180 !== 0 && ([e, A] = [A, e]), g.style.width = `${100 * e / C}%`, g.style.height = `${100 * A / i}%`, g.setAttribute("data-main-rotation", (360 - I) % 360);
- }
- get _commonActions() {
- const I = (g, C, i) => {
- const e = i.detail[g], A = e[0], s = e.slice(1);
- i.target.style[C] = m8[`${A}_HTML`](s), this.annotationStorage.setValue(this.data.id, {
- [C]: m8[`${A}_rgb`](s)
- });
- };
- return UI(this, "_commonActions", {
- display: (g) => {
- const {
- display: C
- } = g.detail, i = C % 2 === 1;
- this.container.style.visibility = i ? "hidden" : "visible", this.annotationStorage.setValue(this.data.id, {
- noView: i,
- noPrint: C === 1 || C === 2
- });
- },
- print: (g) => {
- this.annotationStorage.setValue(this.data.id, {
- noPrint: !g.detail.print
- });
- },
- hidden: (g) => {
- const {
- hidden: C
- } = g.detail;
- this.container.style.visibility = C ? "hidden" : "visible", this.annotationStorage.setValue(this.data.id, {
- noPrint: C,
- noView: C
- });
- },
- focus: (g) => {
- setTimeout(() => g.target.focus({
- preventScroll: !1
- }), 0);
- },
- userName: (g) => {
- g.target.title = g.detail.userName;
- },
- readonly: (g) => {
- g.target.disabled = g.detail.readonly;
- },
- required: (g) => {
- this._setRequired(g.target, g.detail.required);
- },
- bgColor: (g) => {
- I("bgColor", "backgroundColor", g);
- },
- fillColor: (g) => {
- I("fillColor", "backgroundColor", g);
- },
- fgColor: (g) => {
- I("fgColor", "color", g);
- },
- textColor: (g) => {
- I("textColor", "color", g);
- },
- borderColor: (g) => {
- I("borderColor", "borderColor", g);
- },
- strokeColor: (g) => {
- I("strokeColor", "borderColor", g);
- },
- rotation: (g) => {
- const C = g.detail.rotation;
- this.setRotation(C), this.annotationStorage.setValue(this.data.id, {
- rotation: C
- });
- }
- });
- }
- _dispatchEventFromSandbox(I, g) {
- const C = this._commonActions;
- for (const i of Object.keys(g.detail)) {
- const e = I[i] || C[i];
- e == null || e(g);
- }
- }
- _setDefaultPropertiesFromJS(I) {
- if (!this.enableScripting)
- return;
- const g = this.annotationStorage.getRawValue(this.data.id);
- if (!g)
- return;
- const C = this._commonActions;
- for (const [i, e] of Object.entries(g)) {
- const A = C[i];
- if (A) {
- const s = {
- detail: {
- [i]: e
- },
- target: I
- };
- A(s), delete g[i];
- }
- }
- }
- _createQuadrilaterals() {
- if (!this.container)
- return;
- const {
- quadPoints: I
- } = this.data;
- if (!I)
- return;
- const [g, C, i, e] = this.data.rect.map((h) => Math.fround(h));
- if (I.length === 8) {
- const [h, b, u, m] = I.subarray(2, 6);
- if (i === h && e === b && g === u && C === m)
- return;
- }
- const {
- style: A
- } = this.container;
- let s;
- if (M(this, Eh)) {
- const {
- borderColor: h,
- borderWidth: b
- } = A;
- A.borderWidth = 0, s = ["url('data:image/svg+xml;utf8,", '<svg xmlns="http://www.w3.org/2000/svg"', ' preserveAspectRatio="none" viewBox="0 0 1 1">', `<g fill="transparent" stroke="${h}" stroke-width="${b}">`], this.container.classList.add("hasBorder");
- }
- const l = i - g, n = e - C, {
- svgFactory: a
- } = this, d = a.createElement("svg");
- d.classList.add("quadrilateralsContainer"), d.setAttribute("width", 0), d.setAttribute("height", 0);
- const o = a.createElement("defs");
- d.append(o);
- const c = a.createElement("clipPath"), r = `clippath_${this.data.id}`;
- c.setAttribute("id", r), c.setAttribute("clipPathUnits", "objectBoundingBox"), o.append(c);
- for (let h = 2, b = I.length; h < b; h += 8) {
- const u = I[h], m = I[h + 1], Z = I[h + 2], p = I[h + 3], Y = a.createElement("rect"), R = (Z - g) / l, X = (e - m) / n, H = (u - Z) / l, S = (m - p) / n;
- Y.setAttribute("x", R), Y.setAttribute("y", X), Y.setAttribute("width", H), Y.setAttribute("height", S), c.append(Y), s == null || s.push(`<rect vector-effect="non-scaling-stroke" x="${R}" y="${X}" width="${H}" height="${S}"/>`);
- }
- M(this, Eh) && (s.push("</g></svg>')"), A.backgroundImage = s.join("")), this.container.append(d), this.container.style.clipPath = `url(#${r})`;
- }
- _createPopup() {
- const {
- data: I
- } = this, g = $(this, Ph, new NS({
- data: {
- color: I.color,
- titleObj: I.titleObj,
- modificationDate: I.modificationDate,
- contentsObj: I.contentsObj,
- richText: I.richText,
- parentRect: I.rect,
- borderStyle: 0,
- id: `popup_${I.id}`,
- rotation: I.rotation
- },
- parent: this.parent,
- elements: [this]
- }));
- this.parent.div.append(g.render());
- }
- render() {
- BC("Abstract method `AnnotationElement.render` called");
- }
- _getElementsByName(I, g = null) {
- const C = [];
- if (this._fieldObjects) {
- const i = this._fieldObjects[I];
- if (i)
- for (const {
- page: e,
- id: A,
- exportValues: s
- } of i) {
- if (e === -1 || A === g)
- continue;
- const l = typeof s == "string" ? s : null, n = document.querySelector(`[data-element-id="${A}"]`);
- if (n && !rd.has(n)) {
- DI(`_getElementsByName - element not allowed: ${A}`);
- continue;
- }
- C.push({
- id: A,
- exportValue: l,
- domElement: n
- });
- }
- return C;
- }
- for (const i of document.getElementsByName(I)) {
- const {
- exportValue: e
- } = i, A = i.getAttribute("data-element-id");
- A !== g && rd.has(i) && C.push({
- id: A,
- exportValue: e,
- domElement: i
- });
- }
- return C;
- }
- show() {
- var I;
- this.container && (this.container.hidden = !1), (I = this.popup) == null || I.maybeShow();
- }
- hide() {
- var I;
- this.container && (this.container.hidden = !0), (I = this.popup) == null || I.forceHide();
- }
- getElementsToTriggerPopup() {
- return this.container;
- }
- addHighlightArea() {
- const I = this.getElementsToTriggerPopup();
- if (Array.isArray(I))
- for (const g of I)
- g.classList.add("highlightArea");
- else
- I.classList.add("highlightArea");
- }
- _editOnDoubleClick() {
- if (!this._isEditable)
- return;
- const {
- annotationEditorType: I,
- data: {
- id: g
- }
- } = this;
- this.container.addEventListener("dblclick", () => {
- var C;
- (C = this.linkService.eventBus) == null || C.dispatch("switchannotationeditormode", {
- source: this,
- mode: I,
- editId: g
- });
- });
- }
- get width() {
- return this.data.rect[2] - this.data.rect[0];
- }
- get height() {
- return this.data.rect[3] - this.data.rect[1];
- }
- };
- Kc = new WeakMap(), Eh = new WeakMap(), Ph = new WeakMap(), pZ = new WeakSet(), YS = function(I) {
- const {
- container: {
- style: g
- },
- data: {
- rect: C,
- rotation: i
- },
- parent: {
- viewport: {
- rawDims: {
- pageWidth: e,
- pageHeight: A,
- pageX: s,
- pageY: l
- }
- }
- }
- } = this;
- C == null || C.splice(0, 4, ...I), g.left = `${100 * (I[0] - s) / e}%`, g.top = `${100 * (A - I[3] + l) / A}%`, i === 0 ? (g.width = `${100 * (I[2] - I[0]) / e}%`, g.height = `${100 * (I[3] - I[1]) / A}%`) : this.setRotation(i);
- };
- let nt = e1;
- var Ye, To, Kgg, Fgg;
- class Dgg extends nt {
- constructor(g, C = null) {
- super(g, {
- isRenderable: !0,
- ignoreBorder: !!(C != null && C.ignoreBorder),
- createQuadrilaterals: !0
- });
- tg(this, Ye);
- this.isTooltipOnly = g.data.isTooltipOnly;
- }
- render() {
- const {
- data: g,
- linkService: C
- } = this, i = document.createElement("a");
- i.setAttribute("data-element-id", g.id);
- let e = !1;
- return g.url ? (C.addLinkAttributes(i, g.url, g.newWindow), e = !0) : g.action ? (this._bindNamedAction(i, g.action), e = !0) : g.attachment ? (ig(this, Ye, Kgg).call(this, i, g.attachment, g.attachmentDest), e = !0) : g.setOCGState ? (ig(this, Ye, Fgg).call(this, i, g.setOCGState), e = !0) : g.dest ? (this._bindLink(i, g.dest), e = !0) : (g.actions && (g.actions.Action || g.actions["Mouse Up"] || g.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions && (this._bindJSAction(i, g), e = !0), g.resetForm ? (this._bindResetFormAction(i, g.resetForm), e = !0) : this.isTooltipOnly && !e && (this._bindLink(i, ""), e = !0)), this.container.classList.add("linkAnnotation"), e && this.container.append(i), this.container;
- }
- _bindLink(g, C) {
- g.href = this.linkService.getDestinationHash(C), g.onclick = () => (C && this.linkService.goToDestination(C), !1), (C || C === "") && ig(this, Ye, To).call(this);
- }
- _bindNamedAction(g, C) {
- g.href = this.linkService.getAnchorUrl(""), g.onclick = () => (this.linkService.executeNamedAction(C), !1), ig(this, Ye, To).call(this);
- }
- _bindJSAction(g, C) {
- g.href = this.linkService.getAnchorUrl("");
- const i = /* @__PURE__ */ new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]);
- for (const e of Object.keys(C.actions)) {
- const A = i.get(e);
- A && (g[A] = () => {
- var s;
- return (s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: C.id,
- name: e
- }
- }), !1;
- });
- }
- g.onclick || (g.onclick = () => !1), ig(this, Ye, To).call(this);
- }
- _bindResetFormAction(g, C) {
- const i = g.onclick;
- if (i || (g.href = this.linkService.getAnchorUrl("")), ig(this, Ye, To).call(this), !this._fieldObjects) {
- DI('_bindResetFormAction - "resetForm" action not supported, ensure that the `fieldObjects` parameter is provided.'), i || (g.onclick = () => !1);
- return;
- }
- g.onclick = () => {
- var d;
- i == null || i();
- const {
- fields: e,
- refs: A,
- include: s
- } = C, l = [];
- if (e.length !== 0 || A.length !== 0) {
- const o = new Set(A);
- for (const c of e) {
- const r = this._fieldObjects[c] || [];
- for (const {
- id: h
- } of r)
- o.add(h);
- }
- for (const c of Object.values(this._fieldObjects))
- for (const r of c)
- o.has(r.id) === s && l.push(r);
- } else
- for (const o of Object.values(this._fieldObjects))
- l.push(...o);
- const n = this.annotationStorage, a = [];
- for (const o of l) {
- const {
- id: c
- } = o;
- switch (a.push(c), o.type) {
- case "text": {
- const h = o.defaultValue || "";
- n.setValue(c, {
- value: h
- });
- break;
- }
- case "checkbox":
- case "radiobutton": {
- const h = o.defaultValue === o.exportValues;
- n.setValue(c, {
- value: h
- });
- break;
- }
- case "combobox":
- case "listbox": {
- const h = o.defaultValue || "";
- n.setValue(c, {
- value: h
- });
- break;
- }
- default:
- continue;
- }
- const r = document.querySelector(`[data-element-id="${c}"]`);
- if (r) {
- if (!rd.has(r)) {
- DI(`_bindResetFormAction - element not allowed: ${c}`);
- continue;
- }
- } else continue;
- r.dispatchEvent(new Event("resetform"));
- }
- return this.enableScripting && ((d = this.linkService.eventBus) == null || d.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: "app",
- ids: a,
- name: "ResetForm"
- }
- })), !1;
- };
- }
- }
- Ye = new WeakSet(), To = function() {
- this.container.setAttribute("data-internal-link", "");
- }, Kgg = function(g, C, i = null) {
- g.href = this.linkService.getAnchorUrl(""), C.description && (g.title = C.description), g.onclick = () => {
- var e;
- return (e = this.downloadManager) == null || e.openOrDownloadData(C.content, C.filename, i), !1;
- }, ig(this, Ye, To).call(this);
- }, Fgg = function(g, C) {
- g.href = this.linkService.getAnchorUrl(""), g.onclick = () => (this.linkService.executeSetOCGState(C), !1), ig(this, Ye, To).call(this);
- };
- class odg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0
- });
- }
- render() {
- this.container.classList.add("textAnnotation");
- const I = document.createElement("img");
- return I.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg", I.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"), I.setAttribute("data-l10n-args", JSON.stringify({
- type: this.data.name
- })), !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.append(I), this.container;
- }
- }
- class md extends nt {
- render() {
- return this.container;
- }
- showElementAndHideCanvas(I) {
- var g;
- this.data.hasOwnCanvas && (((g = I.previousSibling) == null ? void 0 : g.nodeName) === "CANVAS" && (I.previousSibling.hidden = !0), I.hidden = !1);
- }
- _getKeyModifier(I) {
- return Ai.platform.isMac ? I.metaKey : I.ctrlKey;
- }
- _setEventListener(I, g, C, i, e) {
- C.includes("mouse") ? I.addEventListener(C, (A) => {
- var s;
- (s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: this.data.id,
- name: i,
- value: e(A),
- shift: A.shiftKey,
- modifier: this._getKeyModifier(A)
- }
- });
- }) : I.addEventListener(C, (A) => {
- var s;
- if (C === "blur") {
- if (!g.focused || !A.relatedTarget)
- return;
- g.focused = !1;
- } else if (C === "focus") {
- if (g.focused)
- return;
- g.focused = !0;
- }
- e && ((s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: this.data.id,
- name: i,
- value: e(A)
- }
- }));
- });
- }
- _setEventListeners(I, g, C, i) {
- var e, A, s;
- for (const [l, n] of C)
- (n === "Action" || (e = this.data.actions) != null && e[n]) && ((n === "Focus" || n === "Blur") && (g || (g = {
- focused: !1
- })), this._setEventListener(I, g, l, n, i), n === "Focus" && !((A = this.data.actions) != null && A.Blur) ? this._setEventListener(I, g, "blur", "Blur", null) : n === "Blur" && !((s = this.data.actions) != null && s.Focus) && this._setEventListener(I, g, "focus", "Focus", null));
- }
- _setBackgroundColor(I) {
- const g = this.data.backgroundColor || null;
- I.style.backgroundColor = g === null ? "transparent" : AI.makeHexColor(g[0], g[1], g[2]);
- }
- _setTextStyle(I) {
- const g = ["left", "center", "right"], {
- fontColor: C
- } = this.data.defaultAppearanceData, i = this.data.defaultAppearanceData.fontSize || adg, e = I.style;
- let A;
- const s = 2, l = (n) => Math.round(10 * n) / 10;
- if (this.data.multiLine) {
- const n = Math.abs(this.data.rect[3] - this.data.rect[1] - s), a = Math.round(n / (LH * i)) || 1, d = n / a;
- A = Math.min(i, l(d / LH));
- } else {
- const n = Math.abs(this.data.rect[3] - this.data.rect[1] - s);
- A = Math.min(i, l(n / LH));
- }
- e.fontSize = `calc(${A}px * var(--total-scale-factor))`, e.color = AI.makeHexColor(C[0], C[1], C[2]), this.data.textAlignment !== null && (e.textAlign = g[this.data.textAlignment]);
- }
- _setRequired(I, g) {
- g ? I.setAttribute("required", !0) : I.removeAttribute("required"), I.setAttribute("aria-required", g);
- }
- }
- class cdg extends md {
- constructor(I) {
- const g = I.renderForms || I.data.hasOwnCanvas || !I.data.hasAppearance && !!I.data.fieldValue;
- super(I, {
- isRenderable: g
- });
- }
- setPropertyOnSiblings(I, g, C, i) {
- const e = this.annotationStorage;
- for (const A of this._getElementsByName(I.name, I.id))
- A.domElement && (A.domElement[g] = C), e.setValue(A.id, {
- [i]: C
- });
- }
- render() {
- var i, e;
- const I = this.annotationStorage, g = this.data.id;
- this.container.classList.add("textWidgetAnnotation");
- let C = null;
- if (this.renderForms) {
- const A = I.getValue(g, {
- value: this.data.fieldValue
- });
- let s = A.value || "";
- const l = I.getValue(g, {
- charLimit: this.data.maxLen
- }).charLimit;
- l && s.length > l && (s = s.slice(0, l));
- let n = A.formattedValue || ((i = this.data.textContent) == null ? void 0 : i.join(`
- `)) || null;
- n && this.data.comb && (n = n.replaceAll(/\s+/g, ""));
- const a = {
- userValue: s,
- formattedValue: n,
- lastCommittedValue: null,
- commitKey: 1,
- focused: !1
- };
- this.data.multiLine ? (C = document.createElement("textarea"), C.textContent = n ?? s, this.data.doNotScroll && (C.style.overflowY = "hidden")) : (C = document.createElement("input"), C.type = this.data.password ? "password" : "text", C.setAttribute("value", n ?? s), this.data.doNotScroll && (C.style.overflowX = "hidden")), this.data.hasOwnCanvas && (C.hidden = !0), rd.add(C), C.setAttribute("data-element-id", g), C.disabled = this.data.readOnly, C.name = this.data.fieldName, C.tabIndex = aG, this._setRequired(C, this.data.required), l && (C.maxLength = l), C.addEventListener("input", (o) => {
- I.setValue(g, {
- value: o.target.value
- }), this.setPropertyOnSiblings(C, "value", o.target.value, "value"), a.formattedValue = null;
- }), C.addEventListener("resetform", (o) => {
- const c = this.data.defaultFieldValue ?? "";
- C.value = a.userValue = c, a.formattedValue = null;
- });
- let d = (o) => {
- const {
- formattedValue: c
- } = a;
- c != null && (o.target.value = c), o.target.scrollLeft = 0;
- };
- if (this.enableScripting && this.hasJSActions) {
- C.addEventListener("focus", (c) => {
- var h;
- if (a.focused)
- return;
- const {
- target: r
- } = c;
- a.userValue && (r.value = a.userValue), a.lastCommittedValue = r.value, a.commitKey = 1, (h = this.data.actions) != null && h.Focus || (a.focused = !0);
- }), C.addEventListener("updatefromsandbox", (c) => {
- this.showElementAndHideCanvas(c.target);
- const r = {
- value(h) {
- a.userValue = h.detail.value ?? "", I.setValue(g, {
- value: a.userValue.toString()
- }), h.target.value = a.userValue;
- },
- formattedValue(h) {
- const {
- formattedValue: b
- } = h.detail;
- a.formattedValue = b, b != null && h.target !== document.activeElement && (h.target.value = b), I.setValue(g, {
- formattedValue: b
- });
- },
- selRange(h) {
- h.target.setSelectionRange(...h.detail.selRange);
- },
- charLimit: (h) => {
- var Z;
- const {
- charLimit: b
- } = h.detail, {
- target: u
- } = h;
- if (b === 0) {
- u.removeAttribute("maxLength");
- return;
- }
- u.setAttribute("maxLength", b);
- let m = a.userValue;
- !m || m.length <= b || (m = m.slice(0, b), u.value = a.userValue = m, I.setValue(g, {
- value: m
- }), (Z = this.linkService.eventBus) == null || Z.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: g,
- name: "Keystroke",
- value: m,
- willCommit: !0,
- commitKey: 1,
- selStart: u.selectionStart,
- selEnd: u.selectionEnd
- }
- }));
- }
- };
- this._dispatchEventFromSandbox(r, c);
- }), C.addEventListener("keydown", (c) => {
- var b;
- a.commitKey = 1;
- let r = -1;
- if (c.key === "Escape" ? r = 0 : c.key === "Enter" && !this.data.multiLine ? r = 2 : c.key === "Tab" && (a.commitKey = 3), r === -1)
- return;
- const {
- value: h
- } = c.target;
- a.lastCommittedValue !== h && (a.lastCommittedValue = h, a.userValue = h, (b = this.linkService.eventBus) == null || b.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: g,
- name: "Keystroke",
- value: h,
- willCommit: !0,
- commitKey: r,
- selStart: c.target.selectionStart,
- selEnd: c.target.selectionEnd
- }
- }));
- });
- const o = d;
- d = null, C.addEventListener("blur", (c) => {
- var h, b;
- if (!a.focused || !c.relatedTarget)
- return;
- (h = this.data.actions) != null && h.Blur || (a.focused = !1);
- const {
- value: r
- } = c.target;
- a.userValue = r, a.lastCommittedValue !== r && ((b = this.linkService.eventBus) == null || b.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: g,
- name: "Keystroke",
- value: r,
- willCommit: !0,
- commitKey: a.commitKey,
- selStart: c.target.selectionStart,
- selEnd: c.target.selectionEnd
- }
- })), o(c);
- }), (e = this.data.actions) != null && e.Keystroke && C.addEventListener("beforeinput", (c) => {
- var Y;
- a.lastCommittedValue = null;
- const {
- data: r,
- target: h
- } = c, {
- value: b,
- selectionStart: u,
- selectionEnd: m
- } = h;
- let Z = u, p = m;
- switch (c.inputType) {
- case "deleteWordBackward": {
- const R = b.substring(0, u).match(/\w*[^\w]*$/);
- R && (Z -= R[0].length);
- break;
- }
- case "deleteWordForward": {
- const R = b.substring(u).match(/^[^\w]*\w*/);
- R && (p += R[0].length);
- break;
- }
- case "deleteContentBackward":
- u === m && (Z -= 1);
- break;
- case "deleteContentForward":
- u === m && (p += 1);
- break;
- }
- c.preventDefault(), (Y = this.linkService.eventBus) == null || Y.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: g,
- name: "Keystroke",
- value: b,
- change: r || "",
- willCommit: !1,
- selStart: Z,
- selEnd: p
- }
- });
- }), this._setEventListeners(C, a, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (c) => c.target.value);
- }
- if (d && C.addEventListener("blur", d), this.data.comb) {
- const c = (this.data.rect[2] - this.data.rect[0]) / l;
- C.classList.add("comb"), C.style.letterSpacing = `calc(${c}px * var(--total-scale-factor) - 1ch)`;
- }
- } else
- C = document.createElement("div"), C.textContent = this.data.fieldValue, C.style.verticalAlign = "middle", C.style.display = "table-cell", this.data.hasOwnCanvas && (C.hidden = !0);
- return this._setTextStyle(C), this._setBackgroundColor(C), this._setDefaultPropertiesFromJS(C), this.container.append(C), this.container;
- }
- }
- class ddg extends md {
- constructor(I) {
- super(I, {
- isRenderable: !!I.data.hasOwnCanvas
- });
- }
- }
- class rdg extends md {
- constructor(I) {
- super(I, {
- isRenderable: I.renderForms
- });
- }
- render() {
- const I = this.annotationStorage, g = this.data, C = g.id;
- let i = I.getValue(C, {
- value: g.exportValue === g.fieldValue
- }).value;
- typeof i == "string" && (i = i !== "Off", I.setValue(C, {
- value: i
- })), this.container.classList.add("buttonWidgetAnnotation", "checkBox");
- const e = document.createElement("input");
- return rd.add(e), e.setAttribute("data-element-id", C), e.disabled = g.readOnly, this._setRequired(e, this.data.required), e.type = "checkbox", e.name = g.fieldName, i && e.setAttribute("checked", !0), e.setAttribute("exportValue", g.exportValue), e.tabIndex = aG, e.addEventListener("change", (A) => {
- const {
- name: s,
- checked: l
- } = A.target;
- for (const n of this._getElementsByName(s, C)) {
- const a = l && n.exportValue === g.exportValue;
- n.domElement && (n.domElement.checked = a), I.setValue(n.id, {
- value: a
- });
- }
- I.setValue(C, {
- value: l
- });
- }), e.addEventListener("resetform", (A) => {
- const s = g.defaultFieldValue || "Off";
- A.target.checked = s === g.exportValue;
- }), this.enableScripting && this.hasJSActions && (e.addEventListener("updatefromsandbox", (A) => {
- const s = {
- value(l) {
- l.target.checked = l.detail.value !== "Off", I.setValue(C, {
- value: l.target.checked
- });
- }
- };
- this._dispatchEventFromSandbox(s, A);
- }), this._setEventListeners(e, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (A) => A.target.checked)), this._setBackgroundColor(e), this._setDefaultPropertiesFromJS(e), this.container.append(e), this.container;
- }
- }
- class kgg extends md {
- constructor(I) {
- super(I, {
- isRenderable: I.renderForms
- });
- }
- render() {
- this.container.classList.add("buttonWidgetAnnotation", "radioButton");
- const I = this.annotationStorage, g = this.data, C = g.id;
- let i = I.getValue(C, {
- value: g.fieldValue === g.buttonValue
- }).value;
- if (typeof i == "string" && (i = i !== g.buttonValue, I.setValue(C, {
- value: i
- })), i)
- for (const A of this._getElementsByName(g.fieldName, C))
- I.setValue(A.id, {
- value: !1
- });
- const e = document.createElement("input");
- if (rd.add(e), e.setAttribute("data-element-id", C), e.disabled = g.readOnly, this._setRequired(e, this.data.required), e.type = "radio", e.name = g.fieldName, i && e.setAttribute("checked", !0), e.tabIndex = aG, e.addEventListener("change", (A) => {
- const {
- name: s,
- checked: l
- } = A.target;
- for (const n of this._getElementsByName(s, C))
- I.setValue(n.id, {
- value: !1
- });
- I.setValue(C, {
- value: l
- });
- }), e.addEventListener("resetform", (A) => {
- const s = g.defaultFieldValue;
- A.target.checked = s != null && s === g.buttonValue;
- }), this.enableScripting && this.hasJSActions) {
- const A = g.buttonValue;
- e.addEventListener("updatefromsandbox", (s) => {
- const l = {
- value: (n) => {
- const a = A === n.detail.value;
- for (const d of this._getElementsByName(n.target.name)) {
- const o = a && d.id === C;
- d.domElement && (d.domElement.checked = o), I.setValue(d.id, {
- value: o
- });
- }
- }
- };
- this._dispatchEventFromSandbox(l, s);
- }), this._setEventListeners(e, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (s) => s.target.checked);
- }
- return this._setBackgroundColor(e), this._setDefaultPropertiesFromJS(e), this.container.append(e), this.container;
- }
- }
- class hdg extends Dgg {
- constructor(I) {
- super(I, {
- ignoreBorder: I.data.hasAppearance
- });
- }
- render() {
- const I = super.render();
- I.classList.add("buttonWidgetAnnotation", "pushButton");
- const g = I.lastChild;
- return this.enableScripting && this.hasJSActions && g && (this._setDefaultPropertiesFromJS(g), g.addEventListener("updatefromsandbox", (C) => {
- this._dispatchEventFromSandbox({}, C);
- })), I;
- }
- }
- class bdg extends md {
- constructor(I) {
- super(I, {
- isRenderable: I.renderForms
- });
- }
- render() {
- this.container.classList.add("choiceWidgetAnnotation");
- const I = this.annotationStorage, g = this.data.id, C = I.getValue(g, {
- value: this.data.fieldValue
- }), i = document.createElement("select");
- rd.add(i), i.setAttribute("data-element-id", g), i.disabled = this.data.readOnly, this._setRequired(i, this.data.required), i.name = this.data.fieldName, i.tabIndex = aG;
- let e = this.data.combo && this.data.options.length > 0;
- this.data.combo || (i.size = this.data.options.length, this.data.multiSelect && (i.multiple = !0)), i.addEventListener("resetform", (a) => {
- const d = this.data.defaultFieldValue;
- for (const o of i.options)
- o.selected = o.value === d;
- });
- for (const a of this.data.options) {
- const d = document.createElement("option");
- d.textContent = a.displayValue, d.value = a.exportValue, C.value.includes(a.exportValue) && (d.setAttribute("selected", !0), e = !1), i.append(d);
- }
- let A = null;
- if (e) {
- const a = document.createElement("option");
- a.value = " ", a.setAttribute("hidden", !0), a.setAttribute("selected", !0), i.prepend(a), A = () => {
- a.remove(), i.removeEventListener("input", A), A = null;
- }, i.addEventListener("input", A);
- }
- const s = (a) => {
- const d = a ? "value" : "textContent", {
- options: o,
- multiple: c
- } = i;
- return c ? Array.prototype.filter.call(o, (r) => r.selected).map((r) => r[d]) : o.selectedIndex === -1 ? null : o[o.selectedIndex][d];
- };
- let l = s(!1);
- const n = (a) => {
- const d = a.target.options;
- return Array.prototype.map.call(d, (o) => ({
- displayValue: o.textContent,
- exportValue: o.value
- }));
- };
- return this.enableScripting && this.hasJSActions ? (i.addEventListener("updatefromsandbox", (a) => {
- const d = {
- value(o) {
- A == null || A();
- const c = o.detail.value, r = new Set(Array.isArray(c) ? c : [c]);
- for (const h of i.options)
- h.selected = r.has(h.value);
- I.setValue(g, {
- value: s(!0)
- }), l = s(!1);
- },
- multipleSelection(o) {
- i.multiple = !0;
- },
- remove(o) {
- const c = i.options, r = o.detail.remove;
- c[r].selected = !1, i.remove(r), c.length > 0 && Array.prototype.findIndex.call(c, (b) => b.selected) === -1 && (c[0].selected = !0), I.setValue(g, {
- value: s(!0),
- items: n(o)
- }), l = s(!1);
- },
- clear(o) {
- for (; i.length !== 0; )
- i.remove(0);
- I.setValue(g, {
- value: null,
- items: []
- }), l = s(!1);
- },
- insert(o) {
- const {
- index: c,
- displayValue: r,
- exportValue: h
- } = o.detail.insert, b = i.children[c], u = document.createElement("option");
- u.textContent = r, u.value = h, b ? b.before(u) : i.append(u), I.setValue(g, {
- value: s(!0),
- items: n(o)
- }), l = s(!1);
- },
- items(o) {
- const {
- items: c
- } = o.detail;
- for (; i.length !== 0; )
- i.remove(0);
- for (const r of c) {
- const {
- displayValue: h,
- exportValue: b
- } = r, u = document.createElement("option");
- u.textContent = h, u.value = b, i.append(u);
- }
- i.options.length > 0 && (i.options[0].selected = !0), I.setValue(g, {
- value: s(!0),
- items: n(o)
- }), l = s(!1);
- },
- indices(o) {
- const c = new Set(o.detail.indices);
- for (const r of o.target.options)
- r.selected = c.has(r.index);
- I.setValue(g, {
- value: s(!0)
- }), l = s(!1);
- },
- editable(o) {
- o.target.disabled = !o.detail.editable;
- }
- };
- this._dispatchEventFromSandbox(d, a);
- }), i.addEventListener("input", (a) => {
- var c;
- const d = s(!0), o = s(!1);
- I.setValue(g, {
- value: d
- }), a.preventDefault(), (c = this.linkService.eventBus) == null || c.dispatch("dispatcheventinsandbox", {
- source: this,
- detail: {
- id: g,
- name: "Keystroke",
- value: l,
- change: o,
- changeEx: d,
- willCommit: !1,
- commitKey: 1,
- keyDown: !1
- }
- });
- }), this._setEventListeners(i, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], (a) => a.target.value)) : i.addEventListener("input", function(a) {
- I.setValue(g, {
- value: s(!0)
- });
- }), this.data.combo && this._setTextStyle(i), this._setBackgroundColor(i), this._setDefaultPropertiesFromJS(i), this.container.append(i), this.container;
- }
- }
- class NS extends nt {
- constructor(I) {
- const {
- data: g,
- elements: C
- } = I;
- super(I, {
- isRenderable: nt._hasPopupData(g)
- }), this.elements = C, this.popup = null;
- }
- render() {
- this.container.classList.add("popupAnnotation");
- const I = this.popup = new udg({
- container: this.container,
- color: this.data.color,
- titleObj: this.data.titleObj,
- modificationDate: this.data.modificationDate,
- contentsObj: this.data.contentsObj,
- richText: this.data.richText,
- rect: this.data.rect,
- parentRect: this.data.parentRect || null,
- parent: this.parent,
- elements: this.elements,
- open: this.data.open
- }), g = [];
- for (const C of this.elements)
- C.popup = I, C.container.ariaHasPopup = "dialog", g.push(C.data.id), C.addHighlightArea();
- return this.container.setAttribute("aria-controls", g.map((C) => `${d9}${C}`).join(",")), this.container;
- }
- }
- var _h, TV, xV, qh, $h, $C, Sl, g0, BZ, WZ, I0, Dl, yA, Kl, yZ, Fl, YZ, Fc, kc, WC, WN, VS, zgg, Jgg, Lgg, vgg, yN, YN, MS;
- class udg {
- constructor({
- container: I,
- color: g,
- elements: C,
- titleObj: i,
- modificationDate: e,
- contentsObj: A,
- richText: s,
- parent: l,
- rect: n,
- parentRect: a,
- open: d
- }) {
- tg(this, WC);
- tg(this, _h, ig(this, WC, Lgg).bind(this));
- tg(this, TV, ig(this, WC, MS).bind(this));
- tg(this, xV, ig(this, WC, YN).bind(this));
- tg(this, qh, ig(this, WC, yN).bind(this));
- tg(this, $h, null);
- tg(this, $C, null);
- tg(this, Sl, null);
- tg(this, g0, null);
- tg(this, BZ, null);
- tg(this, WZ, null);
- tg(this, I0, null);
- tg(this, Dl, !1);
- tg(this, yA, null);
- tg(this, Kl, null);
- tg(this, yZ, null);
- tg(this, Fl, null);
- tg(this, YZ, null);
- tg(this, Fc, null);
- tg(this, kc, !1);
- var o;
- $(this, $C, I), $(this, YZ, i), $(this, Sl, A), $(this, Fl, s), $(this, WZ, l), $(this, $h, g), $(this, yZ, n), $(this, I0, a), $(this, BZ, C), $(this, g0, b9.toDateObject(e)), this.trigger = C.flatMap((c) => c.getElementsToTriggerPopup());
- for (const c of this.trigger)
- c.addEventListener("click", M(this, qh)), c.addEventListener("mouseenter", M(this, xV)), c.addEventListener("mouseleave", M(this, TV)), c.classList.add("popupTriggerArea");
- for (const c of C)
- (o = c.container) == null || o.addEventListener("keydown", M(this, _h));
- M(this, $C).hidden = !0, d && ig(this, WC, yN).call(this);
- }
- render() {
- if (M(this, yA))
- return;
- const I = $(this, yA, document.createElement("div"));
- if (I.className = "popup", M(this, $h)) {
- const e = I.style.outlineColor = AI.makeHexColor(...M(this, $h));
- I.style.backgroundColor = `color-mix(in srgb, ${e} 30%, white)`;
- }
- const g = document.createElement("span");
- g.className = "header";
- const C = document.createElement("h1");
- if (g.append(C), {
- dir: C.dir,
- str: C.textContent
- } = M(this, YZ), I.append(g), M(this, g0)) {
- const e = document.createElement("span");
- e.classList.add("popupDate"), e.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"), e.setAttribute("data-l10n-args", JSON.stringify({
- dateObj: M(this, g0).valueOf()
- })), g.append(e);
- }
- const i = M(this, WC, WN);
- if (i)
- Sgg.render({
- xfaHtml: i,
- intent: "richText",
- div: I
- }), I.lastChild.classList.add("richText", "popupContent");
- else {
- const e = this._formatContents(M(this, Sl));
- I.append(e);
- }
- M(this, $C).append(I);
- }
- _formatContents({
- str: I,
- dir: g
- }) {
- const C = document.createElement("p");
- C.classList.add("popupContent"), C.dir = g;
- const i = I.split(/(?:\r\n?|\n)/);
- for (let e = 0, A = i.length; e < A; ++e) {
- const s = i[e];
- C.append(document.createTextNode(s)), e < A - 1 && C.append(document.createElement("br"));
- }
- return C;
- }
- updateEdited({
- rect: I,
- popupContent: g
- }) {
- var C;
- M(this, Fc) || $(this, Fc, {
- contentsObj: M(this, Sl),
- richText: M(this, Fl)
- }), I && $(this, Kl, null), g && ($(this, Fl, ig(this, WC, Jgg).call(this, g)), $(this, Sl, null)), (C = M(this, yA)) == null || C.remove(), $(this, yA, null);
- }
- resetEdited() {
- var I;
- M(this, Fc) && ({
- contentsObj: Wi(this, Sl)._,
- richText: Wi(this, Fl)._
- } = M(this, Fc), $(this, Fc, null), (I = M(this, yA)) == null || I.remove(), $(this, yA, null), $(this, Kl, null));
- }
- forceHide() {
- $(this, kc, this.isVisible), M(this, kc) && (M(this, $C).hidden = !0);
- }
- maybeShow() {
- M(this, kc) && (M(this, yA) || ig(this, WC, YN).call(this), $(this, kc, !1), M(this, $C).hidden = !1);
- }
- get isVisible() {
- return M(this, $C).hidden === !1;
- }
- }
- _h = new WeakMap(), TV = new WeakMap(), xV = new WeakMap(), qh = new WeakMap(), $h = new WeakMap(), $C = new WeakMap(), Sl = new WeakMap(), g0 = new WeakMap(), BZ = new WeakMap(), WZ = new WeakMap(), I0 = new WeakMap(), Dl = new WeakMap(), yA = new WeakMap(), Kl = new WeakMap(), yZ = new WeakMap(), Fl = new WeakMap(), YZ = new WeakMap(), Fc = new WeakMap(), kc = new WeakMap(), WC = new WeakSet(), WN = function() {
- const I = M(this, Fl), g = M(this, Sl);
- return I != null && I.str && (!(g != null && g.str) || g.str === I.str) && M(this, Fl).html || null;
- }, VS = function() {
- var I, g, C;
- return ((C = (g = (I = M(this, WC, WN)) == null ? void 0 : I.attributes) == null ? void 0 : g.style) == null ? void 0 : C.fontSize) || 0;
- }, zgg = function() {
- var I, g, C;
- return ((C = (g = (I = M(this, WC, WN)) == null ? void 0 : I.attributes) == null ? void 0 : g.style) == null ? void 0 : C.color) || null;
- }, Jgg = function(I) {
- const g = [], C = {
- str: I,
- html: {
- name: "div",
- attributes: {
- dir: "auto"
- },
- children: [{
- name: "p",
- children: g
- }]
- }
- }, i = {
- style: {
- color: M(this, WC, zgg),
- fontSize: M(this, WC, VS) ? `calc(${M(this, WC, VS)}px * var(--total-scale-factor))` : ""
- }
- };
- for (const e of I.split(`
- `))
- g.push({
- name: "span",
- value: e,
- attributes: i
- });
- return C;
- }, Lgg = function(I) {
- I.altKey || I.shiftKey || I.ctrlKey || I.metaKey || (I.key === "Enter" || I.key === "Escape" && M(this, Dl)) && ig(this, WC, yN).call(this);
- }, vgg = function() {
- if (M(this, Kl) !== null)
- return;
- const {
- page: {
- view: I
- },
- viewport: {
- rawDims: {
- pageWidth: g,
- pageHeight: C,
- pageX: i,
- pageY: e
- }
- }
- } = M(this, WZ);
- let A = !!M(this, I0), s = A ? M(this, I0) : M(this, yZ);
- for (const r of M(this, BZ))
- if (!s || AI.intersect(r.data.rect, s) !== null) {
- s = r.data.rect, A = !0;
- break;
- }
- const l = AI.normalizeRect([s[0], I[3] - s[1] + I[1], s[2], I[3] - s[3] + I[1]]), a = A ? s[2] - s[0] + 5 : 0, d = l[0] + a, o = l[1];
- $(this, Kl, [100 * (d - i) / g, 100 * (o - e) / C]);
- const {
- style: c
- } = M(this, $C);
- c.left = `${M(this, Kl)[0]}%`, c.top = `${M(this, Kl)[1]}%`;
- }, yN = function() {
- $(this, Dl, !M(this, Dl)), M(this, Dl) ? (ig(this, WC, YN).call(this), M(this, $C).addEventListener("click", M(this, qh)), M(this, $C).addEventListener("keydown", M(this, _h))) : (ig(this, WC, MS).call(this), M(this, $C).removeEventListener("click", M(this, qh)), M(this, $C).removeEventListener("keydown", M(this, _h)));
- }, YN = function() {
- M(this, yA) || this.render(), this.isVisible ? M(this, Dl) && M(this, $C).classList.add("focused") : (ig(this, WC, vgg).call(this), M(this, $C).hidden = !1, M(this, $C).style.zIndex = parseInt(M(this, $C).style.zIndex) + 1e3);
- }, MS = function() {
- M(this, $C).classList.remove("focused"), !(M(this, Dl) || !this.isVisible) && (M(this, $C).hidden = !0, M(this, $C).style.zIndex = parseInt(M(this, $C).style.zIndex) - 1e3);
- };
- class Tgg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0,
- ignoreBorder: !0
- }), this.textContent = I.data.textContent, this.textPosition = I.data.textPosition, this.annotationEditorType = XI.FREETEXT;
- }
- render() {
- if (this.container.classList.add("freeTextAnnotation"), this.textContent) {
- const I = document.createElement("div");
- I.classList.add("annotationTextContent"), I.setAttribute("role", "comment");
- for (const g of this.textContent) {
- const C = document.createElement("span");
- C.textContent = g, I.append(C);
- }
- this.container.append(I);
- }
- return !this.data.popupRef && this.hasPopupData && this._createPopup(), this._editOnDoubleClick(), this.container;
- }
- }
- var NZ;
- class mdg extends nt {
- constructor(g) {
- super(g, {
- isRenderable: !0,
- ignoreBorder: !0
- });
- tg(this, NZ, null);
- }
- render() {
- this.container.classList.add("lineAnnotation");
- const {
- data: g,
- width: C,
- height: i
- } = this, e = this.svgFactory.create(C, i, !0), A = $(this, NZ, this.svgFactory.createElement("svg:line"));
- return A.setAttribute("x1", g.rect[2] - g.lineCoordinates[0]), A.setAttribute("y1", g.rect[3] - g.lineCoordinates[1]), A.setAttribute("x2", g.rect[2] - g.lineCoordinates[2]), A.setAttribute("y2", g.rect[3] - g.lineCoordinates[3]), A.setAttribute("stroke-width", g.borderStyle.width || 1), A.setAttribute("stroke", "transparent"), A.setAttribute("fill", "transparent"), e.append(A), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
- }
- getElementsToTriggerPopup() {
- return M(this, NZ);
- }
- addHighlightArea() {
- this.container.classList.add("highlightArea");
- }
- }
- NZ = new WeakMap();
- var VZ;
- class Zdg extends nt {
- constructor(g) {
- super(g, {
- isRenderable: !0,
- ignoreBorder: !0
- });
- tg(this, VZ, null);
- }
- render() {
- this.container.classList.add("squareAnnotation");
- const {
- data: g,
- width: C,
- height: i
- } = this, e = this.svgFactory.create(C, i, !0), A = g.borderStyle.width, s = $(this, VZ, this.svgFactory.createElement("svg:rect"));
- return s.setAttribute("x", A / 2), s.setAttribute("y", A / 2), s.setAttribute("width", C - A), s.setAttribute("height", i - A), s.setAttribute("stroke-width", A || 1), s.setAttribute("stroke", "transparent"), s.setAttribute("fill", "transparent"), e.append(s), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
- }
- getElementsToTriggerPopup() {
- return M(this, VZ);
- }
- addHighlightArea() {
- this.container.classList.add("highlightArea");
- }
- }
- VZ = new WeakMap();
- var MZ;
- class Gdg extends nt {
- constructor(g) {
- super(g, {
- isRenderable: !0,
- ignoreBorder: !0
- });
- tg(this, MZ, null);
- }
- render() {
- this.container.classList.add("circleAnnotation");
- const {
- data: g,
- width: C,
- height: i
- } = this, e = this.svgFactory.create(C, i, !0), A = g.borderStyle.width, s = $(this, MZ, this.svgFactory.createElement("svg:ellipse"));
- return s.setAttribute("cx", C / 2), s.setAttribute("cy", i / 2), s.setAttribute("rx", C / 2 - A / 2), s.setAttribute("ry", i / 2 - A / 2), s.setAttribute("stroke-width", A || 1), s.setAttribute("stroke", "transparent"), s.setAttribute("fill", "transparent"), e.append(s), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
- }
- getElementsToTriggerPopup() {
- return M(this, MZ);
- }
- addHighlightArea() {
- this.container.classList.add("highlightArea");
- }
- }
- MZ = new WeakMap();
- var RZ;
- class xgg extends nt {
- constructor(g) {
- super(g, {
- isRenderable: !0,
- ignoreBorder: !0
- });
- tg(this, RZ, null);
- this.containerClassName = "polylineAnnotation", this.svgElementName = "svg:polyline";
- }
- render() {
- this.container.classList.add(this.containerClassName);
- const {
- data: {
- rect: g,
- vertices: C,
- borderStyle: i,
- popupRef: e
- },
- width: A,
- height: s
- } = this;
- if (!C)
- return this.container;
- const l = this.svgFactory.create(A, s, !0);
- let n = [];
- for (let d = 0, o = C.length; d < o; d += 2) {
- const c = C[d] - g[0], r = g[3] - C[d + 1];
- n.push(`${c},${r}`);
- }
- n = n.join(" ");
- const a = $(this, RZ, this.svgFactory.createElement(this.svgElementName));
- return a.setAttribute("points", n), a.setAttribute("stroke-width", i.width || 1), a.setAttribute("stroke", "transparent"), a.setAttribute("fill", "transparent"), l.append(a), this.container.append(l), !e && this.hasPopupData && this._createPopup(), this.container;
- }
- getElementsToTriggerPopup() {
- return M(this, RZ);
- }
- addHighlightArea() {
- this.container.classList.add("highlightArea");
- }
- }
- RZ = new WeakMap();
- class wdg extends xgg {
- constructor(I) {
- super(I), this.containerClassName = "polygonAnnotation", this.svgElementName = "svg:polygon";
- }
- }
- class pdg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0,
- ignoreBorder: !0
- });
- }
- render() {
- return this.container.classList.add("caretAnnotation"), !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container;
- }
- }
- var fZ, zc, HZ, RS;
- class p9 extends nt {
- constructor(g) {
- super(g, {
- isRenderable: !0,
- ignoreBorder: !0
- });
- tg(this, HZ);
- tg(this, fZ, null);
- tg(this, zc, []);
- this.containerClassName = "inkAnnotation", this.svgElementName = "svg:polyline", this.annotationEditorType = this.data.it === "InkHighlight" ? XI.HIGHLIGHT : XI.INK;
- }
- render() {
- this.container.classList.add(this.containerClassName);
- const {
- data: {
- rect: g,
- rotation: C,
- inkLists: i,
- borderStyle: e,
- popupRef: A
- }
- } = this, {
- transform: s,
- width: l,
- height: n
- } = ig(this, HZ, RS).call(this, C, g), a = this.svgFactory.create(l, n, !0), d = $(this, fZ, this.svgFactory.createElement("svg:g"));
- a.append(d), d.setAttribute("stroke-width", e.width || 1), d.setAttribute("stroke-linecap", "round"), d.setAttribute("stroke-linejoin", "round"), d.setAttribute("stroke-miterlimit", 10), d.setAttribute("stroke", "transparent"), d.setAttribute("fill", "transparent"), d.setAttribute("transform", s);
- for (let o = 0, c = i.length; o < c; o++) {
- const r = this.svgFactory.createElement(this.svgElementName);
- M(this, zc).push(r), r.setAttribute("points", i[o].join(",")), d.append(r);
- }
- return !A && this.hasPopupData && this._createPopup(), this.container.append(a), this._editOnDoubleClick(), this.container;
- }
- updateEdited(g) {
- super.updateEdited(g);
- const {
- thickness: C,
- points: i,
- rect: e
- } = g, A = M(this, fZ);
- if (C >= 0 && A.setAttribute("stroke-width", C || 1), i)
- for (let s = 0, l = M(this, zc).length; s < l; s++)
- M(this, zc)[s].setAttribute("points", i[s].join(","));
- if (e) {
- const {
- transform: s,
- width: l,
- height: n
- } = ig(this, HZ, RS).call(this, this.data.rotation, e);
- A.parentElement.setAttribute("viewBox", `0 0 ${l} ${n}`), A.setAttribute("transform", s);
- }
- }
- getElementsToTriggerPopup() {
- return M(this, zc);
- }
- addHighlightArea() {
- this.container.classList.add("highlightArea");
- }
- }
- fZ = new WeakMap(), zc = new WeakMap(), HZ = new WeakSet(), RS = function(g, C) {
- switch (g) {
- case 90:
- return {
- transform: `rotate(90) translate(${-C[0]},${C[1]}) scale(1,-1)`,
- width: C[3] - C[1],
- height: C[2] - C[0]
- };
- case 180:
- return {
- transform: `rotate(180) translate(${-C[2]},${C[1]}) scale(1,-1)`,
- width: C[2] - C[0],
- height: C[3] - C[1]
- };
- case 270:
- return {
- transform: `rotate(270) translate(${-C[2]},${C[3]}) scale(1,-1)`,
- width: C[3] - C[1],
- height: C[2] - C[0]
- };
- default:
- return {
- transform: `translate(${-C[0]},${C[3]}) scale(1,-1)`,
- width: C[2] - C[0],
- height: C[3] - C[1]
- };
- }
- };
- class jgg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0,
- ignoreBorder: !0,
- createQuadrilaterals: !0
- }), this.annotationEditorType = XI.HIGHLIGHT;
- }
- render() {
- return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("highlightAnnotation"), this._editOnDoubleClick(), this.container;
- }
- }
- class Bdg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0,
- ignoreBorder: !0,
- createQuadrilaterals: !0
- });
- }
- render() {
- return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("underlineAnnotation"), this.container;
- }
- }
- class Wdg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0,
- ignoreBorder: !0,
- createQuadrilaterals: !0
- });
- }
- render() {
- return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("squigglyAnnotation"), this.container;
- }
- }
- class ydg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0,
- ignoreBorder: !0,
- createQuadrilaterals: !0
- });
- }
- render() {
- return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("strikeoutAnnotation"), this.container;
- }
- }
- class Qgg extends nt {
- constructor(I) {
- super(I, {
- isRenderable: !0,
- ignoreBorder: !0
- }), this.annotationEditorType = XI.STAMP;
- }
- render() {
- return this.container.classList.add("stampAnnotation"), this.container.setAttribute("role", "img"), !this.data.popupRef && this.hasPopupData && this._createPopup(), this._editOnDoubleClick(), this.container;
- }
- }
- var XZ, SZ, fS;
- class Ydg extends nt {
- constructor(g) {
- var i;
- super(g, {
- isRenderable: !0
- });
- tg(this, SZ);
- tg(this, XZ, null);
- const {
- file: C
- } = this.data;
- this.filename = C.filename, this.content = C.content, (i = this.linkService.eventBus) == null || i.dispatch("fileattachmentannotation", {
- source: this,
- ...C
- });
- }
- render() {
- this.container.classList.add("fileAttachmentAnnotation");
- const {
- container: g,
- data: C
- } = this;
- let i;
- C.hasAppearance || C.fillAlpha === 0 ? i = document.createElement("div") : (i = document.createElement("img"), i.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(C.name) ? "paperclip" : "pushpin"}.svg`, C.fillAlpha && C.fillAlpha < 1 && (i.style = `filter: opacity(${Math.round(C.fillAlpha * 100)}%);`)), i.addEventListener("dblclick", ig(this, SZ, fS).bind(this)), $(this, XZ, i);
- const {
- isMac: e
- } = Ai.platform;
- return g.addEventListener("keydown", (A) => {
- A.key === "Enter" && (e ? A.metaKey : A.ctrlKey) && ig(this, SZ, fS).call(this);
- }), !C.popupRef && this.hasPopupData ? this._createPopup() : i.classList.add("popupTriggerArea"), g.append(i), g;
- }
- getElementsToTriggerPopup() {
- return M(this, XZ);
- }
- addHighlightArea() {
- this.container.classList.add("highlightArea");
- }
- }
- XZ = new WeakMap(), SZ = new WeakSet(), fS = function() {
- var g;
- (g = this.downloadManager) == null || g.openOrDownloadData(this.content, this.filename);
- };
- var DZ, Jc, fa, KZ, go, XS, SS;
- const A1 = class A1 {
- constructor({
- div: I,
- accessibilityManager: g,
- annotationCanvasMap: C,
- annotationEditorUIManager: i,
- page: e,
- viewport: A,
- structTreeLayer: s
- }) {
- tg(this, go);
- tg(this, DZ, null);
- tg(this, Jc, null);
- tg(this, fa, /* @__PURE__ */ new Map());
- tg(this, KZ, null);
- this.div = I, $(this, DZ, g), $(this, Jc, C), $(this, KZ, s || null), this.page = e, this.viewport = A, this.zIndex = 0, this._annotationEditorUIManager = i;
- }
- hasEditableAnnotations() {
- return M(this, fa).size > 0;
- }
- async render(I) {
- var A;
- const {
- annotations: g
- } = I, C = this.div;
- cd(C, this.viewport);
- const i = /* @__PURE__ */ new Map(), e = {
- data: null,
- layer: C,
- linkService: I.linkService,
- downloadManager: I.downloadManager,
- imageResourcesPath: I.imageResourcesPath || "",
- renderForms: I.renderForms !== !1,
- svgFactory: new eV(),
- annotationStorage: I.annotationStorage || new Z9(),
- enableScripting: I.enableScripting === !0,
- hasJSActions: I.hasJSActions,
- fieldObjects: I.fieldObjects,
- parent: this,
- elements: null
- };
- for (const s of g) {
- if (s.noHTML)
- continue;
- const l = s.annotationType === dt.POPUP;
- if (l) {
- const d = i.get(s.id);
- if (!d)
- continue;
- e.elements = d;
- } else if (s.rect[2] === s.rect[0] || s.rect[3] === s.rect[1])
- continue;
- e.data = s;
- const n = Z8.create(e);
- if (!n.isRenderable)
- continue;
- if (!l && s.popupRef) {
- const d = i.get(s.popupRef);
- d ? d.push(n) : i.set(s.popupRef, [n]);
- }
- const a = n.render();
- s.hidden && (a.style.visibility = "hidden"), await ig(this, go, XS).call(this, a, s.id), n._isEditable && (M(this, fa).set(n.data.id, n), (A = this._annotationEditorUIManager) == null || A.renderAnnotationElement(n));
- }
- ig(this, go, SS).call(this);
- }
- async addLinkAnnotations(I, g) {
- const C = {
- data: null,
- layer: this.div,
- linkService: g,
- svgFactory: new eV(),
- parent: this
- };
- for (const i of I) {
- i.borderStyle || (i.borderStyle = A1._defaultBorderStyle), C.data = i;
- const e = Z8.create(C);
- if (!e.isRenderable)
- continue;
- const A = e.render();
- await ig(this, go, XS).call(this, A, i.id);
- }
- }
- update({
- viewport: I
- }) {
- const g = this.div;
- this.viewport = I, cd(g, {
- rotation: I.rotation
- }), ig(this, go, SS).call(this), g.hidden = !1;
- }
- getEditableAnnotations() {
- return Array.from(M(this, fa).values());
- }
- getEditableAnnotation(I) {
- return M(this, fa).get(I);
- }
- static get _defaultBorderStyle() {
- return UI(this, "_defaultBorderStyle", Object.freeze({
- width: 1,
- rawWidth: 1,
- style: Qr.SOLID,
- dashArray: [3],
- horizontalCornerRadius: 0,
- verticalCornerRadius: 0
- }));
- }
- };
- DZ = new WeakMap(), Jc = new WeakMap(), fa = new WeakMap(), KZ = new WeakMap(), go = new WeakSet(), XS = async function(I, g) {
- var A, s;
- const C = I.firstChild || I, i = C.id = `${d9}${g}`, e = await ((A = M(this, KZ)) == null ? void 0 : A.getAriaAttributes(i));
- if (e)
- for (const [l, n] of e)
- C.setAttribute(l, n);
- this.div.append(I), (s = M(this, DZ)) == null || s.moveElementInDOM(this.div, I, C, !1);
- }, SS = function() {
- var g;
- if (!M(this, Jc))
- return;
- const I = this.div;
- for (const [C, i] of M(this, Jc)) {
- const e = I.querySelector(`[data-annotation-id="${C}"]`);
- if (!e)
- continue;
- i.className = "annotationContent";
- const {
- firstChild: A
- } = e;
- A ? A.nodeName === "CANVAS" ? A.replaceWith(i) : A.classList.contains("annotationContent") ? A.after(i) : A.before(i) : e.append(i);
- const s = M(this, fa).get(C);
- s && (s._hasNoCanvas ? ((g = this._annotationEditorUIManager) == null || g.setMissingCanvas(C, e.id, i), s._hasNoCanvas = !1) : s.canvas = i);
- }
- M(this, Jc).clear();
- };
- let HS = A1;
- const vY = /\r\n?|\n/g;
- var YA, be, FZ, Lc, ue, mt, Ogg, Ugg, Egg, NN, gn, VN, MN, Pgg, KS, _gg;
- const NC = class NC extends TC {
- constructor(g) {
- super({
- ...g,
- name: "freeTextEditor"
- });
- tg(this, mt);
- tg(this, YA);
- tg(this, be, "");
- tg(this, FZ, `${this.id}-editor`);
- tg(this, Lc, null);
- tg(this, ue);
- $(this, YA, g.color || NC._defaultColor || TC._defaultLineColor), $(this, ue, g.fontSize || NC._defaultFontSize);
- }
- static get _keyboardManager() {
- const g = NC.prototype, C = (A) => A.isEmpty(), i = dd.TRANSLATE_SMALL, e = dd.TRANSLATE_BIG;
- return UI(this, "_keyboardManager", new lG([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], g.commitOrRemove, {
- bubbles: !0
- }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], g.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], g._translateEmpty, {
- args: [-i, 0],
- checker: C
- }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], g._translateEmpty, {
- args: [-e, 0],
- checker: C
- }], [["ArrowRight", "mac+ArrowRight"], g._translateEmpty, {
- args: [i, 0],
- checker: C
- }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], g._translateEmpty, {
- args: [e, 0],
- checker: C
- }], [["ArrowUp", "mac+ArrowUp"], g._translateEmpty, {
- args: [0, -i],
- checker: C
- }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], g._translateEmpty, {
- args: [0, -e],
- checker: C
- }], [["ArrowDown", "mac+ArrowDown"], g._translateEmpty, {
- args: [0, i],
- checker: C
- }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], g._translateEmpty, {
- args: [0, e],
- checker: C
- }]]));
- }
- static initialize(g, C) {
- TC.initialize(g, C);
- const i = getComputedStyle(document.documentElement);
- this._internalPadding = parseFloat(i.getPropertyValue("--freetext-padding"));
- }
- static updateDefaultParams(g, C) {
- switch (g) {
- case iC.FREETEXT_SIZE:
- NC._defaultFontSize = C;
- break;
- case iC.FREETEXT_COLOR:
- NC._defaultColor = C;
- break;
- }
- }
- updateParams(g, C) {
- switch (g) {
- case iC.FREETEXT_SIZE:
- ig(this, mt, Ogg).call(this, C);
- break;
- case iC.FREETEXT_COLOR:
- ig(this, mt, Ugg).call(this, C);
- break;
- }
- }
- static get defaultPropertiesToUpdate() {
- return [[iC.FREETEXT_SIZE, NC._defaultFontSize], [iC.FREETEXT_COLOR, NC._defaultColor || TC._defaultLineColor]];
- }
- get propertiesToUpdate() {
- return [[iC.FREETEXT_SIZE, M(this, ue)], [iC.FREETEXT_COLOR, M(this, YA)]];
- }
- _translateEmpty(g, C) {
- this._uiManager.translateSelectedEditors(g, C, !0);
- }
- getInitialTranslation() {
- const g = this.parentScale;
- return [-NC._internalPadding * g, -(NC._internalPadding + M(this, ue)) * g];
- }
- rebuild() {
- this.parent && (super.rebuild(), this.div !== null && (this.isAttachedToDOM || this.parent.add(this)));
- }
- enableEditMode() {
- if (this.isInEditMode())
- return;
- this.parent.setEditingState(!1), this.parent.updateToolbar(XI.FREETEXT), super.enableEditMode(), this.overlayDiv.classList.remove("enabled"), this.editorDiv.contentEditable = !0, this._isDraggable = !1, this.div.removeAttribute("aria-activedescendant"), $(this, Lc, new AbortController());
- const g = this._uiManager.combinedSignal(M(this, Lc));
- this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), {
- signal: g
- }), this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), {
- signal: g
- }), this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), {
- signal: g
- }), this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), {
- signal: g
- }), this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), {
- signal: g
- });
- }
- disableEditMode() {
- var g;
- this.isInEditMode() && (this.parent.setEditingState(!0), super.disableEditMode(), this.overlayDiv.classList.add("enabled"), this.editorDiv.contentEditable = !1, this.div.setAttribute("aria-activedescendant", M(this, FZ)), this._isDraggable = !0, (g = M(this, Lc)) == null || g.abort(), $(this, Lc, null), this.div.focus({
- preventScroll: !0
- }), this.isEditing = !1, this.parent.div.classList.add("freetextEditing"));
- }
- focusin(g) {
- this._focusEventsAllowed && (super.focusin(g), g.target !== this.editorDiv && this.editorDiv.focus());
- }
- onceAdded(g) {
- var C;
- this.width || (this.enableEditMode(), g && this.editorDiv.focus(), (C = this._initialOptions) != null && C.isCentered && this.center(), this._initialOptions = null);
- }
- isEmpty() {
- return !this.editorDiv || this.editorDiv.innerText.trim() === "";
- }
- remove() {
- this.isEditing = !1, this.parent && (this.parent.setEditingState(!0), this.parent.div.classList.add("freetextEditing")), super.remove();
- }
- commit() {
- if (!this.isInEditMode())
- return;
- super.commit(), this.disableEditMode();
- const g = M(this, be), C = $(this, be, ig(this, mt, Egg).call(this).trimEnd());
- if (g === C)
- return;
- const i = (e) => {
- if ($(this, be, e), !e) {
- this.remove();
- return;
- }
- ig(this, mt, MN).call(this), this._uiManager.rebuild(this), ig(this, mt, NN).call(this);
- };
- this.addCommands({
- cmd: () => {
- i(C);
- },
- undo: () => {
- i(g);
- },
- mustExec: !1
- }), ig(this, mt, NN).call(this);
- }
- shouldGetKeyboardEvents() {
- return this.isInEditMode();
- }
- enterInEditMode() {
- this.enableEditMode(), this.editorDiv.focus();
- }
- dblclick(g) {
- this.enterInEditMode();
- }
- keydown(g) {
- g.target === this.div && g.key === "Enter" && (this.enterInEditMode(), g.preventDefault());
- }
- editorDivKeydown(g) {
- NC._keyboardManager.exec(this, g);
- }
- editorDivFocus(g) {
- this.isEditing = !0;
- }
- editorDivBlur(g) {
- this.isEditing = !1;
- }
- editorDivInput(g) {
- this.parent.div.classList.toggle("freetextEditing", this.isEmpty());
- }
- disableEditing() {
- this.editorDiv.setAttribute("role", "comment"), this.editorDiv.removeAttribute("aria-multiline");
- }
- enableEditing() {
- this.editorDiv.setAttribute("role", "textbox"), this.editorDiv.setAttribute("aria-multiline", !0);
- }
- render() {
- if (this.div)
- return this.div;
- let g, C;
- (this._isCopy || this.annotationElementId) && (g = this.x, C = this.y), super.render(), this.editorDiv = document.createElement("div"), this.editorDiv.className = "internal", this.editorDiv.setAttribute("id", M(this, FZ)), this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"), this.editorDiv.setAttribute("data-l10n-attrs", "default-content"), this.enableEditing(), this.editorDiv.contentEditable = !0;
- const {
- style: i
- } = this.editorDiv;
- if (i.fontSize = `calc(${M(this, ue)}px * var(--total-scale-factor))`, i.color = M(this, YA), this.div.append(this.editorDiv), this.overlayDiv = document.createElement("div"), this.overlayDiv.classList.add("overlay", "enabled"), this.div.append(this.overlayDiv), m9(this, this.div, ["dblclick", "keydown"]), this._isCopy || this.annotationElementId) {
- const [e, A] = this.parentDimensions;
- if (this.annotationElementId) {
- const {
- position: s
- } = this._initialData;
- let [l, n] = this.getInitialTranslation();
- [l, n] = this.pageTranslationToScreen(l, n);
- const [a, d] = this.pageDimensions, [o, c] = this.pageTranslation;
- let r, h;
- switch (this.rotation) {
- case 0:
- r = g + (s[0] - o) / a, h = C + this.height - (s[1] - c) / d;
- break;
- case 90:
- r = g + (s[0] - o) / a, h = C - (s[1] - c) / d, [l, n] = [n, -l];
- break;
- case 180:
- r = g - this.width + (s[0] - o) / a, h = C - (s[1] - c) / d, [l, n] = [-l, -n];
- break;
- case 270:
- r = g + (s[0] - o - this.height * d) / a, h = C + (s[1] - c - this.width * a) / d, [l, n] = [-n, l];
- break;
- }
- this.setAt(r * e, h * A, l, n);
- } else
- this._moveAfterPaste(g, C);
- ig(this, mt, MN).call(this), this._isDraggable = !0, this.editorDiv.contentEditable = !1;
- } else
- this._isDraggable = !1, this.editorDiv.contentEditable = !0;
- return this.div;
- }
- editorDivPaste(g) {
- var r, h, b;
- const C = g.clipboardData || window.clipboardData, {
- types: i
- } = C;
- if (i.length === 1 && i[0] === "text/plain")
- return;
- g.preventDefault();
- const e = ig(r = NC, gn, KS).call(r, C.getData("text") || "").replaceAll(vY, `
- `);
- if (!e)
- return;
- const A = window.getSelection();
- if (!A.rangeCount)
- return;
- this.editorDiv.normalize(), A.deleteFromDocument();
- const s = A.getRangeAt(0);
- if (!e.includes(`
- `)) {
- s.insertNode(document.createTextNode(e)), this.editorDiv.normalize(), A.collapseToStart();
- return;
- }
- const {
- startContainer: l,
- startOffset: n
- } = s, a = [], d = [];
- if (l.nodeType === Node.TEXT_NODE) {
- const u = l.parentElement;
- if (d.push(l.nodeValue.slice(n).replaceAll(vY, "")), u !== this.editorDiv) {
- let m = a;
- for (const Z of this.editorDiv.childNodes) {
- if (Z === u) {
- m = d;
- continue;
- }
- m.push(ig(h = NC, gn, VN).call(h, Z));
- }
- }
- a.push(l.nodeValue.slice(0, n).replaceAll(vY, ""));
- } else if (l === this.editorDiv) {
- let u = a, m = 0;
- for (const Z of this.editorDiv.childNodes)
- m++ === n && (u = d), u.push(ig(b = NC, gn, VN).call(b, Z));
- }
- $(this, be, `${a.join(`
- `)}${e}${d.join(`
- `)}`), ig(this, mt, MN).call(this);
- const o = new Range();
- let c = Math.sumPrecise(a.map((u) => u.length));
- for (const {
- firstChild: u
- } of this.editorDiv.childNodes)
- if (u.nodeType === Node.TEXT_NODE) {
- const m = u.nodeValue.length;
- if (c <= m) {
- o.setStart(u, c), o.setEnd(u, c);
- break;
- }
- c -= m;
- }
- A.removeAllRanges(), A.addRange(o);
- }
- get contentDiv() {
- return this.editorDiv;
- }
- static async deserialize(g, C, i) {
- var s;
- let e = null;
- if (g instanceof Tgg) {
- const {
- data: {
- defaultAppearanceData: {
- fontSize: l,
- fontColor: n
- },
- rect: a,
- rotation: d,
- id: o,
- popupRef: c
- },
- textContent: r,
- textPosition: h,
- parent: {
- page: {
- pageNumber: b
- }
- }
- } = g;
- if (!r || r.length === 0)
- return null;
- e = g = {
- annotationType: XI.FREETEXT,
- color: Array.from(n),
- fontSize: l,
- value: r.join(`
- `),
- position: h,
- pageIndex: b - 1,
- rect: a.slice(0),
- rotation: d,
- id: o,
- deleted: !1,
- popupRef: c
- };
- }
- const A = await super.deserialize(g, C, i);
- return $(A, ue, g.fontSize), $(A, YA, AI.makeHexColor(...g.color)), $(A, be, ig(s = NC, gn, KS).call(s, g.value)), A.annotationElementId = g.id || null, A._initialData = e, A;
- }
- serialize(g = !1) {
- if (this.isEmpty())
- return null;
- if (this.deleted)
- return this.serializeDeleted();
- const C = NC._internalPadding * this.parentScale, i = this.getRect(C, C), e = TC._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : M(this, YA)), A = {
- annotationType: XI.FREETEXT,
- color: e,
- fontSize: M(this, ue),
- value: ig(this, mt, Pgg).call(this),
- pageIndex: this.pageIndex,
- rect: i,
- rotation: this.rotation,
- structTreeParentId: this._structTreeParentId
- };
- return g ? (A.isCopy = !0, A) : this.annotationElementId && !ig(this, mt, _gg).call(this, A) ? null : (A.id = this.annotationElementId, A);
- }
- renderAnnotationElement(g) {
- const C = super.renderAnnotationElement(g);
- if (this.deleted)
- return C;
- const {
- style: i
- } = C;
- i.fontSize = `calc(${M(this, ue)}px * var(--total-scale-factor))`, i.color = M(this, YA), C.replaceChildren();
- for (const A of M(this, be).split(`
- `)) {
- const s = document.createElement("div");
- s.append(A ? document.createTextNode(A) : document.createElement("br")), C.append(s);
- }
- const e = NC._internalPadding * this.parentScale;
- return g.updateEdited({
- rect: this.getRect(e, e),
- popupContent: M(this, be)
- }), C;
- }
- resetAnnotationElement(g) {
- super.resetAnnotationElement(g), g.resetEdited();
- }
- };
- YA = new WeakMap(), be = new WeakMap(), FZ = new WeakMap(), Lc = new WeakMap(), ue = new WeakMap(), mt = new WeakSet(), Ogg = function(g) {
- const C = (e) => {
- this.editorDiv.style.fontSize = `calc(${e}px * var(--total-scale-factor))`, this.translate(0, -(e - M(this, ue)) * this.parentScale), $(this, ue, e), ig(this, mt, NN).call(this);
- }, i = M(this, ue);
- this.addCommands({
- cmd: C.bind(this, g),
- undo: C.bind(this, i),
- post: this._uiManager.updateUI.bind(this._uiManager, this),
- mustExec: !0,
- type: iC.FREETEXT_SIZE,
- overwriteIfSameType: !0,
- keepUndo: !0
- });
- }, Ugg = function(g) {
- const C = (e) => {
- $(this, YA, this.editorDiv.style.color = e);
- }, i = M(this, YA);
- this.addCommands({
- cmd: C.bind(this, g),
- undo: C.bind(this, i),
- post: this._uiManager.updateUI.bind(this._uiManager, this),
- mustExec: !0,
- type: iC.FREETEXT_COLOR,
- overwriteIfSameType: !0,
- keepUndo: !0
- });
- }, Egg = function() {
- var i;
- const g = [];
- this.editorDiv.normalize();
- let C = null;
- for (const e of this.editorDiv.childNodes)
- (C == null ? void 0 : C.nodeType) === Node.TEXT_NODE && e.nodeName === "BR" || (g.push(ig(i = NC, gn, VN).call(i, e)), C = e);
- return g.join(`
- `);
- }, NN = function() {
- const [g, C] = this.parentDimensions;
- let i;
- if (this.isAttachedToDOM)
- i = this.div.getBoundingClientRect();
- else {
- const {
- currentLayer: e,
- div: A
- } = this, s = A.style.display, l = A.classList.contains("hidden");
- A.classList.remove("hidden"), A.style.display = "hidden", e.div.append(this.div), i = A.getBoundingClientRect(), A.remove(), A.style.display = s, A.classList.toggle("hidden", l);
- }
- this.rotation % 180 === this.parentRotation % 180 ? (this.width = i.width / g, this.height = i.height / C) : (this.width = i.height / g, this.height = i.width / C), this.fixAndSetPosition();
- }, gn = new WeakSet(), VN = function(g) {
- return (g.nodeType === Node.TEXT_NODE ? g.nodeValue : g.innerText).replaceAll(vY, "");
- }, MN = function() {
- if (this.editorDiv.replaceChildren(), !!M(this, be))
- for (const g of M(this, be).split(`
- `)) {
- const C = document.createElement("div");
- C.append(g ? document.createTextNode(g) : document.createElement("br")), this.editorDiv.append(C);
- }
- }, Pgg = function() {
- return M(this, be).replaceAll(" ", " ");
- }, KS = function(g) {
- return g.replaceAll(" ", " ");
- }, _gg = function(g) {
- const {
- value: C,
- fontSize: i,
- color: e,
- pageIndex: A
- } = this._initialData;
- return this._hasBeenMoved || g.value !== C || g.fontSize !== i || g.color.some((s, l) => s !== e[l]) || g.pageIndex !== A;
- }, tg(NC, gn), iI(NC, "_freeTextDefaultContent", ""), iI(NC, "_internalPadding", 0), iI(NC, "_defaultColor", null), iI(NC, "_defaultFontSize", 10), iI(NC, "_type", "freetext"), iI(NC, "_editorType", XI.FREETEXT);
- let DS = NC;
- class $g {
- toSVGPath() {
- BC("Abstract method `toSVGPath` must be implemented.");
- }
- get box() {
- BC("Abstract getter `box` must be implemented.");
- }
- serialize(I, g) {
- BC("Abstract method `serialize` must be implemented.");
- }
- static _rescale(I, g, C, i, e, A) {
- A || (A = new Float32Array(I.length));
- for (let s = 0, l = I.length; s < l; s += 2)
- A[s] = g + I[s] * i, A[s + 1] = C + I[s + 1] * e;
- return A;
- }
- static _rescaleAndSwap(I, g, C, i, e, A) {
- A || (A = new Float32Array(I.length));
- for (let s = 0, l = I.length; s < l; s += 2)
- A[s] = g + I[s + 1] * i, A[s + 1] = C + I[s] * e;
- return A;
- }
- static _translate(I, g, C, i) {
- i || (i = new Float32Array(I.length));
- for (let e = 0, A = I.length; e < A; e += 2)
- i[e] = g + I[e], i[e + 1] = C + I[e + 1];
- return i;
- }
- static svgRound(I) {
- return Math.round(I * 1e4);
- }
- static _normalizePoint(I, g, C, i, e) {
- switch (e) {
- case 90:
- return [1 - g / C, I / i];
- case 180:
- return [1 - I / C, 1 - g / i];
- case 270:
- return [g / C, 1 - I / i];
- default:
- return [I / C, g / i];
- }
- }
- static _normalizePagePoint(I, g, C) {
- switch (C) {
- case 90:
- return [1 - g, I];
- case 180:
- return [1 - I, 1 - g];
- case 270:
- return [g, 1 - I];
- default:
- return [I, g];
- }
- }
- static createBezierPoints(I, g, C, i, e, A) {
- return [(I + 5 * C) / 6, (g + 5 * i) / 6, (5 * C + e) / 6, (5 * i + A) / 6, (C + e) / 2, (i + A) / 2];
- }
- }
- iI($g, "PRECISION", 1e-4);
- var me, NA, C0, t0, Ys, TI, vc, Tc, kZ, zZ, i0, e0, Ha, JZ, jV, QV, Nt, $u, qgg, $gg, gIg, IIg, CIg, tIg;
- const ml = class ml {
- constructor({
- x: I,
- y: g
- }, C, i, e, A, s = 0) {
- tg(this, Nt);
- tg(this, me);
- tg(this, NA, []);
- tg(this, C0);
- tg(this, t0);
- tg(this, Ys, []);
- tg(this, TI, new Float32Array(18));
- tg(this, vc);
- tg(this, Tc);
- tg(this, kZ);
- tg(this, zZ);
- tg(this, i0);
- tg(this, e0);
- tg(this, Ha, []);
- $(this, me, C), $(this, e0, e * i), $(this, t0, A), M(this, TI).set([NaN, NaN, NaN, NaN, I, g], 6), $(this, C0, s), $(this, zZ, M(ml, JZ) * i), $(this, kZ, M(ml, QV) * i), $(this, i0, i), M(this, Ha).push(I, g);
- }
- isEmpty() {
- return isNaN(M(this, TI)[8]);
- }
- add({
- x: I,
- y: g
- }) {
- var S;
- $(this, vc, I), $(this, Tc, g);
- const [C, i, e, A] = M(this, me);
- let [s, l, n, a] = M(this, TI).subarray(8, 12);
- const d = I - n, o = g - a, c = Math.hypot(d, o);
- if (c < M(this, kZ))
- return !1;
- const r = c - M(this, zZ), h = r / c, b = h * d, u = h * o;
- let m = s, Z = l;
- s = n, l = a, n += b, a += u, (S = M(this, Ha)) == null || S.push(I, g);
- const p = -u / r, Y = b / r, R = p * M(this, e0), X = Y * M(this, e0);
- return M(this, TI).set(M(this, TI).subarray(2, 8), 0), M(this, TI).set([n + R, a + X], 4), M(this, TI).set(M(this, TI).subarray(14, 18), 12), M(this, TI).set([n - R, a - X], 16), isNaN(M(this, TI)[6]) ? (M(this, Ys).length === 0 && (M(this, TI).set([s + R, l + X], 2), M(this, Ys).push(NaN, NaN, NaN, NaN, (s + R - C) / e, (l + X - i) / A), M(this, TI).set([s - R, l - X], 14), M(this, NA).push(NaN, NaN, NaN, NaN, (s - R - C) / e, (l - X - i) / A)), M(this, TI).set([m, Z, s, l, n, a], 6), !this.isEmpty()) : (M(this, TI).set([m, Z, s, l, n, a], 6), Math.abs(Math.atan2(Z - l, m - s) - Math.atan2(u, b)) < Math.PI / 2 ? ([s, l, n, a] = M(this, TI).subarray(2, 6), M(this, Ys).push(NaN, NaN, NaN, NaN, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), [s, l, m, Z] = M(this, TI).subarray(14, 18), M(this, NA).push(NaN, NaN, NaN, NaN, ((m + s) / 2 - C) / e, ((Z + l) / 2 - i) / A), !0) : ([m, Z, s, l, n, a] = M(this, TI).subarray(0, 6), M(this, Ys).push(((m + 5 * s) / 6 - C) / e, ((Z + 5 * l) / 6 - i) / A, ((5 * s + n) / 6 - C) / e, ((5 * l + a) / 6 - i) / A, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), [n, a, s, l, m, Z] = M(this, TI).subarray(12, 18), M(this, NA).push(((m + 5 * s) / 6 - C) / e, ((Z + 5 * l) / 6 - i) / A, ((5 * s + n) / 6 - C) / e, ((5 * l + a) / 6 - i) / A, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), !0));
- }
- toSVGPath() {
- if (this.isEmpty())
- return "";
- const I = M(this, Ys), g = M(this, NA);
- if (isNaN(M(this, TI)[6]) && !this.isEmpty())
- return ig(this, Nt, qgg).call(this);
- const C = [];
- C.push(`M${I[4]} ${I[5]}`);
- for (let i = 6; i < I.length; i += 6)
- isNaN(I[i]) ? C.push(`L${I[i + 4]} ${I[i + 5]}`) : C.push(`C${I[i]} ${I[i + 1]} ${I[i + 2]} ${I[i + 3]} ${I[i + 4]} ${I[i + 5]}`);
- ig(this, Nt, gIg).call(this, C);
- for (let i = g.length - 6; i >= 6; i -= 6)
- isNaN(g[i]) ? C.push(`L${g[i + 4]} ${g[i + 5]}`) : C.push(`C${g[i]} ${g[i + 1]} ${g[i + 2]} ${g[i + 3]} ${g[i + 4]} ${g[i + 5]}`);
- return ig(this, Nt, $gg).call(this, C), C.join(" ");
- }
- newFreeDrawOutline(I, g, C, i, e, A) {
- return new iIg(I, g, C, i, e, A);
- }
- getOutlines() {
- var d;
- const I = M(this, Ys), g = M(this, NA), C = M(this, TI), [i, e, A, s] = M(this, me), l = new Float32Array((((d = M(this, Ha)) == null ? void 0 : d.length) ?? 0) + 2);
- for (let o = 0, c = l.length - 2; o < c; o += 2)
- l[o] = (M(this, Ha)[o] - i) / A, l[o + 1] = (M(this, Ha)[o + 1] - e) / s;
- if (l[l.length - 2] = (M(this, vc) - i) / A, l[l.length - 1] = (M(this, Tc) - e) / s, isNaN(C[6]) && !this.isEmpty())
- return ig(this, Nt, IIg).call(this, l);
- const n = new Float32Array(M(this, Ys).length + 24 + M(this, NA).length);
- let a = I.length;
- for (let o = 0; o < a; o += 2) {
- if (isNaN(I[o])) {
- n[o] = n[o + 1] = NaN;
- continue;
- }
- n[o] = I[o], n[o + 1] = I[o + 1];
- }
- a = ig(this, Nt, tIg).call(this, n, a);
- for (let o = g.length - 6; o >= 6; o -= 6)
- for (let c = 0; c < 6; c += 2) {
- if (isNaN(g[o + c])) {
- n[a] = n[a + 1] = NaN, a += 2;
- continue;
- }
- n[a] = g[o + c], n[a + 1] = g[o + c + 1], a += 2;
- }
- return ig(this, Nt, CIg).call(this, n, a), this.newFreeDrawOutline(n, l, M(this, me), M(this, i0), M(this, C0), M(this, t0));
- }
- };
- me = new WeakMap(), NA = new WeakMap(), C0 = new WeakMap(), t0 = new WeakMap(), Ys = new WeakMap(), TI = new WeakMap(), vc = new WeakMap(), Tc = new WeakMap(), kZ = new WeakMap(), zZ = new WeakMap(), i0 = new WeakMap(), e0 = new WeakMap(), Ha = new WeakMap(), JZ = new WeakMap(), jV = new WeakMap(), QV = new WeakMap(), Nt = new WeakSet(), $u = function() {
- const I = M(this, TI).subarray(4, 6), g = M(this, TI).subarray(16, 18), [C, i, e, A] = M(this, me);
- return [(M(this, vc) + (I[0] - g[0]) / 2 - C) / e, (M(this, Tc) + (I[1] - g[1]) / 2 - i) / A, (M(this, vc) + (g[0] - I[0]) / 2 - C) / e, (M(this, Tc) + (g[1] - I[1]) / 2 - i) / A];
- }, qgg = function() {
- const [I, g, C, i] = M(this, me), [e, A, s, l] = ig(this, Nt, $u).call(this);
- return `M${(M(this, TI)[2] - I) / C} ${(M(this, TI)[3] - g) / i} L${(M(this, TI)[4] - I) / C} ${(M(this, TI)[5] - g) / i} L${e} ${A} L${s} ${l} L${(M(this, TI)[16] - I) / C} ${(M(this, TI)[17] - g) / i} L${(M(this, TI)[14] - I) / C} ${(M(this, TI)[15] - g) / i} Z`;
- }, $gg = function(I) {
- const g = M(this, NA);
- I.push(`L${g[4]} ${g[5]} Z`);
- }, gIg = function(I) {
- const [g, C, i, e] = M(this, me), A = M(this, TI).subarray(4, 6), s = M(this, TI).subarray(16, 18), [l, n, a, d] = ig(this, Nt, $u).call(this);
- I.push(`L${(A[0] - g) / i} ${(A[1] - C) / e} L${l} ${n} L${a} ${d} L${(s[0] - g) / i} ${(s[1] - C) / e}`);
- }, IIg = function(I) {
- const g = M(this, TI), [C, i, e, A] = M(this, me), [s, l, n, a] = ig(this, Nt, $u).call(this), d = new Float32Array(36);
- return d.set([NaN, NaN, NaN, NaN, (g[2] - C) / e, (g[3] - i) / A, NaN, NaN, NaN, NaN, (g[4] - C) / e, (g[5] - i) / A, NaN, NaN, NaN, NaN, s, l, NaN, NaN, NaN, NaN, n, a, NaN, NaN, NaN, NaN, (g[16] - C) / e, (g[17] - i) / A, NaN, NaN, NaN, NaN, (g[14] - C) / e, (g[15] - i) / A], 0), this.newFreeDrawOutline(d, I, M(this, me), M(this, i0), M(this, C0), M(this, t0));
- }, CIg = function(I, g) {
- const C = M(this, NA);
- return I.set([NaN, NaN, NaN, NaN, C[4], C[5]], g), g += 6;
- }, tIg = function(I, g) {
- const C = M(this, TI).subarray(4, 6), i = M(this, TI).subarray(16, 18), [e, A, s, l] = M(this, me), [n, a, d, o] = ig(this, Nt, $u).call(this);
- return I.set([NaN, NaN, NaN, NaN, (C[0] - e) / s, (C[1] - A) / l, NaN, NaN, NaN, NaN, n, a, NaN, NaN, NaN, NaN, d, o, NaN, NaN, NaN, NaN, (i[0] - e) / s, (i[1] - A) / l], g), g += 24;
- }, tg(ml, JZ, 8), tg(ml, jV, 2), tg(ml, QV, M(ml, JZ) + M(ml, jV));
- let AV = ml;
- var A0, xc, kl, LZ, Ze, vZ, et, OV, eIg;
- class iIg extends $g {
- constructor(g, C, i, e, A, s) {
- super();
- tg(this, OV);
- tg(this, A0);
- tg(this, xc, new Float32Array(4));
- tg(this, kl);
- tg(this, LZ);
- tg(this, Ze);
- tg(this, vZ);
- tg(this, et);
- $(this, et, g), $(this, Ze, C), $(this, A0, i), $(this, vZ, e), $(this, kl, A), $(this, LZ, s), this.lastPoint = [NaN, NaN], ig(this, OV, eIg).call(this, s);
- const [l, n, a, d] = M(this, xc);
- for (let o = 0, c = g.length; o < c; o += 2)
- g[o] = (g[o] - l) / a, g[o + 1] = (g[o + 1] - n) / d;
- for (let o = 0, c = C.length; o < c; o += 2)
- C[o] = (C[o] - l) / a, C[o + 1] = (C[o + 1] - n) / d;
- }
- toSVGPath() {
- const g = [`M${M(this, et)[4]} ${M(this, et)[5]}`];
- for (let C = 6, i = M(this, et).length; C < i; C += 6) {
- if (isNaN(M(this, et)[C])) {
- g.push(`L${M(this, et)[C + 4]} ${M(this, et)[C + 5]}`);
- continue;
- }
- g.push(`C${M(this, et)[C]} ${M(this, et)[C + 1]} ${M(this, et)[C + 2]} ${M(this, et)[C + 3]} ${M(this, et)[C + 4]} ${M(this, et)[C + 5]}`);
- }
- return g.push("Z"), g.join(" ");
- }
- serialize([g, C, i, e], A) {
- const s = i - g, l = e - C;
- let n, a;
- switch (A) {
- case 0:
- n = $g._rescale(M(this, et), g, e, s, -l), a = $g._rescale(M(this, Ze), g, e, s, -l);
- break;
- case 90:
- n = $g._rescaleAndSwap(M(this, et), g, C, s, l), a = $g._rescaleAndSwap(M(this, Ze), g, C, s, l);
- break;
- case 180:
- n = $g._rescale(M(this, et), i, C, -s, l), a = $g._rescale(M(this, Ze), i, C, -s, l);
- break;
- case 270:
- n = $g._rescaleAndSwap(M(this, et), i, e, -s, -l), a = $g._rescaleAndSwap(M(this, Ze), i, e, -s, -l);
- break;
- }
- return {
- outline: Array.from(n),
- points: [Array.from(a)]
- };
- }
- get box() {
- return M(this, xc);
- }
- newOutliner(g, C, i, e, A, s = 0) {
- return new AV(g, C, i, e, A, s);
- }
- getNewOutline(g, C) {
- const [i, e, A, s] = M(this, xc), [l, n, a, d] = M(this, A0), o = A * a, c = s * d, r = i * a + l, h = e * d + n, b = this.newOutliner({
- x: M(this, Ze)[0] * o + r,
- y: M(this, Ze)[1] * c + h
- }, M(this, A0), M(this, vZ), g, M(this, LZ), C ?? M(this, kl));
- for (let u = 2; u < M(this, Ze).length; u += 2)
- b.add({
- x: M(this, Ze)[u] * o + r,
- y: M(this, Ze)[u + 1] * c + h
- });
- return b.getOutlines();
- }
- }
- A0 = new WeakMap(), xc = new WeakMap(), kl = new WeakMap(), LZ = new WeakMap(), Ze = new WeakMap(), vZ = new WeakMap(), et = new WeakMap(), OV = new WeakSet(), eIg = function(g) {
- const C = M(this, et);
- let i = C[4], e = C[5];
- const A = [i, e, i, e];
- let s = i, l = e;
- const n = g ? Math.max : Math.min;
- for (let d = 6, o = C.length; d < o; d += 6) {
- const c = C[d + 4], r = C[d + 5];
- if (isNaN(C[d]))
- AI.pointBoundingBox(c, r, A), l < r ? (s = c, l = r) : l === r && (s = n(s, c));
- else {
- const h = [1 / 0, 1 / 0, -1 / 0, -1 / 0];
- AI.bezierBoundingBox(i, e, ...C.slice(d, d + 6), h), AI.rectBoundingBox(...h, A), l < h[3] ? (s = h[2], l = h[3]) : l === h[3] && (s = n(s, h[2]));
- }
- i = c, e = r;
- }
- const a = M(this, xc);
- a[0] = A[0] - M(this, kl), a[1] = A[1] - M(this, kl), a[2] = A[2] - A[0] + 2 * M(this, kl), a[3] = A[3] - A[1] + 2 * M(this, kl), this.lastPoint = [s, l];
- };
- var TZ, xZ, Xa, VA, Xi, AIg, RN, sIg, lIg, kS;
- class FS {
- constructor(I, g = 0, C = 0, i = !0) {
- tg(this, Xi);
- tg(this, TZ);
- tg(this, xZ);
- tg(this, Xa, []);
- tg(this, VA, []);
- const e = [1 / 0, 1 / 0, -1 / 0, -1 / 0], A = 10 ** -4;
- for (const {
- x: c,
- y: r,
- width: h,
- height: b
- } of I) {
- const u = Math.floor((c - g) / A) * A, m = Math.ceil((c + h + g) / A) * A, Z = Math.floor((r - g) / A) * A, p = Math.ceil((r + b + g) / A) * A, Y = [u, Z, p, !0], R = [m, Z, p, !1];
- M(this, Xa).push(Y, R), AI.rectBoundingBox(u, Z, m, p, e);
- }
- const s = e[2] - e[0] + 2 * C, l = e[3] - e[1] + 2 * C, n = e[0] - C, a = e[1] - C, d = M(this, Xa).at(i ? -1 : -2), o = [d[0], d[2]];
- for (const c of M(this, Xa)) {
- const [r, h, b] = c;
- c[0] = (r - n) / s, c[1] = (h - a) / l, c[2] = (b - a) / l;
- }
- $(this, TZ, new Float32Array([n, a, s, l])), $(this, xZ, o);
- }
- getOutlines() {
- M(this, Xa).sort((g, C) => g[0] - C[0] || g[1] - C[1] || g[2] - C[2]);
- const I = [];
- for (const g of M(this, Xa))
- g[3] ? (I.push(...ig(this, Xi, kS).call(this, g)), ig(this, Xi, sIg).call(this, g)) : (ig(this, Xi, lIg).call(this, g), I.push(...ig(this, Xi, kS).call(this, g)));
- return ig(this, Xi, AIg).call(this, I);
- }
- }
- TZ = new WeakMap(), xZ = new WeakMap(), Xa = new WeakMap(), VA = new WeakMap(), Xi = new WeakSet(), AIg = function(I) {
- const g = [], C = /* @__PURE__ */ new Set();
- for (const A of I) {
- const [s, l, n] = A;
- g.push([s, l, A], [s, n, A]);
- }
- g.sort((A, s) => A[1] - s[1] || A[0] - s[0]);
- for (let A = 0, s = g.length; A < s; A += 2) {
- const l = g[A][2], n = g[A + 1][2];
- l.push(n), n.push(l), C.add(l), C.add(n);
- }
- const i = [];
- let e;
- for (; C.size > 0; ) {
- const A = C.values().next().value;
- let [s, l, n, a, d] = A;
- C.delete(A);
- let o = s, c = l;
- for (e = [s, n], i.push(e); ; ) {
- let r;
- if (C.has(a))
- r = a;
- else if (C.has(d))
- r = d;
- else
- break;
- C.delete(r), [s, l, n, a, d] = r, o !== s && (e.push(o, c, s, c === l ? l : n), o = s), c = c === l ? n : l;
- }
- e.push(o, c);
- }
- return new Ndg(i, M(this, TZ), M(this, xZ));
- }, RN = function(I) {
- const g = M(this, VA);
- let C = 0, i = g.length - 1;
- for (; C <= i; ) {
- const e = C + i >> 1, A = g[e][0];
- if (A === I)
- return e;
- A < I ? C = e + 1 : i = e - 1;
- }
- return i + 1;
- }, sIg = function([, I, g]) {
- const C = ig(this, Xi, RN).call(this, I);
- M(this, VA).splice(C, 0, [I, g]);
- }, lIg = function([, I, g]) {
- const C = ig(this, Xi, RN).call(this, I);
- for (let i = C; i < M(this, VA).length; i++) {
- const [e, A] = M(this, VA)[i];
- if (e !== I)
- break;
- if (e === I && A === g) {
- M(this, VA).splice(i, 1);
- return;
- }
- }
- for (let i = C - 1; i >= 0; i--) {
- const [e, A] = M(this, VA)[i];
- if (e !== I)
- break;
- if (e === I && A === g) {
- M(this, VA).splice(i, 1);
- return;
- }
- }
- }, kS = function(I) {
- const [g, C, i] = I, e = [[g, C, i]], A = ig(this, Xi, RN).call(this, i);
- for (let s = 0; s < A; s++) {
- const [l, n] = M(this, VA)[s];
- for (let a = 0, d = e.length; a < d; a++) {
- const [, o, c] = e[a];
- if (!(n <= o || c <= l)) {
- if (o >= l) {
- if (c > n)
- e[a][1] = n;
- else {
- if (d === 1)
- return [];
- e.splice(a, 1), a--, d--;
- }
- continue;
- }
- e[a][2] = l, c > n && e.push([g, n, c]);
- }
- }
- }
- return e;
- };
- var jZ, s0;
- class Ndg extends $g {
- constructor(g, C, i) {
- super();
- tg(this, jZ);
- tg(this, s0);
- $(this, s0, g), $(this, jZ, C), this.lastPoint = i;
- }
- toSVGPath() {
- const g = [];
- for (const C of M(this, s0)) {
- let [i, e] = C;
- g.push(`M${i} ${e}`);
- for (let A = 2; A < C.length; A += 2) {
- const s = C[A], l = C[A + 1];
- s === i ? (g.push(`V${l}`), e = l) : l === e && (g.push(`H${s}`), i = s);
- }
- g.push("Z");
- }
- return g.join(" ");
- }
- serialize([g, C, i, e], A) {
- const s = [], l = i - g, n = e - C;
- for (const a of M(this, s0)) {
- const d = new Array(a.length);
- for (let o = 0; o < a.length; o += 2)
- d[o] = g + a[o] * l, d[o + 1] = e - a[o + 1] * n;
- s.push(d);
- }
- return s;
- }
- get box() {
- return M(this, jZ);
- }
- get classNamesForOutlining() {
- return ["highlightOutline"];
- }
- }
- jZ = new WeakMap(), s0 = new WeakMap();
- class zS extends AV {
- newFreeDrawOutline(I, g, C, i, e, A) {
- return new Vdg(I, g, C, i, e, A);
- }
- }
- class Vdg extends iIg {
- newOutliner(I, g, C, i, e, A = 0) {
- return new zS(I, g, C, i, e, A);
- }
- }
- var MA, jc, l0, Wt, QZ, n0, OZ, UZ, Sa, RA, a0, EZ, pC, JS, LS, vS, xo, nIg, $n;
- const ji = class ji {
- constructor({
- editor: I = null,
- uiManager: g = null
- }) {
- tg(this, pC);
- tg(this, MA, null);
- tg(this, jc, null);
- tg(this, l0);
- tg(this, Wt, null);
- tg(this, QZ, !1);
- tg(this, n0, !1);
- tg(this, OZ, null);
- tg(this, UZ);
- tg(this, Sa, null);
- tg(this, RA, null);
- tg(this, a0);
- var C;
- I ? ($(this, n0, !1), $(this, a0, iC.HIGHLIGHT_COLOR), $(this, OZ, I)) : ($(this, n0, !0), $(this, a0, iC.HIGHLIGHT_DEFAULT_COLOR)), $(this, RA, (I == null ? void 0 : I._uiManager) || g), $(this, UZ, M(this, RA)._eventBus), $(this, l0, (I == null ? void 0 : I.color) || ((C = M(this, RA)) == null ? void 0 : C.highlightColors.values().next().value) || "#FFFF98"), M(ji, EZ) || $(ji, EZ, Object.freeze({
- blue: "pdfjs-editor-colorpicker-blue",
- green: "pdfjs-editor-colorpicker-green",
- pink: "pdfjs-editor-colorpicker-pink",
- red: "pdfjs-editor-colorpicker-red",
- yellow: "pdfjs-editor-colorpicker-yellow"
- }));
- }
- static get _keyboardManager() {
- return UI(this, "_keyboardManager", new lG([[["Escape", "mac+Escape"], ji.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ji.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ji.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ji.prototype._moveToPrevious], [["Home", "mac+Home"], ji.prototype._moveToBeginning], [["End", "mac+End"], ji.prototype._moveToEnd]]));
- }
- renderButton() {
- const I = $(this, MA, document.createElement("button"));
- I.className = "colorPicker", I.tabIndex = "0", I.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"), I.setAttribute("aria-haspopup", !0);
- const g = M(this, RA)._signal;
- I.addEventListener("click", ig(this, pC, xo).bind(this), {
- signal: g
- }), I.addEventListener("keydown", ig(this, pC, vS).bind(this), {
- signal: g
- });
- const C = $(this, jc, document.createElement("span"));
- return C.className = "swatch", C.setAttribute("aria-hidden", !0), C.style.backgroundColor = M(this, l0), I.append(C), I;
- }
- renderMainDropdown() {
- const I = $(this, Wt, ig(this, pC, JS).call(this));
- return I.setAttribute("aria-orientation", "horizontal"), I.setAttribute("aria-labelledby", "highlightColorPickerLabel"), I;
- }
- _colorSelectFromKeyboard(I) {
- if (I.target === M(this, MA)) {
- ig(this, pC, xo).call(this, I);
- return;
- }
- const g = I.target.getAttribute("data-color");
- g && ig(this, pC, LS).call(this, g, I);
- }
- _moveToNext(I) {
- var g, C;
- if (!M(this, pC, $n)) {
- ig(this, pC, xo).call(this, I);
- return;
- }
- if (I.target === M(this, MA)) {
- (g = M(this, Wt).firstChild) == null || g.focus();
- return;
- }
- (C = I.target.nextSibling) == null || C.focus();
- }
- _moveToPrevious(I) {
- var g, C;
- if (I.target === ((g = M(this, Wt)) == null ? void 0 : g.firstChild) || I.target === M(this, MA)) {
- M(this, pC, $n) && this._hideDropdownFromKeyboard();
- return;
- }
- M(this, pC, $n) || ig(this, pC, xo).call(this, I), (C = I.target.previousSibling) == null || C.focus();
- }
- _moveToBeginning(I) {
- var g;
- if (!M(this, pC, $n)) {
- ig(this, pC, xo).call(this, I);
- return;
- }
- (g = M(this, Wt).firstChild) == null || g.focus();
- }
- _moveToEnd(I) {
- var g;
- if (!M(this, pC, $n)) {
- ig(this, pC, xo).call(this, I);
- return;
- }
- (g = M(this, Wt).lastChild) == null || g.focus();
- }
- hideDropdown() {
- var I, g;
- (I = M(this, Wt)) == null || I.classList.add("hidden"), (g = M(this, Sa)) == null || g.abort(), $(this, Sa, null);
- }
- _hideDropdownFromKeyboard() {
- var I;
- if (!M(this, n0)) {
- if (!M(this, pC, $n)) {
- (I = M(this, OZ)) == null || I.unselect();
- return;
- }
- this.hideDropdown(), M(this, MA).focus({
- preventScroll: !0,
- focusVisible: M(this, QZ)
- });
- }
- }
- updateColor(I) {
- if (M(this, jc) && (M(this, jc).style.backgroundColor = I), !M(this, Wt))
- return;
- const g = M(this, RA).highlightColors.values();
- for (const C of M(this, Wt).children)
- C.setAttribute("aria-selected", g.next().value === I);
- }
- destroy() {
- var I, g;
- (I = M(this, MA)) == null || I.remove(), $(this, MA, null), $(this, jc, null), (g = M(this, Wt)) == null || g.remove(), $(this, Wt, null);
- }
- };
- MA = new WeakMap(), jc = new WeakMap(), l0 = new WeakMap(), Wt = new WeakMap(), QZ = new WeakMap(), n0 = new WeakMap(), OZ = new WeakMap(), UZ = new WeakMap(), Sa = new WeakMap(), RA = new WeakMap(), a0 = new WeakMap(), EZ = new WeakMap(), pC = new WeakSet(), JS = function() {
- const I = document.createElement("div"), g = M(this, RA)._signal;
- I.addEventListener("contextmenu", zA, {
- signal: g
- }), I.className = "dropdown", I.role = "listbox", I.setAttribute("aria-multiselectable", !1), I.setAttribute("aria-orientation", "vertical"), I.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown");
- for (const [C, i] of M(this, RA).highlightColors) {
- const e = document.createElement("button");
- e.tabIndex = "0", e.role = "option", e.setAttribute("data-color", i), e.title = C, e.setAttribute("data-l10n-id", M(ji, EZ)[C]);
- const A = document.createElement("span");
- e.append(A), A.className = "swatch", A.style.backgroundColor = i, e.setAttribute("aria-selected", i === M(this, l0)), e.addEventListener("click", ig(this, pC, LS).bind(this, i), {
- signal: g
- }), I.append(e);
- }
- return I.addEventListener("keydown", ig(this, pC, vS).bind(this), {
- signal: g
- }), I;
- }, LS = function(I, g) {
- g.stopPropagation(), M(this, UZ).dispatch("switchannotationeditorparams", {
- source: this,
- type: M(this, a0),
- value: I
- });
- }, vS = function(I) {
- ji._keyboardManager.exec(this, I);
- }, xo = function(I) {
- if (M(this, pC, $n)) {
- this.hideDropdown();
- return;
- }
- if ($(this, QZ, I.detail === 0), M(this, Sa) || ($(this, Sa, new AbortController()), window.addEventListener("pointerdown", ig(this, pC, nIg).bind(this), {
- signal: M(this, RA).combinedSignal(M(this, Sa))
- })), M(this, Wt)) {
- M(this, Wt).classList.remove("hidden");
- return;
- }
- const g = $(this, Wt, ig(this, pC, JS).call(this));
- M(this, MA).append(g);
- }, nIg = function(I) {
- var g;
- (g = M(this, Wt)) != null && g.contains(I.target) || this.hideDropdown();
- }, $n = function() {
- return M(this, Wt) && !M(this, Wt).classList.contains("hidden");
- }, tg(ji, EZ, null);
- let sV = ji;
- var o0, PZ, zl, Qc, c0, Ui, _Z, qZ, Oc, Ee, Ge, _t, d0, Jl, Zi, r0, Pe, $Z, kI, TS, fN, aIg, oIg, cIg, xS, jo, CA, qr, dIg, HN, gm, rIg, hIg, bIg, uIg, mIg;
- const cC = class cC extends TC {
- constructor(g) {
- super({
- ...g,
- name: "highlightEditor"
- });
- tg(this, kI);
- tg(this, o0, null);
- tg(this, PZ, 0);
- tg(this, zl);
- tg(this, Qc, null);
- tg(this, c0, null);
- tg(this, Ui, null);
- tg(this, _Z, null);
- tg(this, qZ, 0);
- tg(this, Oc, null);
- tg(this, Ee, null);
- tg(this, Ge, null);
- tg(this, _t, !1);
- tg(this, d0, null);
- tg(this, Jl);
- tg(this, Zi, null);
- tg(this, r0, "");
- tg(this, Pe);
- tg(this, $Z, "");
- this.color = g.color || cC._defaultColor, $(this, Pe, g.thickness || cC._defaultThickness), $(this, Jl, g.opacity || cC._defaultOpacity), $(this, zl, g.boxes || null), $(this, $Z, g.methodOfCreation || ""), $(this, r0, g.text || ""), this._isDraggable = !1, this.defaultL10nId = "pdfjs-editor-highlight-editor", g.highlightId > -1 ? ($(this, _t, !0), ig(this, kI, fN).call(this, g), ig(this, kI, jo).call(this)) : M(this, zl) && ($(this, o0, g.anchorNode), $(this, PZ, g.anchorOffset), $(this, _Z, g.focusNode), $(this, qZ, g.focusOffset), ig(this, kI, TS).call(this), ig(this, kI, jo).call(this), this.rotate(this.rotation));
- }
- static get _keyboardManager() {
- const g = cC.prototype;
- return UI(this, "_keyboardManager", new lG([[["ArrowLeft", "mac+ArrowLeft"], g._moveCaret, {
- args: [0]
- }], [["ArrowRight", "mac+ArrowRight"], g._moveCaret, {
- args: [1]
- }], [["ArrowUp", "mac+ArrowUp"], g._moveCaret, {
- args: [2]
- }], [["ArrowDown", "mac+ArrowDown"], g._moveCaret, {
- args: [3]
- }]]));
- }
- get telemetryInitialData() {
- return {
- action: "added",
- type: M(this, _t) ? "free_highlight" : "highlight",
- color: this._uiManager.highlightColorNames.get(this.color),
- thickness: M(this, Pe),
- methodOfCreation: M(this, $Z)
- };
- }
- get telemetryFinalData() {
- return {
- type: "highlight",
- color: this._uiManager.highlightColorNames.get(this.color)
- };
- }
- static computeTelemetryFinalData(g) {
- return {
- numberOfColors: g.get("color").size
- };
- }
- static initialize(g, C) {
- var i;
- TC.initialize(g, C), cC._defaultColor || (cC._defaultColor = ((i = C.highlightColors) == null ? void 0 : i.values().next().value) || "#fff066");
- }
- static updateDefaultParams(g, C) {
- switch (g) {
- case iC.HIGHLIGHT_DEFAULT_COLOR:
- cC._defaultColor = C;
- break;
- case iC.HIGHLIGHT_THICKNESS:
- cC._defaultThickness = C;
- break;
- }
- }
- translateInPage(g, C) {
- }
- get toolbarPosition() {
- return M(this, d0);
- }
- updateParams(g, C) {
- switch (g) {
- case iC.HIGHLIGHT_COLOR:
- ig(this, kI, aIg).call(this, C);
- break;
- case iC.HIGHLIGHT_THICKNESS:
- ig(this, kI, oIg).call(this, C);
- break;
- }
- }
- static get defaultPropertiesToUpdate() {
- return [[iC.HIGHLIGHT_DEFAULT_COLOR, cC._defaultColor], [iC.HIGHLIGHT_THICKNESS, cC._defaultThickness]];
- }
- get propertiesToUpdate() {
- return [[iC.HIGHLIGHT_COLOR, this.color || cC._defaultColor], [iC.HIGHLIGHT_THICKNESS, M(this, Pe) || cC._defaultThickness], [iC.HIGHLIGHT_FREE, M(this, _t)]];
- }
- async addEditToolbar() {
- const g = await super.addEditToolbar();
- return g ? (this._uiManager.highlightColors && ($(this, c0, new sV({
- editor: this
- })), g.addColorPicker(M(this, c0))), g) : null;
- }
- disableEditing() {
- super.disableEditing(), this.div.classList.toggle("disabled", !0);
- }
- enableEditing() {
- super.enableEditing(), this.div.classList.toggle("disabled", !1);
- }
- fixAndSetPosition() {
- return super.fixAndSetPosition(ig(this, kI, gm).call(this));
- }
- getBaseTranslation() {
- return [0, 0];
- }
- getRect(g, C) {
- return super.getRect(g, C, ig(this, kI, gm).call(this));
- }
- onceAdded(g) {
- this.annotationElementId || this.parent.addUndoableEditor(this), g && this.div.focus();
- }
- remove() {
- ig(this, kI, xS).call(this), this._reportTelemetry({
- action: "deleted"
- }), super.remove();
- }
- rebuild() {
- this.parent && (super.rebuild(), this.div !== null && (ig(this, kI, jo).call(this), this.isAttachedToDOM || this.parent.add(this)));
- }
- setParent(g) {
- var i;
- let C = !1;
- this.parent && !g ? ig(this, kI, xS).call(this) : g && (ig(this, kI, jo).call(this, g), C = !this.parent && ((i = this.div) == null ? void 0 : i.classList.contains("selectedEditor"))), super.setParent(g), this.show(this._isVisible), C && this.select();
- }
- rotate(g) {
- var e, A, s;
- const {
- drawLayer: C
- } = this.parent;
- let i;
- M(this, _t) ? (g = (g - this.rotation + 360) % 360, i = ig(e = cC, CA, qr).call(e, M(this, Ee).box, g)) : i = ig(A = cC, CA, qr).call(A, [this.x, this.y, this.width, this.height], g), C.updateProperties(M(this, Ge), {
- bbox: i,
- root: {
- "data-main-rotation": g
- }
- }), C.updateProperties(M(this, Zi), {
- bbox: ig(s = cC, CA, qr).call(s, M(this, Ui).box, g),
- root: {
- "data-main-rotation": g
- }
- });
- }
- render() {
- if (this.div)
- return this.div;
- const g = super.render();
- M(this, r0) && (g.setAttribute("aria-label", M(this, r0)), g.setAttribute("role", "mark")), M(this, _t) ? g.classList.add("free") : this.div.addEventListener("keydown", ig(this, kI, dIg).bind(this), {
- signal: this._uiManager._signal
- });
- const C = $(this, Oc, document.createElement("div"));
- g.append(C), C.setAttribute("aria-hidden", "true"), C.className = "internal", C.style.clipPath = M(this, Qc);
- const [i, e] = this.parentDimensions;
- return this.setDims(this.width * i, this.height * e), m9(this, M(this, Oc), ["pointerover", "pointerleave"]), this.enableEditing(), g;
- }
- pointerover() {
- var g;
- this.isSelected || (g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
- rootClass: {
- hovered: !0
- }
- });
- }
- pointerleave() {
- var g;
- this.isSelected || (g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
- rootClass: {
- hovered: !1
- }
- });
- }
- _moveCaret(g) {
- switch (this.parent.unselect(this), g) {
- case 0:
- case 2:
- ig(this, kI, HN).call(this, !0);
- break;
- case 1:
- case 3:
- ig(this, kI, HN).call(this, !1);
- break;
- }
- }
- select() {
- var g;
- super.select(), M(this, Zi) && ((g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
- rootClass: {
- hovered: !1,
- selected: !0
- }
- }));
- }
- unselect() {
- var g;
- super.unselect(), M(this, Zi) && ((g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
- rootClass: {
- selected: !1
- }
- }), M(this, _t) || ig(this, kI, HN).call(this, !1));
- }
- get _mustFixPosition() {
- return !M(this, _t);
- }
- show(g = this._isVisible) {
- super.show(g), this.parent && (this.parent.drawLayer.updateProperties(M(this, Ge), {
- rootClass: {
- hidden: !g
- }
- }), this.parent.drawLayer.updateProperties(M(this, Zi), {
- rootClass: {
- hidden: !g
- }
- }));
- }
- static startHighlighting(g, C, {
- target: i,
- x: e,
- y: A
- }) {
- const {
- x: s,
- y: l,
- width: n,
- height: a
- } = i.getBoundingClientRect(), d = new AbortController(), o = g.combinedSignal(d), c = (r) => {
- d.abort(), ig(this, CA, uIg).call(this, g, r);
- };
- window.addEventListener("blur", c, {
- signal: o
- }), window.addEventListener("pointerup", c, {
- signal: o
- }), window.addEventListener("pointerdown", ht, {
- capture: !0,
- passive: !1,
- signal: o
- }), window.addEventListener("contextmenu", zA, {
- signal: o
- }), i.addEventListener("pointermove", ig(this, CA, bIg).bind(this, g), {
- signal: o
- }), this._freeHighlight = new zS({
- x: e,
- y: A
- }, [s, l, n, a], g.scale, this._defaultThickness / 2, C, 1e-3), {
- id: this._freeHighlightId,
- clipPathId: this._freeHighlightClipId
- } = g.drawLayer.draw({
- bbox: [0, 0, 1, 1],
- root: {
- viewBox: "0 0 1 1",
- fill: this._defaultColor,
- "fill-opacity": this._defaultOpacity
- },
- rootClass: {
- highlight: !0,
- free: !0
- },
- path: {
- d: this._freeHighlight.toSVGPath()
- }
- }, !0, !0);
- }
- static async deserialize(g, C, i) {
- var h, b, u, m;
- let e = null;
- if (g instanceof jgg) {
- const {
- data: {
- quadPoints: Z,
- rect: p,
- rotation: Y,
- id: R,
- color: X,
- opacity: H,
- popupRef: S
- },
- parent: {
- page: {
- pageNumber: z
- }
- }
- } = g;
- e = g = {
- annotationType: XI.HIGHLIGHT,
- color: Array.from(X),
- opacity: H,
- quadPoints: Z,
- boxes: null,
- pageIndex: z - 1,
- rect: p.slice(0),
- rotation: Y,
- id: R,
- deleted: !1,
- popupRef: S
- };
- } else if (g instanceof p9) {
- const {
- data: {
- inkLists: Z,
- rect: p,
- rotation: Y,
- id: R,
- color: X,
- borderStyle: {
- rawWidth: H
- },
- popupRef: S
- },
- parent: {
- page: {
- pageNumber: z
- }
- }
- } = g;
- e = g = {
- annotationType: XI.HIGHLIGHT,
- color: Array.from(X),
- thickness: H,
- inkLists: Z,
- boxes: null,
- pageIndex: z - 1,
- rect: p.slice(0),
- rotation: Y,
- id: R,
- deleted: !1,
- popupRef: S
- };
- }
- const {
- color: A,
- quadPoints: s,
- inkLists: l,
- opacity: n
- } = g, a = await super.deserialize(g, C, i);
- a.color = AI.makeHexColor(...A), $(a, Jl, n || 1), l && $(a, Pe, g.thickness), a.annotationElementId = g.id || null, a._initialData = e;
- const [d, o] = a.pageDimensions, [c, r] = a.pageTranslation;
- if (s) {
- const Z = $(a, zl, []);
- for (let p = 0; p < s.length; p += 8)
- Z.push({
- x: (s[p] - c) / d,
- y: 1 - (s[p + 1] - r) / o,
- width: (s[p + 2] - s[p]) / d,
- height: (s[p + 1] - s[p + 5]) / o
- });
- ig(h = a, kI, TS).call(h), ig(b = a, kI, jo).call(b), a.rotate(a.rotation);
- } else if (l) {
- $(a, _t, !0);
- const Z = l[0], p = {
- x: Z[0] - c,
- y: o - (Z[1] - r)
- }, Y = new zS(p, [0, 0, d, o], 1, M(a, Pe) / 2, !0, 1e-3);
- for (let H = 0, S = Z.length; H < S; H += 2)
- p.x = Z[H] - c, p.y = o - (Z[H + 1] - r), Y.add(p);
- const {
- id: R,
- clipPathId: X
- } = C.drawLayer.draw({
- bbox: [0, 0, 1, 1],
- root: {
- viewBox: "0 0 1 1",
- fill: a.color,
- "fill-opacity": a._defaultOpacity
- },
- rootClass: {
- highlight: !0,
- free: !0
- },
- path: {
- d: Y.toSVGPath()
- }
- }, !0, !0);
- ig(u = a, kI, fN).call(u, {
- highlightOutlines: Y.getOutlines(),
- highlightId: R,
- clipPathId: X
- }), ig(m = a, kI, jo).call(m), a.rotate(a.parentRotation);
- }
- return a;
- }
- serialize(g = !1) {
- if (this.isEmpty() || g)
- return null;
- if (this.deleted)
- return this.serializeDeleted();
- const C = this.getRect(0, 0), i = TC._colorManager.convert(this.color), e = {
- annotationType: XI.HIGHLIGHT,
- color: i,
- opacity: M(this, Jl),
- thickness: M(this, Pe),
- quadPoints: ig(this, kI, rIg).call(this),
- outlines: ig(this, kI, hIg).call(this, C),
- pageIndex: this.pageIndex,
- rect: C,
- rotation: ig(this, kI, gm).call(this),
- structTreeParentId: this._structTreeParentId
- };
- return this.annotationElementId && !ig(this, kI, mIg).call(this, e) ? null : (e.id = this.annotationElementId, e);
- }
- renderAnnotationElement(g) {
- return g.updateEdited({
- rect: this.getRect(0, 0)
- }), null;
- }
- static canCreateNewEmptyEditor() {
- return !1;
- }
- };
- o0 = new WeakMap(), PZ = new WeakMap(), zl = new WeakMap(), Qc = new WeakMap(), c0 = new WeakMap(), Ui = new WeakMap(), _Z = new WeakMap(), qZ = new WeakMap(), Oc = new WeakMap(), Ee = new WeakMap(), Ge = new WeakMap(), _t = new WeakMap(), d0 = new WeakMap(), Jl = new WeakMap(), Zi = new WeakMap(), r0 = new WeakMap(), Pe = new WeakMap(), $Z = new WeakMap(), kI = new WeakSet(), TS = function() {
- const g = new FS(M(this, zl), 1e-3);
- $(this, Ee, g.getOutlines()), [this.x, this.y, this.width, this.height] = M(this, Ee).box;
- const C = new FS(M(this, zl), 25e-4, 1e-3, this._uiManager.direction === "ltr");
- $(this, Ui, C.getOutlines());
- const {
- lastPoint: i
- } = M(this, Ui);
- $(this, d0, [(i[0] - this.x) / this.width, (i[1] - this.y) / this.height]);
- }, fN = function({
- highlightOutlines: g,
- highlightId: C,
- clipPathId: i
- }) {
- var d, o;
- if ($(this, Ee, g), $(this, Ui, g.getNewOutline(M(this, Pe) / 2 + 1.5, 25e-4)), C >= 0)
- $(this, Ge, C), $(this, Qc, i), this.parent.drawLayer.finalizeDraw(C, {
- bbox: g.box,
- path: {
- d: g.toSVGPath()
- }
- }), $(this, Zi, this.parent.drawLayer.drawOutline({
- rootClass: {
- highlightOutline: !0,
- free: !0
- },
- bbox: M(this, Ui).box,
- path: {
- d: M(this, Ui).toSVGPath()
- }
- }, !0));
- else if (this.parent) {
- const c = this.parent.viewport.rotation;
- this.parent.drawLayer.updateProperties(M(this, Ge), {
- bbox: ig(d = cC, CA, qr).call(d, M(this, Ee).box, (c - this.rotation + 360) % 360),
- path: {
- d: g.toSVGPath()
- }
- }), this.parent.drawLayer.updateProperties(M(this, Zi), {
- bbox: ig(o = cC, CA, qr).call(o, M(this, Ui).box, c),
- path: {
- d: M(this, Ui).toSVGPath()
- }
- });
- }
- const [A, s, l, n] = g.box;
- switch (this.rotation) {
- case 0:
- this.x = A, this.y = s, this.width = l, this.height = n;
- break;
- case 90: {
- const [c, r] = this.parentDimensions;
- this.x = s, this.y = 1 - A, this.width = l * r / c, this.height = n * c / r;
- break;
- }
- case 180:
- this.x = 1 - A, this.y = 1 - s, this.width = l, this.height = n;
- break;
- case 270: {
- const [c, r] = this.parentDimensions;
- this.x = 1 - s, this.y = A, this.width = l * r / c, this.height = n * c / r;
- break;
- }
- }
- const {
- lastPoint: a
- } = M(this, Ui);
- $(this, d0, [(a[0] - A) / l, (a[1] - s) / n]);
- }, aIg = function(g) {
- const C = (A, s) => {
- var l, n;
- this.color = A, $(this, Jl, s), (l = this.parent) == null || l.drawLayer.updateProperties(M(this, Ge), {
- root: {
- fill: A,
- "fill-opacity": s
- }
- }), (n = M(this, c0)) == null || n.updateColor(A);
- }, i = this.color, e = M(this, Jl);
- this.addCommands({
- cmd: C.bind(this, g, cC._defaultOpacity),
- undo: C.bind(this, i, e),
- post: this._uiManager.updateUI.bind(this._uiManager, this),
- mustExec: !0,
- type: iC.HIGHLIGHT_COLOR,
- overwriteIfSameType: !0,
- keepUndo: !0
- }), this._reportTelemetry({
- action: "color_changed",
- color: this._uiManager.highlightColorNames.get(g)
- }, !0);
- }, oIg = function(g) {
- const C = M(this, Pe), i = (e) => {
- $(this, Pe, e), ig(this, kI, cIg).call(this, e);
- };
- this.addCommands({
- cmd: i.bind(this, g),
- undo: i.bind(this, C),
- post: this._uiManager.updateUI.bind(this._uiManager, this),
- mustExec: !0,
- type: iC.INK_THICKNESS,
- overwriteIfSameType: !0,
- keepUndo: !0
- }), this._reportTelemetry({
- action: "thickness_changed",
- thickness: g
- }, !0);
- }, cIg = function(g) {
- if (!M(this, _t))
- return;
- ig(this, kI, fN).call(this, {
- highlightOutlines: M(this, Ee).getNewOutline(g / 2)
- }), this.fixAndSetPosition();
- const [C, i] = this.parentDimensions;
- this.setDims(this.width * C, this.height * i);
- }, xS = function() {
- M(this, Ge) === null || !this.parent || (this.parent.drawLayer.remove(M(this, Ge)), $(this, Ge, null), this.parent.drawLayer.remove(M(this, Zi)), $(this, Zi, null));
- }, jo = function(g = this.parent) {
- M(this, Ge) === null && ({
- id: Wi(this, Ge)._,
- clipPathId: Wi(this, Qc)._
- } = g.drawLayer.draw({
- bbox: M(this, Ee).box,
- root: {
- viewBox: "0 0 1 1",
- fill: this.color,
- "fill-opacity": M(this, Jl)
- },
- rootClass: {
- highlight: !0,
- free: M(this, _t)
- },
- path: {
- d: M(this, Ee).toSVGPath()
- }
- }, !1, !0), $(this, Zi, g.drawLayer.drawOutline({
- rootClass: {
- highlightOutline: !0,
- free: M(this, _t)
- },
- bbox: M(this, Ui).box,
- path: {
- d: M(this, Ui).toSVGPath()
- }
- }, M(this, _t))), M(this, Oc) && (M(this, Oc).style.clipPath = M(this, Qc)));
- }, CA = new WeakSet(), qr = function([g, C, i, e], A) {
- switch (A) {
- case 90:
- return [1 - C - e, g, e, i];
- case 180:
- return [1 - g - i, 1 - C - e, i, e];
- case 270:
- return [C, 1 - g - i, e, i];
- }
- return [g, C, i, e];
- }, dIg = function(g) {
- cC._keyboardManager.exec(this, g);
- }, HN = function(g) {
- if (!M(this, o0))
- return;
- const C = window.getSelection();
- g ? C.setPosition(M(this, o0), M(this, PZ)) : C.setPosition(M(this, _Z), M(this, qZ));
- }, gm = function() {
- return M(this, _t) ? this.rotation : 0;
- }, rIg = function() {
- if (M(this, _t))
- return null;
- const [g, C] = this.pageDimensions, [i, e] = this.pageTranslation, A = M(this, zl), s = new Float32Array(A.length * 8);
- let l = 0;
- for (const {
- x: n,
- y: a,
- width: d,
- height: o
- } of A) {
- const c = n * g + i, r = (1 - a) * C + e;
- s[l] = s[l + 4] = c, s[l + 1] = s[l + 3] = r, s[l + 2] = s[l + 6] = c + d * g, s[l + 5] = s[l + 7] = r - o * C, l += 8;
- }
- return s;
- }, hIg = function(g) {
- return M(this, Ee).serialize(g, ig(this, kI, gm).call(this));
- }, bIg = function(g, C) {
- this._freeHighlight.add(C) && g.drawLayer.updateProperties(this._freeHighlightId, {
- path: {
- d: this._freeHighlight.toSVGPath()
- }
- });
- }, uIg = function(g, C) {
- this._freeHighlight.isEmpty() ? g.drawLayer.remove(this._freeHighlightId) : g.createAndAddNewEditor(C, !1, {
- highlightId: this._freeHighlightId,
- highlightOutlines: this._freeHighlight.getOutlines(),
- clipPathId: this._freeHighlightClipId,
- methodOfCreation: "main_toolbar"
- }), this._freeHighlightId = -1, this._freeHighlight = null, this._freeHighlightClipId = "";
- }, mIg = function(g) {
- const {
- color: C
- } = this._initialData;
- return g.color.some((i, e) => i !== C[e]);
- }, tg(cC, CA), iI(cC, "_defaultColor", null), iI(cC, "_defaultOpacity", 1), iI(cC, "_defaultThickness", 12), iI(cC, "_type", "highlight"), iI(cC, "_editorType", XI.HIGHLIGHT), iI(cC, "_freeHighlightId", -1), iI(cC, "_freeHighlight", null), iI(cC, "_freeHighlightClipId", "");
- let lV = cC;
- var Uc;
- class ZIg {
- constructor() {
- tg(this, Uc, /* @__PURE__ */ Object.create(null));
- }
- updateProperty(I, g) {
- this[I] = g, this.updateSVGProperty(I, g);
- }
- updateProperties(I) {
- if (I)
- for (const [g, C] of Object.entries(I))
- g.startsWith("_") || this.updateProperty(g, C);
- }
- updateSVGProperty(I, g) {
- M(this, Uc)[I] = g;
- }
- toSVGProperties() {
- const I = M(this, Uc);
- return $(this, Uc, /* @__PURE__ */ Object.create(null)), {
- root: I
- };
- }
- reset() {
- $(this, Uc, /* @__PURE__ */ Object.create(null));
- }
- updateAll(I = this) {
- this.updateProperties(I);
- }
- clone() {
- BC("Not implemented");
- }
- }
- Uc = new WeakMap();
- var we, h0, Ft, Ec, Pc, Da, Ka, Fa, _c, sC, jS, QS, OS, Im, GIg, XN, Cm, $r;
- const II = class II extends TC {
- constructor(g) {
- super(g);
- tg(this, sC);
- tg(this, we, null);
- tg(this, h0);
- iI(this, "_drawId", null);
- $(this, h0, g.mustBeCommitted || !1), this._addOutlines(g);
- }
- _addOutlines(g) {
- g.drawOutlines && (ig(this, sC, jS).call(this, g), ig(this, sC, Im).call(this));
- }
- static _mergeSVGProperties(g, C) {
- const i = new Set(Object.keys(g));
- for (const [e, A] of Object.entries(C))
- i.has(e) ? Object.assign(g[e], A) : g[e] = A;
- return g;
- }
- static getDefaultDrawingOptions(g) {
- BC("Not implemented");
- }
- static get typesMap() {
- BC("Not implemented");
- }
- static get isDrawer() {
- return !0;
- }
- static get supportMultipleDrawings() {
- return !1;
- }
- static updateDefaultParams(g, C) {
- const i = this.typesMap.get(g);
- i && this._defaultDrawingOptions.updateProperty(i, C), this._currentParent && (M(II, Ft).updateProperty(i, C), this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()));
- }
- updateParams(g, C) {
- const i = this.constructor.typesMap.get(g);
- i && this._updateProperty(g, i, C);
- }
- static get defaultPropertiesToUpdate() {
- const g = [], C = this._defaultDrawingOptions;
- for (const [i, e] of this.typesMap)
- g.push([i, C[e]]);
- return g;
- }
- get propertiesToUpdate() {
- const g = [], {
- _drawingOptions: C
- } = this;
- for (const [i, e] of this.constructor.typesMap)
- g.push([i, C[e]]);
- return g;
- }
- _updateProperty(g, C, i) {
- const e = this._drawingOptions, A = e[C], s = (l) => {
- var a;
- e.updateProperty(C, l);
- const n = M(this, we).updateProperty(C, l);
- n && ig(this, sC, Cm).call(this, n), (a = this.parent) == null || a.drawLayer.updateProperties(this._drawId, e.toSVGProperties());
- };
- this.addCommands({
- cmd: s.bind(this, i),
- undo: s.bind(this, A),
- post: this._uiManager.updateUI.bind(this._uiManager, this),
- mustExec: !0,
- type: g,
- overwriteIfSameType: !0,
- keepUndo: !0
- });
- }
- _onResizing() {
- var g;
- (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathResizingSVGProperties(ig(this, sC, XN).call(this)), {
- bbox: ig(this, sC, $r).call(this)
- }));
- }
- _onResized() {
- var g;
- (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathResizedSVGProperties(ig(this, sC, XN).call(this)), {
- bbox: ig(this, sC, $r).call(this)
- }));
- }
- _onTranslating(g, C) {
- var i;
- (i = this.parent) == null || i.drawLayer.updateProperties(this._drawId, {
- bbox: ig(this, sC, $r).call(this)
- });
- }
- _onTranslated() {
- var g;
- (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathTranslatedSVGProperties(ig(this, sC, XN).call(this), this.parentDimensions), {
- bbox: ig(this, sC, $r).call(this)
- }));
- }
- _onStartDragging() {
- var g;
- (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, {
- rootClass: {
- moving: !0
- }
- });
- }
- _onStopDragging() {
- var g;
- (g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, {
- rootClass: {
- moving: !1
- }
- });
- }
- commit() {
- super.commit(), this.disableEditMode(), this.disableEditing();
- }
- disableEditing() {
- super.disableEditing(), this.div.classList.toggle("disabled", !0);
- }
- enableEditing() {
- super.enableEditing(), this.div.classList.toggle("disabled", !1);
- }
- getBaseTranslation() {
- return [0, 0];
- }
- get isResizable() {
- return !0;
- }
- onceAdded(g) {
- this.annotationElementId || this.parent.addUndoableEditor(this), this._isDraggable = !0, M(this, h0) && ($(this, h0, !1), this.commit(), this.parent.setSelected(this), g && this.isOnScreen && this.div.focus());
- }
- remove() {
- ig(this, sC, OS).call(this), super.remove();
- }
- rebuild() {
- this.parent && (super.rebuild(), this.div !== null && (ig(this, sC, Im).call(this), ig(this, sC, Cm).call(this, M(this, we).box), this.isAttachedToDOM || this.parent.add(this)));
- }
- setParent(g) {
- var i;
- let C = !1;
- this.parent && !g ? (this._uiManager.removeShouldRescale(this), ig(this, sC, OS).call(this)) : g && (this._uiManager.addShouldRescale(this), ig(this, sC, Im).call(this, g), C = !this.parent && ((i = this.div) == null ? void 0 : i.classList.contains("selectedEditor"))), super.setParent(g), C && this.select();
- }
- rotate() {
- this.parent && this.parent.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties({
- bbox: ig(this, sC, $r).call(this)
- }, M(this, we).updateRotation((this.parentRotation - this.rotation + 360) % 360)));
- }
- onScaleChanging() {
- this.parent && ig(this, sC, Cm).call(this, M(this, we).updateParentDimensions(this.parentDimensions, this.parent.scale));
- }
- static onScaleChangingWhenDrawing() {
- }
- render() {
- if (this.div)
- return this.div;
- let g, C;
- this._isCopy && (g = this.x, C = this.y);
- const i = super.render();
- i.classList.add("draw");
- const e = document.createElement("div");
- i.append(e), e.setAttribute("aria-hidden", "true"), e.className = "internal";
- const [A, s] = this.parentDimensions;
- return this.setDims(this.width * A, this.height * s), this._uiManager.addShouldRescale(this), this.disableEditing(), this._isCopy && this._moveAfterPaste(g, C), i;
- }
- static createDrawerInstance(g, C, i, e, A) {
- BC("Not implemented");
- }
- static startDrawing(g, C, i, e) {
- var b;
- const {
- target: A,
- offsetX: s,
- offsetY: l,
- pointerId: n,
- pointerType: a
- } = e;
- if (M(II, Ka) && M(II, Ka) !== a)
- return;
- const {
- viewport: {
- rotation: d
- }
- } = g, {
- width: o,
- height: c
- } = A.getBoundingClientRect(), r = $(II, Ec, new AbortController()), h = g.combinedSignal(r);
- if (M(II, Da) || $(II, Da, n), M(II, Ka) ?? $(II, Ka, a), window.addEventListener("pointerup", (u) => {
- var m;
- M(II, Da) === u.pointerId ? this._endDraw(u) : (m = M(II, Fa)) == null || m.delete(u.pointerId);
- }, {
- signal: h
- }), window.addEventListener("pointercancel", (u) => {
- var m;
- M(II, Da) === u.pointerId ? this._currentParent.endDrawingSession() : (m = M(II, Fa)) == null || m.delete(u.pointerId);
- }, {
- signal: h
- }), window.addEventListener("pointerdown", (u) => {
- M(II, Ka) === u.pointerType && ((M(II, Fa) || $(II, Fa, /* @__PURE__ */ new Set())).add(u.pointerId), M(II, Ft).isCancellable() && (M(II, Ft).removeLastElement(), M(II, Ft).isEmpty() ? this._currentParent.endDrawingSession(!0) : this._endDraw(null)));
- }, {
- capture: !0,
- passive: !1,
- signal: h
- }), window.addEventListener("contextmenu", zA, {
- signal: h
- }), A.addEventListener("pointermove", this._drawMove.bind(this), {
- signal: h
- }), A.addEventListener("touchmove", (u) => {
- u.timeStamp === M(II, _c) && ht(u);
- }, {
- signal: h
- }), g.toggleDrawing(), (b = C._editorUndoBar) == null || b.hide(), M(II, Ft)) {
- g.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).startNew(s, l, o, c, d));
- return;
- }
- C.updateUIForDefaultProperties(this), $(II, Ft, this.createDrawerInstance(s, l, o, c, d)), $(II, Pc, this.getDefaultDrawingOptions()), this._currentParent = g, {
- id: this._currentDrawId
- } = g.drawLayer.draw(this._mergeSVGProperties(M(II, Pc).toSVGProperties(), M(II, Ft).defaultSVGProperties), !0, !1);
- }
- static _drawMove(g) {
- var A;
- if ($(II, _c, -1), !M(II, Ft))
- return;
- const {
- offsetX: C,
- offsetY: i,
- pointerId: e
- } = g;
- if (M(II, Da) === e) {
- if (((A = M(II, Fa)) == null ? void 0 : A.size) >= 1) {
- this._endDraw(g);
- return;
- }
- this._currentParent.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).add(C, i)), $(II, _c, g.timeStamp), ht(g);
- }
- }
- static _cleanup(g) {
- g && (this._currentDrawId = -1, this._currentParent = null, $(II, Ft, null), $(II, Pc, null), $(II, Ka, null), $(II, _c, NaN)), M(II, Ec) && (M(II, Ec).abort(), $(II, Ec, null), $(II, Da, NaN), $(II, Fa, null));
- }
- static _endDraw(g) {
- const C = this._currentParent;
- if (C) {
- if (C.toggleDrawing(!0), this._cleanup(!1), (g == null ? void 0 : g.target) === C.div && C.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).end(g.offsetX, g.offsetY)), this.supportMultipleDrawings) {
- const i = M(II, Ft), e = this._currentDrawId, A = i.getLastElement();
- C.addCommands({
- cmd: () => {
- C.drawLayer.updateProperties(e, i.setLastElement(A));
- },
- undo: () => {
- C.drawLayer.updateProperties(e, i.removeLastElement());
- },
- mustExec: !1,
- type: iC.DRAW_STEP
- });
- return;
- }
- this.endDrawing(!1);
- }
- }
- static endDrawing(g) {
- const C = this._currentParent;
- if (!C)
- return null;
- if (C.toggleDrawing(!0), C.cleanUndoStack(iC.DRAW_STEP), !M(II, Ft).isEmpty()) {
- const {
- pageDimensions: [i, e],
- scale: A
- } = C, s = C.createAndAddNewEditor({
- offsetX: 0,
- offsetY: 0
- }, !1, {
- drawId: this._currentDrawId,
- drawOutlines: M(II, Ft).getOutlines(i * A, e * A, A, this._INNER_MARGIN),
- drawingOptions: M(II, Pc),
- mustBeCommitted: !g
- });
- return this._cleanup(!0), s;
- }
- return C.drawLayer.remove(this._currentDrawId), this._cleanup(!0), null;
- }
- createDrawingOptions(g) {
- }
- static deserializeDraw(g, C, i, e, A, s) {
- BC("Not implemented");
- }
- static async deserialize(g, C, i) {
- var d, o;
- const {
- rawDims: {
- pageWidth: e,
- pageHeight: A,
- pageX: s,
- pageY: l
- }
- } = C.viewport, n = this.deserializeDraw(s, l, e, A, this._INNER_MARGIN, g), a = await super.deserialize(g, C, i);
- return a.createDrawingOptions(g), ig(d = a, sC, jS).call(d, {
- drawOutlines: n
- }), ig(o = a, sC, Im).call(o), a.onScaleChanging(), a.rotate(), a;
- }
- serializeDraw(g) {
- const [C, i] = this.pageTranslation, [e, A] = this.pageDimensions;
- return M(this, we).serialize([C, i, e, A], g);
- }
- renderAnnotationElement(g) {
- return g.updateEdited({
- rect: this.getRect(0, 0)
- }), null;
- }
- static canCreateNewEmptyEditor() {
- return !1;
- }
- };
- we = new WeakMap(), h0 = new WeakMap(), Ft = new WeakMap(), Ec = new WeakMap(), Pc = new WeakMap(), Da = new WeakMap(), Ka = new WeakMap(), Fa = new WeakMap(), _c = new WeakMap(), sC = new WeakSet(), jS = function({
- drawOutlines: g,
- drawId: C,
- drawingOptions: i
- }) {
- $(this, we, g), this._drawingOptions || (this._drawingOptions = i), C >= 0 ? (this._drawId = C, this.parent.drawLayer.finalizeDraw(C, g.defaultProperties)) : this._drawId = ig(this, sC, QS).call(this, g, this.parent), ig(this, sC, Cm).call(this, g.box);
- }, QS = function(g, C) {
- const {
- id: i
- } = C.drawLayer.draw(II._mergeSVGProperties(this._drawingOptions.toSVGProperties(), g.defaultSVGProperties), !1, !1);
- return i;
- }, OS = function() {
- this._drawId === null || !this.parent || (this.parent.drawLayer.remove(this._drawId), this._drawId = null, this._drawingOptions.reset());
- }, Im = function(g = this.parent) {
- if (!(this._drawId !== null && this.parent === g)) {
- if (this._drawId !== null) {
- this.parent.drawLayer.updateParent(this._drawId, g.drawLayer);
- return;
- }
- this._drawingOptions.updateAll(), this._drawId = ig(this, sC, QS).call(this, M(this, we), g);
- }
- }, GIg = function([g, C, i, e]) {
- const {
- parentDimensions: [A, s],
- rotation: l
- } = this;
- switch (l) {
- case 90:
- return [C, 1 - g, i * (s / A), e * (A / s)];
- case 180:
- return [1 - g, 1 - C, i, e];
- case 270:
- return [1 - C, g, i * (s / A), e * (A / s)];
- default:
- return [g, C, i, e];
- }
- }, XN = function() {
- const {
- x: g,
- y: C,
- width: i,
- height: e,
- parentDimensions: [A, s],
- rotation: l
- } = this;
- switch (l) {
- case 90:
- return [1 - C, g, i * (A / s), e * (s / A)];
- case 180:
- return [1 - g, 1 - C, i, e];
- case 270:
- return [C, 1 - g, i * (A / s), e * (s / A)];
- default:
- return [g, C, i, e];
- }
- }, Cm = function(g) {
- if ([this.x, this.y, this.width, this.height] = ig(this, sC, GIg).call(this, g), this.div) {
- this.fixAndSetPosition();
- const [C, i] = this.parentDimensions;
- this.setDims(this.width * C, this.height * i);
- }
- this._onResized();
- }, $r = function() {
- const {
- x: g,
- y: C,
- width: i,
- height: e,
- rotation: A,
- parentRotation: s,
- parentDimensions: [l, n]
- } = this;
- switch ((A * 4 + s) / 90) {
- case 1:
- return [1 - C - e, g, e, i];
- case 2:
- return [1 - g - i, 1 - C - e, i, e];
- case 3:
- return [C, 1 - g - i, e, i];
- case 4:
- return [g, C - i * (l / n), e * (n / l), i * (l / n)];
- case 5:
- return [1 - C, g, i * (l / n), e * (n / l)];
- case 6:
- return [1 - g - e * (n / l), 1 - C, e * (n / l), i * (l / n)];
- case 7:
- return [C - i * (l / n), 1 - g - e * (n / l), i * (l / n), e * (n / l)];
- case 8:
- return [g - i, C - e, i, e];
- case 9:
- return [1 - C, g - i, e, i];
- case 10:
- return [1 - g, 1 - C, i, e];
- case 11:
- return [C - e, 1 - g, e, i];
- case 12:
- return [g - e * (n / l), C, e * (n / l), i * (l / n)];
- case 13:
- return [1 - C - i * (l / n), g - e * (n / l), i * (l / n), e * (n / l)];
- case 14:
- return [1 - g, 1 - C - i * (l / n), e * (n / l), i * (l / n)];
- case 15:
- return [C, 1 - g, i * (l / n), e * (n / l)];
- default:
- return [g, C, i, e];
- }
- }, iI(II, "_currentDrawId", -1), iI(II, "_currentParent", null), tg(II, Ft, null), tg(II, Ec, null), tg(II, Pc, null), tg(II, Da, NaN), tg(II, Ka, null), tg(II, Fa, null), tg(II, _c, NaN), iI(II, "_INNER_MARGIN", 3);
- let nV = II;
- var Ns, kt, zt, qc, b0, Vi, qt, _e, $c, gd, Id, u0, SN;
- class Mdg {
- constructor(I, g, C, i, e, A) {
- tg(this, u0);
- tg(this, Ns, new Float64Array(6));
- tg(this, kt);
- tg(this, zt);
- tg(this, qc);
- tg(this, b0);
- tg(this, Vi);
- tg(this, qt, "");
- tg(this, _e, 0);
- tg(this, $c, new oG());
- tg(this, gd);
- tg(this, Id);
- $(this, gd, C), $(this, Id, i), $(this, qc, e), $(this, b0, A), [I, g] = ig(this, u0, SN).call(this, I, g);
- const s = $(this, kt, [NaN, NaN, NaN, NaN, I, g]);
- $(this, Vi, [I, g]), $(this, zt, [{
- line: s,
- points: M(this, Vi)
- }]), M(this, Ns).set(s, 0);
- }
- updateProperty(I, g) {
- I === "stroke-width" && $(this, b0, g);
- }
- isEmpty() {
- return !M(this, zt) || M(this, zt).length === 0;
- }
- isCancellable() {
- return M(this, Vi).length <= 10;
- }
- add(I, g) {
- [I, g] = ig(this, u0, SN).call(this, I, g);
- const [C, i, e, A] = M(this, Ns).subarray(2, 6), s = I - e, l = g - A;
- return Math.hypot(M(this, gd) * s, M(this, Id) * l) <= 2 ? null : (M(this, Vi).push(I, g), isNaN(C) ? (M(this, Ns).set([e, A, I, g], 2), M(this, kt).push(NaN, NaN, NaN, NaN, I, g), {
- path: {
- d: this.toSVGPath()
- }
- }) : (isNaN(M(this, Ns)[0]) && M(this, kt).splice(6, 6), M(this, Ns).set([C, i, e, A, I, g], 0), M(this, kt).push(...$g.createBezierPoints(C, i, e, A, I, g)), {
- path: {
- d: this.toSVGPath()
- }
- }));
- }
- end(I, g) {
- const C = this.add(I, g);
- return C || (M(this, Vi).length === 2 ? {
- path: {
- d: this.toSVGPath()
- }
- } : null);
- }
- startNew(I, g, C, i, e) {
- $(this, gd, C), $(this, Id, i), $(this, qc, e), [I, g] = ig(this, u0, SN).call(this, I, g);
- const A = $(this, kt, [NaN, NaN, NaN, NaN, I, g]);
- $(this, Vi, [I, g]);
- const s = M(this, zt).at(-1);
- return s && (s.line = new Float32Array(s.line), s.points = new Float32Array(s.points)), M(this, zt).push({
- line: A,
- points: M(this, Vi)
- }), M(this, Ns).set(A, 0), $(this, _e, 0), this.toSVGPath(), null;
- }
- getLastElement() {
- return M(this, zt).at(-1);
- }
- setLastElement(I) {
- return M(this, zt) ? (M(this, zt).push(I), $(this, kt, I.line), $(this, Vi, I.points), $(this, _e, 0), {
- path: {
- d: this.toSVGPath()
- }
- }) : M(this, $c).setLastElement(I);
- }
- removeLastElement() {
- if (!M(this, zt))
- return M(this, $c).removeLastElement();
- M(this, zt).pop(), $(this, qt, "");
- for (let I = 0, g = M(this, zt).length; I < g; I++) {
- const {
- line: C,
- points: i
- } = M(this, zt)[I];
- $(this, kt, C), $(this, Vi, i), $(this, _e, 0), this.toSVGPath();
- }
- return {
- path: {
- d: M(this, qt)
- }
- };
- }
- toSVGPath() {
- const I = $g.svgRound(M(this, kt)[4]), g = $g.svgRound(M(this, kt)[5]);
- if (M(this, Vi).length === 2)
- return $(this, qt, `${M(this, qt)} M ${I} ${g} Z`), M(this, qt);
- if (M(this, Vi).length <= 6) {
- const i = M(this, qt).lastIndexOf("M");
- $(this, qt, `${M(this, qt).slice(0, i)} M ${I} ${g}`), $(this, _e, 6);
- }
- if (M(this, Vi).length === 4) {
- const i = $g.svgRound(M(this, kt)[10]), e = $g.svgRound(M(this, kt)[11]);
- return $(this, qt, `${M(this, qt)} L ${i} ${e}`), $(this, _e, 12), M(this, qt);
- }
- const C = [];
- M(this, _e) === 0 && (C.push(`M ${I} ${g}`), $(this, _e, 6));
- for (let i = M(this, _e), e = M(this, kt).length; i < e; i += 6) {
- const [A, s, l, n, a, d] = M(this, kt).slice(i, i + 6).map($g.svgRound);
- C.push(`C${A} ${s} ${l} ${n} ${a} ${d}`);
- }
- return $(this, qt, M(this, qt) + C.join(" ")), $(this, _e, M(this, kt).length), M(this, qt);
- }
- getOutlines(I, g, C, i) {
- const e = M(this, zt).at(-1);
- return e.line = new Float32Array(e.line), e.points = new Float32Array(e.points), M(this, $c).build(M(this, zt), I, g, C, M(this, qc), M(this, b0), i), $(this, Ns, null), $(this, kt, null), $(this, zt, null), $(this, qt, null), M(this, $c);
- }
- get defaultSVGProperties() {
- return {
- root: {
- viewBox: "0 0 10000 10000"
- },
- rootClass: {
- draw: !0
- },
- bbox: [0, 0, 1, 1]
- };
- }
- }
- Ns = new WeakMap(), kt = new WeakMap(), zt = new WeakMap(), qc = new WeakMap(), b0 = new WeakMap(), Vi = new WeakMap(), qt = new WeakMap(), _e = new WeakMap(), $c = new WeakMap(), gd = new WeakMap(), Id = new WeakMap(), u0 = new WeakSet(), SN = function(I, g) {
- return $g._normalizePoint(I, g, M(this, gd), M(this, Id), M(this, qc));
- };
- var Mi, gG, IG, pe, Vs, Ms, m0, Z0, Cd, ii, hl, wIg, pIg, BIg;
- class oG extends $g {
- constructor() {
- super(...arguments);
- tg(this, ii);
- tg(this, Mi);
- tg(this, gG, 0);
- tg(this, IG);
- tg(this, pe);
- tg(this, Vs);
- tg(this, Ms);
- tg(this, m0);
- tg(this, Z0);
- tg(this, Cd);
- }
- build(g, C, i, e, A, s, l) {
- $(this, Vs, C), $(this, Ms, i), $(this, m0, e), $(this, Z0, A), $(this, Cd, s), $(this, IG, l ?? 0), $(this, pe, g), ig(this, ii, pIg).call(this);
- }
- get thickness() {
- return M(this, Cd);
- }
- setLastElement(g) {
- return M(this, pe).push(g), {
- path: {
- d: this.toSVGPath()
- }
- };
- }
- removeLastElement() {
- return M(this, pe).pop(), {
- path: {
- d: this.toSVGPath()
- }
- };
- }
- toSVGPath() {
- const g = [];
- for (const {
- line: C
- } of M(this, pe)) {
- if (g.push(`M${$g.svgRound(C[4])} ${$g.svgRound(C[5])}`), C.length === 6) {
- g.push("Z");
- continue;
- }
- if (C.length === 12 && isNaN(C[6])) {
- g.push(`L${$g.svgRound(C[10])} ${$g.svgRound(C[11])}`);
- continue;
- }
- for (let i = 6, e = C.length; i < e; i += 6) {
- const [A, s, l, n, a, d] = C.subarray(i, i + 6).map($g.svgRound);
- g.push(`C${A} ${s} ${l} ${n} ${a} ${d}`);
- }
- }
- return g.join("");
- }
- serialize([g, C, i, e], A) {
- const s = [], l = [], [n, a, d, o] = ig(this, ii, wIg).call(this);
- let c, r, h, b, u, m, Z, p, Y;
- switch (M(this, Z0)) {
- case 0:
- Y = $g._rescale, c = g, r = C + e, h = i, b = -e, u = g + n * i, m = C + (1 - a - o) * e, Z = g + (n + d) * i, p = C + (1 - a) * e;
- break;
- case 90:
- Y = $g._rescaleAndSwap, c = g, r = C, h = i, b = e, u = g + a * i, m = C + n * e, Z = g + (a + o) * i, p = C + (n + d) * e;
- break;
- case 180:
- Y = $g._rescale, c = g + i, r = C, h = -i, b = e, u = g + (1 - n - d) * i, m = C + a * e, Z = g + (1 - n) * i, p = C + (a + o) * e;
- break;
- case 270:
- Y = $g._rescaleAndSwap, c = g + i, r = C + e, h = -i, b = -e, u = g + (1 - a - o) * i, m = C + (1 - n - d) * e, Z = g + (1 - a) * i, p = C + (1 - n) * e;
- break;
- }
- for (const {
- line: R,
- points: X
- } of M(this, pe))
- s.push(Y(R, c, r, h, b, A ? new Array(R.length) : null)), l.push(Y(X, c, r, h, b, A ? new Array(X.length) : null));
- return {
- lines: s,
- points: l,
- rect: [u, m, Z, p]
- };
- }
- static deserialize(g, C, i, e, A, {
- paths: {
- lines: s,
- points: l
- },
- rotation: n,
- thickness: a
- }) {
- const d = [];
- let o, c, r, h, b;
- switch (n) {
- case 0:
- b = $g._rescale, o = -g / i, c = C / e + 1, r = 1 / i, h = -1 / e;
- break;
- case 90:
- b = $g._rescaleAndSwap, o = -C / e, c = -g / i, r = 1 / e, h = 1 / i;
- break;
- case 180:
- b = $g._rescale, o = g / i + 1, c = -C / e, r = -1 / i, h = 1 / e;
- break;
- case 270:
- b = $g._rescaleAndSwap, o = C / e + 1, c = g / i + 1, r = -1 / e, h = -1 / i;
- break;
- }
- if (!s) {
- s = [];
- for (const m of l) {
- const Z = m.length;
- if (Z === 2) {
- s.push(new Float32Array([NaN, NaN, NaN, NaN, m[0], m[1]]));
- continue;
- }
- if (Z === 4) {
- s.push(new Float32Array([NaN, NaN, NaN, NaN, m[0], m[1], NaN, NaN, NaN, NaN, m[2], m[3]]));
- continue;
- }
- const p = new Float32Array(3 * (Z - 2));
- s.push(p);
- let [Y, R, X, H] = m.subarray(0, 4);
- p.set([NaN, NaN, NaN, NaN, Y, R], 0);
- for (let S = 4; S < Z; S += 2) {
- const z = m[S], v = m[S + 1];
- p.set($g.createBezierPoints(Y, R, X, H, z, v), (S - 2) * 3), [Y, R, X, H] = [X, H, z, v];
- }
- }
- }
- for (let m = 0, Z = s.length; m < Z; m++)
- d.push({
- line: b(s[m].map((p) => p ?? NaN), o, c, r, h),
- points: b(l[m].map((p) => p ?? NaN), o, c, r, h)
- });
- const u = new this.prototype.constructor();
- return u.build(d, i, e, 1, n, a, A), u;
- }
- get box() {
- return M(this, Mi);
- }
- updateProperty(g, C) {
- return g === "stroke-width" ? ig(this, ii, BIg).call(this, C) : null;
- }
- updateParentDimensions([g, C], i) {
- const [e, A] = ig(this, ii, hl).call(this);
- $(this, Vs, g), $(this, Ms, C), $(this, m0, i);
- const [s, l] = ig(this, ii, hl).call(this), n = s - e, a = l - A, d = M(this, Mi);
- return d[0] -= n, d[1] -= a, d[2] += 2 * n, d[3] += 2 * a, d;
- }
- updateRotation(g) {
- return $(this, gG, g), {
- path: {
- transform: this.rotationTransform
- }
- };
- }
- get viewBox() {
- return M(this, Mi).map($g.svgRound).join(" ");
- }
- get defaultProperties() {
- const [g, C] = M(this, Mi);
- return {
- root: {
- viewBox: this.viewBox
- },
- path: {
- "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`
- }
- };
- }
- get rotationTransform() {
- const [, , g, C] = M(this, Mi);
- let i = 0, e = 0, A = 0, s = 0, l = 0, n = 0;
- switch (M(this, gG)) {
- case 90:
- e = C / g, A = -g / C, l = g;
- break;
- case 180:
- i = -1, s = -1, l = g, n = C;
- break;
- case 270:
- e = -C / g, A = g / C, n = C;
- break;
- default:
- return "";
- }
- return `matrix(${i} ${e} ${A} ${s} ${$g.svgRound(l)} ${$g.svgRound(n)})`;
- }
- getPathResizingSVGProperties([g, C, i, e]) {
- const [A, s] = ig(this, ii, hl).call(this), [l, n, a, d] = M(this, Mi);
- if (Math.abs(a - A) <= $g.PRECISION || Math.abs(d - s) <= $g.PRECISION) {
- const b = g + i / 2 - (l + a / 2), u = C + e / 2 - (n + d / 2);
- return {
- path: {
- "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
- transform: `${this.rotationTransform} translate(${b} ${u})`
- }
- };
- }
- const o = (i - 2 * A) / (a - 2 * A), c = (e - 2 * s) / (d - 2 * s), r = a / i, h = d / e;
- return {
- path: {
- "transform-origin": `${$g.svgRound(l)} ${$g.svgRound(n)}`,
- transform: `${this.rotationTransform} scale(${r} ${h}) translate(${$g.svgRound(A)} ${$g.svgRound(s)}) scale(${o} ${c}) translate(${$g.svgRound(-A)} ${$g.svgRound(-s)})`
- }
- };
- }
- getPathResizedSVGProperties([g, C, i, e]) {
- const [A, s] = ig(this, ii, hl).call(this), l = M(this, Mi), [n, a, d, o] = l;
- if (l[0] = g, l[1] = C, l[2] = i, l[3] = e, Math.abs(d - A) <= $g.PRECISION || Math.abs(o - s) <= $g.PRECISION) {
- const u = g + i / 2 - (n + d / 2), m = C + e / 2 - (a + o / 2);
- for (const {
- line: Z,
- points: p
- } of M(this, pe))
- $g._translate(Z, u, m, Z), $g._translate(p, u, m, p);
- return {
- root: {
- viewBox: this.viewBox
- },
- path: {
- "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
- transform: this.rotationTransform || null,
- d: this.toSVGPath()
- }
- };
- }
- const c = (i - 2 * A) / (d - 2 * A), r = (e - 2 * s) / (o - 2 * s), h = -c * (n + A) + g + A, b = -r * (a + s) + C + s;
- if (c !== 1 || r !== 1 || h !== 0 || b !== 0)
- for (const {
- line: u,
- points: m
- } of M(this, pe))
- $g._rescale(u, h, b, c, r, u), $g._rescale(m, h, b, c, r, m);
- return {
- root: {
- viewBox: this.viewBox
- },
- path: {
- "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
- transform: this.rotationTransform || null,
- d: this.toSVGPath()
- }
- };
- }
- getPathTranslatedSVGProperties([g, C], i) {
- const [e, A] = i, s = M(this, Mi), l = g - s[0], n = C - s[1];
- if (M(this, Vs) === e && M(this, Ms) === A)
- for (const {
- line: a,
- points: d
- } of M(this, pe))
- $g._translate(a, l, n, a), $g._translate(d, l, n, d);
- else {
- const a = M(this, Vs) / e, d = M(this, Ms) / A;
- $(this, Vs, e), $(this, Ms, A);
- for (const {
- line: o,
- points: c
- } of M(this, pe))
- $g._rescale(o, l, n, a, d, o), $g._rescale(c, l, n, a, d, c);
- s[2] *= a, s[3] *= d;
- }
- return s[0] = g, s[1] = C, {
- root: {
- viewBox: this.viewBox
- },
- path: {
- d: this.toSVGPath(),
- "transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`
- }
- };
- }
- get defaultSVGProperties() {
- const g = M(this, Mi);
- return {
- root: {
- viewBox: this.viewBox
- },
- rootClass: {
- draw: !0
- },
- path: {
- d: this.toSVGPath(),
- "transform-origin": `${$g.svgRound(g[0])} ${$g.svgRound(g[1])}`,
- transform: this.rotationTransform || null
- },
- bbox: g
- };
- }
- }
- Mi = new WeakMap(), gG = new WeakMap(), IG = new WeakMap(), pe = new WeakMap(), Vs = new WeakMap(), Ms = new WeakMap(), m0 = new WeakMap(), Z0 = new WeakMap(), Cd = new WeakMap(), ii = new WeakSet(), hl = function(g = M(this, Cd)) {
- const C = M(this, IG) + g / 2 * M(this, m0);
- return M(this, Z0) % 180 === 0 ? [C / M(this, Vs), C / M(this, Ms)] : [C / M(this, Ms), C / M(this, Vs)];
- }, wIg = function() {
- const [g, C, i, e] = M(this, Mi), [A, s] = ig(this, ii, hl).call(this, 0);
- return [g + A, C + s, i - 2 * A, e - 2 * s];
- }, pIg = function() {
- const g = $(this, Mi, new Float32Array([1 / 0, 1 / 0, -1 / 0, -1 / 0]));
- for (const {
- line: e
- } of M(this, pe)) {
- if (e.length <= 12) {
- for (let l = 4, n = e.length; l < n; l += 6)
- AI.pointBoundingBox(e[l], e[l + 1], g);
- continue;
- }
- let A = e[4], s = e[5];
- for (let l = 6, n = e.length; l < n; l += 6) {
- const [a, d, o, c, r, h] = e.subarray(l, l + 6);
- AI.bezierBoundingBox(A, s, a, d, o, c, r, h, g), A = r, s = h;
- }
- }
- const [C, i] = ig(this, ii, hl).call(this);
- g[0] = fi(g[0] - C, 0, 1), g[1] = fi(g[1] - i, 0, 1), g[2] = fi(g[2] + C, 0, 1), g[3] = fi(g[3] + i, 0, 1), g[2] -= g[0], g[3] -= g[1];
- }, BIg = function(g) {
- const [C, i] = ig(this, ii, hl).call(this);
- $(this, Cd, g);
- const [e, A] = ig(this, ii, hl).call(this), [s, l] = [e - C, A - i], n = M(this, Mi);
- return n[0] -= s, n[1] -= l, n[2] += 2 * s, n[3] += 2 * l, n;
- };
- class IM extends ZIg {
- constructor(I) {
- super(), this._viewParameters = I, super.updateProperties({
- fill: "none",
- stroke: TC._defaultLineColor,
- "stroke-opacity": 1,
- "stroke-width": 1,
- "stroke-linecap": "round",
- "stroke-linejoin": "round",
- "stroke-miterlimit": 10
- });
- }
- updateSVGProperty(I, g) {
- I === "stroke-width" && (g ?? (g = this["stroke-width"]), g *= this._viewParameters.realScale), super.updateSVGProperty(I, g);
- }
- clone() {
- const I = new IM(this._viewParameters);
- return I.updateAll(this), I;
- }
- }
- var UV, WIg;
- const nh = class nh extends nV {
- constructor(g) {
- super({
- ...g,
- name: "inkEditor"
- });
- tg(this, UV);
- this._willKeepAspectRatio = !0, this.defaultL10nId = "pdfjs-editor-ink-editor";
- }
- static initialize(g, C) {
- TC.initialize(g, C), this._defaultDrawingOptions = new IM(C.viewParameters);
- }
- static getDefaultDrawingOptions(g) {
- const C = this._defaultDrawingOptions.clone();
- return C.updateProperties(g), C;
- }
- static get supportMultipleDrawings() {
- return !0;
- }
- static get typesMap() {
- return UI(this, "typesMap", /* @__PURE__ */ new Map([[iC.INK_THICKNESS, "stroke-width"], [iC.INK_COLOR, "stroke"], [iC.INK_OPACITY, "stroke-opacity"]]));
- }
- static createDrawerInstance(g, C, i, e, A) {
- return new Mdg(g, C, i, e, A, this._defaultDrawingOptions["stroke-width"]);
- }
- static deserializeDraw(g, C, i, e, A, s) {
- return oG.deserialize(g, C, i, e, A, s);
- }
- static async deserialize(g, C, i) {
- let e = null;
- if (g instanceof p9) {
- const {
- data: {
- inkLists: s,
- rect: l,
- rotation: n,
- id: a,
- color: d,
- opacity: o,
- borderStyle: {
- rawWidth: c
- },
- popupRef: r
- },
- parent: {
- page: {
- pageNumber: h
- }
- }
- } = g;
- e = g = {
- annotationType: XI.INK,
- color: Array.from(d),
- thickness: c,
- opacity: o,
- paths: {
- points: s
- },
- boxes: null,
- pageIndex: h - 1,
- rect: l.slice(0),
- rotation: n,
- id: a,
- deleted: !1,
- popupRef: r
- };
- }
- const A = await super.deserialize(g, C, i);
- return A.annotationElementId = g.id || null, A._initialData = e, A;
- }
- onScaleChanging() {
- if (!this.parent)
- return;
- super.onScaleChanging();
- const {
- _drawId: g,
- _drawingOptions: C,
- parent: i
- } = this;
- C.updateSVGProperty("stroke-width"), i.drawLayer.updateProperties(g, C.toSVGProperties());
- }
- static onScaleChangingWhenDrawing() {
- const g = this._currentParent;
- g && (super.onScaleChangingWhenDrawing(), this._defaultDrawingOptions.updateSVGProperty("stroke-width"), g.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()));
- }
- createDrawingOptions({
- color: g,
- thickness: C,
- opacity: i
- }) {
- this._drawingOptions = nh.getDefaultDrawingOptions({
- stroke: AI.makeHexColor(...g),
- "stroke-width": C,
- "stroke-opacity": i
- });
- }
- serialize(g = !1) {
- if (this.isEmpty())
- return null;
- if (this.deleted)
- return this.serializeDeleted();
- const {
- lines: C,
- points: i,
- rect: e
- } = this.serializeDraw(g), {
- _drawingOptions: {
- stroke: A,
- "stroke-opacity": s,
- "stroke-width": l
- }
- } = this, n = {
- annotationType: XI.INK,
- color: TC._colorManager.convert(A),
- opacity: s,
- thickness: l,
- paths: {
- lines: C,
- points: i
- },
- pageIndex: this.pageIndex,
- rect: e,
- rotation: this.rotation,
- structTreeParentId: this._structTreeParentId
- };
- return g ? (n.isCopy = !0, n) : this.annotationElementId && !ig(this, UV, WIg).call(this, n) ? null : (n.id = this.annotationElementId, n);
- }
- renderAnnotationElement(g) {
- const {
- points: C,
- rect: i
- } = this.serializeDraw(!1);
- return g.updateEdited({
- rect: i,
- thickness: this._drawingOptions["stroke-width"],
- points: C
- }), null;
- }
- };
- UV = new WeakSet(), WIg = function(g) {
- const {
- color: C,
- thickness: i,
- opacity: e,
- pageIndex: A
- } = this._initialData;
- return this._hasBeenMoved || this._hasBeenResized || g.color.some((s, l) => s !== C[l]) || g.thickness !== i || g.opacity !== e || g.pageIndex !== A;
- }, iI(nh, "_type", "ink"), iI(nh, "_editorType", XI.INK), iI(nh, "_defaultDrawingOptions", null);
- let US = nh;
- class ES extends oG {
- toSVGPath() {
- let I = super.toSVGPath();
- return I.endsWith("Z") || (I += "Z"), I;
- }
- }
- const TY = 8, Du = 3;
- var td, rC, PS, fA, yIg, YIg, _S, DN, NIg, VIg, MIg, qS, $S, RIg;
- class Ol {
- static extractContoursFromText(I, {
- fontFamily: g,
- fontStyle: C,
- fontWeight: i
- }, e, A, s, l) {
- let n = new OffscreenCanvas(1, 1), a = n.getContext("2d", {
- alpha: !1
- });
- const d = 200, o = a.font = `${C} ${i} ${d}px ${g}`, {
- actualBoundingBoxLeft: c,
- actualBoundingBoxRight: r,
- actualBoundingBoxAscent: h,
- actualBoundingBoxDescent: b,
- fontBoundingBoxAscent: u,
- fontBoundingBoxDescent: m,
- width: Z
- } = a.measureText(I), p = 1.5, Y = Math.ceil(Math.max(Math.abs(c) + Math.abs(r) || 0, Z) * p), R = Math.ceil(Math.max(Math.abs(h) + Math.abs(b) || d, Math.abs(u) + Math.abs(m) || d) * p);
- n = new OffscreenCanvas(Y, R), a = n.getContext("2d", {
- alpha: !0,
- willReadFrequently: !0
- }), a.font = o, a.filter = "grayscale(1)", a.fillStyle = "white", a.fillRect(0, 0, Y, R), a.fillStyle = "black", a.fillText(I, Y * (p - 1) / 2, R * (3 - p) / 2);
- const X = ig(this, rC, qS).call(this, a.getImageData(0, 0, Y, R).data), H = ig(this, rC, MIg).call(this, X), S = ig(this, rC, $S).call(this, H), z = ig(this, rC, _S).call(this, X, Y, R, S);
- return this.processDrawnLines({
- lines: {
- curves: z,
- width: Y,
- height: R
- },
- pageWidth: e,
- pageHeight: A,
- rotation: s,
- innerMargin: l,
- mustSmooth: !0,
- areContours: !0
- });
- }
- static process(I, g, C, i, e) {
- const [A, s, l] = ig(this, rC, RIg).call(this, I), [n, a] = ig(this, rC, VIg).call(this, A, s, l, Math.hypot(s, l) * M(this, td).sigmaSFactor, M(this, td).sigmaR, M(this, td).kernelSize), d = ig(this, rC, $S).call(this, a), o = ig(this, rC, _S).call(this, n, s, l, d);
- return this.processDrawnLines({
- lines: {
- curves: o,
- width: s,
- height: l
- },
- pageWidth: g,
- pageHeight: C,
- rotation: i,
- innerMargin: e,
- mustSmooth: !0,
- areContours: !0
- });
- }
- static processDrawnLines({
- lines: I,
- pageWidth: g,
- pageHeight: C,
- rotation: i,
- innerMargin: e,
- mustSmooth: A,
- areContours: s
- }) {
- i % 180 !== 0 && ([g, C] = [C, g]);
- const {
- curves: l,
- width: n,
- height: a
- } = I, d = I.thickness ?? 0, o = [], c = Math.min(g / n, C / a), r = c / g, h = c / C, b = [];
- for (const {
- points: m
- } of l) {
- const Z = A ? ig(this, rC, NIg).call(this, m) : m;
- if (!Z)
- continue;
- b.push(Z);
- const p = Z.length, Y = new Float32Array(p), R = new Float32Array(3 * (p === 2 ? 2 : p - 2));
- if (o.push({
- line: R,
- points: Y
- }), p === 2) {
- Y[0] = Z[0] * r, Y[1] = Z[1] * h, R.set([NaN, NaN, NaN, NaN, Y[0], Y[1]], 0);
- continue;
- }
- let [X, H, S, z] = Z;
- X *= r, H *= h, S *= r, z *= h, Y.set([X, H, S, z], 0), R.set([NaN, NaN, NaN, NaN, X, H], 0);
- for (let v = 4; v < p; v += 2) {
- const K = Y[v] = Z[v] * r, V = Y[v + 1] = Z[v + 1] * h;
- R.set($g.createBezierPoints(X, H, S, z, K, V), (v - 2) * 3), [X, H, S, z] = [S, z, K, V];
- }
- }
- if (o.length === 0)
- return null;
- const u = s ? new ES() : new oG();
- return u.build(o, g, C, 1, i, s ? 0 : d, e), {
- outline: u,
- newCurves: b,
- areContours: s,
- thickness: d,
- width: n,
- height: a
- };
- }
- static async compressSignature({
- outlines: I,
- areContours: g,
- thickness: C,
- width: i,
- height: e
- }) {
- let A = 1 / 0, s = -1 / 0, l = 0;
- for (const Z of I) {
- l += Z.length;
- for (let p = 2, Y = Z.length; p < Y; p++) {
- const R = Z[p] - Z[p - 2];
- A = Math.min(A, R), s = Math.max(s, R);
- }
- }
- let n;
- A >= -128 && s <= 127 ? n = Int8Array : A >= -32768 && s <= 32767 ? n = Int16Array : n = Int32Array;
- const a = I.length, d = TY + Du * a, o = new Uint32Array(d);
- let c = 0;
- o[c++] = d * Uint32Array.BYTES_PER_ELEMENT + (l - 2 * a) * n.BYTES_PER_ELEMENT, o[c++] = 0, o[c++] = i, o[c++] = e, o[c++] = g ? 0 : 1, o[c++] = Math.max(0, Math.floor(C ?? 0)), o[c++] = a, o[c++] = n.BYTES_PER_ELEMENT;
- for (const Z of I)
- o[c++] = Z.length - 2, o[c++] = Z[0], o[c++] = Z[1];
- const r = new CompressionStream("deflate-raw"), h = r.writable.getWriter();
- await h.ready, h.write(o);
- const b = n.prototype.constructor;
- for (const Z of I) {
- const p = new b(Z.length - 2);
- for (let Y = 2, R = Z.length; Y < R; Y++)
- p[Y - 2] = Z[Y] - Z[Y - 2];
- h.write(p);
- }
- h.close();
- const u = await new Response(r.readable).arrayBuffer(), m = new Uint8Array(u);
- return X$(m);
- }
- static async decompressSignature(I) {
- try {
- const g = qog(I), {
- readable: C,
- writable: i
- } = new DecompressionStream("deflate-raw"), e = i.getWriter();
- await e.ready, e.write(g).then(async () => {
- await e.ready, await e.close();
- }).catch(() => {
- });
- let A = null, s = 0;
- for await (const Z of C)
- A || (A = new Uint8Array(new Uint32Array(Z.buffer, 0, 4)[0])), A.set(Z, s), s += Z.length;
- const l = new Uint32Array(A.buffer, 0, A.length >> 2), n = l[1];
- if (n !== 0)
- throw new Error(`Invalid version: ${n}`);
- const a = l[2], d = l[3], o = l[4] === 0, c = l[5], r = l[6], h = l[7], b = [], u = (TY + Du * r) * Uint32Array.BYTES_PER_ELEMENT;
- let m;
- switch (h) {
- case Int8Array.BYTES_PER_ELEMENT:
- m = new Int8Array(A.buffer, u);
- break;
- case Int16Array.BYTES_PER_ELEMENT:
- m = new Int16Array(A.buffer, u);
- break;
- case Int32Array.BYTES_PER_ELEMENT:
- m = new Int32Array(A.buffer, u);
- break;
- }
- s = 0;
- for (let Z = 0; Z < r; Z++) {
- const p = l[Du * Z + TY], Y = new Float32Array(p + 2);
- b.push(Y);
- for (let R = 0; R < Du - 1; R++)
- Y[R] = l[Du * Z + TY + R + 1];
- for (let R = 0; R < p; R++)
- Y[R + 2] = Y[R] + m[s++];
- }
- return {
- areContours: o,
- thickness: c,
- outlines: b,
- width: a,
- height: d
- };
- } catch (g) {
- return DI(`decompressSignature: ${g}`), null;
- }
- }
- }
- td = new WeakMap(), rC = new WeakSet(), PS = function(I, g, C, i) {
- return C -= I, i -= g, C === 0 ? i > 0 ? 0 : 4 : C === 1 ? i + 6 : 2 - i;
- }, fA = new WeakMap(), yIg = function(I, g, C, i, e, A, s) {
- const l = ig(this, rC, PS).call(this, C, i, e, A);
- for (let n = 0; n < 8; n++) {
- const a = (-n + l - s + 16) % 8, d = M(this, fA)[2 * a], o = M(this, fA)[2 * a + 1];
- if (I[(C + d) * g + (i + o)] !== 0)
- return a;
- }
- return -1;
- }, YIg = function(I, g, C, i, e, A, s) {
- const l = ig(this, rC, PS).call(this, C, i, e, A);
- for (let n = 0; n < 8; n++) {
- const a = (n + l + s + 16) % 8, d = M(this, fA)[2 * a], o = M(this, fA)[2 * a + 1];
- if (I[(C + d) * g + (i + o)] !== 0)
- return a;
- }
- return -1;
- }, _S = function(I, g, C, i) {
- const e = I.length, A = new Int32Array(e);
- for (let a = 0; a < e; a++)
- A[a] = I[a] <= i ? 1 : 0;
- for (let a = 1; a < C - 1; a++)
- A[a * g] = A[a * g + g - 1] = 0;
- for (let a = 0; a < g; a++)
- A[a] = A[g * C - 1 - a] = 0;
- let s = 1, l;
- const n = [];
- for (let a = 1; a < C - 1; a++) {
- l = 1;
- for (let d = 1; d < g - 1; d++) {
- const o = a * g + d, c = A[o];
- if (c === 0)
- continue;
- let r = a, h = d;
- if (c === 1 && A[o - 1] === 0)
- s += 1, h -= 1;
- else if (c >= 1 && A[o + 1] === 0)
- s += 1, h += 1, c > 1 && (l = c);
- else {
- c !== 1 && (l = Math.abs(c));
- continue;
- }
- const b = [d, a], u = h === d + 1, m = {
- isHole: u,
- points: b,
- id: s,
- parent: 0
- };
- n.push(m);
- let Z;
- for (const v of n)
- if (v.id === l) {
- Z = v;
- break;
- }
- Z ? Z.isHole ? m.parent = u ? Z.parent : l : m.parent = u ? l : Z.parent : m.parent = u ? l : 0;
- const p = ig(this, rC, yIg).call(this, A, g, a, d, r, h, 0);
- if (p === -1) {
- A[o] = -s, A[o] !== 1 && (l = Math.abs(A[o]));
- continue;
- }
- let Y = M(this, fA)[2 * p], R = M(this, fA)[2 * p + 1];
- const X = a + Y, H = d + R;
- r = X, h = H;
- let S = a, z = d;
- for (; ; ) {
- const v = ig(this, rC, YIg).call(this, A, g, S, z, r, h, 1);
- Y = M(this, fA)[2 * v], R = M(this, fA)[2 * v + 1];
- const K = S + Y, V = z + R;
- b.push(V, K);
- const N = S * g + z;
- if (A[N + 1] === 0 ? A[N] = -s : A[N] === 1 && (A[N] = s), K === a && V === d && S === X && z === H) {
- A[o] !== 1 && (l = Math.abs(A[o]));
- break;
- } else
- r = S, h = z, S = K, z = V;
- }
- }
- }
- return n;
- }, DN = function(I, g, C, i) {
- if (C - g <= 4) {
- for (let X = g; X < C - 2; X += 2)
- i.push(I[X], I[X + 1]);
- return;
- }
- const e = I[g], A = I[g + 1], s = I[C - 4] - e, l = I[C - 3] - A, n = Math.hypot(s, l), a = s / n, d = l / n, o = a * A - d * e, c = l / s, r = 1 / n, h = Math.atan(c), b = Math.cos(h), u = Math.sin(h), m = r * (Math.abs(b) + Math.abs(u)), Z = r * (1 - m + m ** 2), p = Math.max(Math.atan(Math.abs(u + b) * Z), Math.atan(Math.abs(u - b) * Z));
- let Y = 0, R = g;
- for (let X = g + 2; X < C - 2; X += 2) {
- const H = Math.abs(o - a * I[X + 1] + d * I[X]);
- H > Y && (R = X, Y = H);
- }
- Y > (n * p) ** 2 ? (ig(this, rC, DN).call(this, I, g, R + 2, i), ig(this, rC, DN).call(this, I, R, C, i)) : i.push(e, A);
- }, NIg = function(I) {
- const g = [], C = I.length;
- return ig(this, rC, DN).call(this, I, 0, C, g), g.push(I[C - 2], I[C - 1]), g.length <= 4 ? null : g;
- }, VIg = function(I, g, C, i, e, A) {
- const s = new Float32Array(A ** 2), l = -2 * i ** 2, n = A >> 1;
- for (let h = 0; h < A; h++) {
- const b = (h - n) ** 2;
- for (let u = 0; u < A; u++)
- s[h * A + u] = Math.exp((b + (u - n) ** 2) / l);
- }
- const a = new Float32Array(256), d = -2 * e ** 2;
- for (let h = 0; h < 256; h++)
- a[h] = Math.exp(h ** 2 / d);
- const o = I.length, c = new Uint8Array(o), r = new Uint32Array(256);
- for (let h = 0; h < C; h++)
- for (let b = 0; b < g; b++) {
- const u = h * g + b, m = I[u];
- let Z = 0, p = 0;
- for (let R = 0; R < A; R++) {
- const X = h + R - n;
- if (!(X < 0 || X >= C))
- for (let H = 0; H < A; H++) {
- const S = b + H - n;
- if (S < 0 || S >= g)
- continue;
- const z = I[X * g + S], v = s[R * A + H] * a[Math.abs(z - m)];
- Z += z * v, p += v;
- }
- }
- const Y = c[u] = Math.round(Z / p);
- r[Y]++;
- }
- return [c, r];
- }, MIg = function(I) {
- const g = new Uint32Array(256);
- for (const C of I)
- g[C]++;
- return g;
- }, qS = function(I) {
- const g = I.length, C = new Uint8ClampedArray(g >> 2);
- let i = -1 / 0, e = 1 / 0;
- for (let s = 0, l = C.length; s < l; s++) {
- if (I[(s << 2) + 3] === 0) {
- i = C[s] = 255;
- continue;
- }
- const a = C[s] = I[s << 2];
- a > i && (i = a), a < e && (e = a);
- }
- const A = 255 / (i - e);
- for (let s = 0; s < g; s++)
- C[s] = (C[s] - e) * A;
- return C;
- }, $S = function(I) {
- let g, C = -1 / 0, i = -1 / 0;
- const e = I.findIndex((l) => l !== 0);
- let A = e, s = e;
- for (g = e; g < 256; g++) {
- const l = I[g];
- l > C && (g - A > i && (i = g - A, s = g - 1), C = l, A = g);
- }
- for (g = s - 1; g >= 0 && !(I[g] > I[g + 1]); g--)
- ;
- return g;
- }, RIg = function(I) {
- const g = I, {
- width: C,
- height: i
- } = I, {
- maxDim: e
- } = M(this, td);
- let A = C, s = i;
- if (C > e || i > e) {
- let o = C, c = i, r = Math.log2(Math.max(C, i) / e);
- const h = Math.floor(r);
- r = r === h ? h - 1 : h;
- for (let u = 0; u < r; u++) {
- A = o, s = c, A > e && (A = Math.ceil(A / 2)), s > e && (s = Math.ceil(s / 2));
- const m = new OffscreenCanvas(A, s);
- m.getContext("2d").drawImage(I, 0, 0, o, c, 0, 0, A, s), o = A, c = s, I !== g && I.close(), I = m.transferToImageBitmap();
- }
- const b = Math.min(e / A, e / s);
- A = Math.round(A * b), s = Math.round(s * b);
- }
- const n = new OffscreenCanvas(A, s).getContext("2d", {
- willReadFrequently: !0
- });
- n.filter = "grayscale(1)", n.drawImage(I, 0, 0, I.width, I.height, 0, 0, A, s);
- const a = n.getImageData(0, 0, A, s).data;
- return [ig(this, rC, qS).call(this, a), A, s];
- }, tg(Ol, rC), tg(Ol, td, {
- maxDim: 512,
- sigmaSFactor: 0.02,
- sigmaR: 25,
- kernelSize: 16
- }), tg(Ol, fA, new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]));
- class B9 extends ZIg {
- constructor() {
- super(), super.updateProperties({
- fill: "CanvasText",
- "stroke-width": 0
- });
- }
- clone() {
- const I = new B9();
- return I.updateAll(this), I;
- }
- }
- class W9 extends IM {
- constructor(I) {
- super(I), super.updateProperties({
- stroke: "CanvasText",
- "stroke-width": 1
- });
- }
- clone() {
- const I = new W9(this._viewParameters);
- return I.updateAll(this), I;
- }
- }
- var ka, Be, za, Ja;
- const ne = class ne extends nV {
- constructor(g) {
- super({
- ...g,
- mustBeCommitted: !0,
- name: "signatureEditor"
- });
- tg(this, ka, !1);
- tg(this, Be, null);
- tg(this, za, null);
- tg(this, Ja, null);
- this._willKeepAspectRatio = !0, $(this, za, g.signatureData || null), $(this, Be, null), this.defaultL10nId = "pdfjs-editor-signature-editor1";
- }
- static initialize(g, C) {
- TC.initialize(g, C), this._defaultDrawingOptions = new B9(), this._defaultDrawnSignatureOptions = new W9(C.viewParameters);
- }
- static getDefaultDrawingOptions(g) {
- const C = this._defaultDrawingOptions.clone();
- return C.updateProperties(g), C;
- }
- static get supportMultipleDrawings() {
- return !1;
- }
- static get typesMap() {
- return UI(this, "typesMap", /* @__PURE__ */ new Map());
- }
- static get isDrawer() {
- return !1;
- }
- get telemetryFinalData() {
- return {
- type: "signature",
- hasDescription: !!M(this, Be)
- };
- }
- static computeTelemetryFinalData(g) {
- const C = g.get("hasDescription");
- return {
- hasAltText: C.get(!0) ?? 0,
- hasNoAltText: C.get(!1) ?? 0
- };
- }
- get isResizable() {
- return !0;
- }
- onScaleChanging() {
- this._drawId !== null && super.onScaleChanging();
- }
- render() {
- if (this.div)
- return this.div;
- let g, C;
- const {
- _isCopy: i
- } = this;
- if (i && (this._isCopy = !1, g = this.x, C = this.y), super.render(), this._drawId === null)
- if (M(this, za)) {
- const {
- lines: e,
- mustSmooth: A,
- areContours: s,
- description: l,
- uuid: n,
- heightInPage: a
- } = M(this, za), {
- rawDims: {
- pageWidth: d,
- pageHeight: o
- },
- rotation: c
- } = this.parent.viewport, r = Ol.processDrawnLines({
- lines: e,
- pageWidth: d,
- pageHeight: o,
- rotation: c,
- innerMargin: ne._INNER_MARGIN,
- mustSmooth: A,
- areContours: s
- });
- this.addSignature(r, a, l, n);
- } else
- this.div.setAttribute("data-l10n-args", JSON.stringify({
- description: ""
- })), this.div.hidden = !0, this._uiManager.getSignature(this);
- return i && (this._isCopy = !0, this._moveAfterPaste(g, C)), this.div;
- }
- setUuid(g) {
- $(this, Ja, g), this.addEditToolbar();
- }
- getUuid() {
- return M(this, Ja);
- }
- get description() {
- return M(this, Be);
- }
- set description(g) {
- $(this, Be, g), super.addEditToolbar().then((C) => {
- C == null || C.updateEditSignatureButton(g);
- });
- }
- getSignaturePreview() {
- const {
- newCurves: g,
- areContours: C,
- thickness: i,
- width: e,
- height: A
- } = M(this, za), s = Math.max(e, A), l = Ol.processDrawnLines({
- lines: {
- curves: g.map((n) => ({
- points: n
- })),
- thickness: i,
- width: e,
- height: A
- },
- pageWidth: s,
- pageHeight: s,
- rotation: 0,
- innerMargin: 0,
- mustSmooth: !1,
- areContours: C
- });
- return {
- areContours: C,
- outline: l.outline
- };
- }
- async addEditToolbar() {
- const g = await super.addEditToolbar();
- return g ? (this._uiManager.signatureManager && M(this, Be) !== null && (await g.addEditSignatureButton(this._uiManager.signatureManager, M(this, Ja), M(this, Be)), g.show()), g) : null;
- }
- addSignature(g, C, i, e) {
- const {
- x: A,
- y: s
- } = this, {
- outline: l
- } = $(this, za, g);
- $(this, ka, l instanceof ES), $(this, Be, i), this.div.setAttribute("data-l10n-args", JSON.stringify({
- description: i
- }));
- let n;
- M(this, ka) ? n = ne.getDefaultDrawingOptions() : (n = ne._defaultDrawnSignatureOptions.clone(), n.updateProperties({
- "stroke-width": l.thickness
- })), this._addOutlines({
- drawOutlines: l,
- drawingOptions: n
- });
- const [a, d] = this.parentDimensions, [, o] = this.pageDimensions;
- let c = C / o;
- c = c >= 1 ? 0.5 : c, this.width *= c / this.height, this.width >= 1 && (c *= 0.9 / this.width, this.width = 0.9), this.height = c, this.setDims(a * this.width, d * this.height), this.x = A, this.y = s, this.center(), this._onResized(), this.onScaleChanging(), this.rotate(), this._uiManager.addToAnnotationStorage(this), this.setUuid(e), this._reportTelemetry({
- action: "pdfjs.signature.inserted",
- data: {
- hasBeenSaved: !!e,
- hasDescription: !!i
- }
- }), this.div.hidden = !1;
- }
- getFromImage(g) {
- const {
- rawDims: {
- pageWidth: C,
- pageHeight: i
- },
- rotation: e
- } = this.parent.viewport;
- return Ol.process(g, C, i, e, ne._INNER_MARGIN);
- }
- getFromText(g, C) {
- const {
- rawDims: {
- pageWidth: i,
- pageHeight: e
- },
- rotation: A
- } = this.parent.viewport;
- return Ol.extractContoursFromText(g, C, i, e, A, ne._INNER_MARGIN);
- }
- getDrawnSignature(g) {
- const {
- rawDims: {
- pageWidth: C,
- pageHeight: i
- },
- rotation: e
- } = this.parent.viewport;
- return Ol.processDrawnLines({
- lines: g,
- pageWidth: C,
- pageHeight: i,
- rotation: e,
- innerMargin: ne._INNER_MARGIN,
- mustSmooth: !1,
- areContours: !1
- });
- }
- createDrawingOptions({
- areContours: g,
- thickness: C
- }) {
- g ? this._drawingOptions = ne.getDefaultDrawingOptions() : (this._drawingOptions = ne._defaultDrawnSignatureOptions.clone(), this._drawingOptions.updateProperties({
- "stroke-width": C
- }));
- }
- serialize(g = !1) {
- if (this.isEmpty())
- return null;
- const {
- lines: C,
- points: i,
- rect: e
- } = this.serializeDraw(g), {
- _drawingOptions: {
- "stroke-width": A
- }
- } = this, s = {
- annotationType: XI.SIGNATURE,
- isSignature: !0,
- areContours: M(this, ka),
- color: [0, 0, 0],
- thickness: M(this, ka) ? 0 : A,
- pageIndex: this.pageIndex,
- rect: e,
- rotation: this.rotation,
- structTreeParentId: this._structTreeParentId
- };
- return g ? (s.paths = {
- lines: C,
- points: i
- }, s.uuid = M(this, Ja), s.isCopy = !0) : s.lines = C, M(this, Be) && (s.accessibilityData = {
- type: "Figure",
- alt: M(this, Be)
- }), s;
- }
- static deserializeDraw(g, C, i, e, A, s) {
- return s.areContours ? ES.deserialize(g, C, i, e, A, s) : oG.deserialize(g, C, i, e, A, s);
- }
- static async deserialize(g, C, i) {
- var A;
- const e = await super.deserialize(g, C, i);
- return $(e, ka, g.areContours), $(e, Be, ((A = g.accessibilityData) == null ? void 0 : A.alt) || ""), $(e, Ja, g.uuid), e;
- }
- };
- ka = new WeakMap(), Be = new WeakMap(), za = new WeakMap(), Ja = new WeakMap(), iI(ne, "_type", "signature"), iI(ne, "_editorType", XI.SIGNATURE), iI(ne, "_defaultDrawingOptions", null);
- let gD = ne;
- var kC, Jt, La, Ll, va, G0, vl, id, Rs, We, w0, lC, tm, im, KN, FN, kN, CD, zN, fIg;
- class ID extends TC {
- constructor(g) {
- super({
- ...g,
- name: "stampEditor"
- });
- tg(this, lC);
- tg(this, kC, null);
- tg(this, Jt, null);
- tg(this, La, null);
- tg(this, Ll, null);
- tg(this, va, null);
- tg(this, G0, "");
- tg(this, vl, null);
- tg(this, id, !1);
- tg(this, Rs, null);
- tg(this, We, !1);
- tg(this, w0, !1);
- $(this, Ll, g.bitmapUrl), $(this, va, g.bitmapFile), this.defaultL10nId = "pdfjs-editor-stamp-editor";
- }
- static initialize(g, C) {
- TC.initialize(g, C);
- }
- static isHandlingMimeForPasting(g) {
- return UX.includes(g);
- }
- static paste(g, C) {
- C.pasteEditor(XI.STAMP, {
- bitmapFile: g.getAsFile()
- });
- }
- altTextFinish() {
- this._uiManager.useNewAltTextFlow && (this.div.hidden = !1), super.altTextFinish();
- }
- get telemetryFinalData() {
- var g;
- return {
- type: "stamp",
- hasAltText: !!((g = this.altTextData) != null && g.altText)
- };
- }
- static computeTelemetryFinalData(g) {
- const C = g.get("hasAltText");
- return {
- hasAltText: C.get(!0) ?? 0,
- hasNoAltText: C.get(!1) ?? 0
- };
- }
- async mlGuessAltText(g = null, C = !0) {
- if (this.hasAltTextData())
- return null;
- const {
- mlManager: i
- } = this._uiManager;
- if (!i)
- throw new Error("No ML.");
- if (!await i.isEnabledFor("altText"))
- throw new Error("ML isn't enabled for alt text.");
- const {
- data: e,
- width: A,
- height: s
- } = g || this.copyCanvas(null, null, !0).imageData, l = await i.guess({
- name: "altText",
- request: {
- data: e,
- width: A,
- height: s,
- channels: e.length / (A * s)
- }
- });
- if (!l)
- throw new Error("No response from the AI service.");
- if (l.error)
- throw new Error("Error from the AI service.");
- if (l.cancel)
- return null;
- if (!l.output)
- throw new Error("No valid response from the AI service.");
- const n = l.output;
- return await this.setGuessedAltText(n), C && !this.hasAltTextData() && (this.altTextData = {
- alt: n,
- decorative: !1
- }), n;
- }
- remove() {
- var g;
- M(this, Jt) && ($(this, kC, null), this._uiManager.imageManager.deleteId(M(this, Jt)), (g = M(this, vl)) == null || g.remove(), $(this, vl, null), M(this, Rs) && (clearTimeout(M(this, Rs)), $(this, Rs, null))), super.remove();
- }
- rebuild() {
- if (!this.parent) {
- M(this, Jt) && ig(this, lC, KN).call(this);
- return;
- }
- super.rebuild(), this.div !== null && (M(this, Jt) && M(this, vl) === null && ig(this, lC, KN).call(this), this.isAttachedToDOM || this.parent.add(this));
- }
- onceAdded(g) {
- this._isDraggable = !0, g && this.div.focus();
- }
- isEmpty() {
- return !(M(this, La) || M(this, kC) || M(this, Ll) || M(this, va) || M(this, Jt) || M(this, id));
- }
- get isResizable() {
- return !0;
- }
- render() {
- if (this.div)
- return this.div;
- let g, C;
- return this._isCopy && (g = this.x, C = this.y), super.render(), this.div.hidden = !0, this.addAltTextButton(), M(this, id) || (M(this, kC) ? ig(this, lC, FN).call(this) : ig(this, lC, KN).call(this)), this._isCopy && this._moveAfterPaste(g, C), this._uiManager.addShouldRescale(this), this.div;
- }
- setCanvas(g, C) {
- const {
- id: i,
- bitmap: e
- } = this._uiManager.imageManager.getFromCanvas(g, C);
- C.remove(), i && this._uiManager.imageManager.isValidId(i) && ($(this, Jt, i), e && $(this, kC, e), $(this, id, !1), ig(this, lC, FN).call(this));
- }
- _onResized() {
- this.onScaleChanging();
- }
- onScaleChanging() {
- if (!this.parent)
- return;
- M(this, Rs) !== null && clearTimeout(M(this, Rs)), $(this, Rs, setTimeout(() => {
- $(this, Rs, null), ig(this, lC, CD).call(this);
- }, 200));
- }
- copyCanvas(g, C, i = !1) {
- var c;
- g || (g = 224);
- const {
- width: e,
- height: A
- } = M(this, kC), s = new In();
- let l = M(this, kC), n = e, a = A, d = null;
- if (C) {
- if (e > C || A > C) {
- const H = Math.min(C / e, C / A);
- n = Math.floor(e * H), a = Math.floor(A * H);
- }
- d = document.createElement("canvas");
- const r = d.width = Math.ceil(n * s.sx), h = d.height = Math.ceil(a * s.sy);
- M(this, We) || (l = ig(this, lC, kN).call(this, r, h));
- const b = d.getContext("2d");
- b.filter = this._uiManager.hcmFilter;
- let u = "white", m = "#cfcfd8";
- this._uiManager.hcmFilter !== "none" ? m = "black" : (c = window.matchMedia) != null && c.call(window, "(prefers-color-scheme: dark)").matches && (u = "#8f8f9d", m = "#42414d");
- const Z = 15, p = Z * s.sx, Y = Z * s.sy, R = new OffscreenCanvas(p * 2, Y * 2), X = R.getContext("2d");
- X.fillStyle = u, X.fillRect(0, 0, p * 2, Y * 2), X.fillStyle = m, X.fillRect(0, 0, p, Y), X.fillRect(p, Y, p, Y), b.fillStyle = b.createPattern(R, "repeat"), b.fillRect(0, 0, r, h), b.drawImage(l, 0, 0, l.width, l.height, 0, 0, r, h);
- }
- let o = null;
- if (i) {
- let r, h;
- if (s.symmetric && l.width < g && l.height < g)
- r = l.width, h = l.height;
- else if (l = M(this, kC), e > g || A > g) {
- const m = Math.min(g / e, g / A);
- r = Math.floor(e * m), h = Math.floor(A * m), M(this, We) || (l = ig(this, lC, kN).call(this, r, h));
- }
- const u = new OffscreenCanvas(r, h).getContext("2d", {
- willReadFrequently: !0
- });
- u.drawImage(l, 0, 0, l.width, l.height, 0, 0, r, h), o = {
- width: r,
- height: h,
- data: u.getImageData(0, 0, r, h).data
- };
- }
- return {
- canvas: d,
- width: n,
- height: a,
- imageData: o
- };
- }
- static async deserialize(g, C, i) {
- var b;
- let e = null, A = !1;
- if (g instanceof Qgg) {
- const {
- data: {
- rect: u,
- rotation: m,
- id: Z,
- structParent: p,
- popupRef: Y
- },
- container: R,
- parent: {
- page: {
- pageNumber: X
- }
- },
- canvas: H
- } = g;
- let S, z;
- H ? (delete g.canvas, {
- id: S,
- bitmap: z
- } = i.imageManager.getFromCanvas(R.id, H), H.remove()) : (A = !0, g._hasNoCanvas = !0);
- const v = ((b = await C._structTree.getAriaAttributes(`${d9}${Z}`)) == null ? void 0 : b.get("aria-label")) || "";
- e = g = {
- annotationType: XI.STAMP,
- bitmapId: S,
- bitmap: z,
- pageIndex: X - 1,
- rect: u.slice(0),
- rotation: m,
- id: Z,
- deleted: !1,
- accessibilityData: {
- decorative: !1,
- altText: v
- },
- isSvg: !1,
- structParent: p,
- popupRef: Y
- };
- }
- const s = await super.deserialize(g, C, i), {
- rect: l,
- bitmap: n,
- bitmapUrl: a,
- bitmapId: d,
- isSvg: o,
- accessibilityData: c
- } = g;
- A ? (i.addMissingCanvas(g.id, s), $(s, id, !0)) : d && i.imageManager.isValidId(d) ? ($(s, Jt, d), n && $(s, kC, n)) : $(s, Ll, a), $(s, We, o);
- const [r, h] = s.pageDimensions;
- return s.width = (l[2] - l[0]) / r, s.height = (l[3] - l[1]) / h, s.annotationElementId = g.id || null, c && (s.altTextData = c), s._initialData = e, $(s, w0, !!e), s;
- }
- serialize(g = !1, C = null) {
- if (this.isEmpty())
- return null;
- if (this.deleted)
- return this.serializeDeleted();
- const i = {
- annotationType: XI.STAMP,
- bitmapId: M(this, Jt),
- pageIndex: this.pageIndex,
- rect: this.getRect(0, 0),
- rotation: this.rotation,
- isSvg: M(this, We),
- structTreeParentId: this._structTreeParentId
- };
- if (g)
- return i.bitmapUrl = ig(this, lC, zN).call(this, !0), i.accessibilityData = this.serializeAltText(!0), i.isCopy = !0, i;
- const {
- decorative: e,
- altText: A
- } = this.serializeAltText(!1);
- if (!e && A && (i.accessibilityData = {
- type: "Figure",
- alt: A
- }), this.annotationElementId) {
- const l = ig(this, lC, fIg).call(this, i);
- if (l.isSame)
- return null;
- l.isSameAltText ? delete i.accessibilityData : i.accessibilityData.structParent = this._initialData.structParent ?? -1;
- }
- if (i.id = this.annotationElementId, C === null)
- return i;
- C.stamps || (C.stamps = /* @__PURE__ */ new Map());
- const s = M(this, We) ? (i.rect[2] - i.rect[0]) * (i.rect[3] - i.rect[1]) : null;
- if (!C.stamps.has(M(this, Jt)))
- C.stamps.set(M(this, Jt), {
- area: s,
- serialized: i
- }), i.bitmap = ig(this, lC, zN).call(this, !1);
- else if (M(this, We)) {
- const l = C.stamps.get(M(this, Jt));
- s > l.area && (l.area = s, l.serialized.bitmap.close(), l.serialized.bitmap = ig(this, lC, zN).call(this, !1));
- }
- return i;
- }
- renderAnnotationElement(g) {
- return g.updateEdited({
- rect: this.getRect(0, 0)
- }), null;
- }
- }
- kC = new WeakMap(), Jt = new WeakMap(), La = new WeakMap(), Ll = new WeakMap(), va = new WeakMap(), G0 = new WeakMap(), vl = new WeakMap(), id = new WeakMap(), Rs = new WeakMap(), We = new WeakMap(), w0 = new WeakMap(), lC = new WeakSet(), tm = function(g, C = !1) {
- if (!g) {
- this.remove();
- return;
- }
- $(this, kC, g.bitmap), C || ($(this, Jt, g.id), $(this, We, g.isSvg)), g.file && $(this, G0, g.file.name), ig(this, lC, FN).call(this);
- }, im = function() {
- if ($(this, La, null), this._uiManager.enableWaiting(!1), !!M(this, vl)) {
- if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && M(this, kC)) {
- this._editToolbar.hide(), this._uiManager.editAltText(this, !0);
- return;
- }
- if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && M(this, kC)) {
- this._reportTelemetry({
- action: "pdfjs.image.image_added",
- data: {
- alt_text_modal: !1,
- alt_text_type: "empty"
- }
- });
- try {
- this.mlGuessAltText();
- } catch {
- }
- }
- this.div.focus();
- }
- }, KN = function() {
- if (M(this, Jt)) {
- this._uiManager.enableWaiting(!0), this._uiManager.imageManager.getFromId(M(this, Jt)).then((i) => ig(this, lC, tm).call(this, i, !0)).finally(() => ig(this, lC, im).call(this));
- return;
- }
- if (M(this, Ll)) {
- const i = M(this, Ll);
- $(this, Ll, null), this._uiManager.enableWaiting(!0), $(this, La, this._uiManager.imageManager.getFromUrl(i).then((e) => ig(this, lC, tm).call(this, e)).finally(() => ig(this, lC, im).call(this)));
- return;
- }
- if (M(this, va)) {
- const i = M(this, va);
- $(this, va, null), this._uiManager.enableWaiting(!0), $(this, La, this._uiManager.imageManager.getFromFile(i).then((e) => ig(this, lC, tm).call(this, e)).finally(() => ig(this, lC, im).call(this)));
- return;
- }
- const g = document.createElement("input");
- g.type = "file", g.accept = UX.join(",");
- const C = this._uiManager._signal;
- $(this, La, new Promise((i) => {
- g.addEventListener("change", async () => {
- if (!g.files || g.files.length === 0)
- this.remove();
- else {
- this._uiManager.enableWaiting(!0);
- const e = await this._uiManager.imageManager.getFromFile(g.files[0]);
- this._reportTelemetry({
- action: "pdfjs.image.image_selected",
- data: {
- alt_text_modal: this._uiManager.useNewAltTextFlow
- }
- }), ig(this, lC, tm).call(this, e);
- }
- i();
- }, {
- signal: C
- }), g.addEventListener("cancel", () => {
- this.remove(), i();
- }, {
- signal: C
- });
- }).finally(() => ig(this, lC, im).call(this))), g.click();
- }, FN = function() {
- var d;
- const {
- div: g
- } = this;
- let {
- width: C,
- height: i
- } = M(this, kC);
- const [e, A] = this.pageDimensions, s = 0.75;
- if (this.width)
- C = this.width * e, i = this.height * A;
- else if (C > s * e || i > s * A) {
- const o = Math.min(s * e / C, s * A / i);
- C *= o, i *= o;
- }
- const [l, n] = this.parentDimensions;
- this.setDims(C * l / e, i * n / A), this._uiManager.enableWaiting(!1);
- const a = $(this, vl, document.createElement("canvas"));
- a.setAttribute("role", "img"), this.addContainer(a), this.width = C / e, this.height = i / A, (d = this._initialOptions) != null && d.isCentered ? this.center() : this.fixAndSetPosition(), this._initialOptions = null, (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) && (g.hidden = !1), ig(this, lC, CD).call(this), M(this, w0) || (this.parent.addUndoableEditor(this), $(this, w0, !0)), this._reportTelemetry({
- action: "inserted_image"
- }), M(this, G0) && this.div.setAttribute("aria-description", M(this, G0));
- }, kN = function(g, C) {
- const {
- width: i,
- height: e
- } = M(this, kC);
- let A = i, s = e, l = M(this, kC);
- for (; A > 2 * g || s > 2 * C; ) {
- const n = A, a = s;
- A > 2 * g && (A = A >= 16384 ? Math.floor(A / 2) - 1 : Math.ceil(A / 2)), s > 2 * C && (s = s >= 16384 ? Math.floor(s / 2) - 1 : Math.ceil(s / 2));
- const d = new OffscreenCanvas(A, s);
- d.getContext("2d").drawImage(l, 0, 0, n, a, 0, 0, A, s), l = d.transferToImageBitmap();
- }
- return l;
- }, CD = function() {
- const [g, C] = this.parentDimensions, {
- width: i,
- height: e
- } = this, A = new In(), s = Math.ceil(i * g * A.sx), l = Math.ceil(e * C * A.sy), n = M(this, vl);
- if (!n || n.width === s && n.height === l)
- return;
- n.width = s, n.height = l;
- const a = M(this, We) ? M(this, kC) : ig(this, lC, kN).call(this, s, l), d = n.getContext("2d");
- d.filter = this._uiManager.hcmFilter, d.drawImage(a, 0, 0, a.width, a.height, 0, 0, s, l);
- }, zN = function(g) {
- if (g) {
- if (M(this, We)) {
- const e = this._uiManager.imageManager.getSvgUrl(M(this, Jt));
- if (e)
- return e;
- }
- const C = document.createElement("canvas");
- return {
- width: C.width,
- height: C.height
- } = M(this, kC), C.getContext("2d").drawImage(M(this, kC), 0, 0), C.toDataURL();
- }
- if (M(this, We)) {
- const [C, i] = this.pageDimensions, e = Math.round(this.width * C * Pa.PDF_TO_CSS_UNITS), A = Math.round(this.height * i * Pa.PDF_TO_CSS_UNITS), s = new OffscreenCanvas(e, A);
- return s.getContext("2d").drawImage(M(this, kC), 0, 0, M(this, kC).width, M(this, kC).height, 0, 0, e, A), s.transferToImageBitmap();
- }
- return structuredClone(M(this, kC));
- }, fIg = function(g) {
- var s;
- const {
- pageIndex: C,
- accessibilityData: {
- altText: i
- }
- } = this._initialData, e = g.pageIndex === C, A = (((s = g.accessibilityData) == null ? void 0 : s.alt) || "") === i;
- return {
- isSame: !this._hasBeenMoved && !this._hasBeenResized && e && A,
- isSameAltText: A
- };
- }, iI(ID, "_type", "stamp"), iI(ID, "_editorType", XI.STAMP);
- var ed, p0, fs, Ta, Tl, qe, xa, B0, Ad, HA, xl, Gi, jl, sI, ja, vC, HIg, ds, iD, eD, JN;
- const wA = class wA {
- constructor({
- uiManager: I,
- pageIndex: g,
- div: C,
- structTreeLayer: i,
- accessibilityManager: e,
- annotationLayer: A,
- drawLayer: s,
- textLayer: l,
- viewport: n,
- l10n: a
- }) {
- tg(this, vC);
- tg(this, ed);
- tg(this, p0, !1);
- tg(this, fs, null);
- tg(this, Ta, null);
- tg(this, Tl, null);
- tg(this, qe, /* @__PURE__ */ new Map());
- tg(this, xa, !1);
- tg(this, B0, !1);
- tg(this, Ad, !1);
- tg(this, HA, null);
- tg(this, xl, null);
- tg(this, Gi, null);
- tg(this, jl, null);
- tg(this, sI);
- const d = [...M(wA, ja).values()];
- if (!wA._initialized) {
- wA._initialized = !0;
- for (const o of d)
- o.initialize(a, I);
- }
- I.registerEditorTypes(d), $(this, sI, I), this.pageIndex = g, this.div = C, $(this, ed, e), $(this, fs, A), this.viewport = n, $(this, Gi, l), this.drawLayer = s, this._structTree = i, M(this, sI).addLayer(this);
- }
- get isEmpty() {
- return M(this, qe).size === 0;
- }
- get isInvisible() {
- return this.isEmpty && M(this, sI).getMode() === XI.NONE;
- }
- updateToolbar(I) {
- M(this, sI).updateToolbar(I);
- }
- updateMode(I = M(this, sI).getMode()) {
- switch (ig(this, vC, JN).call(this), I) {
- case XI.NONE:
- this.disableTextSelection(), this.togglePointerEvents(!1), this.toggleAnnotationLayerPointerEvents(!0), this.disableClick();
- return;
- case XI.INK:
- this.disableTextSelection(), this.togglePointerEvents(!0), this.enableClick();
- break;
- case XI.HIGHLIGHT:
- this.enableTextSelection(), this.togglePointerEvents(!1), this.disableClick();
- break;
- default:
- this.disableTextSelection(), this.togglePointerEvents(!0), this.enableClick();
- }
- this.toggleAnnotationLayerPointerEvents(!1);
- const {
- classList: g
- } = this.div;
- for (const C of M(wA, ja).values())
- g.toggle(`${C._type}Editing`, I === C._editorType);
- this.div.hidden = !1;
- }
- hasTextLayer(I) {
- var g;
- return I === ((g = M(this, Gi)) == null ? void 0 : g.div);
- }
- setEditingState(I) {
- M(this, sI).setEditingState(I);
- }
- addCommands(I) {
- M(this, sI).addCommands(I);
- }
- cleanUndoStack(I) {
- M(this, sI).cleanUndoStack(I);
- }
- toggleDrawing(I = !1) {
- this.div.classList.toggle("drawing", !I);
- }
- togglePointerEvents(I = !1) {
- this.div.classList.toggle("disabled", !I);
- }
- toggleAnnotationLayerPointerEvents(I = !1) {
- var g;
- (g = M(this, fs)) == null || g.div.classList.toggle("disabled", !I);
- }
- async enable() {
- $(this, Ad, !0), this.div.tabIndex = 0, this.togglePointerEvents(!0);
- const I = /* @__PURE__ */ new Set();
- for (const C of M(this, qe).values())
- C.enableEditing(), C.show(!0), C.annotationElementId && (M(this, sI).removeChangedExistingAnnotation(C), I.add(C.annotationElementId));
- if (!M(this, fs)) {
- $(this, Ad, !1);
- return;
- }
- const g = M(this, fs).getEditableAnnotations();
- for (const C of g) {
- if (C.hide(), M(this, sI).isDeletedAnnotationElement(C.data.id) || I.has(C.data.id))
- continue;
- const i = await this.deserialize(C);
- i && (this.addOrRebuild(i), i.enableEditing());
- }
- $(this, Ad, !1);
- }
- disable() {
- var i;
- $(this, B0, !0), this.div.tabIndex = -1, this.togglePointerEvents(!1);
- const I = /* @__PURE__ */ new Map(), g = /* @__PURE__ */ new Map();
- for (const e of M(this, qe).values())
- if (e.disableEditing(), !!e.annotationElementId) {
- if (e.serialize() !== null) {
- I.set(e.annotationElementId, e);
- continue;
- } else
- g.set(e.annotationElementId, e);
- (i = this.getEditableAnnotation(e.annotationElementId)) == null || i.show(), e.remove();
- }
- if (M(this, fs)) {
- const e = M(this, fs).getEditableAnnotations();
- for (const A of e) {
- const {
- id: s
- } = A.data;
- if (M(this, sI).isDeletedAnnotationElement(s))
- continue;
- let l = g.get(s);
- if (l) {
- l.resetAnnotationElement(A), l.show(!1), A.show();
- continue;
- }
- l = I.get(s), l && (M(this, sI).addChangedExistingAnnotation(l), l.renderAnnotationElement(A) && l.show(!1)), A.show();
- }
- }
- ig(this, vC, JN).call(this), this.isEmpty && (this.div.hidden = !0);
- const {
- classList: C
- } = this.div;
- for (const e of M(wA, ja).values())
- C.remove(`${e._type}Editing`);
- this.disableTextSelection(), this.toggleAnnotationLayerPointerEvents(!0), $(this, B0, !1);
- }
- getEditableAnnotation(I) {
- var g;
- return ((g = M(this, fs)) == null ? void 0 : g.getEditableAnnotation(I)) || null;
- }
- setActiveEditor(I) {
- M(this, sI).getActive() !== I && M(this, sI).setActiveEditor(I);
- }
- enableTextSelection() {
- var I;
- if (this.div.tabIndex = -1, (I = M(this, Gi)) != null && I.div && !M(this, jl)) {
- $(this, jl, new AbortController());
- const g = M(this, sI).combinedSignal(M(this, jl));
- M(this, Gi).div.addEventListener("pointerdown", ig(this, vC, HIg).bind(this), {
- signal: g
- }), M(this, Gi).div.classList.add("highlighting");
- }
- }
- disableTextSelection() {
- var I;
- this.div.tabIndex = 0, (I = M(this, Gi)) != null && I.div && M(this, jl) && (M(this, jl).abort(), $(this, jl, null), M(this, Gi).div.classList.remove("highlighting"));
- }
- enableClick() {
- if (M(this, Ta))
- return;
- $(this, Ta, new AbortController());
- const I = M(this, sI).combinedSignal(M(this, Ta));
- this.div.addEventListener("pointerdown", this.pointerdown.bind(this), {
- signal: I
- });
- const g = this.pointerup.bind(this);
- this.div.addEventListener("pointerup", g, {
- signal: I
- }), this.div.addEventListener("pointercancel", g, {
- signal: I
- });
- }
- disableClick() {
- var I;
- (I = M(this, Ta)) == null || I.abort(), $(this, Ta, null);
- }
- attach(I) {
- M(this, qe).set(I.id, I);
- const {
- annotationElementId: g
- } = I;
- g && M(this, sI).isDeletedAnnotationElement(g) && M(this, sI).removeDeletedAnnotationElement(I);
- }
- detach(I) {
- var g;
- M(this, qe).delete(I.id), (g = M(this, ed)) == null || g.removePointerInTextLayer(I.contentDiv), !M(this, B0) && I.annotationElementId && M(this, sI).addDeletedAnnotationElement(I);
- }
- remove(I) {
- this.detach(I), M(this, sI).removeEditor(I), I.div.remove(), I.isAttachedToDOM = !1;
- }
- changeParent(I) {
- var g;
- I.parent !== this && (I.parent && I.annotationElementId && (M(this, sI).addDeletedAnnotationElement(I.annotationElementId), TC.deleteAnnotationElement(I), I.annotationElementId = null), this.attach(I), (g = I.parent) == null || g.detach(I), I.setParent(this), I.div && I.isAttachedToDOM && (I.div.remove(), this.div.append(I.div)));
- }
- add(I) {
- if (!(I.parent === this && I.isAttachedToDOM)) {
- if (this.changeParent(I), M(this, sI).addEditor(I), this.attach(I), !I.isAttachedToDOM) {
- const g = I.render();
- this.div.append(g), I.isAttachedToDOM = !0;
- }
- I.fixAndSetPosition(), I.onceAdded(!M(this, Ad)), M(this, sI).addToAnnotationStorage(I), I._reportTelemetry(I.telemetryInitialData);
- }
- }
- moveEditorInDOM(I) {
- var C;
- if (!I.isAttachedToDOM)
- return;
- const {
- activeElement: g
- } = document;
- I.div.contains(g) && !M(this, Tl) && (I._focusEventsAllowed = !1, $(this, Tl, setTimeout(() => {
- $(this, Tl, null), I.div.contains(document.activeElement) ? I._focusEventsAllowed = !0 : (I.div.addEventListener("focusin", () => {
- I._focusEventsAllowed = !0;
- }, {
- once: !0,
- signal: M(this, sI)._signal
- }), g.focus());
- }, 0))), I._structTreeParentId = (C = M(this, ed)) == null ? void 0 : C.moveElementInDOM(this.div, I.div, I.contentDiv, !0);
- }
- addOrRebuild(I) {
- I.needsToBeRebuilt() ? (I.parent || (I.parent = this), I.rebuild(), I.show()) : this.add(I);
- }
- addUndoableEditor(I) {
- const g = () => I._uiManager.rebuild(I), C = () => {
- I.remove();
- };
- this.addCommands({
- cmd: g,
- undo: C,
- mustExec: !1
- });
- }
- getNextId() {
- return M(this, sI).getId();
- }
- combinedSignal(I) {
- return M(this, sI).combinedSignal(I);
- }
- canCreateNewEmptyEditor() {
- var I;
- return (I = M(this, vC, ds)) == null ? void 0 : I.canCreateNewEmptyEditor();
- }
- async pasteEditor(I, g) {
- M(this, sI).updateToolbar(I), await M(this, sI).updateMode(I);
- const {
- offsetX: C,
- offsetY: i
- } = ig(this, vC, eD).call(this), e = this.getNextId(), A = ig(this, vC, iD).call(this, {
- parent: this,
- id: e,
- x: C,
- y: i,
- uiManager: M(this, sI),
- isCentered: !0,
- ...g
- });
- A && this.add(A);
- }
- async deserialize(I) {
- var g;
- return await ((g = M(wA, ja).get(I.annotationType ?? I.annotationEditorType)) == null ? void 0 : g.deserialize(I, this, M(this, sI))) || null;
- }
- createAndAddNewEditor(I, g, C = {}) {
- const i = this.getNextId(), e = ig(this, vC, iD).call(this, {
- parent: this,
- id: i,
- x: I.offsetX,
- y: I.offsetY,
- uiManager: M(this, sI),
- isCentered: g,
- ...C
- });
- return e && this.add(e), e;
- }
- addNewEditor(I = {}) {
- this.createAndAddNewEditor(ig(this, vC, eD).call(this), !0, I);
- }
- setSelected(I) {
- M(this, sI).setSelected(I);
- }
- toggleSelected(I) {
- M(this, sI).toggleSelected(I);
- }
- unselect(I) {
- M(this, sI).unselect(I);
- }
- pointerup(I) {
- var i;
- const {
- isMac: g
- } = Ai.platform;
- if (I.button !== 0 || I.ctrlKey && g || I.target !== this.div || !M(this, xa) || ($(this, xa, !1), (i = M(this, vC, ds)) != null && i.isDrawer && M(this, vC, ds).supportMultipleDrawings))
- return;
- if (!M(this, p0)) {
- $(this, p0, !0);
- return;
- }
- const C = M(this, sI).getMode();
- if (C === XI.STAMP || C === XI.SIGNATURE) {
- M(this, sI).unselectAll();
- return;
- }
- this.createAndAddNewEditor(I, !1);
- }
- pointerdown(I) {
- var i;
- if (M(this, sI).getMode() === XI.HIGHLIGHT && this.enableTextSelection(), M(this, xa)) {
- $(this, xa, !1);
- return;
- }
- const {
- isMac: g
- } = Ai.platform;
- if (I.button !== 0 || I.ctrlKey && g || I.target !== this.div)
- return;
- if ($(this, xa, !0), (i = M(this, vC, ds)) != null && i.isDrawer) {
- this.startDrawingSession(I);
- return;
- }
- const C = M(this, sI).getActive();
- $(this, p0, !C || C.isEmpty());
- }
- startDrawingSession(I) {
- if (this.div.focus({
- preventScroll: !0
- }), M(this, HA)) {
- M(this, vC, ds).startDrawing(this, M(this, sI), !1, I);
- return;
- }
- M(this, sI).setCurrentDrawingSession(this), $(this, HA, new AbortController());
- const g = M(this, sI).combinedSignal(M(this, HA));
- this.div.addEventListener("blur", ({
- relatedTarget: C
- }) => {
- C && !this.div.contains(C) && ($(this, xl, null), this.commitOrRemove());
- }, {
- signal: g
- }), M(this, vC, ds).startDrawing(this, M(this, sI), !1, I);
- }
- pause(I) {
- if (I) {
- const {
- activeElement: g
- } = document;
- this.div.contains(g) && $(this, xl, g);
- return;
- }
- M(this, xl) && setTimeout(() => {
- var g;
- (g = M(this, xl)) == null || g.focus(), $(this, xl, null);
- }, 0);
- }
- endDrawingSession(I = !1) {
- return M(this, HA) ? (M(this, sI).setCurrentDrawingSession(null), M(this, HA).abort(), $(this, HA, null), $(this, xl, null), M(this, vC, ds).endDrawing(I)) : null;
- }
- findNewParent(I, g, C) {
- const i = M(this, sI).findParent(g, C);
- return i === null || i === this ? !1 : (i.changeParent(I), !0);
- }
- commitOrRemove() {
- return M(this, HA) ? (this.endDrawingSession(), !0) : !1;
- }
- onScaleChanging() {
- M(this, HA) && M(this, vC, ds).onScaleChangingWhenDrawing(this);
- }
- destroy() {
- var I, g;
- this.commitOrRemove(), ((I = M(this, sI).getActive()) == null ? void 0 : I.parent) === this && (M(this, sI).commitOrRemove(), M(this, sI).setActiveEditor(null)), M(this, Tl) && (clearTimeout(M(this, Tl)), $(this, Tl, null));
- for (const C of M(this, qe).values())
- (g = M(this, ed)) == null || g.removePointerInTextLayer(C.contentDiv), C.setParent(null), C.isAttachedToDOM = !1, C.div.remove();
- this.div = null, M(this, qe).clear(), M(this, sI).removeLayer(this);
- }
- render({
- viewport: I
- }) {
- this.viewport = I, cd(this.div, I);
- for (const g of M(this, sI).getEditors(this.pageIndex))
- this.add(g), g.rebuild();
- this.updateMode();
- }
- update({
- viewport: I
- }) {
- M(this, sI).commitOrRemove(), ig(this, vC, JN).call(this);
- const g = this.viewport.rotation, C = I.rotation;
- if (this.viewport = I, cd(this.div, {
- rotation: C
- }), g !== C)
- for (const i of M(this, qe).values())
- i.rotate(C);
- }
- get pageDimensions() {
- const {
- pageWidth: I,
- pageHeight: g
- } = this.viewport.rawDims;
- return [I, g];
- }
- get scale() {
- return M(this, sI).viewParameters.realScale;
- }
- };
- ed = new WeakMap(), p0 = new WeakMap(), fs = new WeakMap(), Ta = new WeakMap(), Tl = new WeakMap(), qe = new WeakMap(), xa = new WeakMap(), B0 = new WeakMap(), Ad = new WeakMap(), HA = new WeakMap(), xl = new WeakMap(), Gi = new WeakMap(), jl = new WeakMap(), sI = new WeakMap(), ja = new WeakMap(), vC = new WeakSet(), HIg = function(I) {
- M(this, sI).unselectAll();
- const {
- target: g
- } = I;
- if (g === M(this, Gi).div || (g.getAttribute("role") === "img" || g.classList.contains("endOfContent")) && M(this, Gi).div.contains(g)) {
- const {
- isMac: C
- } = Ai.platform;
- if (I.button !== 0 || I.ctrlKey && C)
- return;
- M(this, sI).showAllEditors("highlight", !0, !0), M(this, Gi).div.classList.add("free"), this.toggleDrawing(), lV.startHighlighting(this, M(this, sI).direction === "ltr", {
- target: M(this, Gi).div,
- x: I.x,
- y: I.y
- }), M(this, Gi).div.addEventListener("pointerup", () => {
- M(this, Gi).div.classList.remove("free"), this.toggleDrawing(!0);
- }, {
- once: !0,
- signal: M(this, sI)._signal
- }), I.preventDefault();
- }
- }, ds = function() {
- return M(wA, ja).get(M(this, sI).getMode());
- }, iD = function(I) {
- const g = M(this, vC, ds);
- return g ? new g.prototype.constructor(I) : null;
- }, eD = function() {
- const {
- x: I,
- y: g,
- width: C,
- height: i
- } = this.div.getBoundingClientRect(), e = Math.max(0, I), A = Math.max(0, g), s = Math.min(window.innerWidth, I + C), l = Math.min(window.innerHeight, g + i), n = (e + s) / 2 - I, a = (A + l) / 2 - g, [d, o] = this.viewport.rotation % 180 === 0 ? [n, a] : [a, n];
- return {
- offsetX: d,
- offsetY: o
- };
- }, JN = function() {
- for (const I of M(this, qe).values())
- I.isEmpty() && I.remove();
- }, iI(wA, "_initialized", !1), tg(wA, ja, new Map([DS, US, ID, lV, gD].map((I) => [I._editorType, I])));
- let tD = wA;
- var XA, Ri, sd, CG, EV, XIg, zs, sD, SIg, lD;
- const pt = class pt {
- constructor({
- pageIndex: I
- }) {
- tg(this, zs);
- tg(this, XA, null);
- tg(this, Ri, /* @__PURE__ */ new Map());
- tg(this, sd, /* @__PURE__ */ new Map());
- this.pageIndex = I;
- }
- setParent(I) {
- if (!M(this, XA)) {
- $(this, XA, I);
- return;
- }
- if (M(this, XA) !== I) {
- if (M(this, Ri).size > 0)
- for (const g of M(this, Ri).values())
- g.remove(), I.append(g);
- $(this, XA, I);
- }
- }
- static get _svgFactory() {
- return UI(this, "_svgFactory", new eV());
- }
- draw(I, g = !1, C = !1) {
- const i = Wi(pt, CG)._++, e = ig(this, zs, sD).call(this), A = pt._svgFactory.createElement("defs");
- e.append(A);
- const s = pt._svgFactory.createElement("path");
- A.append(s);
- const l = `path_p${this.pageIndex}_${i}`;
- s.setAttribute("id", l), s.setAttribute("vector-effect", "non-scaling-stroke"), g && M(this, sd).set(i, s);
- const n = C ? ig(this, zs, SIg).call(this, A, l) : null, a = pt._svgFactory.createElement("use");
- return e.append(a), a.setAttribute("href", `#${l}`), this.updateProperties(e, I), M(this, Ri).set(i, e), {
- id: i,
- clipPathId: `url(#${n})`
- };
- }
- drawOutline(I, g) {
- const C = Wi(pt, CG)._++, i = ig(this, zs, sD).call(this), e = pt._svgFactory.createElement("defs");
- i.append(e);
- const A = pt._svgFactory.createElement("path");
- e.append(A);
- const s = `path_p${this.pageIndex}_${C}`;
- A.setAttribute("id", s), A.setAttribute("vector-effect", "non-scaling-stroke");
- let l;
- if (g) {
- const d = pt._svgFactory.createElement("mask");
- e.append(d), l = `mask_p${this.pageIndex}_${C}`, d.setAttribute("id", l), d.setAttribute("maskUnits", "objectBoundingBox");
- const o = pt._svgFactory.createElement("rect");
- d.append(o), o.setAttribute("width", "1"), o.setAttribute("height", "1"), o.setAttribute("fill", "white");
- const c = pt._svgFactory.createElement("use");
- d.append(c), c.setAttribute("href", `#${s}`), c.setAttribute("stroke", "none"), c.setAttribute("fill", "black"), c.setAttribute("fill-rule", "nonzero"), c.classList.add("mask");
- }
- const n = pt._svgFactory.createElement("use");
- i.append(n), n.setAttribute("href", `#${s}`), l && n.setAttribute("mask", `url(#${l})`);
- const a = n.cloneNode();
- return i.append(a), n.classList.add("mainOutline"), a.classList.add("secondaryOutline"), this.updateProperties(i, I), M(this, Ri).set(C, i), C;
- }
- finalizeDraw(I, g) {
- M(this, sd).delete(I), this.updateProperties(I, g);
- }
- updateProperties(I, g) {
- var l;
- if (!g)
- return;
- const {
- root: C,
- bbox: i,
- rootClass: e,
- path: A
- } = g, s = typeof I == "number" ? M(this, Ri).get(I) : I;
- if (s) {
- if (C && ig(this, zs, lD).call(this, s, C), i && ig(l = pt, EV, XIg).call(l, s, i), e) {
- const {
- classList: n
- } = s;
- for (const [a, d] of Object.entries(e))
- n.toggle(a, d);
- }
- if (A) {
- const a = s.firstChild.firstChild;
- ig(this, zs, lD).call(this, a, A);
- }
- }
- }
- updateParent(I, g) {
- if (g === this)
- return;
- const C = M(this, Ri).get(I);
- C && (M(g, XA).append(C), M(this, Ri).delete(I), M(g, Ri).set(I, C));
- }
- remove(I) {
- M(this, sd).delete(I), M(this, XA) !== null && (M(this, Ri).get(I).remove(), M(this, Ri).delete(I));
- }
- destroy() {
- $(this, XA, null);
- for (const I of M(this, Ri).values())
- I.remove();
- M(this, Ri).clear(), M(this, sd).clear();
- }
- };
- XA = new WeakMap(), Ri = new WeakMap(), sd = new WeakMap(), CG = new WeakMap(), EV = new WeakSet(), XIg = function(I, [g, C, i, e]) {
- const {
- style: A
- } = I;
- A.top = `${100 * C}%`, A.left = `${100 * g}%`, A.width = `${100 * i}%`, A.height = `${100 * e}%`;
- }, zs = new WeakSet(), sD = function() {
- const I = pt._svgFactory.create(1, 1, !0);
- return M(this, XA).append(I), I.setAttribute("aria-hidden", !0), I;
- }, SIg = function(I, g) {
- const C = pt._svgFactory.createElement("clipPath");
- I.append(C);
- const i = `clip_${g}`;
- C.setAttribute("id", i), C.setAttribute("clipPathUnits", "objectBoundingBox");
- const e = pt._svgFactory.createElement("use");
- return C.append(e), e.setAttribute("href", `#${g}`), e.classList.add("clip"), i;
- }, lD = function(I, g) {
- for (const [C, i] of Object.entries(g))
- i === null ? I.removeAttribute(C) : I.setAttribute(C, i);
- }, tg(pt, EV), tg(pt, CG, 0);
- let AD = pt;
- globalThis.pdfjsTestingUtils = {
- HighlightOutliner: FS
- };
- pI.AbortException;
- pI.AnnotationEditorLayer;
- pI.AnnotationEditorParamsType;
- pI.AnnotationEditorType;
- pI.AnnotationEditorUIManager;
- pI.AnnotationLayer;
- pI.AnnotationMode;
- pI.AnnotationType;
- pI.ColorPicker;
- pI.DOMSVGFactory;
- pI.DrawLayer;
- pI.FeatureTest;
- var Rdg = pI.GlobalWorkerOptions;
- pI.ImageKind;
- pI.InvalidPDFException;
- pI.MathClamp;
- pI.OPS;
- pI.OutputScale;
- pI.PDFDataRangeTransport;
- pI.PDFDateString;
- pI.PDFWorker;
- pI.PasswordResponses;
- pI.PermissionFlag;
- pI.PixelsPerInch;
- pI.RenderingCancelledException;
- pI.ResponseException;
- pI.SignatureExtractor;
- pI.SupportedImageMimeTypes;
- pI.TextLayer;
- pI.TouchManager;
- pI.Util;
- pI.VerbosityLevel;
- pI.XfaLayer;
- pI.build;
- pI.createValidAbsoluteUrl;
- pI.fetchData;
- var fdg = pI.getDocument;
- pI.getFilenameFromUrl;
- pI.getPdfFilenameFromUrl;
- pI.getUuid;
- pI.getXfaPageViewport;
- pI.isDataScheme;
- pI.isPdfFile;
- pI.isValidExplicitDest;
- pI.noContextMenu;
- pI.normalizeUnicode;
- pI.setLayerDimensions;
- pI.shadow;
- pI.stopEvent;
- pI.version;
- const V0 = (t, I) => {
- const g = t.__vccOpts || t;
- for (const [C, i] of I)
- g[C] = i;
- return g;
- }, Hdg = { class: "home_wrap" }, Xdg = ["id"], Sdg = {
- __name: "PdfView",
- props: {
- data: Array
- },
- setup(t) {
- Rdg.workerSrc = new URL("data:text/javascript;base64,LyoqCiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQogKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCiAqCiAqIENvcHlyaWdodCAyMDI0IE1vemlsbGEgRm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQogKi8KCi8qKioqKiovIC8vIFRoZSByZXF1aXJlIHNjb3BlCi8qKioqKiovIHZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307Ci8qKioqKiovIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi8KLyoqKioqKi8gKCgpID0+IHsKLyoqKioqKi8gCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi8gCV9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7Ci8qKioqKiovIAkJZm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgewovKioqKioqLyAJCQlpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHsKLyoqKioqKi8gCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9Ci8qKioqKiovIAl9OwovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqLwovKioqKioqLyAoKCkgPT4gewovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKQovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSBnbG9iYWxUaGlzLnBkZmpzV29ya2VyID0ge307CgovLyBFWFBPUlRTCl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7CiAgV29ya2VyTWVzc2FnZUhhbmRsZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBXb3JrZXJNZXNzYWdlSGFuZGxlcikKfSk7Cgo7Ly8gLi9zcmMvc2hhcmVkL3V0aWwuanMKY29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYgcHJvY2VzcyArICIiID09PSAiW29iamVjdCBwcm9jZXNzXSIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09ICJicm93c2VyIik7CmNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTsKY29uc3QgTElORV9GQUNUT1IgPSAxLjM1Owpjb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTsKY29uc3QgQkFTRUxJTkVfRkFDVE9SID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAvIExJTkVfRkFDVE9SOwpjb25zdCBSZW5kZXJpbmdJbnRlbnRGbGFnID0gewogIEFOWTogMHgwMSwKICBESVNQTEFZOiAweDAyLAogIFBSSU5UOiAweDA0LAogIFNBVkU6IDB4MDgsCiAgQU5OT1RBVElPTlNfRk9STVM6IDB4MTAsCiAgQU5OT1RBVElPTlNfU1RPUkFHRTogMHgyMCwKICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLAogIElTX0VESVRJTkc6IDB4ODAsCiAgT1BMSVNUOiAweDEwMAp9Owpjb25zdCBBbm5vdGF0aW9uTW9kZSA9IHsKICBESVNBQkxFOiAwLAogIEVOQUJMRTogMSwKICBFTkFCTEVfRk9STVM6IDIsCiAgRU5BQkxFX1NUT1JBR0U6IDMKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9ICJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIjsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7CiAgRElTQUJMRTogLTEsCiAgTk9ORTogMCwKICBGUkVFVEVYVDogMywKICBISUdITElHSFQ6IDksCiAgU1RBTVA6IDEzLAogIElOSzogMTUsCiAgU0lHTkFUVVJFOiAxMDEKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7CiAgUkVTSVpFOiAxLAogIENSRUFURTogMiwKICBGUkVFVEVYVF9TSVpFOiAxMSwKICBGUkVFVEVYVF9DT0xPUjogMTIsCiAgRlJFRVRFWFRfT1BBQ0lUWTogMTMsCiAgSU5LX0NPTE9SOiAyMSwKICBJTktfVEhJQ0tORVNTOiAyMiwKICBJTktfT1BBQ0lUWTogMjMsCiAgSElHSExJR0hUX0NPTE9SOiAzMSwKICBISUdITElHSFRfREVGQVVMVF9DT0xPUjogMzIsCiAgSElHSExJR0hUX1RISUNLTkVTUzogMzMsCiAgSElHSExJR0hUX0ZSRUU6IDM0LAogIEhJR0hMSUdIVF9TSE9XX0FMTDogMzUsCiAgRFJBV19TVEVQOiA0MQp9Owpjb25zdCBQZXJtaXNzaW9uRmxhZyA9IHsKICBQUklOVDogMHgwNCwKICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCiAgQ09QWTogMHgxMCwKICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsCiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCiAgQ09QWV9GT1JfQUNDRVNTSUJJTElUWTogMHgyMDAsCiAgQVNTRU1CTEU6IDB4NDAwLAogIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKfTsKY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7CiAgRklMTDogMCwKICBTVFJPS0U6IDEsCiAgRklMTF9TVFJPS0U6IDIsCiAgSU5WSVNJQkxFOiAzLAogIEZJTExfQUREX1RPX1BBVEg6IDQsCiAgU1RST0tFX0FERF9UT19QQVRIOiA1LAogIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LAogIEFERF9UT19QQVRIOiA3LAogIEZJTExfU1RST0tFX01BU0s6IDMsCiAgQUREX1RPX1BBVEhfRkxBRzogNAp9Owpjb25zdCBJbWFnZUtpbmQgPSB7CiAgR1JBWVNDQUxFXzFCUFA6IDEsCiAgUkdCXzI0QlBQOiAyLAogIFJHQkFfMzJCUFA6IDMKfTsKY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7CiAgVEVYVDogMSwKICBMSU5LOiAyLAogIEZSRUVURVhUOiAzLAogIExJTkU6IDQsCiAgU1FVQVJFOiA1LAogIENJUkNMRTogNiwKICBQT0xZR09OOiA3LAogIFBPTFlMSU5FOiA4LAogIEhJR0hMSUdIVDogOSwKICBVTkRFUkxJTkU6IDEwLAogIFNRVUlHR0xZOiAxMSwKICBTVFJJS0VPVVQ6IDEyLAogIFNUQU1QOiAxMywKICBDQVJFVDogMTQsCiAgSU5LOiAxNSwKICBQT1BVUDogMTYsCiAgRklMRUFUVEFDSE1FTlQ6IDE3LAogIFNPVU5EOiAxOCwKICBNT1ZJRTogMTksCiAgV0lER0VUOiAyMCwKICBTQ1JFRU46IDIxLAogIFBSSU5URVJNQVJLOiAyMiwKICBUUkFQTkVUOiAyMywKICBXQVRFUk1BUks6IDI0LAogIFRIUkVFRDogMjUsCiAgUkVEQUNUOiAyNgp9Owpjb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0gewogIEdST1VQOiAiR3JvdXAiLAogIFJFUExZOiAiUiIKfTsKY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7CiAgSU5WSVNJQkxFOiAweDAxLAogIEhJRERFTjogMHgwMiwKICBQUklOVDogMHgwNCwKICBOT1pPT006IDB4MDgsCiAgTk9ST1RBVEU6IDB4MTAsCiAgTk9WSUVXOiAweDIwLAogIFJFQURPTkxZOiAweDQwLAogIExPQ0tFRDogMHg4MCwKICBUT0dHTEVOT1ZJRVc6IDB4MTAwLAogIExPQ0tFRENPTlRFTlRTOiAweDIwMAp9Owpjb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0gewogIFJFQURPTkxZOiAweDAwMDAwMDEsCiAgUkVRVUlSRUQ6IDB4MDAwMDAwMiwKICBOT0VYUE9SVDogMHgwMDAwMDA0LAogIE1VTFRJTElORTogMHgwMDAxMDAwLAogIFBBU1NXT1JEOiAweDAwMDIwMDAsCiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAogIFJBRElPOiAweDAwMDgwMDAsCiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLAogIENPTUJPOiAweDAwMjAwMDAsCiAgRURJVDogMHgwMDQwMDAwLAogIFNPUlQ6IDB4MDA4MDAwMCwKICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCiAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKICBET05PVFNQRUxMQ0hFQ0s6IDB4MDQwMDAwMCwKICBET05PVFNDUk9MTDogMHgwODAwMDAwLAogIENPTUI6IDB4MTAwMDAwMCwKICBSSUNIVEVYVDogMHgyMDAwMDAwLAogIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCiAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAp9Owpjb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gewogIFNPTElEOiAxLAogIERBU0hFRDogMiwKICBCRVZFTEVEOiAzLAogIElOU0VUOiA0LAogIFVOREVSTElORTogNQp9Owpjb25zdCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gewogIEU6ICJNb3VzZSBFbnRlciIsCiAgWDogIk1vdXNlIEV4aXQiLAogIEQ6ICJNb3VzZSBEb3duIiwKICBVOiAiTW91c2UgVXAiLAogIEZvOiAiRm9jdXMiLAogIEJsOiAiQmx1ciIsCiAgUE86ICJQYWdlT3BlbiIsCiAgUEM6ICJQYWdlQ2xvc2UiLAogIFBWOiAiUGFnZVZpc2libGUiLAogIFBJOiAiUGFnZUludmlzaWJsZSIsCiAgSzogIktleXN0cm9rZSIsCiAgRjogIkZvcm1hdCIsCiAgVjogIlZhbGlkYXRlIiwKICBDOiAiQ2FsY3VsYXRlIgp9Owpjb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHsKICBXQzogIldpbGxDbG9zZSIsCiAgV1M6ICJXaWxsU2F2ZSIsCiAgRFM6ICJEaWRTYXZlIiwKICBXUDogIldpbGxQcmludCIsCiAgRFA6ICJEaWRQcmludCIKfTsKY29uc3QgUGFnZUFjdGlvbkV2ZW50VHlwZSA9IHsKICBPOiAiUGFnZU9wZW4iLAogIEM6ICJQYWdlQ2xvc2UiCn07CmNvbnN0IFZlcmJvc2l0eUxldmVsID0gewogIEVSUk9SUzogMCwKICBXQVJOSU5HUzogMSwKICBJTkZPUzogNQp9Owpjb25zdCBPUFMgPSB7CiAgZGVwZW5kZW5jeTogMSwKICBzZXRMaW5lV2lkdGg6IDIsCiAgc2V0TGluZUNhcDogMywKICBzZXRMaW5lSm9pbjogNCwKICBzZXRNaXRlckxpbWl0OiA1LAogIHNldERhc2g6IDYsCiAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAogIHNldEZsYXRuZXNzOiA4LAogIHNldEdTdGF0ZTogOSwKICBzYXZlOiAxMCwKICByZXN0b3JlOiAxMSwKICB0cmFuc2Zvcm06IDEyLAogIG1vdmVUbzogMTMsCiAgbGluZVRvOiAxNCwKICBjdXJ2ZVRvOiAxNSwKICBjdXJ2ZVRvMjogMTYsCiAgY3VydmVUbzM6IDE3LAogIGNsb3NlUGF0aDogMTgsCiAgcmVjdGFuZ2xlOiAxOSwKICBzdHJva2U6IDIwLAogIGNsb3NlU3Ryb2tlOiAyMSwKICBmaWxsOiAyMiwKICBlb0ZpbGw6IDIzLAogIGZpbGxTdHJva2U6IDI0LAogIGVvRmlsbFN0cm9rZTogMjUsCiAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsCiAgZW5kUGF0aDogMjgsCiAgY2xpcDogMjksCiAgZW9DbGlwOiAzMCwKICBiZWdpblRleHQ6IDMxLAogIGVuZFRleHQ6IDMyLAogIHNldENoYXJTcGFjaW5nOiAzMywKICBzZXRXb3JkU3BhY2luZzogMzQsCiAgc2V0SFNjYWxlOiAzNSwKICBzZXRMZWFkaW5nOiAzNiwKICBzZXRGb250OiAzNywKICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCiAgc2V0VGV4dFJpc2U6IDM5LAogIG1vdmVUZXh0OiA0MCwKICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAogIHNldFRleHRNYXRyaXg6IDQyLAogIG5leHRMaW5lOiA0MywKICBzaG93VGV4dDogNDQsCiAgc2hvd1NwYWNlZFRleHQ6IDQ1LAogIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAogIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKICBzZXRDaGFyV2lkdGg6IDQ4LAogIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLAogIHNldFN0cm9rZUNvbG9yOiA1MiwKICBzZXRTdHJva2VDb2xvck46IDUzLAogIHNldEZpbGxDb2xvcjogNTQsCiAgc2V0RmlsbENvbG9yTjogNTUsCiAgc2V0U3Ryb2tlR3JheTogNTYsCiAgc2V0RmlsbEdyYXk6IDU3LAogIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKICBzZXRGaWxsUkdCQ29sb3I6IDU5LAogIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsCiAgc2V0RmlsbENNWUtDb2xvcjogNjEsCiAgc2hhZGluZ0ZpbGw6IDYyLAogIGJlZ2luSW5saW5lSW1hZ2U6IDYzLAogIGJlZ2luSW1hZ2VEYXRhOiA2NCwKICBlbmRJbmxpbmVJbWFnZTogNjUsCiAgcGFpbnRYT2JqZWN0OiA2NiwKICBtYXJrUG9pbnQ6IDY3LAogIG1hcmtQb2ludFByb3BzOiA2OCwKICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LAogIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKICBlbmRNYXJrZWRDb250ZW50OiA3MSwKICBiZWdpbkNvbXBhdDogNzIsCiAgZW5kQ29tcGF0OiA3MywKICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAogIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LAogIGJlZ2luR3JvdXA6IDc2LAogIGVuZEdyb3VwOiA3NywKICBiZWdpbkFubm90YXRpb246IDgwLAogIGVuZEFubm90YXRpb246IDgxLAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsCiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAogIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsCiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksCiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKICBjb25zdHJ1Y3RQYXRoOiA5MSwKICBzZXRTdHJva2VUcmFuc3BhcmVudDogOTIsCiAgc2V0RmlsbFRyYW5zcGFyZW50OiA5Mwp9Owpjb25zdCBEcmF3T1BTID0gewogIG1vdmVUbzogMCwKICBsaW5lVG86IDEsCiAgY3VydmVUbzogMiwKICBjbG9zZVBhdGg6IDMKfTsKY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7CiAgTkVFRF9QQVNTV09SRDogMSwKICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIKfTsKbGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTOwpmdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkgewogIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkgewogICAgdmVyYm9zaXR5ID0gbGV2ZWw7CiAgfQp9CmZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkgewogIHJldHVybiB2ZXJib3NpdHk7Cn0KZnVuY3Rpb24gaW5mbyhtc2cpIHsKICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7CiAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7CiAgfQp9CmZ1bmN0aW9uIHdhcm4obXNnKSB7CiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykgewogICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApOwogIH0KfQpmdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHsKICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKfQpmdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7CiAgaWYgKCFjb25kKSB7CiAgICB1bnJlYWNoYWJsZShtc2cpOwogIH0KfQpmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkgewogIHN3aXRjaCAodXJsPy5wcm90b2NvbCkgewogICAgY2FzZSAiaHR0cDoiOgogICAgY2FzZSAiaHR0cHM6IjoKICAgIGNhc2UgImZ0cDoiOgogICAgY2FzZSAibWFpbHRvOiI6CiAgICBjYXNlICJ0ZWw6IjoKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodXJsLCBiYXNlVXJsID0gbnVsbCwgb3B0aW9ucyA9IG51bGwpIHsKICBpZiAoIXVybCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChvcHRpb25zICYmIHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICBpZiAob3B0aW9ucy5hZGREZWZhdWx0UHJvdG9jb2wgJiYgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSkgewogICAgICBjb25zdCBkb3RzID0gdXJsLm1hdGNoKC9cLi9nKTsKICAgICAgaWYgKGRvdHM/Lmxlbmd0aCA+PSAyKSB7CiAgICAgICAgdXJsID0gYGh0dHA6Ly8ke3VybH1gOwogICAgICB9CiAgICB9CiAgICBpZiAob3B0aW9ucy50cnlDb252ZXJ0RW5jb2RpbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICB1cmwgPSBzdHJpbmdUb1VURjhTdHJpbmcodXJsKTsKICAgICAgfSBjYXRjaCB7fQogICAgfQogIH0KICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBVUkwucGFyc2UodXJsLCBiYXNlVXJsKSA6IFVSTC5wYXJzZSh1cmwpOwogIHJldHVybiBfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSA/IGFic29sdXRlVXJsIDogbnVsbDsKfQpmdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSwgbm9uU2VyaWFsaXphYmxlID0gZmFsc2UpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7CiAgICB2YWx1ZSwKICAgIGVudW1lcmFibGU6ICFub25TZXJpYWxpemFibGUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogZmFsc2UKICB9KTsKICByZXR1cm4gdmFsdWU7Cn0KY29uc3QgQmFzZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkgewogIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSwgbmFtZSkgewogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgfQogIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CiAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247CiAgcmV0dXJuIEJhc2VFeGNlcHRpb247Cn0oKTsKY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHsKICAgIHN1cGVyKG1zZywgIlBhc3N3b3JkRXhjZXB0aW9uIik7CiAgICB0aGlzLmNvZGUgPSBjb2RlOwogIH0KfQpjbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHsKICAgIHN1cGVyKG1zZywgIlVua25vd25FcnJvckV4Y2VwdGlvbiIpOwogICAgdGhpcy5kZXRhaWxzID0gZGV0YWlsczsKICB9Cn0KY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSW52YWxpZFBERkV4Y2VwdGlvbiIpOwogIH0KfQpjbGFzcyBSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzLCBtaXNzaW5nKSB7CiAgICBzdXBlcihtc2csICJSZXNwb25zZUV4Y2VwdGlvbiIpOwogICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICB0aGlzLm1pc3NpbmcgPSBtaXNzaW5nOwogIH0KfQpjbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiRm9ybWF0RXJyb3IiKTsKICB9Cn0KY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkFib3J0RXhjZXB0aW9uIik7CiAgfQp9CmZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHsKICBpZiAodHlwZW9mIGJ5dGVzICE9PSAib2JqZWN0IiB8fCBieXRlcz8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgIHVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7CiAgfQogIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyOwogIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzKTsKICB9CiAgY29uc3Qgc3RyQnVmID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7CiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7CiAgICBjb25zdCBjaHVuayA9IGJ5dGVzLnN1YmFycmF5KGksIGNodW5rRW5kKTsKICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICB9CiAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikgewogIGlmICh0eXBlb2Ygc3RyICE9PSAic3RyaW5nIikgewogICAgdW5yZWFjaGFibGUoIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTsKICB9CiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDsKICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7CiAgfQogIHJldHVybiBieXRlczsKfQpmdW5jdGlvbiBzdHJpbmczMih2YWx1ZSkgewogIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKfQpmdW5jdGlvbiBvYmplY3RTaXplKG9iaikgewogIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDsKfQpmdW5jdGlvbiBvYmplY3RGcm9tTWFwKG1hcCkgewogIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbWFwKSB7CiAgICBvYmpba2V5XSA9IHZhbHVlOwogIH0KICByZXR1cm4gb2JqOwp9CmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkgewogIGNvbnN0IGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTsKICBidWZmZXI4WzBdID0gMTsKICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpOwogIHJldHVybiB2aWV3MzJbMF0gPT09IDE7Cn0KZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkgewogIHRyeSB7CiAgICBuZXcgRnVuY3Rpb24oIiIpOwogICAgcmV0dXJuIHRydWU7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNsYXNzIEZlYXR1cmVUZXN0IHsKICBzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiaXNMaXR0bGVFbmRpYW4iLCBpc0xpdHRsZUVuZGlhbigpKTsKICB9CiAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0V2YWxTdXBwb3J0ZWQiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7CiAgfQogIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCIsIHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICJ1bmRlZmluZWQiKTsKICB9CiAgc3RhdGljIGdldCBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkIiwgdHlwZW9mIEltYWdlRGVjb2RlciAhPT0gInVuZGVmaW5lZCIpOwogIH0KICBzdGF0aWMgZ2V0IHBsYXRmb3JtKCkgewogICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBuYXZpZ2F0b3I/LnBsYXRmb3JtID09PSAic3RyaW5nIiAmJiB0eXBlb2YgbmF2aWdhdG9yPy51c2VyQWdlbnQgPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwbGF0Zm9ybSwKICAgICAgICB1c2VyQWdlbnQKICAgICAgfSA9IG5hdmlnYXRvcjsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGxhdGZvcm0iLCB7CiAgICAgICAgaXNBbmRyb2lkOiB1c2VyQWdlbnQuaW5jbHVkZXMoIkFuZHJvaWQiKSwKICAgICAgICBpc0xpbnV4OiBwbGF0Zm9ybS5pbmNsdWRlcygiTGludXgiKSwKICAgICAgICBpc01hYzogcGxhdGZvcm0uaW5jbHVkZXMoIk1hYyIpLAogICAgICAgIGlzV2luZG93czogcGxhdGZvcm0uaW5jbHVkZXMoIldpbiIpLAogICAgICAgIGlzRmlyZWZveDogdXNlckFnZW50LmluY2x1ZGVzKCJGaXJlZm94IikKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJwbGF0Zm9ybSIsIHsKICAgICAgaXNBbmRyb2lkOiBmYWxzZSwKICAgICAgaXNMaW51eDogZmFsc2UsCiAgICAgIGlzTWFjOiBmYWxzZSwKICAgICAgaXNXaW5kb3dzOiBmYWxzZSwKICAgICAgaXNGaXJlZm94OiBmYWxzZQogICAgfSk7CiAgfQogIHN0YXRpYyBnZXQgaXNDU1NSb3VuZFN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzQ1NTUm91bmRTdXBwb3J0ZWQiLCBnbG9iYWxUaGlzLkNTUz8uc3VwcG9ydHM/Ligid2lkdGg6IHJvdW5kKDEuNXB4LCAxcHgpIikpOwogIH0KfQpjb25zdCBoZXhOdW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSgyNTYpLmtleXMoKSwgbiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAiMCIpKTsKY2xhc3MgVXRpbCB7CiAgc3RhdGljIG1ha2VIZXhDb2xvcihyLCBnLCBiKSB7CiAgICByZXR1cm4gYCMke2hleE51bWJlcnNbcl19JHtoZXhOdW1iZXJzW2ddfSR7aGV4TnVtYmVyc1tiXX1gOwogIH0KICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikgewogICAgcmV0dXJuIFttMVswXSAqIG0yWzBdICsgbTFbMl0gKiBtMlsxXSwgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sIG0xWzBdICogbTJbMl0gKyBtMVsyXSAqIG0yWzNdLCBtMVsxXSAqIG0yWzJdICsgbTFbM10gKiBtMlszXSwgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSwgbTFbMV0gKiBtMls0XSArIG0xWzNdICogbTJbNV0gKyBtMVs1XV07CiAgfQogIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7CiAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdOwogICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTsKICAgIHJldHVybiBbeHQsIHl0XTsKICB9CiAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7CiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7CiAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDsKICAgIHJldHVybiBbeHQsIHl0XTsKICB9CiAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHsKICAgIGNvbnN0IHAxID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLCBtKTsKICAgIGNvbnN0IHAyID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTsKICAgIGNvbnN0IHAzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pOwogICAgY29uc3QgcDQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7CiAgICByZXR1cm4gW01hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5taW4ocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLCBNYXRoLm1heChwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKV07CiAgfQogIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHsKICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOwogICAgcmV0dXJuIFttWzNdIC8gZCwgLW1bMV0gLyBkLCAtbVsyXSAvIGQsIG1bMF0gLyBkLCAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLCAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkXTsKICB9CiAgc3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG0pIHsKICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTsKICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTsKICAgIGNvbnN0IGIgPSBtWzBdICogdHJhbnNwb3NlWzFdICsgbVsxXSAqIHRyYW5zcG9zZVszXTsKICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTsKICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTsKICAgIGNvbnN0IGZpcnN0ID0gKGEgKyBkKSAvIDI7CiAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqKiAyIC0gNCAqIChhICogZCAtIGMgKiBiKSkgLyAyOwogICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxOwogICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxOwogICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTsKICB9CiAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkgewogICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7CiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHsKICAgICAgclswXSA9IHJlY3RbMl07CiAgICAgIHJbMl0gPSByZWN0WzBdOwogICAgfQogICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7CiAgICAgIHJbMV0gPSByZWN0WzNdOwogICAgICByWzNdID0gcmVjdFsxXTsKICAgIH0KICAgIHJldHVybiByOwogIH0KICBzdGF0aWMgaW50ZXJzZWN0KHJlY3QxLCByZWN0MikgewogICAgY29uc3QgeExvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWluKHJlY3QyWzBdLCByZWN0MlsyXSkpOwogICAgY29uc3QgeEhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1heChyZWN0MlswXSwgcmVjdDJbMl0pKTsKICAgIGlmICh4TG93ID4geEhpZ2gpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB5TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5taW4ocmVjdDJbMV0sIHJlY3QyWzNdKSk7CiAgICBjb25zdCB5SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWF4KHJlY3QyWzFdLCByZWN0MlszXSkpOwogICAgaWYgKHlMb3cgPiB5SGlnaCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBbeExvdywgeUxvdywgeEhpZ2gsIHlIaWdoXTsKICB9CiAgc3RhdGljIHBvaW50Qm91bmRpbmdCb3goeCwgeSwgbWluTWF4KSB7CiAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgpOwogICAgbWluTWF4WzFdID0gTWF0aC5taW4obWluTWF4WzFdLCB5KTsKICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeCk7CiAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkpOwogIH0KICBzdGF0aWMgcmVjdEJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCBtaW5NYXgpIHsKICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgeDAsIHgxKTsKICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeTAsIHkxKTsKICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeDAsIHgxKTsKICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgeTAsIHkxKTsKICB9CiAgc3RhdGljICNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCB0LCBtaW5NYXgpIHsKICAgIGlmICh0IDw9IDAgfHwgdCA+PSAxKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG10ID0gMSAtIHQ7CiAgICBjb25zdCB0dCA9IHQgKiB0OwogICAgY29uc3QgdHR0ID0gdHQgKiB0OwogICAgY29uc3QgeCA9IG10ICogKG10ICogKG10ICogeDAgKyAzICogdCAqIHgxKSArIDMgKiB0dCAqIHgyKSArIHR0dCAqIHgzOwogICAgY29uc3QgeSA9IG10ICogKG10ICogKG10ICogeTAgKyAzICogdCAqIHkxKSArIDMgKiB0dCAqIHkyKSArIHR0dCAqIHkzOwogICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCB4KTsKICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeSk7CiAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgpOwogICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCB5KTsKICB9CiAgc3RhdGljICNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIGEsIGIsIGMsIG1pbk1heCkgewogICAgaWYgKE1hdGguYWJzKGEpIDwgMWUtMTIpIHsKICAgICAgaWYgKE1hdGguYWJzKGIpID49IDFlLTEyKSB7CiAgICAgICAgdGhpcy4jZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgLWMgLyBiLCBtaW5NYXgpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGRlbHRhID0gYiAqKiAyIC0gNCAqIGMgKiBhOwogICAgaWYgKGRlbHRhIDwgMCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzcXJ0RGVsdGEgPSBNYXRoLnNxcnQoZGVsdGEpOwogICAgY29uc3QgYTIgPSAyICogYTsKICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiArIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTsKICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiAtIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTsKICB9CiAgc3RhdGljIGJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KSB7CiAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgwLCB4Myk7CiAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIHkwLCB5Myk7CiAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgwLCB4Myk7CiAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkwLCB5Myk7CiAgICB0aGlzLiNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIDMgKiAoLXgwICsgMyAqICh4MSAtIHgyKSArIHgzKSwgNiAqICh4MCAtIDIgKiB4MSArIHgyKSwgMyAqICh4MSAtIHgwKSwgbWluTWF4KTsKICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteTAgKyAzICogKHkxIC0geTIpICsgeTMpLCA2ICogKHkwIC0gMiAqIHkxICsgeTIpLCAzICogKHkxIC0geTApLCBtaW5NYXgpOwogIH0KfQpjb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJkOCwgMHgyYzcsIDB4MmM2LCAweDJkOSwgMHgyZGQsIDB4MmRiLCAweDJkYSwgMHgyZGMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNhLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFlLCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYSwgMHgyMTIyLCAweGZiMDEsIDB4ZmIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdkLCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN2UsIDAsIDB4MjBhY107CmZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikgewogIGlmIChzdHJbMF0gPj0gIlx4RUYiKSB7CiAgICBsZXQgZW5jb2Rpbmc7CiAgICBpZiAoc3RyWzBdID09PSAiXHhGRSIgJiYgc3RyWzFdID09PSAiXHhGRiIpIHsKICAgICAgZW5jb2RpbmcgPSAidXRmLTE2YmUiOwogICAgICBpZiAoc3RyLmxlbmd0aCAlIDIgPT09IDEpIHsKICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTEpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gIlx4RkYiICYmIHN0clsxXSA9PT0gIlx4RkUiKSB7CiAgICAgIGVuY29kaW5nID0gInV0Zi0xNmxlIjsKICAgICAgaWYgKHN0ci5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJbMF0gPT09ICJceEVGIiAmJiBzdHJbMV0gPT09ICJceEJCIiAmJiBzdHJbMl0gPT09ICJceEJGIikgewogICAgICBlbmNvZGluZyA9ICJ1dGYtOCI7CiAgICB9CiAgICBpZiAoZW5jb2RpbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7CiAgICAgICAgICBmYXRhbDogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmluZ1RvQnl0ZXMoc3RyKTsKICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTsKICAgICAgICBpZiAoIWRlY29kZWQuaW5jbHVkZXMoIlx4MWIiKSkgewogICAgICAgICAgcmV0dXJuIGRlY29kZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWNvZGVkLnJlcGxhY2VBbGwoL1x4MWJbXlx4MWJdKig/Olx4MWJ8JCkvZywgIiIpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHdhcm4oYHN0cmluZ1RvUERGU3RyaW5nOiAiJHtleH0iLmApOwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IHN0ckJ1ZiA9IFtdOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgaWYgKGNoYXJDb2RlID09PSAweDFiKSB7CiAgICAgIHdoaWxlICgrK2kgPCBpaSAmJiBzdHIuY2hhckNvZGVBdChpKSAhPT0gMHgxYikge30KICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbY2hhckNvZGVdOwogICAgc3RyQnVmLnB1c2goY29kZSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgOiBzdHIuY2hhckF0KGkpKTsKICB9CiAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7CiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7Cn0KZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikgewogIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7Cn0KZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjEsIGFycjIpIHsKICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZvciAobGV0IGkgPSAwLCBpaSA9IGFycjEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZSgpKSB7CiAgY29uc3QgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpXTsKICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOwp9CmxldCBOb3JtYWxpemVSZWdleCA9IG51bGw7CmxldCBOb3JtYWxpemF0aW9uTWFwID0gbnVsbDsKZnVuY3Rpb24gbm9ybWFsaXplVW5pY29kZShzdHIpIHsKICBpZiAoIU5vcm1hbGl6ZVJlZ2V4KSB7CiAgICBOb3JtYWxpemVSZWdleCA9IC8oW1x1MDBhMFx1MDBiNVx1MDM3ZVx1MGViM1x1MjAwMC1cdTIwMGFcdTIwMmZcdTIxMjZcdWZiMDAtXHVmYjA0XHVmYjA2XHVmYjIwLVx1ZmIzNlx1ZmIzOC1cdWZiM2NcdWZiM2VcdWZiNDAtXHVmYjQxXHVmYjQzLVx1ZmI0NFx1ZmI0Ni1cdWZiYTFcdWZiYTQtXHVmYmE5XHVmYmFlLVx1ZmJiMVx1ZmJkMy1cdWZiZGNcdWZiZGUtXHVmYmU3XHVmYmVhLVx1ZmJmOFx1ZmJmYy1cdWZiZmRcdWZjMDAtXHVmYzVkXHVmYzY0LVx1ZmNmMVx1ZmNmNS1cdWZkM2RcdWZkODhcdWZkZjRcdWZkZmEtXHVmZGZiXHVmZTcxXHVmZTc3XHVmZTc5XHVmZTdiXHVmZTdkXSspfChcdWZiMDUrKS9ndTsKICAgIE5vcm1hbGl6YXRpb25NYXAgPSBuZXcgTWFwKFtbIu+shSIsICLFv3QiXV0pOwogIH0KICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoTm9ybWFsaXplUmVnZXgsIChfLCBwMSwgcDIpID0+IHAxID8gcDEubm9ybWFsaXplKCJORktDIikgOiBOb3JtYWxpemF0aW9uTWFwLmdldChwMikpOwp9CmZ1bmN0aW9uIGdldFV1aWQoKSB7CiAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gImZ1bmN0aW9uIikgewogICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgfQogIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDMyKTsKICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7CiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTsKfQpjb25zdCBBbm5vdGF0aW9uUHJlZml4ID0gInBkZmpzX2ludGVybmFsX2lkXyI7CmZ1bmN0aW9uIF9pc1ZhbGlkRXhwbGljaXREZXN0KHZhbGlkUmVmLCB2YWxpZE5hbWUsIGRlc3QpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkgfHwgZGVzdC5sZW5ndGggPCAyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IFtwYWdlLCB6b29tLCAuLi5hcmdzXSA9IGRlc3Q7CiAgaWYgKCF2YWxpZFJlZihwYWdlKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihwYWdlKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoIXZhbGlkTmFtZSh6b29tKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBhcmdzTGVuID0gYXJncy5sZW5ndGg7CiAgbGV0IGFsbG93TnVsbCA9IHRydWU7CiAgc3dpdGNoICh6b29tLm5hbWUpIHsKICAgIGNhc2UgIlhZWiI6CiAgICAgIGlmIChhcmdzTGVuIDwgMiB8fCBhcmdzTGVuID4gMykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgIkZpdCI6CiAgICBjYXNlICJGaXRCIjoKICAgICAgcmV0dXJuIGFyZ3NMZW4gPT09IDA7CiAgICBjYXNlICJGaXRIIjoKICAgIGNhc2UgIkZpdEJIIjoKICAgIGNhc2UgIkZpdFYiOgogICAgY2FzZSAiRml0QlYiOgogICAgICBpZiAoYXJnc0xlbiA+IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJGaXRSIjoKICAgICAgaWYgKGFyZ3NMZW4gIT09IDQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYWxsb3dOdWxsID0gZmFsc2U7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7CiAgICBpZiAodHlwZW9mIGFyZyA9PT0gIm51bWJlciIgfHwgYWxsb3dOdWxsICYmIGFyZyA9PT0gbnVsbCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gTWF0aENsYW1wKHYsIG1pbiwgbWF4KSB7CiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHYsIG1pbiksIG1heCk7Cn0KZnVuY3Rpb24gdG9IZXhVdGlsKGFycikgewogIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS50b0hleCkgewogICAgcmV0dXJuIGFyci50b0hleCgpOwogIH0KICByZXR1cm4gQXJyYXkuZnJvbShhcnIsIG51bSA9PiBoZXhOdW1iZXJzW251bV0pLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHRvQmFzZTY0VXRpbChhcnIpIHsKICBpZiAoVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQpIHsKICAgIHJldHVybiBhcnIudG9CYXNlNjQoKTsKICB9CiAgcmV0dXJuIGJ0b2EoYnl0ZXNUb1N0cmluZyhhcnIpKTsKfQpmdW5jdGlvbiBmcm9tQmFzZTY0VXRpbChzdHIpIHsKICBpZiAoVWludDhBcnJheS5mcm9tQmFzZTY0KSB7CiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tQmFzZTY0KHN0cik7CiAgfQogIHJldHVybiBzdHJpbmdUb0J5dGVzKGF0b2Ioc3RyKSk7Cn0KaWYgKHR5cGVvZiBQcm9taXNlLnRyeSAhPT0gImZ1bmN0aW9uIikgewogIFByb21pc2UudHJ5ID0gZnVuY3Rpb24gKGZuLCAuLi5hcmdzKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CiAgICAgIHJlc29sdmUoZm4oLi4uYXJncykpOwogICAgfSk7CiAgfTsKfQppZiAodHlwZW9mIE1hdGguc3VtUHJlY2lzZSAhPT0gImZ1bmN0aW9uIikgewogIE1hdGguc3VtUHJlY2lzZSA9IGZ1bmN0aW9uIChudW1iZXJzKSB7CiAgICByZXR1cm4gbnVtYmVycy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTsKICB9Owp9Cgo7Ly8gLi9zcmMvY29yZS9wcmltaXRpdmVzLmpzCgpjb25zdCBDSVJDVUxBUl9SRUYgPSBTeW1ib2woIkNJUkNVTEFSX1JFRiIpOwpjb25zdCBFT0YgPSBTeW1ib2woIkVPRiIpOwpsZXQgQ21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpsZXQgTmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKbGV0IFJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKZnVuY3Rpb24gY2xlYXJQcmltaXRpdmVDYWNoZXMoKSB7CiAgQ21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIE5hbWVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgUmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwp9CmNsYXNzIE5hbWUgewogIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgfQogIHN0YXRpYyBnZXQobmFtZSkgewogICAgcmV0dXJuIE5hbWVDYWNoZVtuYW1lXSB8fD0gbmV3IE5hbWUobmFtZSk7CiAgfQp9CmNsYXNzIENtZCB7CiAgY29uc3RydWN0b3IoY21kKSB7CiAgICB0aGlzLmNtZCA9IGNtZDsKICB9CiAgc3RhdGljIGdldChjbWQpIHsKICAgIHJldHVybiBDbWRDYWNoZVtjbWRdIHx8PSBuZXcgQ21kKGNtZCk7CiAgfQp9CmNvbnN0IG5vblNlcmlhbGl6YWJsZSA9IGZ1bmN0aW9uIG5vblNlcmlhbGl6YWJsZUNsb3N1cmUoKSB7CiAgcmV0dXJuIG5vblNlcmlhbGl6YWJsZTsKfTsKY2xhc3MgRGljdCB7CiAgY29uc3RydWN0b3IoeHJlZiA9IG51bGwpIHsKICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLm9iaklkID0gbnVsbDsKICAgIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2U7CiAgICB0aGlzLl9fbm9uU2VyaWFsaXphYmxlX18gPSBub25TZXJpYWxpemFibGU7CiAgfQogIGFzc2lnblhyZWYobmV3WHJlZikgewogICAgdGhpcy54cmVmID0gbmV3WHJlZjsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CiAgfQogIGdldChrZXkxLCBrZXkyLCBrZXkzKSB7CiAgICBsZXQgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTEpOwogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkyKTsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTMpOwogICAgICB9CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7CiAgICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2godmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CiAgYXN5bmMgZ2V0QXN5bmMoa2V5MSwga2V5Miwga2V5MykgewogICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkxKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5Mik7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkzKTsKICAgICAgfQogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoQXN5bmModmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CiAgZ2V0QXJyYXkoa2V5MSwga2V5Miwga2V5MykgewogICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkxKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5Mik7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkzKTsKICAgICAgfQogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICB2YWx1ZSA9IHRoaXMueHJlZi5mZXRjaCh2YWx1ZSwgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGlmICh2YWx1ZVtpXSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKICAgICAgICAgIHZhbHVlW2ldID0gdGhpcy54cmVmLmZldGNoKHZhbHVlW2ldLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQogIGdldFJhdyhrZXkpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KGtleSk7CiAgfQogIGdldEtleXMoKSB7CiAgICByZXR1cm4gWy4uLnRoaXMuX21hcC5rZXlzKCldOwogIH0KICBnZXRSYXdWYWx1ZXMoKSB7CiAgICByZXR1cm4gWy4uLnRoaXMuX21hcC52YWx1ZXMoKV07CiAgfQogIHNldChrZXksIHZhbHVlKSB7CiAgICB0aGlzLl9tYXAuc2V0KGtleSwgdmFsdWUpOwogIH0KICBoYXMoa2V5KSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhrZXkpOwogIH0KICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9tYXApIHsKICAgICAgeWllbGQgW2tleSwgdmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmID8gdGhpcy54cmVmLmZldGNoKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikgOiB2YWx1ZV07CiAgICB9CiAgfQogIHN0YXRpYyBnZXQgZW1wdHkoKSB7CiAgICBjb25zdCBlbXB0eURpY3QgPSBuZXcgRGljdChudWxsKTsKICAgIGVtcHR5RGljdC5zZXQgPSAoa2V5LCB2YWx1ZSkgPT4gewogICAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIGBzZXRgIG9uIHRoZSBlbXB0eSBkaWN0aW9uYXJ5LiIpOwogICAgfTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImVtcHR5IiwgZW1wdHlEaWN0KTsKICB9CiAgc3RhdGljIG1lcmdlKHsKICAgIHhyZWYsCiAgICBkaWN0QXJyYXksCiAgICBtZXJnZVN1YkRpY3RzID0gZmFsc2UKICB9KSB7CiAgICBjb25zdCBtZXJnZWREaWN0ID0gbmV3IERpY3QoeHJlZiksCiAgICAgIHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgZGljdEFycmF5KSB7CiAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGRpY3QuX21hcCkgewogICAgICAgIGxldCBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7CiAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHByb3BlcnR5ID0gW107CiAgICAgICAgICBwcm9wZXJ0aWVzLnNldChrZXksIHByb3BlcnR5KTsKICAgICAgICB9IGVsc2UgaWYgKCFtZXJnZVN1YkRpY3RzIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHByb3BlcnR5LnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIHByb3BlcnRpZXMpIHsKICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEgfHwgISh2YWx1ZXNbMF0gaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIG1lcmdlZERpY3QuX21hcC5zZXQobmFtZSwgdmFsdWVzWzBdKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBzdWJEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGZvciAoY29uc3QgZGljdCBvZiB2YWx1ZXMpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkaWN0Ll9tYXApIHsKICAgICAgICAgIGlmICghc3ViRGljdC5fbWFwLmhhcyhrZXkpKSB7CiAgICAgICAgICAgIHN1YkRpY3QuX21hcC5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdWJEaWN0LnNpemUgPiAwKSB7CiAgICAgICAgbWVyZ2VkRGljdC5fbWFwLnNldChuYW1lLCBzdWJEaWN0KTsKICAgICAgfQogICAgfQogICAgcHJvcGVydGllcy5jbGVhcigpOwogICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTsKICB9CiAgY2xvbmUoKSB7CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuZ2V0S2V5cygpKSB7CiAgICAgIGRpY3Quc2V0KGtleSwgdGhpcy5nZXRSYXcoa2V5KSk7CiAgICB9CiAgICByZXR1cm4gZGljdDsKICB9CiAgZGVsZXRlKGtleSkgewogICAgZGVsZXRlIHRoaXMuX21hcFtrZXldOwogIH0KfQpjbGFzcyBSZWYgewogIGNvbnN0cnVjdG9yKG51bSwgZ2VuKSB7CiAgICB0aGlzLm51bSA9IG51bTsKICAgIHRoaXMuZ2VuID0gZ2VuOwogIH0KICB0b1N0cmluZygpIHsKICAgIGlmICh0aGlzLmdlbiA9PT0gMCkgewogICAgICByZXR1cm4gYCR7dGhpcy5udW19UmA7CiAgICB9CiAgICByZXR1cm4gYCR7dGhpcy5udW19UiR7dGhpcy5nZW59YDsKICB9CiAgc3RhdGljIGZyb21TdHJpbmcoc3RyKSB7CiAgICBjb25zdCByZWYgPSBSZWZDYWNoZVtzdHJdOwogICAgaWYgKHJlZikgewogICAgICByZXR1cm4gcmVmOwogICAgfQogICAgY29uc3QgbSA9IC9eKFxkKylSKFxkKikkLy5leGVjKHN0cik7CiAgICBpZiAoIW0gfHwgbVsxXSA9PT0gIjAiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIFJlZkNhY2hlW3N0cl0gPSBuZXcgUmVmKHBhcnNlSW50KG1bMV0pLCAhbVsyXSA/IDAgOiBwYXJzZUludChtWzJdKSk7CiAgfQogIHN0YXRpYyBnZXQobnVtLCBnZW4pIHsKICAgIGNvbnN0IGtleSA9IGdlbiA9PT0gMCA/IGAke251bX1SYCA6IGAke251bX1SJHtnZW59YDsKICAgIHJldHVybiBSZWZDYWNoZVtrZXldIHx8PSBuZXcgUmVmKG51bSwgZ2VuKTsKICB9Cn0KY2xhc3MgUmVmU2V0IHsKICBjb25zdHJ1Y3RvcihwYXJlbnQgPSBudWxsKSB7CiAgICB0aGlzLl9zZXQgPSBuZXcgU2V0KHBhcmVudD8uX3NldCk7CiAgfQogIGhhcyhyZWYpIHsKICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKHJlZi50b1N0cmluZygpKTsKICB9CiAgcHV0KHJlZikgewogICAgdGhpcy5fc2V0LmFkZChyZWYudG9TdHJpbmcoKSk7CiAgfQogIHJlbW92ZShyZWYpIHsKICAgIHRoaXMuX3NldC5kZWxldGUocmVmLnRvU3RyaW5nKCkpOwogIH0KICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIHJldHVybiB0aGlzLl9zZXQudmFsdWVzKCk7CiAgfQogIGNsZWFyKCkgewogICAgdGhpcy5fc2V0LmNsZWFyKCk7CiAgfQp9CmNsYXNzIFJlZlNldENhY2hlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CiAgfQogIGdldChyZWYpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KHJlZi50b1N0cmluZygpKTsKICB9CiAgaGFzKHJlZikgewogICAgcmV0dXJuIHRoaXMuX21hcC5oYXMocmVmLnRvU3RyaW5nKCkpOwogIH0KICBwdXQocmVmLCBvYmopIHsKICAgIHRoaXMuX21hcC5zZXQocmVmLnRvU3RyaW5nKCksIG9iaik7CiAgfQogIHB1dEFsaWFzKHJlZiwgYWxpYXNSZWYpIHsKICAgIHRoaXMuX21hcC5zZXQocmVmLnRvU3RyaW5nKCksIHRoaXMuZ2V0KGFsaWFzUmVmKSk7CiAgfQogIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgcmV0dXJuIHRoaXMuX21hcC52YWx1ZXMoKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLl9tYXAuY2xlYXIoKTsKICB9CiAgKnZhbHVlcygpIHsKICAgIHlpZWxkKiB0aGlzLl9tYXAudmFsdWVzKCk7CiAgfQogICppdGVtcygpIHsKICAgIGZvciAoY29uc3QgW3JlZiwgdmFsdWVdIG9mIHRoaXMuX21hcCkgewogICAgICB5aWVsZCBbUmVmLmZyb21TdHJpbmcocmVmKSwgdmFsdWVdOwogICAgfQogIH0KfQpmdW5jdGlvbiBpc05hbWUodiwgbmFtZSkgewogIHJldHVybiB2IGluc3RhbmNlb2YgTmFtZSAmJiAobmFtZSA9PT0gdW5kZWZpbmVkIHx8IHYubmFtZSA9PT0gbmFtZSk7Cn0KZnVuY3Rpb24gaXNDbWQodiwgY21kKSB7CiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBDbWQgJiYgKGNtZCA9PT0gdW5kZWZpbmVkIHx8IHYuY21kID09PSBjbWQpOwp9CmZ1bmN0aW9uIGlzRGljdCh2LCB0eXBlKSB7CiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBEaWN0ICYmICh0eXBlID09PSB1bmRlZmluZWQgfHwgaXNOYW1lKHYuZ2V0KCJUeXBlIiksIHR5cGUpKTsKfQpmdW5jdGlvbiBpc1JlZnNFcXVhbCh2MSwgdjIpIHsKICByZXR1cm4gdjEubnVtID09PSB2Mi5udW0gJiYgdjEuZ2VuID09PSB2Mi5nZW47Cn0KCjsvLyAuL3NyYy9jb3JlL2Jhc2Vfc3RyZWFtLmpzCgpjbGFzcyBCYXNlU3RyZWFtIHsKICBnZXQgbGVuZ3RoKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IGdldHRlciBgbGVuZ3RoYCBhY2Nlc3NlZCIpOwogIH0KICBnZXQgaXNFbXB0eSgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBnZXR0ZXIgYGlzRW1wdHlgIGFjY2Vzc2VkIik7CiAgfQogIGdldCBpc0RhdGFMb2FkZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0RhdGFMb2FkZWQiLCB0cnVlKTsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVgIGNhbGxlZCIpOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVzYCBjYWxsZWQiKTsKICB9CiAgYXN5bmMgZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpIHsKICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpOwogIH0KICBhc3luYyBhc3luY0dldEJ5dGVzKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgYXN5bmNHZXRCeXRlc2AgY2FsbGVkIik7CiAgfQogIGdldCBpc0FzeW5jKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBnZXQgaXNBc3luY0RlY29kZXIoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcGVla0J5dGUoKSB7CiAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKICAgICAgdGhpcy5wb3MtLTsKICAgIH0KICAgIHJldHVybiBwZWVrZWRCeXRlOwogIH0KICBwZWVrQnl0ZXMobGVuZ3RoKSB7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDsKICAgIHJldHVybiBieXRlczsKICB9CiAgZ2V0VWludDE2KCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7CiAgfQogIGdldEludDMyKCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBjb25zdCBiMiA9IHRoaXMuZ2V0Qnl0ZSgpOwogICAgY29uc3QgYjMgPSB0aGlzLmdldEJ5dGUoKTsKICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZVJhbmdlYCBjYWxsZWQiKTsKICB9CiAgZ2V0U3RyaW5nKGxlbmd0aCkgewogICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcodGhpcy5nZXRCeXRlcyhsZW5ndGgpKTsKICB9CiAgc2tpcChuKSB7CiAgICB0aGlzLnBvcyArPSBuIHx8IDE7CiAgfQogIHJlc2V0KCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgcmVzZXRgIGNhbGxlZCIpOwogIH0KICBtb3ZlU3RhcnQoKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtb3ZlU3RhcnRgIGNhbGxlZCIpOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtYWtlU3ViU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NvcmVfdXRpbHMuanMKCgoKY29uc3QgUERGX1ZFUlNJT05fUkVHRVhQID0gL15bMS05XVwuXGQkLzsKY29uc3QgTUFYX0lOVF8zMiA9IDIgKiogMzEgLSAxOwpjb25zdCBNSU5fSU5UXzMyID0gLSgyICoqIDMxKTsKZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7CiAgbGV0IGxvb2t1cDsKICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgaWYgKGluaXRpYWxpemVyKSB7CiAgICAgIGxvb2t1cCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGluaXRpYWxpemVyKGxvb2t1cCk7CiAgICAgIGluaXRpYWxpemVyID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBsb29rdXA7CiAgfTsKfQpjbGFzcyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQpIHsKICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCwgIk1pc3NpbmdEYXRhRXhjZXB0aW9uIik7CiAgICB0aGlzLmJlZ2luID0gYmVnaW47CiAgICB0aGlzLmVuZCA9IGVuZDsKICB9Cn0KY2xhc3MgUGFyc2VyRU9GRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJQYXJzZXJFT0ZFeGNlcHRpb24iKTsKICB9Cn0KY2xhc3MgWFJlZkVudHJ5RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJYUmVmRW50cnlFeGNlcHRpb24iKTsKICB9Cn0KY2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJYUmVmUGFyc2VFeGNlcHRpb24iKTsKICB9Cn0KZnVuY3Rpb24gYXJyYXlCdWZmZXJzVG9CeXRlcyhhcnIpIHsKICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoOwogIGlmIChsZW5ndGggPT09IDApIHsKICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICB9CiAgaWYgKGxlbmd0aCA9PT0gMSkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFyclswXSk7CiAgfQogIGxldCBkYXRhTGVuZ3RoID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBkYXRhTGVuZ3RoICs9IGFycltpXS5ieXRlTGVuZ3RoOwogIH0KICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YUxlbmd0aCk7CiAgbGV0IHBvcyA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgY29uc3QgaXRlbSA9IG5ldyBVaW50OEFycmF5KGFycltpXSk7CiAgICBkYXRhLnNldChpdGVtLCBwb3MpOwogICAgcG9zICs9IGl0ZW0uYnl0ZUxlbmd0aDsKICB9CiAgcmV0dXJuIGRhdGE7Cn0KYXN5bmMgZnVuY3Rpb24gZmV0Y2hCaW5hcnlEYXRhKHVybCkgewogIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTsKICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBmaWxlICIke3VybH0iIHdpdGggIiR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0iLmApOwogIH0KICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7Cn0KZnVuY3Rpb24gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgZGljdCwKICBrZXksCiAgZ2V0QXJyYXkgPSBmYWxzZSwKICBzdG9wV2hlbkZvdW5kID0gdHJ1ZQp9KSB7CiAgbGV0IHZhbHVlczsKICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogIHdoaWxlIChkaWN0IGluc3RhbmNlb2YgRGljdCAmJiAhKGRpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMoZGljdC5vYmpJZCkpKSB7CiAgICBpZiAoZGljdC5vYmpJZCkgewogICAgICB2aXNpdGVkLnB1dChkaWN0Lm9iaklkKTsKICAgIH0KICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpOwogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHN0b3BXaGVuRm91bmQpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgICAgKHZhbHVlcyB8fD0gW10pLnB1c2godmFsdWUpOwogICAgfQogICAgZGljdCA9IGRpY3QuZ2V0KCJQYXJlbnQiKTsKICB9CiAgcmV0dXJuIHZhbHVlczsKfQpmdW5jdGlvbiBnZXRQYXJlbnRUb1VwZGF0ZShkaWN0LCByZWYsIHhyZWYpIHsKICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogIGNvbnN0IGZpcnN0RGljdCA9IGRpY3Q7CiAgY29uc3QgcmVzdWx0ID0gewogICAgZGljdDogbnVsbCwKICAgIHJlZjogbnVsbAogIH07CiAgd2hpbGUgKGRpY3QgaW5zdGFuY2VvZiBEaWN0ICYmICF2aXNpdGVkLmhhcyhyZWYpKSB7CiAgICB2aXNpdGVkLnB1dChyZWYpOwogICAgaWYgKGRpY3QuaGFzKCJUIikpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICByZWYgPSBkaWN0LmdldFJhdygiUGFyZW50Iik7CiAgICBpZiAoIShyZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkaWN0ID0geHJlZi5mZXRjaChyZWYpOwogIH0KICBpZiAoZGljdCBpbnN0YW5jZW9mIERpY3QgJiYgZGljdCAhPT0gZmlyc3REaWN0KSB7CiAgICByZXN1bHQuZGljdCA9IGRpY3Q7CiAgICByZXN1bHQucmVmID0gcmVmOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmNvbnN0IFJPTUFOX05VTUJFUl9NQVAgPSBbIiIsICJDIiwgIkNDIiwgIkNDQyIsICJDRCIsICJEIiwgIkRDIiwgIkRDQyIsICJEQ0NDIiwgIkNNIiwgIiIsICJYIiwgIlhYIiwgIlhYWCIsICJYTCIsICJMIiwgIkxYIiwgIkxYWCIsICJMWFhYIiwgIlhDIiwgIiIsICJJIiwgIklJIiwgIklJSSIsICJJViIsICJWIiwgIlZJIiwgIlZJSSIsICJWSUlJIiwgIklYIl07CmZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIsIGxvd2VyQ2FzZSA9IGZhbHNlKSB7CiAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobnVtYmVyKSAmJiBudW1iZXIgPiAwLCAiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOwogIGNvbnN0IHJvbWFuID0gIk0iLnJlcGVhdChudW1iZXIgLyAxMDAwIHwgMCkgKyBST01BTl9OVU1CRVJfTUFQW251bWJlciAlIDEwMDAgLyAxMDAgfCAwXSArIFJPTUFOX05VTUJFUl9NQVBbMTAgKyAobnVtYmVyICUgMTAwIC8gMTAgfCAwKV0gKyBST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyICUgMTBdOwogIHJldHVybiBsb3dlckNhc2UgPyByb21hbi50b0xvd2VyQ2FzZSgpIDogcm9tYW47Cn0KZnVuY3Rpb24gbG9nMih4KSB7CiAgcmV0dXJuIHggPiAwID8gTWF0aC5jZWlsKE1hdGgubG9nMih4KSkgOiAwOwp9CmZ1bmN0aW9uIHJlYWRJbnQ4KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgPj4gMjQ7Cn0KZnVuY3Rpb24gcmVhZEludDE2KGRhdGEsIG9mZnNldCkgewogIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgPj4gMTY7Cn0KZnVuY3Rpb24gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDggfCBkYXRhW29mZnNldCArIDFdOwp9CmZ1bmN0aW9uIHJlYWRVaW50MzIoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXSkgPj4+IDA7Cn0KZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CiAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhOwp9CmZ1bmN0aW9uIGlzQm9vbGVhbkFycmF5KGFyciwgbGVuKSB7CiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiAobGVuID09PSBudWxsIHx8IGFyci5sZW5ndGggPT09IGxlbikgJiYgYXJyLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09ICJib29sZWFuIik7Cn0KZnVuY3Rpb24gaXNOdW1iZXJBcnJheShhcnIsIGxlbikgewogIGlmIChBcnJheS5pc0FycmF5KGFycikpIHsKICAgIHJldHVybiAobGVuID09PSBudWxsIHx8IGFyci5sZW5ndGggPT09IGxlbikgJiYgYXJyLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09ICJudW1iZXIiKTsKICB9CiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnIpICYmICEoYXJyIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSB8fCBhcnIgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSkgJiYgKGxlbiA9PT0gbnVsbCB8fCBhcnIubGVuZ3RoID09PSBsZW4pOwp9CmZ1bmN0aW9uIGxvb2t1cE1hdHJpeChhcnIsIGZhbGxiYWNrKSB7CiAgcmV0dXJuIGlzTnVtYmVyQXJyYXkoYXJyLCA2KSA/IGFyciA6IGZhbGxiYWNrOwp9CmZ1bmN0aW9uIGxvb2t1cFJlY3QoYXJyLCBmYWxsYmFjaykgewogIHJldHVybiBpc051bWJlckFycmF5KGFyciwgNCkgPyBhcnIgOiBmYWxsYmFjazsKfQpmdW5jdGlvbiBsb29rdXBOb3JtYWxSZWN0KGFyciwgZmFsbGJhY2spIHsKICByZXR1cm4gaXNOdW1iZXJBcnJheShhcnIsIDQpID8gVXRpbC5ub3JtYWxpemVSZWN0KGFycikgOiBmYWxsYmFjazsKfQpmdW5jdGlvbiBwYXJzZVhGQVBhdGgocGF0aCkgewogIGNvbnN0IHBvc2l0aW9uUGF0dGVybiA9IC8oLispXFsoXGQrKVxdJC87CiAgcmV0dXJuIHBhdGguc3BsaXQoIi4iKS5tYXAoY29tcG9uZW50ID0+IHsKICAgIGNvbnN0IG0gPSBjb21wb25lbnQubWF0Y2gocG9zaXRpb25QYXR0ZXJuKTsKICAgIGlmIChtKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgbmFtZTogbVsxXSwKICAgICAgICBwb3M6IHBhcnNlSW50KG1bMl0sIDEwKQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgbmFtZTogY29tcG9uZW50LAogICAgICBwb3M6IDAKICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gZXNjYXBlUERGTmFtZShzdHIpIHsKICBjb25zdCBidWZmZXIgPSBbXTsKICBsZXQgc3RhcnQgPSAwOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoY2hhciA8IDB4MjEgfHwgY2hhciA+IDB4N2UgfHwgY2hhciA9PT0gMHgyMyB8fCBjaGFyID09PSAweDI4IHx8IGNoYXIgPT09IDB4MjkgfHwgY2hhciA9PT0gMHgzYyB8fCBjaGFyID09PSAweDNlIHx8IGNoYXIgPT09IDB4NWIgfHwgY2hhciA9PT0gMHg1ZCB8fCBjaGFyID09PSAweDdiIHx8IGNoYXIgPT09IDB4N2QgfHwgY2hhciA9PT0gMHgyZiB8fCBjaGFyID09PSAweDI1KSB7CiAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goYCMke2NoYXIudG9TdHJpbmcoMTYpfWApOwogICAgICBzdGFydCA9IGkgKyAxOwogICAgfQogIH0KICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHN0cjsKICB9CiAgaWYgKHN0YXJ0IDwgc3RyLmxlbmd0aCkgewogICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgc3RyLmxlbmd0aCkpOwogIH0KICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoLyhbKClcXFxuXHJdKS9nLCBtYXRjaCA9PiB7CiAgICBpZiAobWF0Y2ggPT09ICJcbiIpIHsKICAgICAgcmV0dXJuICJcXG4iOwogICAgfSBlbHNlIGlmIChtYXRjaCA9PT0gIlxyIikgewogICAgICByZXR1cm4gIlxcciI7CiAgICB9CiAgICByZXR1cm4gYFxcJHttYXRjaH1gOwogIH0pOwp9CmZ1bmN0aW9uIF9jb2xsZWN0SlMoZW50cnksIHhyZWYsIGxpc3QsIHBhcmVudHMpIHsKICBpZiAoIWVudHJ5KSB7CiAgICByZXR1cm47CiAgfQogIGxldCBwYXJlbnQgPSBudWxsOwogIGlmIChlbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgaWYgKHBhcmVudHMuaGFzKGVudHJ5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBwYXJlbnQgPSBlbnRyeTsKICAgIHBhcmVudHMucHV0KHBhcmVudCk7CiAgICBlbnRyeSA9IHhyZWYuZmV0Y2goZW50cnkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbnRyeSkgewogICAgICBfY29sbGVjdEpTKGVsZW1lbnQsIHhyZWYsIGxpc3QsIHBhcmVudHMpOwogICAgfQogIH0gZWxzZSBpZiAoZW50cnkgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBpZiAoaXNOYW1lKGVudHJ5LmdldCgiUyIpLCAiSmF2YVNjcmlwdCIpKSB7CiAgICAgIGNvbnN0IGpzID0gZW50cnkuZ2V0KCJKUyIpOwogICAgICBsZXQgY29kZTsKICAgICAgaWYgKGpzIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvZGUgPSBqcy5nZXRTdHJpbmcoKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YganMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29kZSA9IGpzOwogICAgICB9CiAgICAgIGNvZGUgJiY9IHN0cmluZ1RvUERGU3RyaW5nKGNvZGUpLnJlcGxhY2VBbGwoIlx4MDAiLCAiIik7CiAgICAgIGlmIChjb2RlKSB7CiAgICAgICAgbGlzdC5wdXNoKGNvZGUpOwogICAgICB9CiAgICB9CiAgICBfY29sbGVjdEpTKGVudHJ5LmdldFJhdygiTmV4dCIpLCB4cmVmLCBsaXN0LCBwYXJlbnRzKTsKICB9CiAgaWYgKHBhcmVudCkgewogICAgcGFyZW50cy5yZW1vdmUocGFyZW50KTsKICB9Cn0KZnVuY3Rpb24gY29sbGVjdEFjdGlvbnMoeHJlZiwgZGljdCwgZXZlbnRUeXBlKSB7CiAgY29uc3QgYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgYWRkaXRpb25hbEFjdGlvbnNEaWN0cyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgZGljdCwKICAgIGtleTogIkFBIiwKICAgIHN0b3BXaGVuRm91bmQ6IGZhbHNlCiAgfSk7CiAgaWYgKGFkZGl0aW9uYWxBY3Rpb25zRGljdHMpIHsKICAgIGZvciAobGV0IGkgPSBhZGRpdGlvbmFsQWN0aW9uc0RpY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IGFkZGl0aW9uYWxBY3Rpb25zID0gYWRkaXRpb25hbEFjdGlvbnNEaWN0c1tpXTsKICAgICAgaWYgKCEoYWRkaXRpb25hbEFjdGlvbnMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFkZGl0aW9uYWxBY3Rpb25zLmdldEtleXMoKSkgewogICAgICAgIGNvbnN0IGFjdGlvbiA9IGV2ZW50VHlwZVtrZXldOwogICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYWN0aW9uRGljdCA9IGFkZGl0aW9uYWxBY3Rpb25zLmdldFJhdyhrZXkpOwogICAgICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgUmVmU2V0KCk7CiAgICAgICAgY29uc3QgbGlzdCA9IFtdOwogICAgICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYWN0aW9uc1thY3Rpb25dID0gbGlzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGRpY3QuaGFzKCJBIikpIHsKICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBkaWN0LmdldCgiQSIpOwogICAgY29uc3QgcGFyZW50cyA9IG5ldyBSZWZTZXQoKTsKICAgIGNvbnN0IGxpc3QgPSBbXTsKICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICBpZiAobGlzdC5sZW5ndGggPiAwKSB7CiAgICAgIGFjdGlvbnMuQWN0aW9uID0gbGlzdDsKICAgIH0KICB9CiAgcmV0dXJuIG9iamVjdFNpemUoYWN0aW9ucykgPiAwID8gYWN0aW9ucyA6IG51bGw7Cn0KY29uc3QgWE1MRW50aXRpZXMgPSB7CiAgMHgzYzogIiZsdDsiLAogIDB4M2U6ICImZ3Q7IiwKICAweDI2OiAiJmFtcDsiLAogIDB4MjI6ICImcXVvdDsiLAogIDB4Mjc6ICImYXBvczsiCn07CmZ1bmN0aW9uKiBjb2RlUG9pbnRJdGVyKHN0cikgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyID0gc3RyLmNvZGVQb2ludEF0KGkpOwogICAgaWYgKGNoYXIgPiAweGQ3ZmYgJiYgKGNoYXIgPCAweGUwMDAgfHwgY2hhciA+IDB4ZmZmZCkpIHsKICAgICAgaSsrOwogICAgfQogICAgeWllbGQgY2hhcjsKICB9Cn0KZnVuY3Rpb24gZW5jb2RlVG9YbWxTdHJpbmcoc3RyKSB7CiAgY29uc3QgYnVmZmVyID0gW107CiAgbGV0IHN0YXJ0ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jb2RlUG9pbnRBdChpKTsKICAgIGlmICgweDIwIDw9IGNoYXIgJiYgY2hhciA8PSAweDdlKSB7CiAgICAgIGNvbnN0IGVudGl0eSA9IFhNTEVudGl0aWVzW2NoYXJdOwogICAgICBpZiAoZW50aXR5KSB7CiAgICAgICAgaWYgKHN0YXJ0IDwgaSkgewogICAgICAgICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgIH0KICAgICAgICBidWZmZXIucHVzaChlbnRpdHkpOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goYCYjeCR7Y2hhci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX07YCk7CiAgICAgIGlmIChjaGFyID4gMHhkN2ZmICYmIChjaGFyIDwgMHhlMDAwIHx8IGNoYXIgPiAweGZmZmQpKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICB9CiAgfQogIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gc3RyOwogIH0KICBpZiAoc3RhcnQgPCBzdHIubGVuZ3RoKSB7CiAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBzdHIubGVuZ3RoKSk7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KZnVuY3Rpb24gdmFsaWRhdGVGb250TmFtZShmb250RmFtaWx5LCBtdXN0V2FybiA9IGZhbHNlKSB7CiAgY29uc3QgbSA9IC9eKCJ8JykuKigifCcpJC8uZXhlYyhmb250RmFtaWx5KTsKICBpZiAobSAmJiBtWzFdID09PSBtWzJdKSB7CiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYFteXFxcXF0ke21bMV19YCk7CiAgICBpZiAocmUudGVzdChmb250RmFtaWx5LnNsaWNlKDEsIC0xKSkpIHsKICAgICAgaWYgKG11c3RXYXJuKSB7CiAgICAgICAgd2FybihgRm9udEZhbWlseSBjb250YWlucyB1bmVzY2FwZWQgJHttWzFdfTogJHtmb250RmFtaWx5fS5gKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoY29uc3QgaWRlbnQgb2YgZm9udEZhbWlseS5zcGxpdCgvWyBcdF0rLykpIHsKICAgICAgaWYgKC9eKFxkfCgtKFxkfC0pKSkvLnRlc3QoaWRlbnQpIHx8ICEvXltcdy1cXF0rJC8udGVzdChpZGVudCkpIHsKICAgICAgICBpZiAobXVzdFdhcm4pIHsKICAgICAgICAgIHdhcm4oYEZvbnRGYW1pbHkgY29udGFpbnMgaW52YWxpZCA8Y3VzdG9tLWlkZW50PjogJHtmb250RmFtaWx5fS5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIHZhbGlkYXRlQ1NTRm9udChjc3NGb250SW5mbykgewogIGNvbnN0IERFRkFVTFRfQ1NTX0ZPTlRfT0JMSVFVRSA9ICIxNCI7CiAgY29uc3QgREVGQVVMVF9DU1NfRk9OVF9XRUlHSFQgPSAiNDAwIjsKICBjb25zdCBDU1NfRk9OVF9XRUlHSFRfVkFMVUVTID0gbmV3IFNldChbIjEwMCIsICIyMDAiLCAiMzAwIiwgIjQwMCIsICI1MDAiLCAiNjAwIiwgIjcwMCIsICI4MDAiLCAiOTAwIiwgIjEwMDAiLCAibm9ybWFsIiwgImJvbGQiLCAiYm9sZGVyIiwgImxpZ2h0ZXIiXSk7CiAgY29uc3QgewogICAgZm9udEZhbWlseSwKICAgIGZvbnRXZWlnaHQsCiAgICBpdGFsaWNBbmdsZQogIH0gPSBjc3NGb250SW5mbzsKICBpZiAoIXZhbGlkYXRlRm9udE5hbWUoZm9udEZhbWlseSwgdHJ1ZSkpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgY29uc3Qgd2VpZ2h0ID0gZm9udFdlaWdodCA/IGZvbnRXZWlnaHQudG9TdHJpbmcoKSA6ICIiOwogIGNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQgPSBDU1NfRk9OVF9XRUlHSFRfVkFMVUVTLmhhcyh3ZWlnaHQpID8gd2VpZ2h0IDogREVGQVVMVF9DU1NfRk9OVF9XRUlHSFQ7CiAgY29uc3QgYW5nbGUgPSBwYXJzZUZsb2F0KGl0YWxpY0FuZ2xlKTsKICBjc3NGb250SW5mby5pdGFsaWNBbmdsZSA9IGlzTmFOKGFuZ2xlKSB8fCBhbmdsZSA8IC05MCB8fCBhbmdsZSA+IDkwID8gREVGQVVMVF9DU1NfRk9OVF9PQkxJUVVFIDogaXRhbGljQW5nbGUudG9TdHJpbmcoKTsKICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiByZWNvdmVySnNVUkwoc3RyKSB7CiAgY29uc3QgVVJMX09QRU5fTUVUSE9EUyA9IFsiYXBwLmxhdW5jaFVSTCIsICJ3aW5kb3cub3BlbiIsICJ4ZmEuaG9zdC5nb3RvVVJMIl07CiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCJeXFxzKigiICsgVVJMX09QRU5fTUVUSE9EUy5qb2luKCJ8IikucmVwbGFjZUFsbCgiLiIsICJcXC4iKSArICIpXFwoKD86J3xcIikoW14nXCJdKikoPzonfFwiKSg/OixcXHMqKFxcdyspXFwpfFxcKSkiLCAiaSIpOwogIGNvbnN0IGpzVXJsID0gcmVnZXguZXhlYyhzdHIpOwogIGlmIChqc1VybD8uWzJdKSB7CiAgICByZXR1cm4gewogICAgICB1cmw6IGpzVXJsWzJdLAogICAgICBuZXdXaW5kb3c6IGpzVXJsWzFdID09PSAiYXBwLmxhdW5jaFVSTCIgJiYganNVcmxbM10gPT09ICJ0cnVlIgogICAgfTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gbnVtYmVyVG9TdHJpbmcodmFsdWUpIHsKICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwogIH0KICBjb25zdCByb3VuZGVkVmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlICogMTAwKTsKICBpZiAocm91bmRlZFZhbHVlICUgMTAwID09PSAwKSB7CiAgICByZXR1cm4gKHJvdW5kZWRWYWx1ZSAvIDEwMCkudG9TdHJpbmcoKTsKICB9CiAgaWYgKHJvdW5kZWRWYWx1ZSAlIDEwID09PSAwKSB7CiAgICByZXR1cm4gdmFsdWUudG9GaXhlZCgxKTsKICB9CiAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMik7Cn0KZnVuY3Rpb24gZ2V0TmV3QW5ub3RhdGlvbnNNYXAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICBpZiAoIWFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbmV3QW5ub3RhdGlvbnNCeVBhZ2UgPSBuZXcgTWFwKCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoQW5ub3RhdGlvbkVkaXRvclByZWZpeCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYW5ub3RhdGlvbnMgPSBuZXdBbm5vdGF0aW9uc0J5UGFnZS5nZXQodmFsdWUucGFnZUluZGV4KTsKICAgIGlmICghYW5ub3RhdGlvbnMpIHsKICAgICAgYW5ub3RhdGlvbnMgPSBbXTsKICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2Uuc2V0KHZhbHVlLnBhZ2VJbmRleCwgYW5ub3RhdGlvbnMpOwogICAgfQogICAgYW5ub3RhdGlvbnMucHVzaCh2YWx1ZSk7CiAgfQogIHJldHVybiBuZXdBbm5vdGF0aW9uc0J5UGFnZS5zaXplID4gMCA/IG5ld0Fubm90YXRpb25zQnlQYWdlIDogbnVsbDsKfQpmdW5jdGlvbiBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHN0cikgewogIHJldHVybiBpc0FzY2lpKHN0cikgPyBzdHIgOiBzdHJpbmdUb1VURjE2U3RyaW5nKHN0ciwgdHJ1ZSk7Cn0KZnVuY3Rpb24gaXNBc2NpaShzdHIpIHsKICByZXR1cm4gL15bXHgwMC1ceDdGXSokLy50ZXN0KHN0cik7Cn0KZnVuY3Rpb24gc3RyaW5nVG9VVEYxNkhleFN0cmluZyhzdHIpIHsKICBjb25zdCBidWYgPSBbXTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgYnVmLnB1c2goaGV4TnVtYmVyc1tjaGFyID4+IDggJiAweGZmXSwgaGV4TnVtYmVyc1tjaGFyICYgMHhmZl0pOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvVVRGMTZTdHJpbmcoc3RyLCBiaWdFbmRpYW4gPSBmYWxzZSkgewogIGNvbnN0IGJ1ZiA9IFtdOwogIGlmIChiaWdFbmRpYW4pIHsKICAgIGJ1Zi5wdXNoKCJceEZFXHhGRiIpOwogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgYnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyID4+IDggJiAweGZmKSwgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyICYgMHhmZikpOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCB3aWR0aCwgaGVpZ2h0KSB7CiAgc3dpdGNoIChyb3RhdGlvbikgewogICAgY2FzZSA5MDoKICAgICAgcmV0dXJuIFswLCAxLCAtMSwgMCwgd2lkdGgsIDBdOwogICAgY2FzZSAxODA6CiAgICAgIHJldHVybiBbLTEsIDAsIDAsIC0xLCB3aWR0aCwgaGVpZ2h0XTsKICAgIGNhc2UgMjcwOgogICAgICByZXR1cm4gWzAsIC0xLCAxLCAwLCAwLCBoZWlnaHRdOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJvdGF0aW9uIik7CiAgfQp9CmZ1bmN0aW9uIGdldFNpemVJbkJ5dGVzKHgpIHsKICByZXR1cm4gTWF0aC5jZWlsKE1hdGguY2VpbChNYXRoLmxvZzIoMSArIHgpKSAvIDgpOwp9Cgo7Ly8gLi9leHRlcm5hbC9xY21zL3FjbXNfdXRpbHMuanMKY2xhc3MgUUNNUyB7CiAgc3RhdGljIF9tb2R1bGUgPSBudWxsOwogIHN0YXRpYyBfbXVzdEFkZEFscGhhID0gZmFsc2U7CiAgc3RhdGljIF9kZXN0QnVmZmVyID0gbnVsbDsKfQpmdW5jdGlvbiBjb3B5X3Jlc3VsdChwdHIsIGxlbikgewogIGNvbnN0IHsKICAgIF9tb2R1bGUsCiAgICBfbXVzdEFkZEFscGhhLAogICAgX2Rlc3RCdWZmZXIKICB9ID0gUUNNUzsKICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShfbW9kdWxlLm1lbW9yeS5idWZmZXIsIHB0ciwgbGVuKTsKICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gX2Rlc3RCdWZmZXIubGVuZ3RoKSB7CiAgICBfZGVzdEJ1ZmZlci5zZXQocmVzdWx0KTsKICAgIHJldHVybjsKICB9CiAgaWYgKF9tdXN0QWRkQWxwaGEpIHsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMywgaiArPSA0KSB7CiAgICAgIF9kZXN0QnVmZmVyW2pdID0gcmVzdWx0W2ldOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMV0gPSByZXN1bHRbaSArIDFdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMl0gPSByZXN1bHRbaSArIDJdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgM10gPSAyNTU7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMywgaiArPSA0KSB7CiAgICAgIF9kZXN0QnVmZmVyW2pdID0gcmVzdWx0W2ldOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMV0gPSByZXN1bHRbaSArIDFdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMl0gPSByZXN1bHRbaSArIDJdOwogICAgfQogIH0KfQpmdW5jdGlvbiBjb3B5X3JnYihwdHIpIHsKICBRQ01TLl9kZXN0QnVmZmVyLnNldChuZXcgVWludDhBcnJheShRQ01TLl9tb2R1bGUubWVtb3J5LmJ1ZmZlciwgcHRyLCAzKSk7Cn0KCjsvLyAuL2V4dGVybmFsL3FjbXMvcWNtcy5qcwoKbGV0IHdhc207CmNvbnN0IGNhY2hlZFRleHREZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyA/IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7CiAgaWdub3JlQk9NOiB0cnVlLAogIGZhdGFsOiB0cnVlCn0pIDogewogIGRlY29kZTogKCkgPT4gewogICAgdGhyb3cgRXJyb3IoJ1RleHREZWNvZGVyIG5vdCBhdmFpbGFibGUnKTsKICB9Cn07CmlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7CiAgY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKCk7Cn0KOwpsZXQgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBudWxsOwpmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpIHsKICBpZiAoY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPT09IG51bGwgfHwgY2FjaGVkVWludDhBcnJheU1lbW9yeTAuYnl0ZUxlbmd0aCA9PT0gMCkgewogICAgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBuZXcgVWludDhBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpOwogIH0KICByZXR1cm4gY2FjaGVkVWludDhBcnJheU1lbW9yeTA7Cn0KZnVuY3Rpb24gZ2V0U3RyaW5nRnJvbVdhc20wKHB0ciwgbGVuKSB7CiAgcHRyID0gcHRyID4+PiAwOwogIHJldHVybiBjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIsIHB0ciArIGxlbikpOwp9CmxldCBXQVNNX1ZFQ1RPUl9MRU4gPSAwOwpmdW5jdGlvbiBwYXNzQXJyYXk4VG9XYXNtMChhcmcsIG1hbGxvYykgewogIGNvbnN0IHB0ciA9IG1hbGxvYyhhcmcubGVuZ3RoICogMSwgMSkgPj4+IDA7CiAgZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zZXQoYXJnLCBwdHIgLyAxKTsKICBXQVNNX1ZFQ1RPUl9MRU4gPSBhcmcubGVuZ3RoOwogIHJldHVybiBwdHI7Cn0KZnVuY3Rpb24gcWNtc19jb252ZXJ0X2FycmF5KHRyYW5zZm9ybWVyLCBzcmMpIHsKICBjb25zdCBwdHIwID0gcGFzc0FycmF5OFRvV2FzbTAoc3JjLCB3YXNtLl9fd2JpbmRnZW5fbWFsbG9jKTsKICBjb25zdCBsZW4wID0gV0FTTV9WRUNUT1JfTEVOOwogIHdhc20ucWNtc19jb252ZXJ0X2FycmF5KHRyYW5zZm9ybWVyLCBwdHIwLCBsZW4wKTsKfQpmdW5jdGlvbiBxY21zX2NvbnZlcnRfb25lKHRyYW5zZm9ybWVyLCBzcmMpIHsKICB3YXNtLnFjbXNfY29udmVydF9vbmUodHJhbnNmb3JtZXIsIHNyYyk7Cn0KZnVuY3Rpb24gcWNtc19jb252ZXJ0X3RocmVlKHRyYW5zZm9ybWVyLCBzcmMxLCBzcmMyLCBzcmMzKSB7CiAgd2FzbS5xY21zX2NvbnZlcnRfdGhyZWUodHJhbnNmb3JtZXIsIHNyYzEsIHNyYzIsIHNyYzMpOwp9CmZ1bmN0aW9uIHFjbXNfY29udmVydF9mb3VyKHRyYW5zZm9ybWVyLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KSB7CiAgd2FzbS5xY21zX2NvbnZlcnRfZm91cih0cmFuc2Zvcm1lciwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Cn0KZnVuY3Rpb24gcWNtc190cmFuc2Zvcm1lcl9mcm9tX21lbW9yeShtZW0sIGluX3R5cGUsIGludGVudCkgewogIGNvbnN0IHB0cjAgPSBwYXNzQXJyYXk4VG9XYXNtMChtZW0sIHdhc20uX193YmluZGdlbl9tYWxsb2MpOwogIGNvbnN0IGxlbjAgPSBXQVNNX1ZFQ1RPUl9MRU47CiAgY29uc3QgcmV0ID0gd2FzbS5xY21zX3RyYW5zZm9ybWVyX2Zyb21fbWVtb3J5KHB0cjAsIGxlbjAsIGluX3R5cGUsIGludGVudCk7CiAgcmV0dXJuIHJldCA+Pj4gMDsKfQpmdW5jdGlvbiBxY21zX2Ryb3BfdHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpIHsKICB3YXNtLnFjbXNfZHJvcF90cmFuc2Zvcm1lcih0cmFuc2Zvcm1lcik7Cn0KY29uc3QgRGF0YVR5cGUgPSBPYmplY3QuZnJlZXplKHsKICBSR0I4OiAwLAogICIwIjogIlJHQjgiLAogIFJHQkE4OiAxLAogICIxIjogIlJHQkE4IiwKICBCR1JBODogMiwKICAiMiI6ICJCR1JBOCIsCiAgR3JheTg6IDMsCiAgIjMiOiAiR3JheTgiLAogIEdyYXlBODogNCwKICAiNCI6ICJHcmF5QTgiLAogIENNWUs6IDUsCiAgIjUiOiAiQ01ZSyIKfSk7CmNvbnN0IEludGVudCA9IE9iamVjdC5mcmVlemUoewogIFBlcmNlcHR1YWw6IDAsCiAgIjAiOiAiUGVyY2VwdHVhbCIsCiAgUmVsYXRpdmVDb2xvcmltZXRyaWM6IDEsCiAgIjEiOiAiUmVsYXRpdmVDb2xvcmltZXRyaWMiLAogIFNhdHVyYXRpb246IDIsCiAgIjIiOiAiU2F0dXJhdGlvbiIsCiAgQWJzb2x1dGVDb2xvcmltZXRyaWM6IDMsCiAgIjMiOiAiQWJzb2x1dGVDb2xvcmltZXRyaWMiCn0pOwphc3luYyBmdW5jdGlvbiBfX3diZ19sb2FkKG1vZHVsZSwgaW1wb3J0cykgewogIGlmICh0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbicgJiYgbW9kdWxlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKICAgIGlmICh0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobW9kdWxlLCBpbXBvcnRzKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChtb2R1bGUuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpICE9ICdhcHBsaWNhdGlvbi93YXNtJykgewogICAgICAgICAgY29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIiwgZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBieXRlcyA9IGF3YWl0IG1vZHVsZS5hcnJheUJ1ZmZlcigpOwogICAgcmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ5dGVzLCBpbXBvcnRzKTsKICB9IGVsc2UgewogICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2R1bGUsIGltcG9ydHMpOwogICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2UpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBpbnN0YW5jZSwKICAgICAgICBtb2R1bGUKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMoKSB7CiAgY29uc3QgaW1wb3J0cyA9IHt9OwogIGltcG9ydHMud2JnID0ge307CiAgaW1wb3J0cy53YmcuX193YmdfY29weXJlc3VsdF9iMDhlZTdkMjczZjI5NWRkID0gZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgIGNvcHlfcmVzdWx0KGFyZzAgPj4+IDAsIGFyZzEgPj4+IDApOwogIH07CiAgaW1wb3J0cy53YmcuX193YmdfY29weXJnYl9kNjBjZTE3YmIwNWQ5YjY3ID0gZnVuY3Rpb24gKGFyZzApIHsKICAgIGNvcHlfcmdiKGFyZzAgPj4+IDApOwogIH07CiAgaW1wb3J0cy53YmcuX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgIGNvbnN0IHRhYmxlID0gd2FzbS5fX3diaW5kZ2VuX2V4cG9ydF8wOwogICAgY29uc3Qgb2Zmc2V0ID0gdGFibGUuZ3Jvdyg0KTsKICAgIHRhYmxlLnNldCgwLCB1bmRlZmluZWQpOwogICAgdGFibGUuc2V0KG9mZnNldCArIDAsIHVuZGVmaW5lZCk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMSwgbnVsbCk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMiwgdHJ1ZSk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMywgZmFsc2UpOwogIH07CiAgaW1wb3J0cy53YmcuX193YmluZGdlbl90aHJvdyA9IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICB9OwogIHJldHVybiBpbXBvcnRzOwp9CmZ1bmN0aW9uIF9fd2JnX2luaXRfbWVtb3J5KGltcG9ydHMsIG1lbW9yeSkge30KZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSwgbW9kdWxlKSB7CiAgd2FzbSA9IGluc3RhbmNlLmV4cG9ydHM7CiAgX193YmdfaW5pdC5fX3diaW5kZ2VuX3dhc21fbW9kdWxlID0gbW9kdWxlOwogIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbnVsbDsKICB3YXNtLl9fd2JpbmRnZW5fc3RhcnQoKTsKICByZXR1cm4gd2FzbTsKfQpmdW5jdGlvbiBpbml0U3luYyhtb2R1bGUpIHsKICBpZiAod2FzbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd2FzbTsKICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kdWxlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgewogICAgICAoewogICAgICAgIG1vZHVsZQogICAgICB9ID0gbW9kdWxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUud2FybigndXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciBgaW5pdFN5bmMoKWA7IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQnKTsKICAgIH0KICB9CiAgY29uc3QgaW1wb3J0cyA9IF9fd2JnX2dldF9pbXBvcnRzKCk7CiAgX193YmdfaW5pdF9tZW1vcnkoaW1wb3J0cyk7CiAgaWYgKCEobW9kdWxlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSkgewogICAgbW9kdWxlID0gbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShtb2R1bGUpOwogIH0KICBjb25zdCBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpOwogIHJldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLCBtb2R1bGUpOwp9CmFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQobW9kdWxlX29yX3BhdGgpIHsKICBpZiAod2FzbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd2FzbTsKICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoICE9PSAndW5kZWZpbmVkJykgewogICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGVfb3JfcGF0aCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHsKICAgICAgKHsKICAgICAgICBtb2R1bGVfb3JfcGF0aAogICAgICB9ID0gbW9kdWxlX29yX3BhdGgpOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS53YXJuKCd1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCcpOwogICAgfQogIH0KICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoID09PSAndW5kZWZpbmVkJykgewogICAgbW9kdWxlX29yX3BhdGggPSBuZXcgVVJMKCdxY21zX2JnLndhc20nLCBpbXBvcnQubWV0YS51cmwpOwogIH0KICBjb25zdCBpbXBvcnRzID0gX193YmdfZ2V0X2ltcG9ydHMoKTsKICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFJlcXVlc3QgfHwgdHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkgewogICAgbW9kdWxlX29yX3BhdGggPSBmZXRjaChtb2R1bGVfb3JfcGF0aCk7CiAgfQogIF9fd2JnX2luaXRfbWVtb3J5KGltcG9ydHMpOwogIGNvbnN0IHsKICAgIGluc3RhbmNlLAogICAgbW9kdWxlCiAgfSA9IGF3YWl0IF9fd2JnX2xvYWQoYXdhaXQgbW9kdWxlX29yX3BhdGgsIGltcG9ydHMpOwogIHJldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLCBtb2R1bGUpOwp9CgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IHFjbXMgPSAoKC8qIHVudXNlZCBwdXJlIGV4cHJlc3Npb24gb3Igc3VwZXIgKi8gbnVsbCAmJiAoX193YmdfaW5pdCkpKTsKOy8vIC4vc3JjL2NvcmUvY29sb3JzcGFjZS5qcwoKCmZ1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKHNyYywgZGVzdCwgdzEsIGgxLCB3MiwgaDIsIGFscGhhMDEpIHsKICBjb25zdCBDT01QT05FTlRTID0gMzsKICBhbHBoYTAxID0gYWxwaGEwMSAhPT0gMSA/IDAgOiBhbHBoYTAxOwogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwLAogICAgb2xkSW5kZXg7CiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CiAgY29uc3QgdzFTY2FubGluZSA9IHcxICogQ09NUE9ORU5UUzsKICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pICogQ09NUE9ORU5UUzsKICB9CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICBjb25zdCBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBuZXdJbmRleCArPSBhbHBoYTAxOwogICAgfQogIH0KfQpmdW5jdGlvbiByZXNpemVSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCB3MSwgaDEsIHcyLCBoMiwgYWxwaGEwMSkgewogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwOwogIGNvbnN0IHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpOwogIGlmIChhbHBoYTAxID09PSAxKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7CiAgICB9CiAgICBjb25zdCBzcmMzMiA9IG5ldyBVaW50MzJBcnJheShzcmMuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgICBjb25zdCByZ2JNYXNrID0gRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweDAwZmZmZmZmIDogMHhmZmZmZmYwMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaDI7IGkrKykgewogICAgICBjb25zdCBidWYgPSBzcmMzMi5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzEpOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHcyOyBqKyspIHsKICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gfD0gYnVmW3hTY2FsZWRbal1dICYgcmdiTWFzazsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBjb25zdCBDT01QT05FTlRTID0gNDsKICAgIGNvbnN0IHcxU2NhbmxpbmUgPSB3MSAqIENPTVBPTkVOVFM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbykgKiBDT01QT05FTlRTOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICAgIGNvbnN0IGJ1ZiA9IHNyYy5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdzI7IGorKykgewogICAgICAgIGNvbnN0IG9sZEluZGV4ID0geFNjYWxlZFtqXTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4XTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4ICsgMV07CiAgICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IGJ1ZltvbGRJbmRleCArIDJdOwogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGNvcHlSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCBhbHBoYTAxKSB7CiAgaWYgKGFscGhhMDEgPT09IDEpIHsKICAgIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIpOwogICAgY29uc3QgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyKTsKICAgIGNvbnN0IHJnYk1hc2sgPSBGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4MDBmZmZmZmYgOiAweGZmZmZmZjAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0MzJbaV0gfD0gc3JjMzJbaV0gJiByZ2JNYXNrOwogICAgfQogIH0gZWxzZSB7CiAgICBsZXQgaiA9IDA7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkgewogICAgICBkZXN0W2orK10gPSBzcmNbaV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMl07CiAgICB9CiAgfQp9CmNsYXNzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKG5hbWUsIG51bUNvbXBzKSB7CiAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgdGhpcy5udW1Db21wcyA9IG51bUNvbXBzOwogIH0KICBnZXRSZ2Ioc3JjLCBzcmNPZmZzZXQpIHsKICAgIGNvbnN0IHJnYiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICAgIHRoaXMuZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgcmdiLCAwKTsKICAgIHJldHVybiByZ2I7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIik7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoIik7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIHJldHVybiBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIHRoaXMubnVtQ29tcHMpOwogIH0KICBmaWxsUmdiKGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWxXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0OwogICAgbGV0IHJnYkJ1ZiA9IG51bGw7CiAgICBjb25zdCBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYzsKICAgIGNvbnN0IG5lZWRzUmVzaXppbmcgPSBvcmlnaW5hbEhlaWdodCAhPT0gaGVpZ2h0IHx8IG9yaWdpbmFsV2lkdGggIT09IHdpZHRoOwogICAgaWYgKHRoaXMuaXNQYXNzdGhyb3VnaChicGMpKSB7CiAgICAgIHJnYkJ1ZiA9IGNvbXBzOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBzID09PSAxICYmIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmIHRoaXMubmFtZSAhPT0gIkRldmljZUdyYXkiICYmIHRoaXMubmFtZSAhPT0gIkRldmljZVJHQiIpIHsKICAgICAgY29uc3QgYWxsQ29sb3JzID0gYnBjIDw9IDggPyBuZXcgVWludDhBcnJheShudW1Db21wb25lbnRDb2xvcnMpIDogbmV3IFVpbnQxNkFycmF5KG51bUNvbXBvbmVudENvbG9ycyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50Q29sb3JzOyBpKyspIHsKICAgICAgICBhbGxDb2xvcnNbaV0gPSBpOwogICAgICB9CiAgICAgIGNvbnN0IGNvbG9yTWFwID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG51bUNvbXBvbmVudENvbG9ycyAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihhbGxDb2xvcnMsIDAsIG51bUNvbXBvbmVudENvbG9ycywgY29sb3JNYXAsIDAsIGJwYywgMCk7CiAgICAgIGlmICghbmVlZHNSZXNpemluZykgewogICAgICAgIGxldCBkZXN0UG9zID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgIGNvbnN0IGtleSA9IGNvbXBzW2ldICogMzsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleSArIDJdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZ2JCdWYgPSBuZXcgVWludDhBcnJheShjb3VudCAqIDMpOwogICAgICAgIGxldCByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgY29uc3Qga2V5ID0gY29tcHNbaV0gKiAzOwogICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMl07CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CiAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGNvbXBzLCAwLCB3aWR0aCAqIGFjdHVhbEhlaWdodCwgZGVzdCwgMCwgYnBjLCBhbHBoYTAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb3VudCAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAwKTsKICAgIH0KICAgIGlmIChyZ2JCdWYpIHsKICAgICAgaWYgKG5lZWRzUmVzaXppbmcpIHsKICAgICAgICByZXNpemVSZ2JJbWFnZShyZ2JCdWYsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGVzdFBvcyA9IDAsCiAgICAgICAgICByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7IGkrKykgewogICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgdHJ1ZSk7CiAgfQogIHN0YXRpYyBpc0RlZmF1bHREZWNvZGUoZGVjb2RlLCBudW1Db21wcykgewogICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAobnVtQ29tcHMgKiAyICE9PSBkZWNvZGUubGVuZ3RoKSB7CiAgICAgIHdhcm4oIlRoZSBkZWNvZGUgbWFwIGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGgiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkZWNvZGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBpZiAoZGVjb2RlW2ldICE9PSAwIHx8IGRlY29kZVtpICsgMV0gIT09IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBBbHRlcm5hdGVDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKG51bUNvbXBzLCBiYXNlLCB0aW50Rm4pIHsKICAgIHN1cGVyKCJBbHRlcm5hdGUiLCBudW1Db21wcyk7CiAgICB0aGlzLmJhc2UgPSBiYXNlOwogICAgdGhpcy50aW50Rm4gPSB0aW50Rm47CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkoYmFzZS5udW1Db21wcyk7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGNvbnN0IHRtcEJ1ZiA9IHRoaXMudG1wQnVmOwogICAgdGhpcy50aW50Rm4oc3JjLCBzcmNPZmZzZXQsIHRtcEJ1ZiwgMCk7CiAgICB0aGlzLmJhc2UuZ2V0UmdiSXRlbSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCB0aW50Rm4gPSB0aGlzLnRpbnRGbjsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7CiAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGNvbnN0IGJhc2VOdW1Db21wcyA9IGJhc2UubnVtQ29tcHM7CiAgICBjb25zdCB1c2VzWmVyb1RvT25lUmFuZ2UgPSBiYXNlLnVzZXNaZXJvVG9PbmVSYW5nZTsKICAgIGNvbnN0IGlzUGFzc3Rocm91Z2ggPSAoYmFzZS5pc1Bhc3N0aHJvdWdoKDgpIHx8ICF1c2VzWmVyb1RvT25lUmFuZ2UpICYmIGFscGhhMDEgPT09IDA7CiAgICBsZXQgcG9zID0gaXNQYXNzdGhyb3VnaCA/IGRlc3RPZmZzZXQgOiAwOwogICAgY29uc3QgYmFzZUJ1ZiA9IGlzUGFzc3Rocm91Z2ggPyBkZXN0IDogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJhc2VOdW1Db21wcyAqIGNvdW50KTsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IHNjYWxlZCA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOwogICAgY29uc3QgdGludGVkID0gbmV3IEZsb2F0MzJBcnJheShiYXNlTnVtQ29tcHMpOwogICAgbGV0IGksIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgewogICAgICAgIHNjYWxlZFtqXSA9IHNyY1tzcmNPZmZzZXQrK10gKiBzY2FsZTsKICAgICAgfQogICAgICB0aW50Rm4oc2NhbGVkLCAwLCB0aW50ZWQsIDApOwogICAgICBpZiAodXNlc1plcm9Ub09uZVJhbmdlKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhc2VOdW1Db21wczsgaisrKSB7CiAgICAgICAgICBiYXNlQnVmW3BvcysrXSA9IHRpbnRlZFtqXSAqIDI1NTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFzZS5nZXRSZ2JJdGVtKHRpbnRlZCwgMCwgYmFzZUJ1ZiwgcG9zKTsKICAgICAgICBwb3MgKz0gYmFzZU51bUNvbXBzOwogICAgICB9CiAgICB9CiAgICBpZiAoIWlzUGFzc3Rocm91Z2gpIHsKICAgICAgYmFzZS5nZXRSZ2JCdWZmZXIoYmFzZUJ1ZiwgMCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIDgsIGFscGhhMDEpOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoICogdGhpcy5iYXNlLm51bUNvbXBzIC8gdGhpcy5udW1Db21wcywgYWxwaGEwMSk7CiAgfQp9CmNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKGJhc2VDUykgewogICAgc3VwZXIoIlBhdHRlcm4iLCBudWxsKTsKICAgIHRoaXMuYmFzZSA9IGJhc2VDUzsKICB9CiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CiAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKTsKICB9Cn0KY2xhc3MgSW5kZXhlZENTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoYmFzZSwgaGlnaFZhbCwgbG9va3VwKSB7CiAgICBzdXBlcigiSW5kZXhlZCIsIDEpOwogICAgdGhpcy5iYXNlID0gYmFzZTsKICAgIGNvbnN0IGxlbmd0aCA9IGJhc2UubnVtQ29tcHMgKiAoaGlnaFZhbCArIDEpOwogICAgdGhpcy5sb29rdXAgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgaWYgKGxvb2t1cCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgY29uc3QgYnl0ZXMgPSBsb29rdXAuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgICAgdGhpcy5sb29rdXAuc2V0KGJ5dGVzKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvb2t1cCA9PT0gInN0cmluZyIpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIHRoaXMubG9va3VwW2ldID0gbG9va3VwLmNoYXJDb2RlQXQoaSkgJiAweGZmOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICR7bG9va3VwfWApOwogICAgfQogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMuYmFzZS5udW1Db21wczsKICAgIGNvbnN0IHN0YXJ0ID0gc3JjW3NyY09mZnNldF0gKiBudW1Db21wczsKICAgIHRoaXMuYmFzZS5nZXRSZ2JCdWZmZXIodGhpcy5sb29rdXAsIHN0YXJ0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCAwKTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3QgYmFzZSA9IHRoaXMuYmFzZTsKICAgIGNvbnN0IG51bUNvbXBzID0gYmFzZS5udW1Db21wczsKICAgIGNvbnN0IG91dHB1dERlbHRhID0gYmFzZS5nZXRPdXRwdXRMZW5ndGgobnVtQ29tcHMsIGFscGhhMDEpOwogICAgY29uc3QgbG9va3VwID0gdGhpcy5sb29rdXA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgY29uc3QgbG9va3VwUG9zID0gc3JjW3NyY09mZnNldCsrXSAqIG51bUNvbXBzOwogICAgICBiYXNlLmdldFJnYkJ1ZmZlcihsb29rdXAsIGxvb2t1cFBvcywgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7CiAgICAgIGRlc3RPZmZzZXQgKz0gb3V0cHV0RGVsdGE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGggKiB0aGlzLmJhc2UubnVtQ29tcHMsIGFscGhhMDEpOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGVNYXApKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGRlY29kZU1hcC5sZW5ndGggIT09IDIpIHsKICAgICAgd2FybigiRGVjb2RlIG1hcCBsZW5ndGggaXMgbm90IGNvcnJlY3QiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYnBjKSB8fCBicGMgPCAxKSB7CiAgICAgIHdhcm4oIkJpdHMgcGVyIGNvbXBvbmVudCBpcyBub3QgY29ycmVjdCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVNYXBbMF0gPT09IDAgJiYgZGVjb2RlTWFwWzFdID09PSAoMSA8PCBicGMpIC0gMTsKICB9Cn0KY2xhc3MgRGV2aWNlR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigiRGV2aWNlR3JheSIsIDEpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBjID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGM7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBsZXQgaiA9IHNyY09mZnNldCwKICAgICAgcSA9IGRlc3RPZmZzZXQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgY29uc3QgYyA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpOwogIH0KfQpjbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZVJHQiIsIDMpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc3JjW3NyY09mZnNldCArIDJdICogMjU1OwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBpZiAoYml0cyA9PT0gOCAmJiBhbHBoYTAxID09PSAwKSB7CiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50ICogMyksIGRlc3RPZmZzZXQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgbGV0IGogPSBzcmNPZmZzZXQsCiAgICAgIHEgPSBkZXN0T2Zmc2V0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGJpdHMgPT09IDg7CiAgfQp9CmNsYXNzIERldmljZVJnYmFDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZVJHQkEiLCA0KTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBfYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogNDsKICB9CiAgaXNQYXNzdGhyb3VnaChiaXRzKSB7CiAgICByZXR1cm4gYml0cyA9PT0gODsKICB9CiAgZmlsbFJnYihkZXN0LCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgd2lkdGgsIGhlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKSB7CiAgICBpZiAob3JpZ2luYWxIZWlnaHQgIT09IGhlaWdodCB8fCBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aCkgewogICAgICByZXNpemVSZ2JhSW1hZ2UoY29tcHMsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvcHlSZ2JhSW1hZ2UoY29tcHMsIGRlc3QsIGFscGhhMDEpOwogICAgfQogIH0KfQpjbGFzcyBEZXZpY2VDbXlrQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKCJEZXZpY2VDTVlLIiwgNCk7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgc3JjU2NhbGUsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGNvbnN0IGMgPSBzcmNbc3JjT2Zmc2V0XSAqIHNyY1NjYWxlOwogICAgY29uc3QgbSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNyY1NjYWxlOwogICAgY29uc3QgeSA9IHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNyY1NjYWxlOwogICAgY29uc3QgayA9IHNyY1tzcmNPZmZzZXQgKyAzXSAqIHNyY1NjYWxlOwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IDI1NSArIGMgKiAoLTQuMzg3MzMyMzg0NjA5OTg4ICogYyArIDU0LjQ4NjE1MTk0MTg5MTc2ICogbSArIDE4LjgyMjkwNTAyMTY1MzAyICogeSArIDIxMi4yNTY2MjQ1MTYzOTU4NSAqIGsgKyAtMjg1LjIzMzEwMjYxMzcwMDQpICsgbSAqICgxLjcxNDk3NjM0NzczNjIxMzQgKiBtIC0gNS42MDk2NzM2OTA0MDQ3MzE1ICogeSArIC0xNy44NzM4NzA4NjE0MTU0NDQgKiBrIC0gNS40OTcwMDY0MjcxOTYzNjYpICsgeSAqICgtMi41MjE3MzQwMTMxNjgzMDMzICogeSAtIDIxLjI0ODkyMzMzNzM1MzA3MyAqIGsgKyAxNy41MTE5MjcwODQxODEzKSArIGsgKiAoLTIxLjg2MTIyMTQ3NDYzNjA1ICogayAtIDE4OS40ODE4MDgzNTkyMjc0Nyk7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IDI1NSArIGMgKiAoOC44NDEwNDE0MjIwMzYxNDkgKiBjICsgNjAuMTE4MDI3MDQ1NTk3MzY2ICogbSArIDYuODcxNDI1NTkyMDQ5MDA3ICogeSArIDMxLjE1OTEwMDEzMDA1NTkyMiAqIGsgKyAtNzkuMjk3MDg0NDgxNjU0OCkgKyBtICogKC0xNS4zMTAzNjEzMDY5Njc4MTcgKiBtICsgMTcuNTc1MjUxMjYxMTA5NDgyICogeSArIDEzMS4zNTI1MDkxMjQ5Mzk3NiAqIGsgLSAxOTAuOTQ1MzMwMjU4ODk1MSkgKyB5ICogKDQuNDQ0MzM5MTAyODUyNzM5ICogeSArIDkuODYzMjg2MTQ5MzQwNSAqIGsgLSAyNC44Njc0MTU4MjU1NTg3OCkgKyBrICogKC0yMC43MzczMjU0NzExODEwMzQgKiBrIC0gMTg3LjgwNDUzNzA5NzE5NTc4KTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gMjU1ICsgYyAqICgwLjg4NDI1MjI0MzAwMDMyOTYgKiBjICsgOC4wNzg2Nzc1MDMxMTI5MjggKiBtICsgMzAuODk5NzgzMDk3MDM3MjkgKiB5IC0gMC4yMzg4MzIzODY4OTE3ODkzNCAqIGsgKyAtMTQuMTgzNTc2Nzk5NjczMjg2KSArIG0gKiAoMTAuNDk1OTMyNzM0MzIwNzIgKiBtICsgNjMuMDIzNzg0OTQ3NTQwNTIgKiB5ICsgNTAuNjA2OTU3NjU2MzYwNzM0ICogayAtIDExMi4yMzg4NDI1MzcxOTI0OCkgKyB5ICogKDAuMDMyOTYwNDExMTQ4NzMyMTcgKiB5ICsgMTE1LjYwMzg0NDQ5NjQ2NjQxICogayArIC0xOTMuNTgyMDkzNTY4NjE1MDUpICsgayAqICgtMjIuMzM4MTY4MDczMDk4ODYgKiBrIC0gMTgwLjEyNjEzOTc0NzA4MzY3KTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIDEsIGRlc3QsIGRlc3RPZmZzZXQpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgc2NhbGUsIGRlc3QsIGRlc3RPZmZzZXQpOwogICAgICBzcmNPZmZzZXQgKz0gNDsKICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggLyA0ICogKDMgKyBhbHBoYTAxKSB8IDA7CiAgfQp9CmNsYXNzIENhbEdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hKSB7CiAgICBzdXBlcigiQ2FsR3JheSIsIDEpOwogICAgaWYgKCF3aGl0ZVBvaW50KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTsKICAgIH0KICAgIFt0aGlzLlhXLCB0aGlzLllXLCB0aGlzLlpXXSA9IHdoaXRlUG9pbnQ7CiAgICBbdGhpcy5YQiwgdGhpcy5ZQiwgdGhpcy5aQl0gPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTsKICAgIHRoaXMuRyA9IGdhbW1hIHx8IDE7CiAgICBpZiAodGhpcy5YVyA8IDAgfHwgdGhpcy5aVyA8IDAgfHwgdGhpcy5ZVyAhPT0gMSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX0sIG5vIGZhbGxiYWNrIGF2YWlsYWJsZWApOwogICAgfQogICAgaWYgKHRoaXMuWEIgPCAwIHx8IHRoaXMuWUIgPCAwIHx8IHRoaXMuWkIgPCAwKSB7CiAgICAgIGluZm8oYEludmFsaWQgQmxhY2tQb2ludCBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDsKICAgIH0KICAgIGlmICh0aGlzLlhCICE9PSAwIHx8IHRoaXMuWUIgIT09IDAgfHwgdGhpcy5aQiAhPT0gMCkgewogICAgICB3YXJuKGAke3RoaXMubmFtZX0sIEJsYWNrUG9pbnQ6IFhCOiAke3RoaXMuWEJ9LCBZQjogJHt0aGlzLllCfSwgYCArIGBaQjogJHt0aGlzLlpCfSwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLmApOwogICAgfQogICAgaWYgKHRoaXMuRyA8IDEpIHsKICAgICAgaW5mbyhgSW52YWxpZCBHYW1tYTogJHt0aGlzLkd9IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApOwogICAgICB0aGlzLkcgPSAxOwogICAgfQogIH0KICAjdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKSB7CiAgICBjb25zdCBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTsKICAgIGNvbnN0IEFHID0gQSAqKiB0aGlzLkc7CiAgICBjb25zdCBMID0gdGhpcy5ZVyAqIEFHOwogICAgY29uc3QgdmFsID0gTWF0aC5tYXgoMjk1LjggKiBMICoqIDAuMzMzMzMzMzMzMzMzMzMzMyAtIDQwLjgsIDApOwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHZhbDsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdmFsOwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSB2YWw7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCAxKTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKICAgICAgc3JjT2Zmc2V0ICs9IDE7CiAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKICB9Cn0KY2xhc3MgQ2FsUkdCQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBzdGF0aWMgI0JSQURGT1JEX1NDQUxFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAuODk1MSwgMC4yNjY0LCAtMC4xNjE0LCAtMC43NTAyLCAxLjcxMzUsIDAuMDM2NywgMC4wMzg5LCAtMC4wNjg1LCAxLjAyOTZdKTsKICBzdGF0aWMgI0JSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMC45ODY5OTI5LCAtMC4xNDcwNTQzLCAwLjE1OTk2MjcsIDAuNDMyMzA1MywgMC41MTgzNjAzLCAwLjA0OTI5MTIsIC0wLjAwODUyODcsIDAuMDQwMDQyOCwgMC45Njg0ODY3XSk7CiAgc3RhdGljICNTUkdCX0Q2NV9YWVpfVE9fUkdCX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwgLTEuNTM3MTM4NSwgLTAuNDk4NTMxNCwgLTAuOTY5MjY2MCwgMS44NzYwMTA4LCAwLjA0MTU1NjAsIDAuMDU1NjQzNCwgLTAuMjA0MDI1OSwgMS4wNTcyMjUyXSk7CiAgc3RhdGljICNGTEFUX1dISVRFUE9JTlRfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pOwogIHN0YXRpYyAjdGVtcE5vcm1hbGl6ZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgc3RhdGljICN0ZW1wQ29udmVydE1hdHJpeDEgPSBuZXcgRmxvYXQzMkFycmF5KDMpOwogIHN0YXRpYyAjdGVtcENvbnZlcnRNYXRyaXgyID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKICBzdGF0aWMgI0RFQ09ERV9MX0NPTlNUQU5UID0gKCg4ICsgMTYpIC8gMTE2KSAqKiAzIC8gOC4wOwogIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hLCBtYXRyaXgpIHsKICAgIHN1cGVyKCJDYWxSR0IiLCAzKTsKICAgIGlmICghd2hpdGVQb2ludCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0IiKTsKICAgIH0KICAgIGNvbnN0IFtYVywgWVcsIFpXXSA9IHRoaXMud2hpdGVQb2ludCA9IHdoaXRlUG9pbnQ7CiAgICBjb25zdCBbWEIsIFlCLCBaQl0gPSB0aGlzLmJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgICBbdGhpcy5HUiwgdGhpcy5HRywgdGhpcy5HQl0gPSBnYW1tYSB8fCBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxXSk7CiAgICBbdGhpcy5NWEEsIHRoaXMuTVlBLCB0aGlzLk1aQSwgdGhpcy5NWEIsIHRoaXMuTVlCLCB0aGlzLk1aQiwgdGhpcy5NWEMsIHRoaXMuTVlDLCB0aGlzLk1aQ10gPSBtYXRyaXggfHwgbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV0pOwogICAgaWYgKFhXIDwgMCB8fCBaVyA8IDAgfHwgWVcgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9LCBubyBmYWxsYmFjayBhdmFpbGFibGVgKTsKICAgIH0KICAgIGlmIChYQiA8IDAgfHwgWUIgPCAwIHx8IFpCIDwgMCkgewogICAgICBpbmZvKGBJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICR7dGhpcy5uYW1lfSBbJHtYQn0sICR7WUJ9LCAke1pCfV0sIGAgKyAiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIik7CiAgICAgIHRoaXMuYmxhY2tQb2ludCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgICB9CiAgICBpZiAodGhpcy5HUiA8IDAgfHwgdGhpcy5HRyA8IDAgfHwgdGhpcy5HQiA8IDApIHsKICAgICAgaW5mbyhgSW52YWxpZCBHYW1tYSBbJHt0aGlzLkdSfSwgJHt0aGlzLkdHfSwgJHt0aGlzLkdCfV0gZm9yIGAgKyBgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKICAgICAgdGhpcy5HUiA9IHRoaXMuR0cgPSB0aGlzLkdCID0gMTsKICAgIH0KICB9CiAgI21hdHJpeFByb2R1Y3QoYSwgYiwgcmVzdWx0KSB7CiAgICByZXN1bHRbMF0gPSBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07CiAgICByZXN1bHRbMV0gPSBhWzNdICogYlswXSArIGFbNF0gKiBiWzFdICsgYVs1XSAqIGJbMl07CiAgICByZXN1bHRbMl0gPSBhWzZdICogYlswXSArIGFbN10gKiBiWzFdICsgYVs4XSAqIGJbMl07CiAgfQogICN0b0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCByZXN1bHQpIHsKICAgIHJlc3VsdFswXSA9IExNU1swXSAqIDEgLyBzb3VyY2VXaGl0ZVBvaW50WzBdOwogICAgcmVzdWx0WzFdID0gTE1TWzFdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07CiAgICByZXN1bHRbMl0gPSBMTVNbMl0gKiAxIC8gc291cmNlV2hpdGVQb2ludFsyXTsKICB9CiAgI3RvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7CiAgICBjb25zdCBENjVYID0gMC45NTA0NzsKICAgIGNvbnN0IEQ2NVkgPSAxOwogICAgY29uc3QgRDY1WiA9IDEuMDg4ODM7CiAgICByZXN1bHRbMF0gPSBMTVNbMF0gKiBENjVYIC8gc291cmNlV2hpdGVQb2ludFswXTsKICAgIHJlc3VsdFsxXSA9IExNU1sxXSAqIEQ2NVkgLyBzb3VyY2VXaGl0ZVBvaW50WzFdOwogICAgcmVzdWx0WzJdID0gTE1TWzJdICogRDY1WiAvIHNvdXJjZVdoaXRlUG9pbnRbMl07CiAgfQogICNzUkdCVHJhbnNmZXJGdW5jdGlvbihjb2xvcikgewogICAgaWYgKGNvbG9yIDw9IDAuMDAzMTMwOCkgewogICAgICByZXR1cm4gTWF0aENsYW1wKDEyLjkyICogY29sb3IsIDAsIDEpOwogICAgfQogICAgaWYgKGNvbG9yID49IDAuOTk1NTQ1MjUpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gTWF0aENsYW1wKCgxICsgMC4wNTUpICogY29sb3IgKiogKDEgLyAyLjQpIC0gMC4wNTUsIDAsIDEpOwogIH0KICAjZGVjb2RlTChMKSB7CiAgICBpZiAoTCA8IDApIHsKICAgICAgcmV0dXJuIC10aGlzLiNkZWNvZGVMKC1MKTsKICAgIH0KICAgIGlmIChMID4gOC4wKSB7CiAgICAgIHJldHVybiAoKEwgKyAxNikgLyAxMTYpICoqIDM7CiAgICB9CiAgICByZXR1cm4gTCAqIENhbFJHQkNTLiNERUNPREVfTF9DT05TVEFOVDsKICB9CiAgI2NvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHsKICAgIGlmIChzb3VyY2VCbGFja1BvaW50WzBdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMV0gPT09IDAgJiYgc291cmNlQmxhY2tQb2ludFsyXSA9PT0gMCkgewogICAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXTsKICAgICAgcmVzdWx0WzFdID0gWFlaX0ZsYXRbMV07CiAgICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB6ZXJvRGVjb2RlTCA9IHRoaXMuI2RlY29kZUwoMCk7CiAgICBjb25zdCBYX0RTVCA9IHplcm9EZWNvZGVMOwogICAgY29uc3QgWF9TUkMgPSB0aGlzLiNkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMF0pOwogICAgY29uc3QgWV9EU1QgPSB6ZXJvRGVjb2RlTDsKICAgIGNvbnN0IFlfU1JDID0gdGhpcy4jZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzFdKTsKICAgIGNvbnN0IFpfRFNUID0gemVyb0RlY29kZUw7CiAgICBjb25zdCBaX1NSQyA9IHRoaXMuI2RlY29kZUwoc291cmNlQmxhY2tQb2ludFsyXSk7CiAgICBjb25zdCBYX1NjYWxlID0gKDEgLSBYX0RTVCkgLyAoMSAtIFhfU1JDKTsKICAgIGNvbnN0IFhfT2Zmc2V0ID0gMSAtIFhfU2NhbGU7CiAgICBjb25zdCBZX1NjYWxlID0gKDEgLSBZX0RTVCkgLyAoMSAtIFlfU1JDKTsKICAgIGNvbnN0IFlfT2Zmc2V0ID0gMSAtIFlfU2NhbGU7CiAgICBjb25zdCBaX1NjYWxlID0gKDEgLSBaX0RTVCkgLyAoMSAtIFpfU1JDKTsKICAgIGNvbnN0IFpfT2Zmc2V0ID0gMSAtIFpfU2NhbGU7CiAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXSAqIFhfU2NhbGUgKyBYX09mZnNldDsKICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdICogWV9TY2FsZSArIFlfT2Zmc2V0OwogICAgcmVzdWx0WzJdID0gWFlaX0ZsYXRbMl0gKiBaX1NjYWxlICsgWl9PZmZzZXQ7CiAgfQogICNub3JtYWxpemVXaGl0ZVBvaW50VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIFhZWl9JbiwgcmVzdWx0KSB7CiAgICBpZiAoc291cmNlV2hpdGVQb2ludFswXSA9PT0gMSAmJiBzb3VyY2VXaGl0ZVBvaW50WzJdID09PSAxKSB7CiAgICAgIHJlc3VsdFswXSA9IFhZWl9JblswXTsKICAgICAgcmVzdWx0WzFdID0gWFlaX0luWzFdOwogICAgICByZXN1bHRbMl0gPSBYWVpfSW5bMl07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IExNUyA9IHJlc3VsdDsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpOwogICAgY29uc3QgTE1TX0ZsYXQgPSBDYWxSR0JDUy4jdGVtcE5vcm1hbGl6ZU1hdHJpeDsKICAgIHRoaXMuI3RvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIExNU19GbGF0KTsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRmxhdCwgcmVzdWx0KTsKICB9CiAgI25vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkgewogICAgY29uc3QgTE1TID0gcmVzdWx0OwogICAgdGhpcy4jbWF0cml4UHJvZHVjdChDYWxSR0JDUy4jQlJBREZPUkRfU0NBTEVfTUFUUklYLCBYWVpfSW4sIExNUyk7CiAgICBjb25zdCBMTVNfRDY1ID0gQ2FsUkdCQ1MuI3RlbXBOb3JtYWxpemVNYXRyaXg7CiAgICB0aGlzLiN0b0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIExNU19ENjUpOwogICAgdGhpcy4jbWF0cml4UHJvZHVjdChDYWxSR0JDUy4jQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVgsIExNU19ENjUsIHJlc3VsdCk7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHsKICAgIGNvbnN0IEEgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldF0gKiBzY2FsZSwgMCwgMSk7CiAgICBjb25zdCBCID0gTWF0aENsYW1wKHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNjYWxlLCAwLCAxKTsKICAgIGNvbnN0IEMgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldCArIDJdICogc2NhbGUsIDAsIDEpOwogICAgY29uc3QgQUdSID0gQSA9PT0gMSA/IDEgOiBBICoqIHRoaXMuR1I7CiAgICBjb25zdCBCR0cgPSBCID09PSAxID8gMSA6IEIgKiogdGhpcy5HRzsKICAgIGNvbnN0IENHQiA9IEMgPT09IDEgPyAxIDogQyAqKiB0aGlzLkdCOwogICAgY29uc3QgWCA9IHRoaXMuTVhBICogQUdSICsgdGhpcy5NWEIgKiBCR0cgKyB0aGlzLk1YQyAqIENHQjsKICAgIGNvbnN0IFkgPSB0aGlzLk1ZQSAqIEFHUiArIHRoaXMuTVlCICogQkdHICsgdGhpcy5NWUMgKiBDR0I7CiAgICBjb25zdCBaID0gdGhpcy5NWkEgKiBBR1IgKyB0aGlzLk1aQiAqIEJHRyArIHRoaXMuTVpDICogQ0dCOwogICAgY29uc3QgWFlaID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MTsKICAgIFhZWlswXSA9IFg7CiAgICBYWVpbMV0gPSBZOwogICAgWFlaWzJdID0gWjsKICAgIGNvbnN0IFhZWl9GbGF0ID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MjsKICAgIHRoaXMuI25vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQodGhpcy53aGl0ZVBvaW50LCBYWVosIFhZWl9GbGF0KTsKICAgIGNvbnN0IFhZWl9CbGFjayA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDE7CiAgICB0aGlzLiNjb21wZW5zYXRlQmxhY2tQb2ludCh0aGlzLmJsYWNrUG9pbnQsIFhZWl9GbGF0LCBYWVpfQmxhY2spOwogICAgY29uc3QgWFlaX0Q2NSA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDI7CiAgICB0aGlzLiNub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUoQ2FsUkdCQ1MuI0ZMQVRfV0hJVEVQT0lOVF9NQVRSSVgsIFhZWl9CbGFjaywgWFlaX0Q2NSk7CiAgICBjb25zdCBTUkdCID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MTsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI1NSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYLCBYWVpfRDY1LCBTUkdCKTsKICAgIGRlc3RbZGVzdE9mZnNldF0gPSB0aGlzLiNzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzBdKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdGhpcy4jc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsxXSkgKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHRoaXMuI3NSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMl0pICogMjU1OwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSk7CiAgICAgIHNyY09mZnNldCArPSAzOwogICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKICB9Cn0KY2xhc3MgTGFiQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSkgewogICAgc3VwZXIoIkxhYiIsIDMpOwogICAgaWYgKCF3aGl0ZVBvaW50KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIExhYiIpOwogICAgfQogICAgW3RoaXMuWFcsIHRoaXMuWVcsIHRoaXMuWlddID0gd2hpdGVQb2ludDsKICAgIFt0aGlzLmFtaW4sIHRoaXMuYW1heCwgdGhpcy5ibWluLCB0aGlzLmJtYXhdID0gcmFuZ2UgfHwgWy0xMDAsIDEwMCwgLTEwMCwgMTAwXTsKICAgIFt0aGlzLlhCLCB0aGlzLllCLCB0aGlzLlpCXSA9IGJsYWNrUG9pbnQgfHwgWzAsIDAsIDBdOwogICAgaWYgKHRoaXMuWFcgPCAwIHx8IHRoaXMuWlcgPCAwIHx8IHRoaXMuWVcgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cywgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7CiAgICB9CiAgICBpZiAodGhpcy5YQiA8IDAgfHwgdGhpcy5ZQiA8IDAgfHwgdGhpcy5aQiA8IDApIHsKICAgICAgaW5mbygiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpOwogICAgICB0aGlzLlhCID0gdGhpcy5ZQiA9IHRoaXMuWkIgPSAwOwogICAgfQogICAgaWYgKHRoaXMuYW1pbiA+IHRoaXMuYW1heCB8fCB0aGlzLmJtaW4gPiB0aGlzLmJtYXgpIHsKICAgICAgaW5mbygiSW52YWxpZCBSYW5nZSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIik7CiAgICAgIHRoaXMuYW1pbiA9IC0xMDA7CiAgICAgIHRoaXMuYW1heCA9IDEwMDsKICAgICAgdGhpcy5ibWluID0gLTEwMDsKICAgICAgdGhpcy5ibWF4ID0gMTAwOwogICAgfQogIH0KICAjZm5fZyh4KSB7CiAgICByZXR1cm4geCA+PSA2IC8gMjkgPyB4ICoqIDMgOiAxMDggLyA4NDEgKiAoeCAtIDQgLyAyOSk7CiAgfQogICNkZWNvZGUodmFsdWUsIGhpZ2gxLCBsb3cyLCBoaWdoMikgewogICAgcmV0dXJuIGxvdzIgKyB2YWx1ZSAqIChoaWdoMiAtIGxvdzIpIC8gaGlnaDE7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBsZXQgTHMgPSBzcmNbc3JjT2Zmc2V0XTsKICAgIGxldCBhcyA9IHNyY1tzcmNPZmZzZXQgKyAxXTsKICAgIGxldCBicyA9IHNyY1tzcmNPZmZzZXQgKyAyXTsKICAgIGlmIChtYXhWYWwgIT09IGZhbHNlKSB7CiAgICAgIExzID0gdGhpcy4jZGVjb2RlKExzLCBtYXhWYWwsIDAsIDEwMCk7CiAgICAgIGFzID0gdGhpcy4jZGVjb2RlKGFzLCBtYXhWYWwsIHRoaXMuYW1pbiwgdGhpcy5hbWF4KTsKICAgICAgYnMgPSB0aGlzLiNkZWNvZGUoYnMsIG1heFZhbCwgdGhpcy5ibWluLCB0aGlzLmJtYXgpOwogICAgfQogICAgaWYgKGFzID4gdGhpcy5hbWF4KSB7CiAgICAgIGFzID0gdGhpcy5hbWF4OwogICAgfSBlbHNlIGlmIChhcyA8IHRoaXMuYW1pbikgewogICAgICBhcyA9IHRoaXMuYW1pbjsKICAgIH0KICAgIGlmIChicyA+IHRoaXMuYm1heCkgewogICAgICBicyA9IHRoaXMuYm1heDsKICAgIH0gZWxzZSBpZiAoYnMgPCB0aGlzLmJtaW4pIHsKICAgICAgYnMgPSB0aGlzLmJtaW47CiAgICB9CiAgICBjb25zdCBNID0gKExzICsgMTYpIC8gMTE2OwogICAgY29uc3QgTCA9IE0gKyBhcyAvIDUwMDsKICAgIGNvbnN0IE4gPSBNIC0gYnMgLyAyMDA7CiAgICBjb25zdCBYID0gdGhpcy5YVyAqIHRoaXMuI2ZuX2coTCk7CiAgICBjb25zdCBZID0gdGhpcy5ZVyAqIHRoaXMuI2ZuX2coTSk7CiAgICBjb25zdCBaID0gdGhpcy5aVyAqIHRoaXMuI2ZuX2coTik7CiAgICBsZXQgciwgZywgYjsKICAgIGlmICh0aGlzLlpXIDwgMSkgewogICAgICByID0gWCAqIDMuMTMzOSArIFkgKiAtMS42MTcgKyBaICogLTAuNDkwNjsKICAgICAgZyA9IFggKiAtMC45Nzg1ICsgWSAqIDEuOTE2ICsgWiAqIDAuMDMzMzsKICAgICAgYiA9IFggKiAwLjA3MiArIFkgKiAtMC4yMjkgKyBaICogMS40MDU3OwogICAgfSBlbHNlIHsKICAgICAgciA9IFggKiAzLjI0MDYgKyBZICogLTEuNTM3MiArIFogKiAtMC40OTg2OwogICAgICBnID0gWCAqIC0wLjk2ODkgKyBZICogMS44NzU4ICsgWiAqIDAuMDQxNTsKICAgICAgYiA9IFggKiAwLjA1NTcgKyBZICogLTAuMjA0ICsgWiAqIDEuMDU3OwogICAgfQogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IE1hdGguc3FydChyKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gTWF0aC5zcXJ0KGcpICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBNYXRoLnNxcnQoYikgKiAyNTU7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBmYWxzZSwgZGVzdCwgZGVzdE9mZnNldCk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IG1heFZhbCA9ICgxIDw8IGJpdHMpIC0gMTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgICAgc3JjT2Zmc2V0ICs9IDM7CiAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgZmFsc2UpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaWNjX2NvbG9yc3BhY2UuanMKCgoKCmZ1bmN0aW9uIGZldGNoU3luYyh1cmwpIHsKICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgeGhyLnNlbmQobnVsbCk7CiAgcmV0dXJuIHhoci5yZXNwb25zZTsKfQpjbGFzcyBJY2NDb2xvclNwYWNlIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgI3RyYW5zZm9ybWVyOwogICNjb252ZXJ0UGl4ZWw7CiAgc3RhdGljICN1c2VXYXNtID0gdHJ1ZTsKICBzdGF0aWMgI3dhc21VcmwgPSBudWxsOwogIHN0YXRpYyAjZmluYWxpemVyID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHRyYW5zZm9ybWVyID0+IHsKICAgIHFjbXNfZHJvcF90cmFuc2Zvcm1lcih0cmFuc2Zvcm1lcik7CiAgfSk7CiAgY29uc3RydWN0b3IoaWNjUHJvZmlsZSwgbmFtZSwgbnVtQ29tcHMpIHsKICAgIGlmICghSWNjQ29sb3JTcGFjZS5pc1VzYWJsZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIElDQyBjb2xvciBzcGFjZSBzdXBwb3J0Iik7CiAgICB9CiAgICBzdXBlcihuYW1lLCBudW1Db21wcyk7CiAgICBsZXQgaW5UeXBlOwogICAgc3dpdGNoIChudW1Db21wcykgewogICAgICBjYXNlIDE6CiAgICAgICAgaW5UeXBlID0gRGF0YVR5cGUuR3JheTg7CiAgICAgICAgdGhpcy4jY29udmVydFBpeGVsID0gKHNyYywgc3JjT2Zmc2V0KSA9PiBxY21zX2NvbnZlcnRfb25lKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBpblR5cGUgPSBEYXRhVHlwZS5SR0I4OwogICAgICAgIHRoaXMuI2NvbnZlcnRQaXhlbCA9IChzcmMsIHNyY09mZnNldCkgPT4gcWNtc19jb252ZXJ0X3RocmVlKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSwgc3JjW3NyY09mZnNldCArIDFdICogMjU1LCBzcmNbc3JjT2Zmc2V0ICsgMl0gKiAyNTUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgaW5UeXBlID0gRGF0YVR5cGUuQ01ZSzsKICAgICAgICB0aGlzLiNjb252ZXJ0UGl4ZWwgPSAoc3JjLCBzcmNPZmZzZXQpID0+IHFjbXNfY29udmVydF9mb3VyKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSwgc3JjW3NyY09mZnNldCArIDFdICogMjU1LCBzcmNbc3JjT2Zmc2V0ICsgMl0gKiAyNTUsIHNyY1tzcmNPZmZzZXQgKyAzXSAqIDI1NSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBudW1iZXIgb2YgY29tcG9uZW50czogJHtudW1Db21wc31gKTsKICAgIH0KICAgIHRoaXMuI3RyYW5zZm9ybWVyID0gcWNtc190cmFuc2Zvcm1lcl9mcm9tX21lbW9yeShpY2NQcm9maWxlLCBpblR5cGUsIEludGVudC5QZXJjZXB0dWFsKTsKICAgIGlmICghdGhpcy4jdHJhbnNmb3JtZXIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIElDQyBjb2xvciBzcGFjZSIpOwogICAgfQogICAgSWNjQ29sb3JTcGFjZS4jZmluYWxpemVyLnJlZ2lzdGVyKHRoaXMsIHRoaXMuI3RyYW5zZm9ybWVyKTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgUUNNUy5fZGVzdEJ1ZmZlciA9IGRlc3Quc3ViYXJyYXkoZGVzdE9mZnNldCwgZGVzdE9mZnNldCArIDMpOwogICAgdGhpcy4jY29udmVydFBpeGVsKHNyYywgc3JjT2Zmc2V0KTsKICAgIFFDTVMuX2Rlc3RCdWZmZXIgPSBudWxsOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBzcmMgPSBzcmMuc3ViYXJyYXkoc3JjT2Zmc2V0LCBzcmNPZmZzZXQgKyBjb3VudCAqIHRoaXMubnVtQ29tcHMpOwogICAgaWYgKGJpdHMgIT09IDgpIHsKICAgICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBzcmNbaV0gKj0gc2NhbGU7CiAgICAgIH0KICAgIH0KICAgIFFDTVMuX211c3RBZGRBbHBoYSA9IGFscGhhMDEgJiYgZGVzdC5idWZmZXIgPT09IHNyYy5idWZmZXI7CiAgICBRQ01TLl9kZXN0QnVmZmVyID0gZGVzdC5zdWJhcnJheShkZXN0T2Zmc2V0LCBkZXN0T2Zmc2V0ICsgY291bnQgKiAoMyArIGFscGhhMDEpKTsKICAgIHFjbXNfY29udmVydF9hcnJheSh0aGlzLiN0cmFuc2Zvcm1lciwgc3JjKTsKICAgIFFDTVMuX211c3RBZGRBbHBoYSA9IGZhbHNlOwogICAgUUNNUy5fZGVzdEJ1ZmZlciA9IG51bGw7CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoIC8gdGhpcy5udW1Db21wcyAqICgzICsgYWxwaGEwMSkgfCAwOwogIH0KICBzdGF0aWMgc2V0T3B0aW9ucyh7CiAgICB1c2VXYXNtLAogICAgdXNlV29ya2VyRmV0Y2gsCiAgICB3YXNtVXJsCiAgfSkgewogICAgaWYgKCF1c2VXb3JrZXJGZXRjaCkgewogICAgICB0aGlzLiN1c2VXYXNtID0gZmFsc2U7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuI3VzZVdhc20gPSB1c2VXYXNtOwogICAgdGhpcy4jd2FzbVVybCA9IHdhc21Vcmw7CiAgfQogIHN0YXRpYyBnZXQgaXNVc2FibGUoKSB7CiAgICBsZXQgaXNVc2FibGUgPSBmYWxzZTsKICAgIGlmICh0aGlzLiN1c2VXYXNtKSB7CiAgICAgIGlmICh0aGlzLiN3YXNtVXJsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMuX21vZHVsZSA9IFFDTVMuX21vZHVsZSA9IGluaXRTeW5jKHsKICAgICAgICAgICAgbW9kdWxlOiBmZXRjaFN5bmMoYCR7dGhpcy4jd2FzbVVybH1xY21zX2JnLndhc21gKQogICAgICAgICAgfSk7CiAgICAgICAgICBpc1VzYWJsZSA9ICEhdGhpcy5fbW9kdWxlOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHdhcm4oYElDQ0Jhc2VkIGNvbG9yIHNwYWNlOiAiJHtlfSIuYCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIk5vIElDQyBjb2xvciBzcGFjZSBzdXBwb3J0IGR1ZSB0byBtaXNzaW5nIGB3YXNtVXJsYCBBUEkgb3B0aW9uIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImlzVXNhYmxlIiwgaXNVc2FibGUpOwogIH0KfQpjbGFzcyBDbXlrSUNDQmFzZWRDUyBleHRlbmRzIEljY0NvbG9yU3BhY2UgewogIHN0YXRpYyAjaWNjVXJsOwogIGNvbnN0cnVjdG9yKCkgewogICAgY29uc3QgaWNjUHJvZmlsZSA9IG5ldyBVaW50OEFycmF5KGZldGNoU3luYyhgJHtDbXlrSUNDQmFzZWRDUy4jaWNjVXJsfUNHQVRTMDAxQ29tcGF0LXYyLW1pY3JvLmljY2ApKTsKICAgIHN1cGVyKGljY1Byb2ZpbGUsICJEZXZpY2VDTVlLIiwgNCk7CiAgfQogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGljY1VybAogIH0pIHsKICAgIHRoaXMuI2ljY1VybCA9IGljY1VybDsKICB9CiAgc3RhdGljIGdldCBpc1VzYWJsZSgpIHsKICAgIGxldCBpc1VzYWJsZSA9IGZhbHNlOwogICAgaWYgKEljY0NvbG9yU3BhY2UuaXNVc2FibGUpIHsKICAgICAgaWYgKHRoaXMuI2ljY1VybCkgewogICAgICAgIGlzVXNhYmxlID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJObyBDTVlLIElDQyBwcm9maWxlIHN1cHBvcnQgZHVlIHRvIG1pc3NpbmcgYGljY1VybGAgQVBJIG9wdGlvbiIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc1VzYWJsZSIsIGlzVXNhYmxlKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3N0cmVhbS5qcwoKCmNsYXNzIFN0cmVhbSBleHRlbmRzIEJhc2VTdHJlYW0gewogIGNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5ieXRlcyA9IGFycmF5QnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGFycmF5QnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpOwogICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgICB0aGlzLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuYnl0ZXMubGVuZ3RoOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7CiAgfQogIGdldCBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwOwogIH0KICBnZXRCeXRlKCkgewogICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgY29uc3Qgc3RyRW5kID0gdGhpcy5lbmQ7CiAgICBpZiAoIWxlbmd0aCkgewogICAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpOwogICAgfQogICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDsKICAgIGlmIChlbmQgPiBzdHJFbmQpIHsKICAgICAgZW5kID0gc3RyRW5kOwogICAgfQogICAgdGhpcy5wb3MgPSBlbmQ7CiAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgaWYgKGJlZ2luIDwgMCkgewogICAgICBiZWdpbiA9IDA7CiAgICB9CiAgICBpZiAoZW5kID4gdGhpcy5lbmQpIHsKICAgICAgZW5kID0gdGhpcy5lbmQ7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShiZWdpbiwgZW5kKTsKICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgfQogIG1vdmVTdGFydCgpIHsKICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpOwogIH0KfQpjbGFzcyBTdHJpbmdTdHJlYW0gZXh0ZW5kcyBTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIoc3RyaW5nVG9CeXRlcyhzdHIpKTsKICB9Cn0KY2xhc3MgTnVsbFN0cmVhbSBleHRlbmRzIFN0cmVhbSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcihuZXcgVWludDhBcnJheSgwKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jaHVua2VkX3N0cmVhbS5qcwoKCgpjbGFzcyBDaHVua2VkU3RyZWFtIGV4dGVuZHMgU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihsZW5ndGgsIGNodW5rU2l6ZSwgbWFuYWdlcikgewogICAgc3VwZXIobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSwgMCwgbGVuZ3RoLCBudWxsKTsKICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOwogICAgdGhpcy5fbG9hZGVkQ2h1bmtzID0gbmV3IFNldCgpOwogICAgdGhpcy5udW1DaHVua3MgPSBNYXRoLmNlaWwobGVuZ3RoIC8gY2h1bmtTaXplKTsKICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CiAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IDA7CiAgICB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rID0gLTE7CiAgfQogIGdldE1pc3NpbmdDaHVua3MoKSB7CiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGZvciAobGV0IGNodW5rID0gMCwgbiA9IHRoaXMubnVtQ2h1bmtzOyBjaHVuayA8IG47ICsrY2h1bmspIHsKICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgewogICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNodW5rczsKICB9CiAgZ2V0IG51bUNodW5rc0xvYWRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3Muc2l6ZTsKICB9CiAgZ2V0IGlzRGF0YUxvYWRlZCgpIHsKICAgIHJldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3M7CiAgfQogIG9uUmVjZWl2ZURhdGEoYmVnaW4sIGNodW5rKSB7CiAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKICAgIGlmIChiZWdpbiAlIGNodW5rU2l6ZSAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZCBiZWdpbiBvZmZzZXQ6ICR7YmVnaW59YCk7CiAgICB9CiAgICBjb25zdCBlbmQgPSBiZWdpbiArIGNodW5rLmJ5dGVMZW5ndGg7CiAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWQgZW5kIG9mZnNldDogJHtlbmR9YCk7CiAgICB9CiAgICB0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShjaHVuayksIGJlZ2luKTsKICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTsKICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTsKICAgIGZvciAobGV0IGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykgewogICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKICAgIH0KICB9CiAgb25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGRhdGEpIHsKICAgIGxldCBwb3NpdGlvbiA9IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICB0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShkYXRhKSwgcG9zaXRpb24pOwogICAgcG9zaXRpb24gKz0gZGF0YS5ieXRlTGVuZ3RoOwogICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjsKICAgIGNvbnN0IGVuZENodW5rID0gcG9zaXRpb24gPj0gdGhpcy5lbmQgPyB0aGlzLm51bUNodW5rcyA6IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHsKICAgICAgdGhpcy5fbG9hZGVkQ2h1bmtzLmFkZChjdXJDaHVuayk7CiAgICB9CiAgfQogIGVuc3VyZUJ5dGUocG9zKSB7CiAgICBpZiAocG9zIDwgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY2h1bmsgPSBNYXRoLmZsb29yKHBvcyAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGlmIChjaHVuayA+IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChjaHVuayA9PT0gdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihwb3MsIHBvcyArIDEpOwogICAgfQogICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IGNodW5rOwogIH0KICBlbnN1cmVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBpZiAoYmVnaW4gPj0gZW5kKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlbmQgPD0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBpZiAoYmVnaW5DaHVuayA+IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5taW4oTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxLCB0aGlzLm51bUNodW5rcyk7CiAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgewogICAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKTsKICAgICAgfQogICAgfQogIH0KICBuZXh0RW1wdHlDaHVuayhiZWdpbkNodW5rKSB7CiAgICBjb25zdCBudW1DaHVua3MgPSB0aGlzLm51bUNodW5rczsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ2h1bmtzOyArK2kpIHsKICAgICAgY29uc3QgY2h1bmsgPSAoYmVnaW5DaHVuayArIGkpICUgbnVtQ2h1bmtzOwogICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgcmV0dXJuIGNodW5rOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaGFzQ2h1bmsoY2h1bmspIHsKICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKTsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgaWYgKHBvcyA+PSB0aGlzLmVuZCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAocG9zID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlQnl0ZShwb3MpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107CiAgfQogIGdldEJ5dGVzKGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CiAgICBjb25zdCBzdHJFbmQgPSB0aGlzLmVuZDsKICAgIGlmICghbGVuZ3RoKSB7CiAgICAgIGlmIChzdHJFbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICAgIHRoaXMuZW5zdXJlUmFuZ2UocG9zLCBzdHJFbmQpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIHN0ckVuZCk7CiAgICB9CiAgICBsZXQgZW5kID0gcG9zICsgbGVuZ3RoOwogICAgaWYgKGVuZCA+IHN0ckVuZCkgewogICAgICBlbmQgPSBzdHJFbmQ7CiAgICB9CiAgICBpZiAoZW5kID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIGVuZCk7CiAgICB9CiAgICB0aGlzLnBvcyA9IGVuZDsKICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7CiAgfQogIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBpZiAoYmVnaW4gPCAwKSB7CiAgICAgIGJlZ2luID0gMDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgewogICAgICBlbmQgPSB0aGlzLmVuZDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICB0aGlzLmVuc3VyZVJhbmdlKGJlZ2luLCBlbmQpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7CiAgfQogIG1ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCA9IG51bGwpIHsKICAgIGlmIChsZW5ndGgpIHsKICAgICAgaWYgKHN0YXJ0ICsgbGVuZ3RoID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgICB0aGlzLmVuc3VyZVJhbmdlKHN0YXJ0LCBzdGFydCArIGxlbmd0aCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhcnQgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVCeXRlKHN0YXJ0KTsKICAgIH0KICAgIGZ1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKSB7fQogICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHRoaXMpOwogICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUuZ2V0TWlzc2luZ0NodW5rcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgY29uc3QgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CiAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnQgLyBjaHVua1NpemUpOwogICAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKHRoaXMuZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTsKICAgICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IFtdOwogICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgICBtaXNzaW5nQ2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWlzc2luZ0NodW5rczsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUsICJpc0RhdGFMb2FkZWQiLCB7CiAgICAgIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5udW1DaHVua3NMb2FkZWQgPT09IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aCA9PT0gMDsKICAgICAgfSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IHN1YlN0cmVhbSA9IG5ldyBDaHVua2VkU3RyZWFtU3Vic3RyZWFtKCk7CiAgICBzdWJTdHJlYW0ucG9zID0gc3ViU3RyZWFtLnN0YXJ0ID0gc3RhcnQ7CiAgICBzdWJTdHJlYW0uZW5kID0gc3RhcnQgKyBsZW5ndGggfHwgdGhpcy5lbmQ7CiAgICBzdWJTdHJlYW0uZGljdCA9IGRpY3Q7CiAgICByZXR1cm4gc3ViU3RyZWFtOwogIH0KICBnZXRCYXNlU3RyZWFtcygpIHsKICAgIHJldHVybiBbdGhpc107CiAgfQp9CmNsYXNzIENodW5rZWRTdHJlYW1NYW5hZ2VyIHsKICBjb25zdHJ1Y3RvcihwZGZOZXR3b3JrU3RyZWFtLCBhcmdzKSB7CiAgICB0aGlzLmxlbmd0aCA9IGFyZ3MubGVuZ3RoOwogICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplOwogICAgdGhpcy5zdHJlYW0gPSBuZXcgQ2h1bmtlZFN0cmVhbSh0aGlzLmxlbmd0aCwgdGhpcy5jaHVua1NpemUsIHRoaXMpOwogICAgdGhpcy5wZGZOZXR3b3JrU3RyZWFtID0gcGRmTmV0d29ya1N0cmVhbTsKICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDsKICAgIHRoaXMubXNnSGFuZGxlciA9IGFyZ3MubXNnSGFuZGxlcjsKICAgIHRoaXMuY3VyclJlcXVlc3RJZCA9IDA7CiAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdCA9IG5ldyBNYXAoKTsKICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlOwogICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogIH0KICBzZW5kUmVxdWVzdChiZWdpbiwgZW5kKSB7CiAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMucGRmTmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKTsKICAgIGlmICghcmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgcmFuZ2VSZWFkZXIub25Qcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpOwogICAgfQogICAgbGV0IGNodW5rcyA9IFtdLAogICAgICBsb2FkZWQgPSAwOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgcmVhZENodW5rID0gKHsKICAgICAgICB2YWx1ZSwKICAgICAgICBkb25lCiAgICAgIH0pID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgY29uc3QgY2h1bmtEYXRhID0gYXJyYXlCdWZmZXJzVG9CeXRlcyhjaHVua3MpOwogICAgICAgICAgICBjaHVua3MgPSBudWxsOwogICAgICAgICAgICByZXNvbHZlKGNodW5rRGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGxvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoOwogICAgICAgICAgaWYgKHJhbmdlUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7CiAgICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyh7CiAgICAgICAgICAgICAgbG9hZGVkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY2h1bmtzLnB1c2godmFsdWUpOwogICAgICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKICAgIH0pLnRoZW4oZGF0YSA9PiB7CiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5vblJlY2VpdmVEYXRhKHsKICAgICAgICBjaHVuazogZGF0YSwKICAgICAgICBiZWdpbgogICAgICB9KTsKICAgIH0pOwogIH0KICByZXF1ZXN0QWxsQ2h1bmtzKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgaWYgKCFub0ZldGNoKSB7CiAgICAgIGNvbnN0IG1pc3NpbmdDaHVua3MgPSB0aGlzLnN0cmVhbS5nZXRNaXNzaW5nQ2h1bmtzKCk7CiAgICAgIHRoaXMuX3JlcXVlc3RDaHVua3MobWlzc2luZ0NodW5rcyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5wcm9taXNlOwogIH0KICBfcmVxdWVzdENodW5rcyhjaHVua3MpIHsKICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuY3VyclJlcXVlc3RJZCsrOwogICAgY29uc3QgY2h1bmtzTmVlZGVkID0gbmV3IFNldCgpOwogICAgdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LnNldChyZXF1ZXN0SWQsIGNodW5rc05lZWRlZCk7CiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykgewogICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGNodW5rKSkgewogICAgICAgIGNodW5rc05lZWRlZC5hZGQoY2h1bmspOwogICAgICB9CiAgICB9CiAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPT09IDApIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgfQogICAgY29uc3QgY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2FwYWJpbGl0eSk7CiAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTsKICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzTmVlZGVkKSB7CiAgICAgIGxldCByZXF1ZXN0SWRzID0gdGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChjaHVuayk7CiAgICAgIGlmICghcmVxdWVzdElkcykgewogICAgICAgIHJlcXVlc3RJZHMgPSBbXTsKICAgICAgICB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2V0KGNodW5rLCByZXF1ZXN0SWRzKTsKICAgICAgICBjaHVua3NUb1JlcXVlc3QucHVzaChjaHVuayk7CiAgICAgIH0KICAgICAgcmVxdWVzdElkcy5wdXNoKHJlcXVlc3RJZCk7CiAgICB9CiAgICBpZiAoY2h1bmtzVG9SZXF1ZXN0Lmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCA9IHRoaXMuZ3JvdXBDaHVua3MoY2h1bmtzVG9SZXF1ZXN0KTsKICAgICAgZm9yIChjb25zdCBncm91cGVkQ2h1bmsgb2YgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCkgewogICAgICAgIGNvbnN0IGJlZ2luID0gZ3JvdXBlZENodW5rLmJlZ2luQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZTsKICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihncm91cGVkQ2h1bmsuZW5kQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZSwgdGhpcy5sZW5ndGgpOwogICAgICAgIHRoaXMuc2VuZFJlcXVlc3QoYmVnaW4sIGVuZCkuY2F0Y2goY2FwYWJpbGl0eS5yZWplY3QpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFN0cmVhbSgpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdGhpcy5sZW5ndGgpOwogICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhiZWdpbik7CiAgICBjb25zdCBlbmRDaHVuayA9IHRoaXMuZ2V0RW5kQ2h1bmsoZW5kKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CiAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rcyk7CiAgfQogIHJlcXVlc3RSYW5nZXMocmFuZ2VzID0gW10pIHsKICAgIGNvbnN0IGNodW5rc1RvUmVxdWVzdCA9IFtdOwogICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHsKICAgICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhyYW5nZS5iZWdpbik7CiAgICAgIGNvbnN0IGVuZENodW5rID0gdGhpcy5nZXRFbmRDaHVuayhyYW5nZS5lbmQpOwogICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgICBpZiAoIWNodW5rc1RvUmVxdWVzdC5pbmNsdWRlcyhjaHVuaykpIHsKICAgICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNodW5rc1RvUmVxdWVzdC5zb3J0KChhLCBiKSA9PiBhIC0gYik7CiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3NUb1JlcXVlc3QpOwogIH0KICBncm91cENodW5rcyhjaHVua3MpIHsKICAgIGNvbnN0IGdyb3VwZWRDaHVua3MgPSBbXTsKICAgIGxldCBiZWdpbkNodW5rID0gLTE7CiAgICBsZXQgcHJldkNodW5rID0gLTE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tpXTsKICAgICAgaWYgKGJlZ2luQ2h1bmsgPCAwKSB7CiAgICAgICAgYmVnaW5DaHVuayA9IGNodW5rOwogICAgICB9CiAgICAgIGlmIChwcmV2Q2h1bmsgPj0gMCAmJiBwcmV2Q2h1bmsgKyAxICE9PSBjaHVuaykgewogICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7CiAgICAgICAgICBiZWdpbkNodW5rLAogICAgICAgICAgZW5kQ2h1bms6IHByZXZDaHVuayArIDEKICAgICAgICB9KTsKICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7CiAgICAgIH0KICAgICAgaWYgKGkgKyAxID09PSBjaHVua3MubGVuZ3RoKSB7CiAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsKICAgICAgICAgIGJlZ2luQ2h1bmssCiAgICAgICAgICBlbmRDaHVuazogY2h1bmsgKyAxCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcHJldkNodW5rID0gY2h1bms7CiAgICB9CiAgICByZXR1cm4gZ3JvdXBlZENodW5rczsKICB9CiAgb25Qcm9ncmVzcyhhcmdzKSB7CiAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLCB7CiAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUgKyBhcmdzLmxvYWRlZCwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25SZWNlaXZlRGF0YShhcmdzKSB7CiAgICBjb25zdCBjaHVuayA9IGFyZ3MuY2h1bms7CiAgICBjb25zdCBpc1Byb2dyZXNzaXZlID0gYXJncy5iZWdpbiA9PT0gdW5kZWZpbmVkOwogICAgY29uc3QgYmVnaW4gPSBpc1Byb2dyZXNzaXZlID8gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggOiBhcmdzLmJlZ2luOwogICAgY29uc3QgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBjb25zdCBlbmRDaHVuayA9IGVuZCA8IHRoaXMubGVuZ3RoID8gTWF0aC5mbG9vcihlbmQgLyB0aGlzLmNodW5rU2l6ZSkgOiBNYXRoLmNlaWwoZW5kIC8gdGhpcy5jaHVua1NpemUpOwogICAgaWYgKGlzUHJvZ3Jlc3NpdmUpIHsKICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKTsKICAgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBlbmQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuayk7CiAgICB9CiAgICBpZiAodGhpcy5zdHJlYW0uaXNEYXRhTG9hZGVkKSB7CiAgICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVzb2x2ZSh0aGlzLnN0cmVhbSk7CiAgICB9CiAgICBjb25zdCBsb2FkZWRSZXF1ZXN0cyA9IFtdOwogICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CiAgICAgIGNvbnN0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGN1ckNodW5rKTsKICAgICAgaWYgKCFyZXF1ZXN0SWRzKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShjdXJDaHVuayk7CiAgICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIHJlcXVlc3RJZHMpIHsKICAgICAgICBjb25zdCBjaHVua3NOZWVkZWQgPSB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5oYXMoY3VyQ2h1bmspKSB7CiAgICAgICAgICBjaHVua3NOZWVkZWQuZGVsZXRlKGN1ckNodW5rKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5zaXplID4gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxvYWRlZFJlcXVlc3RzLnB1c2gocmVxdWVzdElkKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLmRpc2FibGVBdXRvRmV0Y2ggJiYgdGhpcy5fcmVxdWVzdHNCeUNodW5rLnNpemUgPT09IDApIHsKICAgICAgbGV0IG5leHRFbXB0eUNodW5rOwogICAgICBpZiAodGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkID09PSAxKSB7CiAgICAgICAgY29uc3QgbGFzdENodW5rID0gdGhpcy5zdHJlYW0ubnVtQ2h1bmtzIC0gMTsKICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHsKICAgICAgICAgIG5leHRFbXB0eUNodW5rID0gbGFzdENodW5rOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBuZXh0RW1wdHlDaHVuayA9IHRoaXMuc3RyZWFtLm5leHRFbXB0eUNodW5rKGVuZENodW5rKTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuZXh0RW1wdHlDaHVuaykpIHsKICAgICAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKFtuZXh0RW1wdHlDaHVua10pOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBsb2FkZWRSZXF1ZXN0cykgewogICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShyZXF1ZXN0SWQpOwogICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKICAgIH0KICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKICAgICAgbG9hZGVkOiB0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgKiB0aGlzLmNodW5rU2l6ZSwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25FcnJvcihlcnIpIHsKICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7CiAgfQogIGdldEJlZ2luQ2h1bmsoYmVnaW4pIHsKICAgIHJldHVybiBNYXRoLmZsb29yKGJlZ2luIC8gdGhpcy5jaHVua1NpemUpOwogIH0KICBnZXRFbmRDaHVuayhlbmQpIHsKICAgIHJldHVybiBNYXRoLmZsb29yKChlbmQgLSAxKSAvIHRoaXMuY2h1bmtTaXplKSArIDE7CiAgfQogIGFib3J0KHJlYXNvbikgewogICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKICAgIHRoaXMucGRmTmV0d29ya1N0cmVhbT8uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTsKICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSkgewogICAgICBjYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL3NoYXJlZC9pbWFnZV91dGlscy5qcwoKZnVuY3Rpb24gY29udmVydFRvUkdCQShwYXJhbXMpIHsKICBzd2l0Y2ggKHBhcmFtcy5raW5kKSB7CiAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHBhcmFtcyk7CiAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgIHJldHVybiBjb252ZXJ0UkdCVG9SR0JBKHBhcmFtcyk7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIHdpZHRoLAogIGhlaWdodCwKICBub25CbGFja0NvbG9yID0gMHhmZmZmZmZmZiwKICBpbnZlcnNlRGVjb2RlID0gZmFsc2UKfSkgewogIGNvbnN0IGJsYWNrID0gRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjsKICBjb25zdCBbemVyb01hcHBpbmcsIG9uZU1hcHBpbmddID0gaW52ZXJzZURlY29kZSA/IFtub25CbGFja0NvbG9yLCBibGFja10gOiBbYmxhY2ssIG5vbkJsYWNrQ29sb3JdOwogIGNvbnN0IHdpZHRoSW5Tb3VyY2UgPSB3aWR0aCA+PiAzOwogIGNvbnN0IHdpZHRoUmVtYWluZGVyID0gd2lkdGggJiA3OwogIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5sZW5ndGg7CiAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgbGV0IGRlc3RQb3MgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGZvciAoY29uc3QgbWF4ID0gc3JjUG9zICsgd2lkdGhJblNvdXJjZTsgc3JjUG9zIDwgbWF4OyBzcmNQb3MrKykgewogICAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1Bvc10gOiAyNTU7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgfQogICAgaWYgKHdpZHRoUmVtYWluZGVyID09PSAwKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3MrK10gOiAyNTU7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoUmVtYWluZGVyOyBqKyspIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDEgPDwgNyAtIGogPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzcmNQb3MsCiAgICBkZXN0UG9zCiAgfTsKfQpmdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIGRlc3RQb3MgPSAwLAogIHdpZHRoLAogIGhlaWdodAp9KSB7CiAgbGV0IGkgPSAwOwogIGNvbnN0IGxlbiA9IHdpZHRoICogaGVpZ2h0ICogMzsKICBjb25zdCBsZW4zMiA9IGxlbiA+PiAyOwogIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIsIHNyY1BvcywgbGVuMzIpOwogIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikgewogICAgZm9yICg7IGkgPCBsZW4zMiAtIDI7IGkgKz0gMywgZGVzdFBvcyArPSA0KSB7CiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07CiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdOwogICAgICBjb25zdCBzMyA9IHNyYzMyW2kgKyAyXTsKICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA+Pj4gMjQgfCBzMiA8PCA4IHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMl0gPSBzMiA+Pj4gMTYgfCBzMyA8PCAxNiB8IDB4ZmYwMDAwMDA7CiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPj4+IDggfCAweGZmMDAwMDAwOwogICAgfQogICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyY1BvcyArIGxlbjsgaiA8IGpqOyBqICs9IDMpIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIHwgc3JjW2ogKyAxXSA8PCA4IHwgc3JjW2ogKyAyXSA8PCAxNiB8IDB4ZmYwMDAwMDA7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkgewogICAgICBjb25zdCBzMSA9IHNyYzMyW2ldOwogICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTsKICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07CiAgICAgIGRlc3RbZGVzdFBvc10gPSBzMSB8IDB4ZmY7CiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPDwgMjQgfCBzMiA+Pj4gOCB8IDB4ZmY7CiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPDwgMTYgfCBzMyA+Pj4gMTYgfCAweGZmOwogICAgICBkZXN0W2Rlc3RQb3MgKyAzXSA9IHMzIDw8IDggfCAweGZmOwogICAgfQogICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyY1BvcyArIGxlbjsgaiA8IGpqOyBqICs9IDMpIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIDw8IDI0IHwgc3JjW2ogKyAxXSA8PCAxNiB8IHNyY1tqICsgMl0gPDwgOCB8IDB4ZmY7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzcmNQb3M6IHNyY1BvcyArIGxlbiwKICAgIGRlc3RQb3MKICB9Owp9CmZ1bmN0aW9uIGdyYXlUb1JHQkEoc3JjLCBkZXN0KSB7CiAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxMDAgfCAweDAwMDAwMGZmOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2VfcmVzaXplci5qcwoKCgpjb25zdCBNSU5fSU1BR0VfRElNID0gMjA0ODsKY29uc3QgTUFYX0lNQUdFX0RJTSA9IDY1NTM3Owpjb25zdCBNQVhfRVJST1IgPSAxMjg7CmNsYXNzIEltYWdlUmVzaXplciB7CiAgc3RhdGljICNnb29kU3F1YXJlTGVuZ3RoID0gTUlOX0lNQUdFX0RJTTsKICBzdGF0aWMgI2lzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkID0gRmVhdHVyZVRlc3QuaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ7CiAgY29uc3RydWN0b3IoaW1nRGF0YSwgaXNNYXNrKSB7CiAgICB0aGlzLl9pbWdEYXRhID0gaW1nRGF0YTsKICAgIHRoaXMuX2lzTWFzayA9IGlzTWFzazsKICB9CiAgc3RhdGljIGdldCBjYW5Vc2VJbWFnZURlY29kZXIoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYW5Vc2VJbWFnZURlY29kZXIiLCB0aGlzLiNpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA/IEltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2JtcCIpIDogUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSk7CiAgfQogIHN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKHdpZHRoLCBoZWlnaHQpIHsKICAgIGlmICh3aWR0aCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoICYmIGhlaWdodCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgTUFYX0RJTQogICAgfSA9IHRoaXM7CiAgICBpZiAod2lkdGggPiBNQVhfRElNIHx8IGhlaWdodCA+IE1BWF9ESU0pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CiAgICBpZiAodGhpcy5faGFzTWF4QXJlYSkgewogICAgICByZXR1cm4gYXJlYSA+IHRoaXMuTUFYX0FSRUE7CiAgICB9CiAgICBpZiAoYXJlYSA8IHRoaXMuI2dvb2RTcXVhcmVMZW5ndGggKiogMikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5fYXJlR29vZERpbXMod2lkdGgsIGhlaWdodCkpIHsKICAgICAgdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIE1hdGguZmxvb3IoTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0KSkpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoID0gdGhpcy5fZ3Vlc3NNYXgodGhpcy4jZ29vZFNxdWFyZUxlbmd0aCwgTUFYX0RJTSwgTUFYX0VSUk9SLCAwKTsKICAgIGNvbnN0IG1heEFyZWEgPSB0aGlzLk1BWF9BUkVBID0gdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCAqKiAyOwogICAgcmV0dXJuIGFyZWEgPiBtYXhBcmVhOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9ESU0oKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfRElNIiwgdGhpcy5fZ3Vlc3NNYXgoTUlOX0lNQUdFX0RJTSwgTUFYX0lNQUdFX0RJTSwgMCwgMSkpOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9BUkVBKCkgewogICAgdGhpcy5faGFzTWF4QXJlYSA9IHRydWU7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfQVJFQSIsIHRoaXMuX2d1ZXNzTWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIHRoaXMuTUFYX0RJTSwgTUFYX0VSUk9SLCAwKSAqKiAyKTsKICB9CiAgc3RhdGljIHNldCBNQVhfQVJFQShhcmVhKSB7CiAgICBpZiAoYXJlYSA+PSAwKSB7CiAgICAgIHRoaXMuX2hhc01heEFyZWEgPSB0cnVlOwogICAgICBzaGFkb3codGhpcywgIk1BWF9BUkVBIiwgYXJlYSk7CiAgICB9CiAgfQogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGNhbnZhc01heEFyZWFJbkJ5dGVzID0gLTEsCiAgICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgaWYgKCF0aGlzLl9oYXNNYXhBcmVhKSB7CiAgICAgIHRoaXMuTUFYX0FSRUEgPSBjYW52YXNNYXhBcmVhSW5CeXRlcyA+PiAyOwogICAgfQogICAgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICB9CiAgc3RhdGljIF9hcmVHb29kRGltcyh3aWR0aCwgaGVpZ2h0KSB7CiAgICB0cnkgewogICAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpOwogICAgICBjb25zdCBvcGFjaXR5ID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhWzNdOwogICAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTsKICAgICAgcmV0dXJuIG9wYWNpdHkgIT09IDA7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBzdGF0aWMgX2d1ZXNzTWF4KHN0YXJ0LCBlbmQsIHRvbGVyYW5jZSwgZGVmYXVsdEhlaWdodCkgewogICAgd2hpbGUgKHN0YXJ0ICsgdG9sZXJhbmNlICsgMSA8IGVuZCkgewogICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChzdGFydCArIGVuZCkgLyAyKTsKICAgICAgY29uc3QgaGVpZ2h0ID0gZGVmYXVsdEhlaWdodCB8fCBtaWRkbGU7CiAgICAgIGlmICh0aGlzLl9hcmVHb29kRGltcyhtaWRkbGUsIGhlaWdodCkpIHsKICAgICAgICBzdGFydCA9IG1pZGRsZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbmQgPSBtaWRkbGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdGFydDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlKGltZ0RhdGEsIGlzTWFzayA9IGZhbHNlKSB7CiAgICByZXR1cm4gbmV3IEltYWdlUmVzaXplcihpbWdEYXRhLCBpc01hc2spLl9jcmVhdGVJbWFnZSgpOwogIH0KICBhc3luYyBfY3JlYXRlSW1hZ2UoKSB7CiAgICBjb25zdCB7CiAgICAgIF9pbWdEYXRhOiBpbWdEYXRhCiAgICB9ID0gdGhpczsKICAgIGNvbnN0IHsKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSA9IGltZ0RhdGE7CiAgICBpZiAod2lkdGggKiBoZWlnaHQgKiA0ID4gTUFYX0lOVF8zMikgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNyZXNjYWxlSW1hZ2VEYXRhKCk7CiAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgICBjb25zdCBkYXRhID0gdGhpcy5fZW5jb2RlQk1QKCk7CiAgICBsZXQgZGVjb2RlciwgaW1hZ2VQcm9taXNlOwogICAgaWYgKGF3YWl0IEltYWdlUmVzaXplci5jYW5Vc2VJbWFnZURlY29kZXIpIHsKICAgICAgZGVjb2RlciA9IG5ldyBJbWFnZURlY29kZXIoewogICAgICAgIGRhdGEsCiAgICAgICAgdHlwZTogImltYWdlL2JtcCIsCiAgICAgICAgcHJlZmVyQW5pbWF0aW9uOiBmYWxzZSwKICAgICAgICB0cmFuc2ZlcjogW2RhdGEuYnVmZmVyXQogICAgICB9KTsKICAgICAgaW1hZ2VQcm9taXNlID0gZGVjb2Rlci5kZWNvZGUoKS5jYXRjaChyZWFzb24gPT4gewogICAgICAgIHdhcm4oYEJNUCBpbWFnZSBkZWNvZGluZyBmYWlsZWQ6ICR7cmVhc29ufWApOwogICAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbdGhpcy5fZW5jb2RlQk1QKCkuYnVmZmVyXSwgewogICAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgICB9KSk7CiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGRlY29kZXIuY2xvc2UoKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBpbWFnZVByb21pc2UgPSBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbZGF0YS5idWZmZXJdLCB7CiAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgfSkpOwogICAgfQogICAgY29uc3QgewogICAgICBNQVhfQVJFQSwKICAgICAgTUFYX0RJTQogICAgfSA9IEltYWdlUmVzaXplcjsKICAgIGNvbnN0IG1pbkZhY3RvciA9IE1hdGgubWF4KHdpZHRoIC8gTUFYX0RJTSwgaGVpZ2h0IC8gTUFYX0RJTSwgTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0IC8gTUFYX0FSRUEpKTsKICAgIGNvbnN0IGZpcnN0RmFjdG9yID0gTWF0aC5tYXgobWluRmFjdG9yLCAyKTsKICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucm91bmQoMTAgKiAobWluRmFjdG9yICsgMS4yNSkpIC8gMTAgLyBmaXJzdEZhY3RvcjsKICAgIGNvbnN0IE4gPSBNYXRoLmZsb29yKE1hdGgubG9nMihmYWN0b3IpKTsKICAgIGNvbnN0IHN0ZXBzID0gbmV3IEFycmF5KE4gKyAyKS5maWxsKDIpOwogICAgc3RlcHNbMF0gPSBmaXJzdEZhY3RvcjsKICAgIHN0ZXBzLnNwbGljZSgtMSwgMSwgZmFjdG9yIC8gKDEgPDwgTikpOwogICAgbGV0IG5ld1dpZHRoID0gd2lkdGg7CiAgICBsZXQgbmV3SGVpZ2h0ID0gaGVpZ2h0OwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW1hZ2VQcm9taXNlOwogICAgbGV0IGJpdG1hcCA9IHJlc3VsdC5pbWFnZSB8fCByZXN1bHQ7CiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHsKICAgICAgY29uc3QgcHJldldpZHRoID0gbmV3V2lkdGg7CiAgICAgIGNvbnN0IHByZXZIZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIG5ld1dpZHRoID0gTWF0aC5mbG9vcihuZXdXaWR0aCAvIHN0ZXApIC0gMTsKICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5mbG9vcihuZXdIZWlnaHQgLyBzdGVwKSAtIDE7CiAgICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgcHJldldpZHRoLCBwcmV2SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IG51bGw7CiAgICBpbWdEYXRhLmJpdG1hcCA9IGJpdG1hcDsKICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgIGltZ0RhdGEuaGVpZ2h0ID0gbmV3SGVpZ2h0OwogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogICNyZXNjYWxlSW1hZ2VEYXRhKCkgewogICAgY29uc3QgewogICAgICBfaW1nRGF0YTogaW1nRGF0YQogICAgfSA9IHRoaXM7CiAgICBjb25zdCB7CiAgICAgIGRhdGEsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGtpbmQKICAgIH0gPSBpbWdEYXRhOwogICAgY29uc3QgcmdiYVNpemUgPSB3aWR0aCAqIGhlaWdodCAqIDQ7CiAgICBjb25zdCBLID0gTWF0aC5jZWlsKE1hdGgubG9nMihyZ2JhU2l6ZSAvIE1BWF9JTlRfMzIpKTsKICAgIGNvbnN0IG5ld1dpZHRoID0gd2lkdGggPj4gSzsKICAgIGNvbnN0IG5ld0hlaWdodCA9IGhlaWdodCA+PiBLOwogICAgbGV0IHJnYmFEYXRhOwogICAgbGV0IG1heEhlaWdodCA9IGhlaWdodDsKICAgIHRyeSB7CiAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkocmdiYVNpemUpOwogICAgfSBjYXRjaCB7CiAgICAgIGxldCBuID0gTWF0aC5mbG9vcihNYXRoLmxvZzIocmdiYVNpemUgKyAxKSk7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMiAqKiBuIC0gMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIG4gLT0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcigoMiAqKiBuIC0gMSkgLyAod2lkdGggKiA0KSk7CiAgICAgIGNvbnN0IG5ld1NpemUgPSB3aWR0aCAqIG1heEhlaWdodCAqIDQ7CiAgICAgIGlmIChuZXdTaXplIDwgcmdiYURhdGEubGVuZ3RoKSB7CiAgICAgICAgcmdiYURhdGEgPSBuZXcgVWludDhBcnJheShuZXdTaXplKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkocmdiYURhdGEuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShuZXdXaWR0aCAqIG5ld0hlaWdodCk7CiAgICBsZXQgc3JjUG9zID0gMDsKICAgIGxldCBuZXdJbmRleCA9IDA7CiAgICBjb25zdCBzdGVwID0gTWF0aC5jZWlsKGhlaWdodCAvIG1heEhlaWdodCk7CiAgICBjb25zdCByZW1haW5kZXIgPSBoZWlnaHQgJSBtYXhIZWlnaHQgPT09IDAgPyBoZWlnaHQgOiBoZWlnaHQgJSBtYXhIZWlnaHQ7CiAgICBmb3IgKGxldCBrID0gMDsgayA8IHN0ZXA7IGsrKykgewogICAgICBjb25zdCBoID0gayA8IHN0ZXAgLSAxID8gbWF4SGVpZ2h0IDogcmVtYWluZGVyOwogICAgICAoewogICAgICAgIHNyY1BvcwogICAgICB9ID0gY29udmVydFRvUkdCQSh7CiAgICAgICAga2luZCwKICAgICAgICBzcmM6IGRhdGEsCiAgICAgICAgZGVzdDogc3JjMzIsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGludmVyc2VEZWNvZGU6IHRoaXMuX2lzTWFzaywKICAgICAgICBzcmNQb3MKICAgICAgfSkpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoID4+IEs7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgYnVmID0gc3JjMzIuc3ViYXJyYXkoKGkgPDwgSykgKiB3aWR0aCk7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdXaWR0aDsgaisrKSB7CiAgICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gPSBidWZbaiA8PCBLXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChJbWFnZVJlc2l6ZXIubmVlZHNUb0JlUmVzaXplZChuZXdXaWR0aCwgbmV3SGVpZ2h0KSkgewogICAgICBpbWdEYXRhLmRhdGEgPSBkZXN0MzI7CiAgICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgICAgaW1nRGF0YS5oZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZQogICAgfSk7CiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRlc3QzMi5idWZmZXIpLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KSwgMCwgMCk7CiAgICBpbWdEYXRhLmRhdGEgPSBudWxsOwogICAgaW1nRGF0YS5iaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICBpbWdEYXRhLndpZHRoID0gbmV3V2lkdGg7CiAgICBpbWdEYXRhLmhlaWdodCA9IG5ld0hlaWdodDsKICAgIHJldHVybiBpbWdEYXRhOwogIH0KICBfZW5jb2RlQk1QKCkgewogICAgY29uc3QgewogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBraW5kCiAgICB9ID0gdGhpcy5faW1nRGF0YTsKICAgIGxldCBkYXRhID0gdGhpcy5faW1nRGF0YS5kYXRhOwogICAgbGV0IGJpdFBlclBpeGVsOwogICAgbGV0IGNvbG9yVGFibGUgPSBuZXcgVWludDhBcnJheSgwKTsKICAgIGxldCBtYXNrVGFibGUgPSBjb2xvclRhYmxlOwogICAgbGV0IGNvbXByZXNzaW9uID0gMDsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgICB7CiAgICAgICAgICBiaXRQZXJQaXhlbCA9IDE7CiAgICAgICAgICBjb2xvclRhYmxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5faXNNYXNrID8gWzI1NSwgMjU1LCAyNTUsIDI1NSwgMCwgMCwgMCwgMF0gOiBbMCwgMCwgMCwgMCwgMjU1LCAyNTUsIDI1NSwgMjU1XSk7CiAgICAgICAgICBjb25zdCByb3dMZW4gPSB3aWR0aCArIDcgPj4gMzsKICAgICAgICAgIGNvbnN0IHJvd1NpemUgPSByb3dMZW4gKyAzICYgLTQ7CiAgICAgICAgICBpZiAocm93TGVuICE9PSByb3dTaXplKSB7CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4sIGsgKz0gcm93U2l6ZSkgewogICAgICAgICAgICAgIG5ld0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoaSwgaSArIHJvd0xlbiksIGspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgICAgewogICAgICAgICAgYml0UGVyUGl4ZWwgPSAyNDsKICAgICAgICAgIGlmICh3aWR0aCAmIDMpIHsKICAgICAgICAgICAgY29uc3Qgcm93TGVuID0gMyAqIHdpZHRoOwogICAgICAgICAgICBjb25zdCByb3dTaXplID0gcm93TGVuICsgMyAmIC00OwogICAgICAgICAgICBjb25zdCBleHRyYUxlbiA9IHJvd1NpemUgLSByb3dMZW47CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4pIHsKICAgICAgICAgICAgICBjb25zdCByb3cgPSBkYXRhLnN1YmFycmF5KGksIGkgKyByb3dMZW4pOwogICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93TGVuOyBqICs9IDMpIHsKICAgICAgICAgICAgICAgIG5ld0RhdGFbaysrXSA9IHJvd1tqICsgMl07CiAgICAgICAgICAgICAgICBuZXdEYXRhW2srK10gPSByb3dbaiArIDFdOwogICAgICAgICAgICAgICAgbmV3RGF0YVtrKytdID0gcm93W2pdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBrICs9IGV4dHJhTGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CiAgICAgICAgICAgICAgY29uc3QgdG1wID0gZGF0YVtpXTsKICAgICAgICAgICAgICBkYXRhW2ldID0gZGF0YVtpICsgMl07CiAgICAgICAgICAgICAgZGF0YVtpICsgMl0gPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBJbWFnZUtpbmQuUkdCQV8zMkJQUDoKICAgICAgICBiaXRQZXJQaXhlbCA9IDMyOwogICAgICAgIGNvbXByZXNzaW9uID0gMzsKICAgICAgICBtYXNrVGFibGUgPSBuZXcgVWludDhBcnJheSg0ICsgNCArIDQgKyA0ICsgNTIpOwogICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobWFza1RhYmxlLmJ1ZmZlcik7CiAgICAgICAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigwLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDQsIDB4MDAwMGZmMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoOCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigxMiwgMHhmZjAwMDAwMCwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDAsIDB4ZmYwMDAwMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoNCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMig4LCAweDAwMDBmZjAwLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDEyLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpOwogICAgfQogICAgbGV0IGkgPSAwOwogICAgY29uc3QgaGVhZGVyTGVuZ3RoID0gNDAgKyBtYXNrVGFibGUubGVuZ3RoOwogICAgY29uc3QgZmlsZUxlbmd0aCA9IDE0ICsgaGVhZGVyTGVuZ3RoICsgY29sb3JUYWJsZS5sZW5ndGggKyBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IGJtcERhdGEgPSBuZXcgVWludDhBcnJheShmaWxlTGVuZ3RoKTsKICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYm1wRGF0YS5idWZmZXIpOwogICAgdmlldy5zZXRVaW50MTYoaSwgMHg0ZDQyLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGZpbGVMZW5ndGgsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCAxNCArIGhlYWRlckxlbmd0aCArIGNvbG9yVGFibGUubGVuZ3RoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIGhlYWRlckxlbmd0aCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldEludDMyKGksIHdpZHRoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgLWhlaWdodCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQxNihpLCAxLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDE2KGksIGJpdFBlclBpeGVsLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGNvbXByZXNzaW9uLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIDAsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRJbnQzMihpLCAwLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCBjb2xvclRhYmxlLmxlbmd0aCAvIDQsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICBibXBEYXRhLnNldChtYXNrVGFibGUsIGkpOwogICAgaSArPSBtYXNrVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoY29sb3JUYWJsZSwgaSk7CiAgICBpICs9IGNvbG9yVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoZGF0YSwgaSk7CiAgICByZXR1cm4gYm1wRGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2RlY29kZV9zdHJlYW0uanMKCgpjb25zdCBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApOwpjbGFzcyBEZWNvZGVTdHJlYW0gZXh0ZW5kcyBCYXNlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihtYXliZU1pbkJ1ZmZlckxlbmd0aCkgewogICAgc3VwZXIoKTsKICAgIHRoaXMuX3Jhd01pbkJ1ZmZlckxlbmd0aCA9IG1heWJlTWluQnVmZmVyTGVuZ3RoIHx8IDA7CiAgICB0aGlzLnBvcyA9IDA7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7CiAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgdGhpcy5idWZmZXIgPSBlbXB0eUJ1ZmZlcjsKICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoID0gNTEyOwogICAgaWYgKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICAgIHdoaWxlICh0aGlzLm1pbkJ1ZmZlckxlbmd0aCA8IG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjsKICAgICAgfQogICAgfQogIH0KICBnZXQgaXNFbXB0eSgpIHsKICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPT09IDApIHsKICAgICAgdGhpcy5yZWFkQmxvY2soKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMDsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkgewogICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBpZiAocmVxdWVzdGVkIDw9IGJ1ZmZlci5ieXRlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICBsZXQgc2l6ZSA9IHRoaXMubWluQnVmZmVyTGVuZ3RoOwogICAgd2hpbGUgKHNpemUgPCByZXF1ZXN0ZWQpIHsKICAgICAgc2l6ZSAqPSAyOwogICAgfQogICAgY29uc3QgYnVmZmVyMiA9IG5ldyBVaW50OEFycmF5KHNpemUpOwogICAgYnVmZmVyMi5zZXQoYnVmZmVyKTsKICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjI7CiAgfQogIGdldEJ5dGUoKSB7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBwb3MpIHsKICAgICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107CiAgfQogIGdldEJ5dGVzKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMgPSBudWxsKSB7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIGxldCBlbmQ7CiAgICBpZiAobGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7CiAgICAgIGVuZCA9IHBvcyArIGxlbmd0aDsKICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA8IGVuZCkgewogICAgICAgIHRoaXMucmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICBjb25zdCBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgICAgaWYgKGVuZCA+IGJ1ZkVuZCkgewogICAgICAgIGVuZCA9IGJ1ZkVuZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICBlbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIH0KICAgIHRoaXMucG9zID0gZW5kOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyLnN1YmFycmF5KHBvcywgZW5kKTsKICB9CiAgYXN5bmMgZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpIHsKICAgIGlmICghdGhpcy5jYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcikgewogICAgICBpZiAodGhpcy5pc0FzeW5jRGVjb2RlcikgewogICAgICAgIHJldHVybiB0aGlzLmRlY29kZUltYWdlKG51bGwsIGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGRlY29kZXJPcHRpb25zKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnN0cmVhbS5hc3luY0dldEJ5dGVzKCk7CiAgICByZXR1cm4gdGhpcy5kZWNvZGVJbWFnZShkYXRhLCBkZWNvZGVyT3B0aW9ucyk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5wb3MgPSAwOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwogICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gdGhpcy5zdHIgPyB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpIDogbnVsbDsKICB9Cn0KY2xhc3MgU3RyZWFtc1NlcXVlbmNlU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW1zLCBvbkVycm9yID0gbnVsbCkgewogICAgc3RyZWFtcyA9IHN0cmVhbXMuZmlsdGVyKHMgPT4gcyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pOwogICAgbGV0IG1heWJlTGVuZ3RoID0gMDsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHN0cmVhbXMpIHsKICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtIGluc3RhbmNlb2YgRGVjb2RlU3RyZWFtID8gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGggOiBzdHJlYW0ubGVuZ3RoOwogICAgfQogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtczsKICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yOwogIH0KICByZWFkQmxvY2soKSB7CiAgICBjb25zdCBzdHJlYW1zID0gdGhpcy5zdHJlYW1zOwogICAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpOwogICAgbGV0IGNodW5rOwogICAgdHJ5IHsKICAgICAgY2h1bmsgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICBpZiAodGhpcy5fb25FcnJvcikgewogICAgICAgIHRoaXMuX29uRXJyb3IocmVhc29uLCBzdHJlYW0uZGljdD8ub2JqSWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IG5ld0xlbmd0aCA9IGJ1ZmZlckxlbmd0aCArIGNodW5rLmxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQogIGdldEJhc2VTdHJlYW1zKCkgewogICAgY29uc3QgYmFzZVN0cmVhbXNCdWYgPSBbXTsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHRoaXMuc3RyZWFtcykgewogICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IHN0cmVhbS5nZXRCYXNlU3RyZWFtcygpOwogICAgICBpZiAoYmFzZVN0cmVhbXMpIHsKICAgICAgICBiYXNlU3RyZWFtc0J1Zi5wdXNoKC4uLmJhc2VTdHJlYW1zKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJhc2VTdHJlYW1zQnVmLmxlbmd0aCA+IDAgPyBiYXNlU3RyZWFtc0J1ZiA6IG51bGw7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jb2xvcnNwYWNlX3V0aWxzLmpzCgoKCgoKY2xhc3MgQ29sb3JTcGFjZVV0aWxzIHsKICBzdGF0aWMgcGFyc2UoewogICAgY3MsCiAgICB4cmVmLAogICAgcmVzb3VyY2VzID0gbnVsbCwKICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgYXN5bmNJZk5vdENhY2hlZCA9IGZhbHNlCiAgfSkgewogICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgeHJlZiwKICAgICAgcmVzb3VyY2VzLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH07CiAgICBsZXQgY3NOYW1lLCBjc1JlZiwgcGFyc2VkQ1M7CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgY3NSZWYgPSBjczsKICAgICAgY29uc3QgY2FjaGVkQ1MgPSBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlSZWYoY3NSZWYpIHx8IGxvY2FsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzUmVmKTsKICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICB9CiAgICAgIGNzID0geHJlZi5mZXRjaChjcyk7CiAgICB9CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIGNzTmFtZSA9IGNzLm5hbWU7CiAgICAgIGNvbnN0IGNhY2hlZENTID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlOYW1lKGNzTmFtZSk7CiAgICAgIGlmIChjYWNoZWRDUykgewogICAgICAgIHJldHVybiBjYWNoZWRDUzsKICAgICAgfQogICAgfQogICAgdHJ5IHsKICAgICAgcGFyc2VkQ1MgPSB0aGlzLiNwYXJzZShjcywgb3B0aW9ucyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoYXN5bmNJZk5vdENhY2hlZCAmJiAhKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGV4KTsKICAgICAgfQogICAgICB0aHJvdyBleDsKICAgIH0KICAgIGlmIChjc05hbWUgfHwgY3NSZWYpIHsKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0KGNzTmFtZSwgY3NSZWYsIHBhcnNlZENTKTsKICAgICAgaWYgKGNzUmVmKSB7CiAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLnNldChudWxsLCBjc1JlZiwgcGFyc2VkQ1MpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXN5bmNJZk5vdENhY2hlZCA/IFByb21pc2UucmVzb2x2ZShwYXJzZWRDUykgOiBwYXJzZWRDUzsKICB9CiAgc3RhdGljICNzdWJQYXJzZShjcywgb3B0aW9ucykgewogICAgY29uc3QgewogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0gPSBvcHRpb25zOwogICAgbGV0IGNzUmVmOwogICAgaWYgKGNzIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIGNzUmVmID0gY3M7CiAgICAgIGNvbnN0IGNhY2hlZENTID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzUmVmKTsKICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICB9CiAgICB9CiAgICBjb25zdCBwYXJzZWRDUyA9IHRoaXMuI3BhcnNlKGNzLCBvcHRpb25zKTsKICAgIGlmIChjc1JlZikgewogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuc2V0KG51bGwsIGNzUmVmLCBwYXJzZWRDUyk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VkQ1M7CiAgfQogIHN0YXRpYyAjcGFyc2UoY3MsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHsKICAgICAgeHJlZiwKICAgICAgcmVzb3VyY2VzLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZQogICAgfSA9IG9wdGlvbnM7CiAgICBjcyA9IHhyZWYuZmV0Y2hJZlJlZihjcyk7CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAoY3MubmFtZSkgewogICAgICAgIGNhc2UgIkciOgogICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgcmV0dXJuIHRoaXMuZ3JheTsKICAgICAgICBjYXNlICJSR0IiOgogICAgICAgIGNhc2UgIkRldmljZVJHQiI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZ2I7CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCQSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZ2JhOwogICAgICAgIGNhc2UgIkNNWUsiOgogICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgcmV0dXJuIHRoaXMuY215azsKICAgICAgICBjYXNlICJQYXR0ZXJuIjoKICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKG51bGwpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICBjb25zdCBjb2xvclNwYWNlcyA9IHJlc291cmNlcy5nZXQoIkNvbG9yU3BhY2UiKTsKICAgICAgICAgICAgaWYgKGNvbG9yU3BhY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlc0NTID0gY29sb3JTcGFjZXMuZ2V0KGNzLm5hbWUpOwogICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNDUykgewogICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc0NTIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jcGFyc2UocmVzb3VyY2VzQ1MsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3MgPSByZXNvdXJjZXNDUzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgd2FybihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2U6ICR7Y3MubmFtZX1gKTsKICAgICAgICAgIHJldHVybiB0aGlzLmdyYXk7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KGNzKSkgewogICAgICBjb25zdCBtb2RlID0geHJlZi5mZXRjaElmUmVmKGNzWzBdKS5uYW1lOwogICAgICBsZXQgcGFyYW1zLCBudW1Db21wcywgYmFzZUNTLCB3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYTsKICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgY2FzZSAiRyI6CiAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5ncmF5OwogICAgICAgIGNhc2UgIlJHQiI6CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJnYjsKICAgICAgICBjYXNlICJDTVlLIjoKICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKICAgICAgICAgIHJldHVybiB0aGlzLmNteWs7CiAgICAgICAgY2FzZSAiQ2FsR3JheSI6CiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOwogICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOwogICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0KCJHYW1tYSIpOwogICAgICAgICAgcmV0dXJuIG5ldyBDYWxHcmF5Q1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEpOwogICAgICAgIGNhc2UgIkNhbFJHQiI6CiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOwogICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOwogICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0QXJyYXkoIkdhbW1hIik7CiAgICAgICAgICBjb25zdCBtYXRyaXggPSBwYXJhbXMuZ2V0QXJyYXkoIk1hdHJpeCIpOwogICAgICAgICAgcmV0dXJuIG5ldyBDYWxSR0JDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KTsKICAgICAgICBjYXNlICJJQ0NCYXNlZCI6CiAgICAgICAgICBjb25zdCBpc1JlZiA9IGNzWzFdIGluc3RhbmNlb2YgUmVmOwogICAgICAgICAgaWYgKGlzUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IGNhY2hlZENTID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzWzFdKTsKICAgICAgICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdHJlYW0gPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgY29uc3QgZGljdCA9IHN0cmVhbS5kaWN0OwogICAgICAgICAgbnVtQ29tcHMgPSBkaWN0LmdldCgiTiIpOwogICAgICAgICAgaWYgKEljY0NvbG9yU3BhY2UuaXNVc2FibGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBjb25zdCBpY2NDUyA9IG5ldyBJY2NDb2xvclNwYWNlKHN0cmVhbS5nZXRCeXRlcygpLCAiSUNDQmFzZWQiLCBudW1Db21wcyk7CiAgICAgICAgICAgICAgaWYgKGlzUmVmKSB7CiAgICAgICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuc2V0KG51bGwsIGNzWzFdLCBpY2NDUyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBpY2NDUzsKICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHdhcm4oYElDQ0Jhc2VkIGNvbG9yIHNwYWNlICgke2NzWzFdfSk6ICIke2V4fSIuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGFsdFJhdyA9IGRpY3QuZ2V0UmF3KCJBbHRlcm5hdGUiKTsKICAgICAgICAgIGlmIChhbHRSYXcpIHsKICAgICAgICAgICAgY29uc3QgYWx0Q1MgPSB0aGlzLiNzdWJQYXJzZShhbHRSYXcsIG9wdGlvbnMpOwogICAgICAgICAgICBpZiAoYWx0Q1MubnVtQ29tcHMgPT09IG51bUNvbXBzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFsdENTOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdhcm4oIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChudW1Db21wcyA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ncmF5OwogICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gMykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZ2I7CiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSA0KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNteWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQYXR0ZXJuIjoKICAgICAgICAgIGJhc2VDUyA9IGNzWzFdIHx8IG51bGw7CiAgICAgICAgICBpZiAoYmFzZUNTKSB7CiAgICAgICAgICAgIGJhc2VDUyA9IHRoaXMuI3N1YlBhcnNlKGJhc2VDUywgb3B0aW9ucyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IFBhdHRlcm5DUyhiYXNlQ1MpOwogICAgICAgIGNhc2UgIkkiOgogICAgICAgIGNhc2UgIkluZGV4ZWQiOgogICAgICAgICAgYmFzZUNTID0gdGhpcy4jc3ViUGFyc2UoY3NbMV0sIG9wdGlvbnMpOwogICAgICAgICAgY29uc3QgaGlWYWwgPSBNYXRoQ2xhbXAoeHJlZi5mZXRjaElmUmVmKGNzWzJdKSwgMCwgMjU1KTsKICAgICAgICAgIGNvbnN0IGxvb2t1cCA9IHhyZWYuZmV0Y2hJZlJlZihjc1szXSk7CiAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRDUyhiYXNlQ1MsIGhpVmFsLCBsb29rdXApOwogICAgICAgIGNhc2UgIlNlcGFyYXRpb24iOgogICAgICAgIGNhc2UgIkRldmljZU4iOgogICAgICAgICAgY29uc3QgbmFtZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CiAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7CiAgICAgICAgICBiYXNlQ1MgPSB0aGlzLiNzdWJQYXJzZShjc1syXSwgb3B0aW9ucyk7CiAgICAgICAgICBjb25zdCB0aW50Rm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGNzWzNdKTsKICAgICAgICAgIHJldHVybiBuZXcgQWx0ZXJuYXRlQ1MobnVtQ29tcHMsIGJhc2VDUywgdGludEZuKTsKICAgICAgICBjYXNlICJMYWIiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGNvbnN0IHJhbmdlID0gcGFyYW1zLmdldEFycmF5KCJSYW5nZSIpOwogICAgICAgICAgcmV0dXJuIG5ldyBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICR7bW9kZX1gKTsKICAgICAgICAgIHJldHVybiB0aGlzLmdyYXk7CiAgICAgIH0KICAgIH0KICAgIHdhcm4oYFVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogJHtjc31gKTsKICAgIHJldHVybiB0aGlzLmdyYXk7CiAgfQogIHN0YXRpYyBnZXQgZ3JheSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImdyYXkiLCBuZXcgRGV2aWNlR3JheUNTKCkpOwogIH0KICBzdGF0aWMgZ2V0IHJnYigpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInJnYiIsIG5ldyBEZXZpY2VSZ2JDUygpKTsKICB9CiAgc3RhdGljIGdldCByZ2JhKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmdiYSIsIG5ldyBEZXZpY2VSZ2JhQ1MoKSk7CiAgfQogIHN0YXRpYyBnZXQgY215aygpIHsKICAgIGlmIChDbXlrSUNDQmFzZWRDUy5pc1VzYWJsZSkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNteWsiLCBuZXcgQ215a0lDQ0Jhc2VkQ1MoKSk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHdhcm4oIkNNWUsgZmFsbGJhY2s6IERldmljZUNNWUsiKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY215ayIsIG5ldyBEZXZpY2VDbXlrQ1MoKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qcGcuanMKCgoKCgpjbGFzcyBKcGVnRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkpwZWdFcnJvciIpOwogIH0KfQpjbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHNjYW5MaW5lcykgewogICAgc3VwZXIobWVzc2FnZSwgIkROTE1hcmtlckVycm9yIik7CiAgICB0aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lczsKICB9Cn0KY2xhc3MgRU9JTWFya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkVPSU1hcmtlckVycm9yIik7CiAgfQp9CmNvbnN0IGRjdFppZ1phZyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCA4LCAxNiwgOSwgMiwgMywgMTAsIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsIDQsIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwgMjcsIDIwLCAxMywgNiwgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LCAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzXSk7CmNvbnN0IGRjdENvczEgPSA0MDE3Owpjb25zdCBkY3RTaW4xID0gNzk5Owpjb25zdCBkY3RDb3MzID0gMzQwNjsKY29uc3QgZGN0U2luMyA9IDIyNzY7CmNvbnN0IGRjdENvczYgPSAxNTY3Owpjb25zdCBkY3RTaW42ID0gMzc4NDsKY29uc3QgZGN0U3FydDIgPSA1NzkzOwpjb25zdCBkY3RTcXJ0MWQyID0gMjg5NjsKZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsIHZhbHVlcykgewogIGxldCBrID0gMCwKICAgIGksCiAgICBqLAogICAgbGVuZ3RoID0gMTY7CiAgd2hpbGUgKGxlbmd0aCA+IDAgJiYgIWNvZGVMZW5ndGhzW2xlbmd0aCAtIDFdKSB7CiAgICBsZW5ndGgtLTsKICB9CiAgY29uc3QgY29kZSA9IFt7CiAgICBjaGlsZHJlbjogW10sCiAgICBpbmRleDogMAogIH1dOwogIGxldCBwID0gY29kZVswXSwKICAgIHE7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aHNbaV07IGorKykgewogICAgICBwID0gY29kZS5wb3AoKTsKICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHZhbHVlc1trXTsKICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7CiAgICAgICAgcCA9IGNvZGUucG9wKCk7CiAgICAgIH0KICAgICAgcC5pbmRleCsrOwogICAgICBjb2RlLnB1c2gocCk7CiAgICAgIHdoaWxlIChjb2RlLmxlbmd0aCA8PSBpKSB7CiAgICAgICAgY29kZS5wdXNoKHEgPSB7CiAgICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgICBpbmRleDogMAogICAgICAgIH0pOwogICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOwogICAgICAgIHAgPSBxOwogICAgICB9CiAgICAgIGsrKzsKICAgIH0KICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewogICAgICBjb2RlLnB1c2gocSA9IHsKICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgaW5kZXg6IDAKICAgICAgfSk7CiAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOwogICAgICBwID0gcTsKICAgIH0KICB9CiAgcmV0dXJuIGNvZGVbMF0uY2hpbGRyZW47Cn0KZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkgewogIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7Cn0KZnVuY3Rpb24gZGVjb2RlU2NhbihkYXRhLCBvZmZzZXQsIGZyYW1lLCBjb21wb25lbnRzLCByZXNldEludGVydmFsLCBzcGVjdHJhbFN0YXJ0LCBzcGVjdHJhbEVuZCwgc3VjY2Vzc2l2ZVByZXYsIHN1Y2Nlc3NpdmUsIHBhcnNlRE5MTWFya2VyID0gZmFsc2UpIHsKICBjb25zdCBtY3VzUGVyTGluZSA9IGZyYW1lLm1jdXNQZXJMaW5lOwogIGNvbnN0IHByb2dyZXNzaXZlID0gZnJhbWUucHJvZ3Jlc3NpdmU7CiAgY29uc3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAgbGV0IGJpdHNEYXRhID0gMCwKICAgIGJpdHNDb3VudCA9IDA7CiAgZnVuY3Rpb24gcmVhZEJpdCgpIHsKICAgIGlmIChiaXRzQ291bnQgPiAwKSB7CiAgICAgIGJpdHNDb3VudC0tOwogICAgICByZXR1cm4gYml0c0RhdGEgPj4gYml0c0NvdW50ICYgMTsKICAgIH0KICAgIGJpdHNEYXRhID0gZGF0YVtvZmZzZXQrK107CiAgICBpZiAoYml0c0RhdGEgPT09IDB4ZmYpIHsKICAgICAgY29uc3QgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTsKICAgICAgaWYgKG5leHRCeXRlKSB7CiAgICAgICAgaWYgKG5leHRCeXRlID09PSAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnN0IHNjYW5MaW5lcyA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgaWYgKHNjYW5MaW5lcyA+IDAgJiYgc2NhbkxpbmVzICE9PSBmcmFtZS5zY2FuTGluZXMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEROTE1hcmtlckVycm9yKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIiwgc2NhbkxpbmVzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAweGQ5KSB7CiAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHsKICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7CiAgICAgICAgICAgIGlmIChtYXliZVNjYW5MaW5lcyA+IDAgJiYgTWF0aC5yb3VuZChmcmFtZS5zY2FuTGluZXMgLyBtYXliZVNjYW5MaW5lcykgPj0gNSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgIiArICJwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsIG1heWJlU2NhbkxpbmVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IEVPSU1hcmtlckVycm9yKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIik7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoYHVuZXhwZWN0ZWQgbWFya2VyICR7KGJpdHNEYXRhIDw8IDggfCBuZXh0Qnl0ZSkudG9TdHJpbmcoMTYpfWApOwogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSA3OwogICAgcmV0dXJuIGJpdHNEYXRhID4+PiA3OwogIH0KICBmdW5jdGlvbiBkZWNvZGVIdWZmbWFuKHRyZWUpIHsKICAgIGxldCBub2RlID0gdHJlZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG5vZGUgPSBub2RlW3JlYWRCaXQoKV07CiAgICAgIHN3aXRjaCAodHlwZW9mIG5vZGUpIHsKICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZSIpOwogICAgfQogIH0KICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkgewogICAgbGV0IG4gPSAwOwogICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKICAgICAgbiA9IG4gPDwgMSB8IHJlYWRCaXQoKTsKICAgICAgbGVuZ3RoLS07CiAgICB9CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gcmVjZWl2ZUFuZEV4dGVuZChsZW5ndGgpIHsKICAgIGlmIChsZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHJlYWRCaXQoKSA9PT0gMSA/IDEgOiAtMTsKICAgIH0KICAgIGNvbnN0IG4gPSByZWNlaXZlKGxlbmd0aCk7CiAgICBpZiAobiA+PSAxIDw8IGxlbmd0aCAtIDEpIHsKICAgICAgcmV0dXJuIG47CiAgICB9CiAgICByZXR1cm4gbiArICgtMSA8PCBsZW5ndGgpICsgMTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29uc3QgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKICAgIGNvbnN0IGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7CiAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CiAgICBsZXQgayA9IDE7CiAgICB3aGlsZSAoayA8IDY0KSB7CiAgICAgIGNvbnN0IHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOwogICAgICBjb25zdCBzID0gcnMgJiAxNSwKICAgICAgICByID0gcnMgPj4gNDsKICAgICAgaWYgKHMgPT09IDApIHsKICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7CiAgICAgIGsrKzsKICAgIH0KICB9CiAgZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBjb25zdCB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOwogICAgY29uc3QgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlOwogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmOwogIH0KICBmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gfD0gcmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmU7CiAgfQogIGxldCBlb2JydW4gPSAwOwogIGZ1bmN0aW9uIGRlY29kZUFDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgaWYgKGVvYnJ1biA+IDApIHsKICAgICAgZW9icnVuLS07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBrID0gc3BlY3RyYWxTdGFydDsKICAgIGNvbnN0IGUgPSBzcGVjdHJhbEVuZDsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3QgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CiAgICAgIGNvbnN0IHMgPSBycyAmIDE1LAogICAgICAgIHIgPSBycyA+PiA0OwogICAgICBpZiAocyA9PT0gMCkgewogICAgICAgIGlmIChyIDwgMTUpIHsKICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKSAtIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTsKICAgICAgaysrOwogICAgfQogIH0KICBsZXQgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwLAogICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlOwogIGZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBsZXQgayA9IHNwZWN0cmFsU3RhcnQ7CiAgICBjb25zdCBlID0gc3BlY3RyYWxFbmQ7CiAgICBsZXQgciA9IDA7CiAgICBsZXQgczsKICAgIGxldCByczsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3Qgb2Zmc2V0WiA9IGJsb2NrT2Zmc2V0ICsgZGN0WmlnWmFnW2tdOwogICAgICBjb25zdCBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7CiAgICAgIHN3aXRjaCAoc3VjY2Vzc2l2ZUFDU3RhdGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKICAgICAgICAgIHMgPSBycyAmIDE1OwogICAgICAgICAgciA9IHJzID4+IDQ7CiAgICAgICAgICBpZiAocyA9PT0gMCkgewogICAgICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpOwogICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gNDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByID0gMTY7CiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocyAhPT0gMSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIDE6CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHItLTsKICAgICAgICAgICAgaWYgKHIgPT09IDApIHsKICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSAyID8gMyA6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID0gc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIDw8IHN1Y2Nlc3NpdmU7CiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBrKys7CiAgICB9CiAgICBpZiAoc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDQpIHsKICAgICAgZW9icnVuLS07CiAgICAgIGlmIChlb2JydW4gPT09IDApIHsKICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CiAgICAgIH0KICAgIH0KICB9CiAgbGV0IGJsb2NrUm93ID0gMDsKICBmdW5jdGlvbiBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGUsIG1jdSwgcm93LCBjb2wpIHsKICAgIGNvbnN0IG1jdVJvdyA9IG1jdSAvIG1jdXNQZXJMaW5lIHwgMDsKICAgIGNvbnN0IG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lOwogICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdzsKICAgIGNvbnN0IGJsb2NrQ29sID0gbWN1Q29sICogY29tcG9uZW50LmggKyBjb2w7CiAgICBjb25zdCBibG9ja09mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKICAgIGRlY29kZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkgewogICAgYmxvY2tSb3cgPSBtY3UgLyBjb21wb25lbnQuYmxvY2tzUGVyTGluZSB8IDA7CiAgICBjb25zdCBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOwogICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CiAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7CiAgfQogIGNvbnN0IGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDsKICBsZXQgY29tcG9uZW50LCBpLCBqLCBrLCBuOwogIGxldCBkZWNvZGVGbjsKICBpZiAocHJvZ3Jlc3NpdmUpIHsKICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7CiAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlOwogICAgfSBlbHNlIHsKICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7CiAgICB9CiAgfSBlbHNlIHsKICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7CiAgfQogIGxldCBtY3UgPSAwLAogICAgZmlsZU1hcmtlcjsKICBjb25zdCBtY3VFeHBlY3RlZCA9IGNvbXBvbmVudHNMZW5ndGggPT09IDEgPyBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckxpbmUgKiBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckNvbHVtbiA6IG1jdXNQZXJMaW5lICogZnJhbWUubWN1c1BlckNvbHVtbjsKICBsZXQgaCwgdjsKICB3aGlsZSAobWN1IDw9IG1jdUV4cGVjdGVkKSB7CiAgICBjb25zdCBtY3VUb1JlYWQgPSByZXNldEludGVydmFsID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpIDogbWN1RXhwZWN0ZWQ7CiAgICBpZiAobWN1VG9SZWFkID4gMCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7CiAgICAgICAgY29tcG9uZW50c1tpXS5wcmVkID0gMDsKICAgICAgfQogICAgICBlb2JydW4gPSAwOwogICAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkgewogICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbMF07CiAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7CiAgICAgICAgICBkZWNvZGVCbG9jayhjb21wb25lbnQsIGRlY29kZUZuLCBtY3UpOwogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOwogICAgICAgICAgICBoID0gY29tcG9uZW50Lmg7CiAgICAgICAgICAgIHYgPSBjb21wb25lbnQudjsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHY7IGorKykgewogICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoOyBrKyspIHsKICAgICAgICAgICAgICAgIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZUZuLCBtY3UsIGosIGspOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSAwOwogICAgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQpOwogICAgaWYgKCFmaWxlTWFya2VyKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkgewogICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/ICJ1bmV4cGVjdGVkIiA6ICJleGNlc3NpdmUiOwogICAgICB3YXJuKGBkZWNvZGVTY2FuIC0gJHtwYXJ0aWFsTXNnfSBNQ1UgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICR7ZmlsZU1hcmtlci5pbnZhbGlkfWApOwogICAgICBvZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKICAgIH0KICAgIGlmIChmaWxlTWFya2VyLm1hcmtlciA+PSAweGZmZDAgJiYgZmlsZU1hcmtlci5tYXJrZXIgPD0gMHhmZmQ3KSB7CiAgICAgIG9mZnNldCArPSAyOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDsKfQpmdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LCBibG9ja0J1ZmZlck9mZnNldCwgcCkgewogIGNvbnN0IHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLAogICAgYmxvY2tEYXRhID0gY29tcG9uZW50LmJsb2NrRGF0YTsKICBsZXQgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3OwogIGxldCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDc7CiAgbGV0IHQ7CiAgaWYgKCFxdCkgewogICAgdGhyb3cgbmV3IEpwZWdFcnJvcigibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuIik7CiAgfQogIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IDY0OyByb3cgKz0gOCkgewogICAgcDAgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3ddOwogICAgcDEgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAxXTsKICAgIHAyID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMl07CiAgICBwMyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDNdOwogICAgcDQgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA0XTsKICAgIHA1ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNV07CiAgICBwNiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDZdOwogICAgcDcgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA3XTsKICAgIHAwICo9IHF0W3Jvd107CiAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkgewogICAgICB0ID0gZGN0U3FydDIgKiBwMCArIDUxMiA+PiAxMDsKICAgICAgcFtyb3ddID0gdDsKICAgICAgcFtyb3cgKyAxXSA9IHQ7CiAgICAgIHBbcm93ICsgMl0gPSB0OwogICAgICBwW3JvdyArIDNdID0gdDsKICAgICAgcFtyb3cgKyA0XSA9IHQ7CiAgICAgIHBbcm93ICsgNV0gPSB0OwogICAgICBwW3JvdyArIDZdID0gdDsKICAgICAgcFtyb3cgKyA3XSA9IHQ7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgcDEgKj0gcXRbcm93ICsgMV07CiAgICBwMiAqPSBxdFtyb3cgKyAyXTsKICAgIHAzICo9IHF0W3JvdyArIDNdOwogICAgcDQgKj0gcXRbcm93ICsgNF07CiAgICBwNSAqPSBxdFtyb3cgKyA1XTsKICAgIHA2ICo9IHF0W3JvdyArIDZdOwogICAgcDcgKj0gcXRbcm93ICsgN107CiAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAxMjggPj4gODsKICAgIHYxID0gZGN0U3FydDIgKiBwNCArIDEyOCA+PiA4OwogICAgdjIgPSBwMjsKICAgIHYzID0gcDY7CiAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAxMjggPj4gODsKICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDEyOCA+PiA4OwogICAgdjUgPSBwMyA8PCA0OwogICAgdjYgPSBwNSA8PCA0OwogICAgdjAgPSB2MCArIHYxICsgMSA+PiAxOwogICAgdjEgPSB2MCAtIHYxOwogICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDEyOCA+PiA4OwogICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAxMjggPj4gODsKICAgIHYzID0gdDsKICAgIHY0ID0gdjQgKyB2NiArIDEgPj4gMTsKICAgIHY2ID0gdjQgLSB2NjsKICAgIHY3ID0gdjcgKyB2NSArIDEgPj4gMTsKICAgIHY1ID0gdjcgLSB2NTsKICAgIHYwID0gdjAgKyB2MyArIDEgPj4gMTsKICAgIHYzID0gdjAgLSB2MzsKICAgIHYxID0gdjEgKyB2MiArIDEgPj4gMTsKICAgIHYyID0gdjEgLSB2MjsKICAgIHQgPSB2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4ID4+IDEyOwogICAgdjQgPSB2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4ID4+IDEyOwogICAgdjcgPSB0OwogICAgdCA9IHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDggPj4gMTI7CiAgICB2NSA9IHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDggPj4gMTI7CiAgICB2NiA9IHQ7CiAgICBwW3Jvd10gPSB2MCArIHY3OwogICAgcFtyb3cgKyA3XSA9IHYwIC0gdjc7CiAgICBwW3JvdyArIDFdID0gdjEgKyB2NjsKICAgIHBbcm93ICsgNl0gPSB2MSAtIHY2OwogICAgcFtyb3cgKyAyXSA9IHYyICsgdjU7CiAgICBwW3JvdyArIDVdID0gdjIgLSB2NTsKICAgIHBbcm93ICsgM10gPSB2MyArIHY0OwogICAgcFtyb3cgKyA0XSA9IHYzIC0gdjQ7CiAgfQogIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDg7ICsrY29sKSB7CiAgICBwMCA9IHBbY29sXTsKICAgIHAxID0gcFtjb2wgKyA4XTsKICAgIHAyID0gcFtjb2wgKyAxNl07CiAgICBwMyA9IHBbY29sICsgMjRdOwogICAgcDQgPSBwW2NvbCArIDMyXTsKICAgIHA1ID0gcFtjb2wgKyA0MF07CiAgICBwNiA9IHBbY29sICsgNDhdOwogICAgcDcgPSBwW2NvbCArIDU2XTsKICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CiAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgODE5MiA+PiAxNDsKICAgICAgaWYgKHQgPCAtMjA0MCkgewogICAgICAgIHQgPSAwOwogICAgICB9IGVsc2UgaWYgKHQgPj0gMjAyNCkgewogICAgICAgIHQgPSAyNTU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdCA9IHQgKyAyMDU2ID4+IDQ7CiAgICAgIH0KICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gdDsKICAgICAgY29udGludWU7CiAgICB9CiAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAyMDQ4ID4+IDEyOwogICAgdjEgPSBkY3RTcXJ0MiAqIHA0ICsgMjA0OCA+PiAxMjsKICAgIHYyID0gcDI7CiAgICB2MyA9IHA2OwogICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMjA0OCA+PiAxMjsKICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDIwNDggPj4gMTI7CiAgICB2NSA9IHAzOwogICAgdjYgPSBwNTsKICAgIHYwID0gKHYwICsgdjEgKyAxID4+IDEpICsgNDExMjsKICAgIHYxID0gdjAgLSB2MTsKICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAyMDQ4ID4+IDEyOwogICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAyMDQ4ID4+IDEyOwogICAgdjMgPSB0OwogICAgdjQgPSB2NCArIHY2ICsgMSA+PiAxOwogICAgdjYgPSB2NCAtIHY2OwogICAgdjcgPSB2NyArIHY1ICsgMSA+PiAxOwogICAgdjUgPSB2NyAtIHY1OwogICAgdjAgPSB2MCArIHYzICsgMSA+PiAxOwogICAgdjMgPSB2MCAtIHYzOwogICAgdjEgPSB2MSArIHYyICsgMSA+PiAxOwogICAgdjIgPSB2MSAtIHYyOwogICAgdCA9IHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDggPj4gMTI7CiAgICB2NCA9IHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDggPj4gMTI7CiAgICB2NyA9IHQ7CiAgICB0ID0gdjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCA+PiAxMjsKICAgIHY1ID0gdjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCA+PiAxMjsKICAgIHY2ID0gdDsKICAgIHAwID0gdjAgKyB2NzsKICAgIHA3ID0gdjAgLSB2NzsKICAgIHAxID0gdjEgKyB2NjsKICAgIHA2ID0gdjEgLSB2NjsKICAgIHAyID0gdjIgKyB2NTsKICAgIHA1ID0gdjIgLSB2NTsKICAgIHAzID0gdjMgKyB2NDsKICAgIHA0ID0gdjMgLSB2NDsKICAgIGlmIChwMCA8IDE2KSB7CiAgICAgIHAwID0gMDsKICAgIH0gZWxzZSBpZiAocDAgPj0gNDA4MCkgewogICAgICBwMCA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAwID4+PSA0OwogICAgfQogICAgaWYgKHAxIDwgMTYpIHsKICAgICAgcDEgPSAwOwogICAgfSBlbHNlIGlmIChwMSA+PSA0MDgwKSB7CiAgICAgIHAxID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDEgPj49IDQ7CiAgICB9CiAgICBpZiAocDIgPCAxNikgewogICAgICBwMiA9IDA7CiAgICB9IGVsc2UgaWYgKHAyID49IDQwODApIHsKICAgICAgcDIgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwMiA+Pj0gNDsKICAgIH0KICAgIGlmIChwMyA8IDE2KSB7CiAgICAgIHAzID0gMDsKICAgIH0gZWxzZSBpZiAocDMgPj0gNDA4MCkgewogICAgICBwMyA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAzID4+PSA0OwogICAgfQogICAgaWYgKHA0IDwgMTYpIHsKICAgICAgcDQgPSAwOwogICAgfSBlbHNlIGlmIChwNCA+PSA0MDgwKSB7CiAgICAgIHA0ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDQgPj49IDQ7CiAgICB9CiAgICBpZiAocDUgPCAxNikgewogICAgICBwNSA9IDA7CiAgICB9IGVsc2UgaWYgKHA1ID49IDQwODApIHsKICAgICAgcDUgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwNSA+Pj0gNDsKICAgIH0KICAgIGlmIChwNiA8IDE2KSB7CiAgICAgIHA2ID0gMDsKICAgIH0gZWxzZSBpZiAocDYgPj0gNDA4MCkgewogICAgICBwNiA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHA2ID4+PSA0OwogICAgfQogICAgaWYgKHA3IDwgMTYpIHsKICAgICAgcDcgPSAwOwogICAgfSBlbHNlIGlmIChwNyA+PSA0MDgwKSB7CiAgICAgIHA3ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDcgPj49IDQ7CiAgICB9CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gcDA7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA4XSA9IHAxOwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gcDI7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSBwMzsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDMyXSA9IHA0OwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gcDU7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSBwNjsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDU2XSA9IHA3OwogIH0KfQpmdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCkgewogIGNvbnN0IGJsb2Nrc1BlckxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTsKICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uOwogIGNvbnN0IGNvbXB1dGF0aW9uQnVmZmVyID0gbmV3IEludDE2QXJyYXkoNjQpOwogIGZvciAobGV0IGJsb2NrUm93ID0gMDsgYmxvY2tSb3cgPCBibG9ja3NQZXJDb2x1bW47IGJsb2NrUm93KyspIHsKICAgIGZvciAobGV0IGJsb2NrQ29sID0gMDsgYmxvY2tDb2wgPCBibG9ja3NQZXJMaW5lOyBibG9ja0NvbCsrKSB7CiAgICAgIGNvbnN0IG9mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKICAgICAgcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgb2Zmc2V0LCBjb21wdXRhdGlvbkJ1ZmZlcik7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhOwp9CmZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBjdXJyZW50UG9zLCBzdGFydFBvcyA9IGN1cnJlbnRQb3MpIHsKICBjb25zdCBtYXhQb3MgPSBkYXRhLmxlbmd0aCAtIDE7CiAgbGV0IG5ld1BvcyA9IHN0YXJ0UG9zIDwgY3VycmVudFBvcyA/IHN0YXJ0UG9zIDogY3VycmVudFBvczsKICBpZiAoY3VycmVudFBvcyA+PSBtYXhQb3MpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBjdXJyZW50TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBjdXJyZW50UG9zKTsKICBpZiAoY3VycmVudE1hcmtlciA+PSAweGZmYzAgJiYgY3VycmVudE1hcmtlciA8PSAweGZmZmUpIHsKICAgIHJldHVybiB7CiAgICAgIGludmFsaWQ6IG51bGwsCiAgICAgIG1hcmtlcjogY3VycmVudE1hcmtlciwKICAgICAgb2Zmc2V0OiBjdXJyZW50UG9zCiAgICB9OwogIH0KICBsZXQgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpOwogIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHsKICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBuZXdNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG5ld1Bvcyk7CiAgfQogIHJldHVybiB7CiAgICBpbnZhbGlkOiBjdXJyZW50TWFya2VyLnRvU3RyaW5nKDE2KSwKICAgIG1hcmtlcjogbmV3TWFya2VyLAogICAgb2Zmc2V0OiBuZXdQb3MKICB9Owp9CmZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7CiAgY29uc3QgbWN1c1BlckxpbmUgPSBNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4IC8gZnJhbWUubWF4SCk7CiAgY29uc3QgbWN1c1BlckNvbHVtbiA9IE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4IC8gZnJhbWUubWF4Vik7CiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgZnJhbWUuY29tcG9uZW50cykgewogICAgY29uc3QgYmxvY2tzUGVyTGluZSA9IE1hdGguY2VpbChNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4KSAqIGNvbXBvbmVudC5oIC8gZnJhbWUubWF4SCk7CiAgICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDgpICogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWKTsKICAgIGNvbnN0IGJsb2Nrc1BlckxpbmVGb3JNY3UgPSBtY3VzUGVyTGluZSAqIGNvbXBvbmVudC5oOwogICAgY29uc3QgYmxvY2tzUGVyQ29sdW1uRm9yTWN1ID0gbWN1c1BlckNvbHVtbiAqIGNvbXBvbmVudC52OwogICAgY29uc3QgYmxvY2tzQnVmZmVyU2l6ZSA9IDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTsKICAgIGNvbXBvbmVudC5ibG9ja0RhdGEgPSBuZXcgSW50MTZBcnJheShibG9ja3NCdWZmZXJTaXplKTsKICAgIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lID0gYmxvY2tzUGVyTGluZTsKICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47CiAgfQogIGZyYW1lLm1jdXNQZXJMaW5lID0gbWN1c1BlckxpbmU7CiAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47Cn0KZnVuY3Rpb24gcmVhZERhdGFCbG9jayhkYXRhLCBvZmZzZXQpIHsKICBjb25zdCBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgb2Zmc2V0ICs9IDI7CiAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7CiAgY29uc3QgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBlbmRPZmZzZXQsIG9mZnNldCk7CiAgaWYgKGZpbGVNYXJrZXI/LmludmFsaWQpIHsKICAgIHdhcm4oInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIiArIGZpbGVNYXJrZXIuaW52YWxpZCk7CiAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKICB9CiAgY29uc3QgYXJyYXkgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgZW5kT2Zmc2V0KTsKICByZXR1cm4gewogICAgYXBwRGF0YTogYXJyYXksCiAgICBvbGRPZmZzZXQ6IG9mZnNldCwKICAgIG5ld09mZnNldDogb2Zmc2V0ICsgYXJyYXkubGVuZ3RoCiAgfTsKfQpmdW5jdGlvbiBza2lwRGF0YShkYXRhLCBvZmZzZXQpIHsKICBjb25zdCBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgb2Zmc2V0ICs9IDI7CiAgY29uc3QgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoIC0gMjsKICBjb25zdCBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGVuZE9mZnNldCwgb2Zmc2V0KTsKICBpZiAoZmlsZU1hcmtlcj8uaW52YWxpZCkgewogICAgcmV0dXJuIGZpbGVNYXJrZXIub2Zmc2V0OwogIH0KICByZXR1cm4gZW5kT2Zmc2V0Owp9CmNsYXNzIEpwZWdJbWFnZSB7CiAgY29uc3RydWN0b3IoewogICAgZGVjb2RlVHJhbnNmb3JtID0gbnVsbCwKICAgIGNvbG9yVHJhbnNmb3JtID0gLTEKICB9ID0ge30pIHsKICAgIHRoaXMuX2RlY29kZVRyYW5zZm9ybSA9IGRlY29kZVRyYW5zZm9ybTsKICAgIHRoaXMuX2NvbG9yVHJhbnNmb3JtID0gY29sb3JUcmFuc2Zvcm07CiAgfQogIHN0YXRpYyBjYW5Vc2VJbWFnZURlY29kZXIoZGF0YSwgY29sb3JUcmFuc2Zvcm0gPSAtMSkgewogICAgbGV0IGV4aWZPZmZzZXRzID0gbnVsbDsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IG51bUNvbXBvbmVudHMgPSBudWxsOwogICAgbGV0IGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIGlmIChmaWxlTWFya2VyICE9PSAweGZmZDgpIHsKICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiU09JIG5vdCBmb3VuZCIpOwogICAgfQogICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgIG9mZnNldCArPSAyOwogICAgbWFya2VyTG9vcDogd2hpbGUgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOSkgewogICAgICBzd2l0Y2ggKGZpbGVNYXJrZXIpIHsKICAgICAgICBjYXNlIDB4ZmZlMToKICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgYXBwRGF0YSwKICAgICAgICAgICAgb2xkT2Zmc2V0LAogICAgICAgICAgICBuZXdPZmZzZXQKICAgICAgICAgIH0gPSByZWFkRGF0YUJsb2NrKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgPSBuZXdPZmZzZXQ7CiAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0NSAmJiBhcHBEYXRhWzFdID09PSAweDc4ICYmIGFwcERhdGFbMl0gPT09IDB4NjkgJiYgYXBwRGF0YVszXSA9PT0gMHg2NiAmJiBhcHBEYXRhWzRdID09PSAwICYmIGFwcERhdGFbNV0gPT09IDApIHsKICAgICAgICAgICAgaWYgKGV4aWZPZmZzZXRzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiRHVwbGljYXRlIEVYSUYtYmxvY2tzIGZvdW5kLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4aWZPZmZzZXRzID0gewogICAgICAgICAgICAgIGV4aWZTdGFydDogb2xkT2Zmc2V0ICsgNiwKICAgICAgICAgICAgICBleGlmRW5kOiBuZXdPZmZzZXQKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgMHhmZmMwOgogICAgICAgIGNhc2UgMHhmZmMxOgogICAgICAgIGNhc2UgMHhmZmMyOgogICAgICAgICAgbnVtQ29tcG9uZW50cyA9IGRhdGFbb2Zmc2V0ICsgKDIgKyAxICsgMiArIDIpXTsKICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CiAgICAgICAgICAgIG9mZnNldC0tOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgb2Zmc2V0ID0gc2tpcERhdGEoZGF0YSwgb2Zmc2V0KTsKICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgb2Zmc2V0ICs9IDI7CiAgICB9CiAgICBpZiAobnVtQ29tcG9uZW50cyA9PT0gNCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChudW1Db21wb25lbnRzID09PSAzICYmIGNvbG9yVHJhbnNmb3JtID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGV4aWZPZmZzZXRzIHx8IHt9OwogIH0KICBwYXJzZShkYXRhLCB7CiAgICBkbmxTY2FuTGluZXMgPSBudWxsCiAgfSA9IHt9KSB7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBqZmlmID0gbnVsbDsKICAgIGxldCBhZG9iZSA9IG51bGw7CiAgICBsZXQgZnJhbWUsIHJlc2V0SW50ZXJ2YWw7CiAgICBsZXQgbnVtU09TTWFya2VycyA9IDA7CiAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTsKICAgIGNvbnN0IGh1ZmZtYW5UYWJsZXNBQyA9IFtdLAogICAgICBodWZmbWFuVGFibGVzREMgPSBbXTsKICAgIGxldCBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgb2Zmc2V0ICs9IDI7CiAgICBpZiAoZmlsZU1hcmtlciAhPT0gMHhmZmQ4KSB7CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTsKICAgIH0KICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAweGZmZDkpIHsKICAgICAgbGV0IGksIGosIGw7CiAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikgewogICAgICAgIGNhc2UgMHhmZmUwOgogICAgICAgIGNhc2UgMHhmZmUxOgogICAgICAgIGNhc2UgMHhmZmUyOgogICAgICAgIGNhc2UgMHhmZmUzOgogICAgICAgIGNhc2UgMHhmZmU0OgogICAgICAgIGNhc2UgMHhmZmU1OgogICAgICAgIGNhc2UgMHhmZmU2OgogICAgICAgIGNhc2UgMHhmZmU3OgogICAgICAgIGNhc2UgMHhmZmU4OgogICAgICAgIGNhc2UgMHhmZmU5OgogICAgICAgIGNhc2UgMHhmZmVhOgogICAgICAgIGNhc2UgMHhmZmViOgogICAgICAgIGNhc2UgMHhmZmVjOgogICAgICAgIGNhc2UgMHhmZmVkOgogICAgICAgIGNhc2UgMHhmZmVlOgogICAgICAgIGNhc2UgMHhmZmVmOgogICAgICAgIGNhc2UgMHhmZmZlOgogICAgICAgICAgY29uc3QgewogICAgICAgICAgICBhcHBEYXRhLAogICAgICAgICAgICBuZXdPZmZzZXQKICAgICAgICAgIH0gPSByZWFkRGF0YUJsb2NrKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgPSBuZXdPZmZzZXQ7CiAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmUwKSB7CiAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDRhICYmIGFwcERhdGFbMV0gPT09IDB4NDYgJiYgYXBwRGF0YVsyXSA9PT0gMHg0OSAmJiBhcHBEYXRhWzNdID09PSAweDQ2ICYmIGFwcERhdGFbNF0gPT09IDApIHsKICAgICAgICAgICAgICBqZmlmID0gewogICAgICAgICAgICAgICAgdmVyc2lvbjogewogICAgICAgICAgICAgICAgICBtYWpvcjogYXBwRGF0YVs1XSwKICAgICAgICAgICAgICAgICAgbWlub3I6IGFwcERhdGFbNl0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZW5zaXR5VW5pdHM6IGFwcERhdGFbN10sCiAgICAgICAgICAgICAgICB4RGVuc2l0eTogYXBwRGF0YVs4XSA8PCA4IHwgYXBwRGF0YVs5XSwKICAgICAgICAgICAgICAgIHlEZW5zaXR5OiBhcHBEYXRhWzEwXSA8PCA4IHwgYXBwRGF0YVsxMV0sCiAgICAgICAgICAgICAgICB0aHVtYldpZHRoOiBhcHBEYXRhWzEyXSwKICAgICAgICAgICAgICAgIHRodW1iSGVpZ2h0OiBhcHBEYXRhWzEzXSwKICAgICAgICAgICAgICAgIHRodW1iRGF0YTogYXBwRGF0YS5zdWJhcnJheSgxNCwgMTQgKyAzICogYXBwRGF0YVsxMl0gKiBhcHBEYXRhWzEzXSkKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7CiAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDQxICYmIGFwcERhdGFbMV0gPT09IDB4NjQgJiYgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJiBhcHBEYXRhWzNdID09PSAweDYyICYmIGFwcERhdGFbNF0gPT09IDB4NjUpIHsKICAgICAgICAgICAgICBhZG9iZSA9IHsKICAgICAgICAgICAgICAgIHZlcnNpb246IGFwcERhdGFbNV0gPDwgOCB8IGFwcERhdGFbNl0sCiAgICAgICAgICAgICAgICBmbGFnczA6IGFwcERhdGFbN10gPDwgOCB8IGFwcERhdGFbOF0sCiAgICAgICAgICAgICAgICBmbGFnczE6IGFwcERhdGFbOV0gPDwgOCB8IGFwcERhdGFbMTBdLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtQ29kZTogYXBwRGF0YVsxMV0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYjoKICAgICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzRW5kID0gcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoICsgb2Zmc2V0IC0gMjsKICAgICAgICAgIGxldCB6OwogICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkgewogICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFVpbnQxNkFycmF5KDY0KTsKICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvblRhYmxlU3BlYyA+PiA0ID09PSAwKSB7CiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07CiAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDEpIHsKICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgewogICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTsKICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmYzA6CiAgICAgICAgY2FzZSAweGZmYzE6CiAgICAgICAgY2FzZSAweGZmYzI6CiAgICAgICAgICBpZiAoZnJhbWUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lID0ge307CiAgICAgICAgICBmcmFtZS5leHRlbmRlZCA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMTsKICAgICAgICAgIGZyYW1lLnByb2dyZXNzaXZlID0gZmlsZU1hcmtlciA9PT0gMHhmZmMyOwogICAgICAgICAgZnJhbWUucHJlY2lzaW9uID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICBjb25zdCBzb2ZTY2FuTGluZXMgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lLnNjYW5MaW5lcyA9IGRubFNjYW5MaW5lcyB8fCBzb2ZTY2FuTGluZXM7CiAgICAgICAgICBmcmFtZS5zYW1wbGVzUGVyTGluZSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZnJhbWUuY29tcG9uZW50cyA9IFtdOwogICAgICAgICAgZnJhbWUuY29tcG9uZW50SWRzID0ge307CiAgICAgICAgICBjb25zdCBjb21wb25lbnRzQ291bnQgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgIGxldCBtYXhIID0gMCwKICAgICAgICAgICAgbWF4ViA9IDA7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07CiAgICAgICAgICAgIGNvbnN0IGggPSBkYXRhW29mZnNldCArIDFdID4+IDQ7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkYXRhW29mZnNldCArIDFdICYgMTU7CiAgICAgICAgICAgIGlmIChtYXhIIDwgaCkgewogICAgICAgICAgICAgIG1heEggPSBoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXhWIDwgdikgewogICAgICAgICAgICAgIG1heFYgPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07CiAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goewogICAgICAgICAgICAgIGgsCiAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLAogICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHNbY29tcG9uZW50SWRdID0gbCAtIDE7CiAgICAgICAgICAgIG9mZnNldCArPSAzOwogICAgICAgICAgfQogICAgICAgICAgZnJhbWUubWF4SCA9IG1heEg7CiAgICAgICAgICBmcmFtZS5tYXhWID0gbWF4VjsKICAgICAgICAgIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmM0OgogICAgICAgICAgY29uc3QgaHVmZm1hbkxlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZm9yIChpID0gMjsgaSA8IGh1ZmZtYW5MZW5ndGg7KSB7CiAgICAgICAgICAgIGNvbnN0IGh1ZmZtYW5UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgICAgICAgIGxldCBjb2RlTGVuZ3RoU3VtID0gMDsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgY29kZUxlbmd0aFN1bSArPSBjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTsKICAgICAgICAgICAgKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCA9PT0gMCA/IGh1ZmZtYW5UYWJsZXNEQyA6IGh1ZmZtYW5UYWJsZXNBQylbaHVmZm1hblRhYmxlU3BlYyAmIDE1XSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRkOgogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICByZXNldEludGVydmFsID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYToKICAgICAgICAgIGNvbnN0IHBhcnNlRE5MTWFya2VyID0gKytudW1TT1NNYXJrZXJzID09PSAxICYmICFkbmxTY2FuTGluZXM7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnN0IHNlbGVjdG9yc0NvdW50ID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIGNvbXBvbmVudHMgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluZGV4ID0gZnJhbWUuY29tcG9uZW50SWRzW2luZGV4XTsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tjb21wb25lbnRJbmRleF07CiAgICAgICAgICAgIGNvbXBvbmVudC5pbmRleCA9IGluZGV4OwogICAgICAgICAgICBjb25zdCB0YWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDID0gaHVmZm1hblRhYmxlc0RDW3RhYmxlU3BlYyA+PiA0XTsKICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDID0gaHVmZm1hblRhYmxlc0FDW3RhYmxlU3BlYyAmIDE1XTsKICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzcGVjdHJhbFN0YXJ0ID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIHNwZWN0cmFsRW5kID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA+PiA0LCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LCBwYXJzZUROTE1hcmtlcik7CiAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikgewogICAgICAgICAgICAgIHdhcm4oYCR7ZXgubWVzc2FnZX0gLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS5gKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShkYXRhLCB7CiAgICAgICAgICAgICAgICBkbmxTY2FuTGluZXM6IGV4LnNjYW5MaW5lcwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpIHsKICAgICAgICAgICAgICB3YXJuKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApOwogICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYzoKICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CiAgICAgICAgICAgIG9mZnNldC0tOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGNvbnN0IG5leHRGaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCAtIDIsIG9mZnNldCAtIDMpOwogICAgICAgICAgaWYgKG5leHRGaWxlTWFya2VyPy5pbnZhbGlkKSB7CiAgICAgICAgICAgIHdhcm4oIkpwZWdJbWFnZS5wYXJzZSAtIHVuZXhwZWN0ZWQgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIgKyBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKTsKICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dEZpbGVNYXJrZXIub2Zmc2V0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbmV4dEZpbGVNYXJrZXIgfHwgb2Zmc2V0ID49IGRhdGEubGVuZ3RoIC0gMSkgewogICAgICAgICAgICB3YXJuKCJKcGVnSW1hZ2UucGFyc2UgLSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEgIiArICJ3aXRob3V0IGZpbmRpbmcgYW4gRU9JIG1hcmtlciAoMHhGRkQ5KS4iKTsKICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiICsgZmlsZU1hcmtlci50b1N0cmluZygxNikpOwogICAgICB9CiAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgIG9mZnNldCArPSAyOwogICAgfQogICAgaWYgKCFmcmFtZSkgewogICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJKcGVnSW1hZ2UucGFyc2UgLSBubyBmcmFtZSBkYXRhIGZvdW5kLiIpOwogICAgfQogICAgdGhpcy53aWR0aCA9IGZyYW1lLnNhbXBsZXNQZXJMaW5lOwogICAgdGhpcy5oZWlnaHQgPSBmcmFtZS5zY2FuTGluZXM7CiAgICB0aGlzLmpmaWYgPSBqZmlmOwogICAgdGhpcy5hZG9iZSA9IGFkb2JlOwogICAgdGhpcy5jb21wb25lbnRzID0gW107CiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBmcmFtZS5jb21wb25lbnRzKSB7CiAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGVzW2NvbXBvbmVudC5xdWFudGl6YXRpb25JZF07CiAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZSkgewogICAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlOwogICAgICB9CiAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHsKICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LAogICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLAogICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILAogICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLAogICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLAogICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbgogICAgICB9KTsKICAgIH0KICAgIHRoaXMubnVtQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0LCBpc1NvdXJjZVBERiA9IGZhbHNlKSB7CiAgICBjb25zdCBzY2FsZVggPSB0aGlzLndpZHRoIC8gd2lkdGgsCiAgICAgIHNjYWxlWSA9IHRoaXMuaGVpZ2h0IC8gaGVpZ2h0OwogICAgbGV0IGNvbXBvbmVudCwgY29tcG9uZW50U2NhbGVYLCBjb21wb25lbnRTY2FsZVksIGJsb2Nrc1BlclNjYW5saW5lOwogICAgbGV0IHgsIHksIGksIGosIGs7CiAgICBsZXQgaW5kZXg7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBvdXRwdXQ7CiAgICBjb25zdCBudW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDsKICAgIGNvbnN0IGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGFMZW5ndGgpOwogICAgY29uc3QgeFNjYWxlQmxvY2tPZmZzZXQgPSBuZXcgVWludDMyQXJyYXkod2lkdGgpOwogICAgY29uc3QgbWFzazNMU0IgPSAweGZmZmZmZmY4OwogICAgbGV0IGxhc3RDb21wb25lbnRTY2FsZVg7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7CiAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTsKICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDsKICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTsKICAgICAgb2Zmc2V0ID0gaTsKICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDsKICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZSArIDEgPDwgMzsKICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkgewogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBqID0gMCB8IHggKiBjb21wb25lbnRTY2FsZVg7CiAgICAgICAgICB4U2NhbGVCbG9ja09mZnNldFt4XSA9IChqICYgbWFzazNMU0IpIDw8IDMgfCBqICYgNzsKICAgICAgICB9CiAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDsKICAgICAgfQogICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICBqID0gMCB8IHkgKiBjb21wb25lbnRTY2FsZVk7CiAgICAgICAgaW5kZXggPSBibG9ja3NQZXJTY2FubGluZSAqIChqICYgbWFzazNMU0IpIHwgKGogJiA3KSA8PCAzOwogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSBvdXRwdXRbaW5kZXggKyB4U2NhbGVCbG9ja09mZnNldFt4XV07CiAgICAgICAgICBvZmZzZXQgKz0gbnVtQ29tcG9uZW50czsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07CiAgICBpZiAoIWlzU291cmNlUERGICYmIG51bUNvbXBvbmVudHMgPT09IDQgJiYgIXRyYW5zZm9ybSkgewogICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7CiAgICB9CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOykgewogICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikgewogICAgICAgICAgZGF0YVtpXSA9IChkYXRhW2ldICogdHJhbnNmb3JtW2tdID4+IDgpICsgdHJhbnNmb3JtW2sgKyAxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkgewogICAgaWYgKHRoaXMuYWRvYmUpIHsKICAgICAgcmV0dXJuICEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOwogICAgfQogICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMykgewogICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRzWzBdLmluZGV4ID09PSAweDUyICYmIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gMHg0NyAmJiB0aGlzLmNvbXBvbmVudHNbMl0uaW5kZXggPT09IDB4NDIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2IoZGF0YSkgewogICAgbGV0IFksIENiLCBDcjsKICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgIFkgPSBkYXRhW2ldOwogICAgICBDYiA9IGRhdGFbaSArIDFdOwogICAgICBDciA9IGRhdGFbaSArIDJdOwogICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOwogICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2JhKGRhdGEsIG91dCkgewogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzLCBqICs9IDQpIHsKICAgICAgY29uc3QgWSA9IGRhdGFbaV07CiAgICAgIGNvbnN0IENiID0gZGF0YVtpICsgMV07CiAgICAgIGNvbnN0IENyID0gZGF0YVtpICsgMl07CiAgICAgIG91dFtqXSA9IFkgLSAxNzkuNDU2ICsgMS40MDIgKiBDcjsKICAgICAgb3V0W2ogKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIG91dFtqICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7CiAgICAgIG91dFtqICsgM10gPSAyNTU7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBfY29udmVydFljY2tUb1JnYihkYXRhKSB7CiAgICB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTsKICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpOwogIH0KICBfY29udmVydFljY2tUb1JnYmEoZGF0YSkgewogICAgdGhpcy5fY29udmVydFljY2tUb0NteWsoZGF0YSk7CiAgICByZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYmEoZGF0YSk7CiAgfQogIF9jb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7CiAgICBsZXQgWSwgQ2IsIENyOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgWSA9IGRhdGFbaV07CiAgICAgIENiID0gZGF0YVtpICsgMV07CiAgICAgIENyID0gZGF0YVtpICsgMl07CiAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7CiAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjsKICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSkgewogICAgY29uc3QgY291bnQgPSBkYXRhLmxlbmd0aCAvIDQ7CiAgICBDb2xvclNwYWNlVXRpbHMuY215ay5nZXRSZ2JCdWZmZXIoZGF0YSwgMCwgY291bnQsIGRhdGEsIDAsIDgsIDApOwogICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgY291bnQgKiAzKTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2JhKGRhdGEpIHsKICAgIENvbG9yU3BhY2VVdGlscy5jbXlrLmdldFJnYkJ1ZmZlcihkYXRhLCAwLCBkYXRhLmxlbmd0aCAvIDQsIGRhdGEsIDAsIDgsIDEpOwogICAgaWYgKENvbG9yU3BhY2VVdGlscy5jbXlrIGluc3RhbmNlb2YgRGV2aWNlQ215a0NTKSB7CiAgICAgIGZvciAobGV0IGkgPSAzLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkgewogICAgICAgIGRhdGFbaV0gPSAyNTU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXREYXRhKHsKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgZm9yY2VSR0JBID0gZmFsc2UsCiAgICBmb3JjZVJHQiA9IGZhbHNlLAogICAgaXNTb3VyY2VQREYgPSBmYWxzZQogIH0pIHsKICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPiA0KSB7CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTsKICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDEgJiYgKGZvcmNlUkdCQSB8fCBmb3JjZVJHQikpIHsKICAgICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGggKiAoZm9yY2VSR0JBID8gNCA6IDMpOwogICAgICBjb25zdCByZ2JhRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShsZW4pOwogICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgIGdyYXlUb1JHQkEoZGF0YSwgbmV3IFVpbnQzMkFycmF5KHJnYmFEYXRhLmJ1ZmZlcikpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgZ3JheUNvbG9yIG9mIGRhdGEpIHsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJnYmFEYXRhOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgIGNvbnN0IHJnYmFEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEubGVuZ3RoIC8gMyAqIDQpOwogICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2JhKGRhdGEsIHJnYmFEYXRhKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiKGRhdGEpOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDQpIHsKICAgICAgaWYgKHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7CiAgICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2JhKGRhdGEpOwogICAgICAgIH0KICAgICAgICBpZiAoZm9yY2VSR0IpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiKGRhdGEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY2tUb0NteWsoZGF0YSk7CiAgICAgIH0gZWxzZSBpZiAoZm9yY2VSR0JBKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2JhKGRhdGEpOwogICAgICB9IGVsc2UgaWYgKGZvcmNlUkdCKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvanBlZ19zdHJlYW0uanMKCgoKCmNsYXNzIEpwZWdTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIHN0YXRpYyAjaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBGZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgc3RhdGljIGdldCBjYW5Vc2VJbWFnZURlY29kZXIoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYW5Vc2VJbWFnZURlY29kZXIiLCB0aGlzLiNpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA/IEltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2pwZWciKSA6IFByb21pc2UucmVzb2x2ZShmYWxzZSkpOwogIH0KICBzdGF0aWMgc2V0T3B0aW9ucyh7CiAgICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CiAgfQogIGVuc3VyZUJ1ZmZlcihyZXF1ZXN0ZWQpIHt9CiAgcmVhZEJsb2NrKCkgewogICAgdGhpcy5kZWNvZGVJbWFnZSgpOwogIH0KICBnZXQganBlZ09wdGlvbnMoKSB7CiAgICBjb25zdCBqcGVnT3B0aW9ucyA9IHsKICAgICAgZGVjb2RlVHJhbnNmb3JtOiB1bmRlZmluZWQsCiAgICAgIGNvbG9yVHJhbnNmb3JtOiB1bmRlZmluZWQKICAgIH07CiAgICBjb25zdCBkZWNvZGVBcnIgPSB0aGlzLmRpY3QuZ2V0QXJyYXkoIkQiLCAiRGVjb2RlIik7CiAgICBpZiAoKHRoaXMuZm9yY2VSR0JBIHx8IHRoaXMuZm9yY2VSR0IpICYmIEFycmF5LmlzQXJyYXkoZGVjb2RlQXJyKSkgewogICAgICBjb25zdCBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5kaWN0LmdldCgiQlBDIiwgIkJpdHNQZXJDb21wb25lbnQiKSB8fCA4OwogICAgICBjb25zdCBkZWNvZGVBcnJMZW5ndGggPSBkZWNvZGVBcnIubGVuZ3RoOwogICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShkZWNvZGVBcnJMZW5ndGgpOwogICAgICBsZXQgdHJhbnNmb3JtTmVlZGVkID0gZmFsc2U7CiAgICAgIGNvbnN0IG1heFZhbHVlID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZUFyckxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgdHJhbnNmb3JtW2ldID0gKGRlY29kZUFycltpICsgMV0gLSBkZWNvZGVBcnJbaV0pICogMjU2IHwgMDsKICAgICAgICB0cmFuc2Zvcm1baSArIDFdID0gZGVjb2RlQXJyW2ldICogbWF4VmFsdWUgfCAwOwogICAgICAgIGlmICh0cmFuc2Zvcm1baV0gIT09IDI1NiB8fCB0cmFuc2Zvcm1baSArIDFdICE9PSAwKSB7CiAgICAgICAgICB0cmFuc2Zvcm1OZWVkZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHJhbnNmb3JtTmVlZGVkKSB7CiAgICAgICAganBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtID0gdHJhbnNmb3JtOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5wYXJhbXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGNvbG9yVHJhbnNmb3JtID0gdGhpcy5wYXJhbXMuZ2V0KCJDb2xvclRyYW5zZm9ybSIpOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb2xvclRyYW5zZm9ybSkpIHsKICAgICAgICBqcGVnT3B0aW9ucy5jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJqcGVnT3B0aW9ucyIsIGpwZWdPcHRpb25zKTsKICB9CiAgI3NraXBVc2VsZXNzQnl0ZXMoZGF0YSkgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGggLSAxOyBpIDwgaWk7IGkrKykgewogICAgICBpZiAoZGF0YVtpXSA9PT0gMHhmZiAmJiBkYXRhW2kgKyAxXSA9PT0gMHhkOCkgewogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoaSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZGVjb2RlSW1hZ2UoYnl0ZXMpIHsKICAgIGlmICh0aGlzLmVvZikgewogICAgICByZXR1cm4gdGhpcy5idWZmZXI7CiAgICB9CiAgICBieXRlcyA9IHRoaXMuI3NraXBVc2VsZXNzQnl0ZXMoYnl0ZXMgfHwgdGhpcy5ieXRlcyk7CiAgICBjb25zdCBqcGVnSW1hZ2UgPSBuZXcgSnBlZ0ltYWdlKHRoaXMuanBlZ09wdGlvbnMpOwogICAganBlZ0ltYWdlLnBhcnNlKGJ5dGVzKTsKICAgIGNvbnN0IGRhdGEgPSBqcGVnSW1hZ2UuZ2V0RGF0YSh7CiAgICAgIHdpZHRoOiB0aGlzLmRyYXdXaWR0aCwKICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsCiAgICAgIGZvcmNlUkdCQTogdGhpcy5mb3JjZVJHQkEsCiAgICAgIGZvcmNlUkdCOiB0aGlzLmZvcmNlUkdCLAogICAgICBpc1NvdXJjZVBERjogdHJ1ZQogICAgfSk7CiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9CiAgYXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKSB7CiAgICBpZiAoIShhd2FpdCBKcGVnU3RyZWFtLmNhblVzZUltYWdlRGVjb2RlcikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBqcGVnT3B0aW9ucyA9IHRoaXMuanBlZ09wdGlvbnM7CiAgICBpZiAoanBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGRlY29kZXI7CiAgICB0cnkgewogICAgICBjb25zdCBieXRlcyA9IHRoaXMuY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIgJiYgKGF3YWl0IHRoaXMuc3RyZWFtLmFzeW5jR2V0Qnl0ZXMoKSkgfHwgdGhpcy5ieXRlczsKICAgICAgaWYgKCFieXRlcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxldCBkYXRhID0gdGhpcy4jc2tpcFVzZWxlc3NCeXRlcyhieXRlcyk7CiAgICAgIGNvbnN0IHVzZUltYWdlRGVjb2RlciA9IEpwZWdJbWFnZS5jYW5Vc2VJbWFnZURlY29kZXIoZGF0YSwganBlZ09wdGlvbnMuY29sb3JUcmFuc2Zvcm0pOwogICAgICBpZiAoIXVzZUltYWdlRGVjb2RlcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICh1c2VJbWFnZURlY29kZXIuZXhpZlN0YXJ0KSB7CiAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoKTsKICAgICAgICBkYXRhLmZpbGwoMHgwMCwgdXNlSW1hZ2VEZWNvZGVyLmV4aWZTdGFydCwgdXNlSW1hZ2VEZWNvZGVyLmV4aWZFbmQpOwogICAgICB9CiAgICAgIGRlY29kZXIgPSBuZXcgSW1hZ2VEZWNvZGVyKHsKICAgICAgICBkYXRhLAogICAgICAgIHR5cGU6ICJpbWFnZS9qcGVnIiwKICAgICAgICBwcmVmZXJBbmltYXRpb246IGZhbHNlCiAgICAgIH0pOwogICAgICByZXR1cm4gKGF3YWl0IGRlY29kZXIuZGVjb2RlKCkpLmltYWdlOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYGdldFRyYW5zZmVyYWJsZUltYWdlIC0gZmFpbGVkOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGZpbmFsbHkgewogICAgICBkZWNvZGVyPy5jbG9zZSgpOwogICAgfQogIH0KfQoKOy8vIC4vZXh0ZXJuYWwvb3BlbmpwZWcvb3BlbmpwZWcuanMKdmFyIE9wZW5KUEVHID0gKCgpID0+IHsKICB2YXIgX3NjcmlwdE5hbWUgPSBpbXBvcnQubWV0YS51cmw7CiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChtb2R1bGVBcmcgPSB7fSkgewogICAgdmFyIG1vZHVsZVJ0bjsKICAgIHZhciBNb2R1bGUgPSBtb2R1bGVBcmc7CiAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgdmFyIHJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgIH0pOwogICAgdmFyIEVOVklST05NRU5UX0lTX1dFQiA9IHRydWU7CiAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gZmFsc2U7CiAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgTW9kdWxlKTsKICAgIHZhciBhcmd1bWVudHNfID0gW107CiAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgdmFyIHF1aXRfID0gKHN0YXR1cywgdG9UaHJvdykgPT4gewogICAgICB0aHJvdyB0b1Rocm93OwogICAgfTsKICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgIGZ1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgfQogICAgICByZXR1cm4gc2NyaXB0RGlyZWN0b3J5ICsgcGF0aDsKICAgIH0KICAgIHZhciByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgIH0KICAgICAgaWYgKF9zY3JpcHROYW1lKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdE5hbWU7CiAgICAgIH0KICAgICAgaWYgKHNjcmlwdERpcmVjdG9yeS5zdGFydHNXaXRoKCJibG9iOiIpKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2NyaXB0RGlyZWN0b3J5LnNsaWNlKDAsIHNjcmlwdERpcmVjdG9yeS5yZXBsYWNlKC9bPyNdLiovLCAiIikubGFzdEluZGV4T2YoIi8iKSArIDEpOwogICAgICB9CiAgICAgIHJlYWRBc3luYyA9IGFzeW5jIHVybCA9PiB7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7CiAgICAgICAgICBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIgogICAgICAgIH0pOwogICAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyAiIDogIiArIHJlc3BvbnNlLnVybCk7CiAgICAgIH07CiAgICB9IGVsc2Uge30KICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpOwogICAgT2JqZWN0LmFzc2lnbihNb2R1bGUsIG1vZHVsZU92ZXJyaWRlcyk7CiAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgaWYgKE1vZHVsZVsiYXJndW1lbnRzIl0pIGFyZ3VtZW50c18gPSBNb2R1bGVbImFyZ3VtZW50cyJdOwogICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkgdGhpc1Byb2dyYW0gPSBNb2R1bGVbInRoaXNQcm9ncmFtIl07CiAgICB2YXIgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgdmFyIHdhc21NZW1vcnk7CiAgICB2YXIgQUJPUlQgPSBmYWxzZTsKICAgIHZhciBFWElUU1RBVFVTOwogICAgdmFyIEhFQVA4LCBIRUFQVTgsIEhFQVAxNiwgSEVBUFUxNiwgSEVBUDMyLCBIRUFQVTMyLCBIRUFQRjMyLCBIRUFQNjQsIEhFQVBVNjQsIEhFQVBGNjQ7CiAgICB2YXIgcnVudGltZUluaXRpYWxpemVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiB1cGRhdGVNZW1vcnlWaWV3cygpIHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVAxNiJdID0gSEVBUDE2ID0gbmV3IEludDE2QXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFU4Il0gPSBIRUFQVTggPSBuZXcgVWludDhBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQVTE2Il0gPSBIRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVAzMiJdID0gSEVBUDMyID0gbmV3IEludDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFUzMiJdID0gSEVBUFUzMiA9IG5ldyBVaW50MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBIRUFQRjMyID0gbmV3IEZsb2F0MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBIRUFQRjY0ID0gbmV3IEZsb2F0NjRBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQNjQiXSA9IEhFQVA2NCA9IG5ldyBCaWdJbnQ2NEFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVBVNjQiXSA9IEhFQVBVNjQgPSBuZXcgQmlnVWludDY0QXJyYXkoYik7CiAgICB9CiAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInByZVJ1biJdKSB7CiAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdID09ICJmdW5jdGlvbiIpIE1vZHVsZVsicHJlUnVuIl0gPSBbTW9kdWxlWyJwcmVSdW4iXV07CiAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhvblByZVJ1bnMpOwogICAgfQogICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgIHJ1bnRpbWVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHdhc21FeHBvcnRzWyJ0Il0oKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3Mob25Qb3N0UnVucyk7CiAgICB9CiAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgIHZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICBydW5EZXBlbmRlbmNpZXMrKzsKICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0/LihydW5EZXBlbmRlbmNpZXMpOwogICAgfQogICAgZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCkgewogICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0/LihydW5EZXBlbmRlbmNpZXMpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ7CiAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgTW9kdWxlWyJvbkFib3J0Il0/Lih3aGF0KTsKICAgICAgd2hhdCA9ICJBYm9ydGVkKCIgKyB3aGF0ICsgIikiOwogICAgICBlcnIod2hhdCk7CiAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgd2hhdCArPSAiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7CiAgICAgIHZhciBlID0gbmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTsKICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICB0aHJvdyBlOwogICAgfQogICAgdmFyIHdhc21CaW5hcnlGaWxlOwogICAgZnVuY3Rpb24gZmluZFdhc21CaW5hcnkoKSB7CiAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgIHJldHVybiBsb2NhdGVGaWxlKCJvcGVuanBlZy53YXNtIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBVUkwoIm9wZW5qcGVnLndhc20iLCBpbXBvcnQubWV0YS51cmwpLmhyZWY7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRCaW5hcnlTeW5jKGZpbGUpIHsKICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgfQogICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICB9CiAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBnZXRXYXNtQmluYXJ5KGJpbmFyeUZpbGUpIHsKICAgICAgaWYgKCF3YXNtQmluYXJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHJlYWRBc3luYyhiaW5hcnlGaWxlKTsKICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXNwb25zZSk7CiAgICAgICAgfSBjYXRjaCB7fQogICAgICB9CiAgICAgIHJldHVybiBnZXRCaW5hcnlTeW5jKGJpbmFyeUZpbGUpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihiaW5hcnlGaWxlLCBpbXBvcnRzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGJpbmFyeSA9IGF3YWl0IGdldFdhc21CaW5hcnkoYmluYXJ5RmlsZSk7CiAgICAgICAgdmFyIGluc3RhbmNlID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbXBvcnRzKTsKICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGVycihgZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogJHtyZWFzb259YCk7CiAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYyhiaW5hcnksIGJpbmFyeUZpbGUsIGltcG9ydHMpIHsKICAgICAgaWYgKCFiaW5hcnkgJiYgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHJlc3BvbnNlID0gZmV0Y2goYmluYXJ5RmlsZSwgewogICAgICAgICAgICBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIgogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgaW5zdGFudGlhdGlvblJlc3VsdCA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLCBpbXBvcnRzKTsKICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0aW9uUmVzdWx0OwogICAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgICAgZXJyKGB3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogJHtyZWFzb259YCk7CiAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKGJpbmFyeUZpbGUsIGltcG9ydHMpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbUltcG9ydHMoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYTogd2FzbUltcG9ydHMKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgd2FzbUV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgIHdhc21NZW1vcnkgPSB3YXNtRXhwb3J0c1sicyJdOwogICAgICAgIHVwZGF0ZU1lbW9yeVZpZXdzKCk7CiAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpOwogICAgICAgIHJldHVybiB3YXNtRXhwb3J0czsKICAgICAgfQogICAgICBhZGRSdW5EZXBlbmRlbmN5KCJ3YXNtLWluc3RhbnRpYXRlIik7CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0aW9uUmVzdWx0KHJlc3VsdCkgewogICAgICAgIHJldHVybiByZWNlaXZlSW5zdGFuY2UocmVzdWx0WyJpbnN0YW5jZSJdKTsKICAgICAgfQogICAgICB2YXIgaW5mbyA9IGdldFdhc21JbXBvcnRzKCk7CiAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbywgKG1vZCwgaW5zdCkgPT4gewogICAgICAgICAgICByZWNlaXZlSW5zdGFuY2UobW9kLCBpbnN0KTsKICAgICAgICAgICAgcmVzb2x2ZShtb2QuZXhwb3J0cyk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICB3YXNtQmluYXJ5RmlsZSA/Pz0gZmluZFdhc21CaW5hcnkoKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgaW5zdGFudGlhdGVBc3luYyh3YXNtQmluYXJ5LCB3YXNtQmluYXJ5RmlsZSwgaW5mbyk7CiAgICAgICAgdmFyIGV4cG9ydHMgPSByZWNlaXZlSW5zdGFudGlhdGlvblJlc3VsdChyZXN1bHQpOwogICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgfQogICAgfQogICAgY2xhc3MgRXhpdFN0YXR1cyB7CiAgICAgIG5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgIGNvbnN0cnVjdG9yKHN0YXR1cykgewogICAgICAgIHRoaXMubWVzc2FnZSA9IGBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7c3RhdHVzfSlgOwogICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICB9CiAgICB9CiAgICB2YXIgY2FsbFJ1bnRpbWVDYWxsYmFja3MgPSBjYWxsYmFja3MgPT4gewogICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICBjYWxsYmFja3Muc2hpZnQoKShNb2R1bGUpOwogICAgICB9CiAgICB9OwogICAgdmFyIG9uUG9zdFJ1bnMgPSBbXTsKICAgIHZhciBhZGRPblBvc3RSdW4gPSBjYiA9PiBvblBvc3RSdW5zLnVuc2hpZnQoY2IpOwogICAgdmFyIG9uUHJlUnVucyA9IFtdOwogICAgdmFyIGFkZE9uUHJlUnVuID0gY2IgPT4gb25QcmVSdW5zLnVuc2hpZnQoY2IpOwogICAgdmFyIG5vRXhpdFJ1bnRpbWUgPSBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgdmFyIF9fYWJvcnRfanMgPSAoKSA9PiBhYm9ydCgiIik7CiAgICB2YXIgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPSAwOwogICAgdmFyIF9fZW1zY3JpcHRlbl9ydW50aW1lX2tlZXBhbGl2ZV9jbGVhciA9ICgpID0+IHsKICAgICAgbm9FeGl0UnVudGltZSA9IGZhbHNlOwogICAgICBydW50aW1lS2VlcGFsaXZlQ291bnRlciA9IDA7CiAgICB9OwogICAgdmFyIHRpbWVycyA9IHt9OwogICAgdmFyIGhhbmRsZUV4Y2VwdGlvbiA9IGUgPT4gewogICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMgfHwgZSA9PSAidW53aW5kIikgewogICAgICAgIHJldHVybiBFWElUU1RBVFVTOwogICAgICB9CiAgICAgIHF1aXRfKDEsIGUpOwogICAgfTsKICAgIHZhciBrZWVwUnVudGltZUFsaXZlID0gKCkgPT4gbm9FeGl0UnVudGltZSB8fCBydW50aW1lS2VlcGFsaXZlQ291bnRlciA+IDA7CiAgICB2YXIgX3Byb2NfZXhpdCA9IGNvZGUgPT4gewogICAgICBFWElUU1RBVFVTID0gY29kZTsKICAgICAgaWYgKCFrZWVwUnVudGltZUFsaXZlKCkpIHsKICAgICAgICBNb2R1bGVbIm9uRXhpdCJdPy4oY29kZSk7CiAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICB9CiAgICAgIHF1aXRfKGNvZGUsIG5ldyBFeGl0U3RhdHVzKGNvZGUpKTsKICAgIH07CiAgICB2YXIgZXhpdEpTID0gKHN0YXR1cywgaW1wbGljaXQpID0+IHsKICAgICAgRVhJVFNUQVRVUyA9IHN0YXR1czsKICAgICAgX3Byb2NfZXhpdChzdGF0dXMpOwogICAgfTsKICAgIHZhciBfZXhpdCA9IGV4aXRKUzsKICAgIHZhciBtYXliZUV4aXQgPSAoKSA9PiB7CiAgICAgIGlmICgha2VlcFJ1bnRpbWVBbGl2ZSgpKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIF9leGl0KEVYSVRTVEFUVVMpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICB2YXIgY2FsbFVzZXJDYWxsYmFjayA9IGZ1bmMgPT4gewogICAgICBpZiAoQUJPUlQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBmdW5jKCk7CiAgICAgICAgbWF5YmVFeGl0KCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9ICgpID0+IHBlcmZvcm1hbmNlLm5vdygpOwogICAgdmFyIF9fc2V0aXRpbWVyX2pzID0gKHdoaWNoLCB0aW1lb3V0X21zKSA9PiB7CiAgICAgIGlmICh0aW1lcnNbd2hpY2hdKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyc1t3aGljaF0uaWQpOwogICAgICAgIGRlbGV0ZSB0aW1lcnNbd2hpY2hdOwogICAgICB9CiAgICAgIGlmICghdGltZW91dF9tcykgcmV0dXJuIDA7CiAgICAgIHZhciBpZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGRlbGV0ZSB0aW1lcnNbd2hpY2hdOwogICAgICAgIGNhbGxVc2VyQ2FsbGJhY2soKCkgPT4gX19lbXNjcmlwdGVuX3RpbWVvdXQod2hpY2gsIF9lbXNjcmlwdGVuX2dldF9ub3coKSkpOwogICAgICB9LCB0aW1lb3V0X21zKTsKICAgICAgdGltZXJzW3doaWNoXSA9IHsKICAgICAgICBpZCwKICAgICAgICB0aW1lb3V0X21zCiAgICAgIH07CiAgICAgIHJldHVybiAwOwogICAgfTsKICAgIGZ1bmN0aW9uIF9jb3B5X3BpeGVsc18xKGNvbXBHX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wRyA9IEhFQVAzMi5zdWJhcnJheShjb21wR19wdHIsIGNvbXBHX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGltYWdlRGF0YS5zZXQoY29tcEcpOwogICAgfQogICAgZnVuY3Rpb24gX2NvcHlfcGl4ZWxzXzMoY29tcFJfcHRyLCBjb21wR19wdHIsIGNvbXBCX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogMyk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbMyAqIGldID0gY29tcFJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzMgKiBpICsgMV0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbMyAqIGkgKyAyXSA9IGNvbXBCW2ldOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfY29weV9waXhlbHNfNChjb21wUl9wdHIsIGNvbXBHX3B0ciwgY29tcEJfcHRyLCBjb21wQV9wdHIsIG5iX3BpeGVscykgewogICAgICBjb21wUl9wdHIgPj49IDI7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29tcEJfcHRyID4+PSAyOwogICAgICBjb21wQV9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGNvbnN0IGNvbXBBID0gSEVBUDMyLnN1YmFycmF5KGNvbXBBX3B0ciwgY29tcEFfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYl9waXhlbHM7IGkrKykgewogICAgICAgIGltYWdlRGF0YVs0ICogaV0gPSBjb21wUltpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAxXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDJdID0gY29tcEJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgM10gPSBjb21wQVtpXTsKICAgICAgfQogICAgfQogICAgdmFyIGdldEhlYXBNYXggPSAoKSA9PiAyMTQ3NDgzNjQ4OwogICAgdmFyIGFsaWduTWVtb3J5ID0gKHNpemUsIGFsaWdubWVudCkgPT4gTWF0aC5jZWlsKHNpemUgLyBhbGlnbm1lbnQpICogYWxpZ25tZW50OwogICAgdmFyIGdyb3dNZW1vcnkgPSBzaXplID0+IHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgdmFyIHBhZ2VzID0gKHNpemUgLSBiLmJ5dGVMZW5ndGggKyA2NTUzNSkgLyA2NTUzNiB8IDA7CiAgICAgIHRyeSB7CiAgICAgICAgd2FzbU1lbW9yeS5ncm93KHBhZ2VzKTsKICAgICAgICB1cGRhdGVNZW1vcnlWaWV3cygpOwogICAgICAgIHJldHVybiAxOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfTsKICAgIHZhciBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCA9IHJlcXVlc3RlZFNpemUgPT4gewogICAgICB2YXIgb2xkU2l6ZSA9IEhFQVBVOC5sZW5ndGg7CiAgICAgIHJlcXVlc3RlZFNpemUgPj4+PSAwOwogICAgICB2YXIgbWF4SGVhcFNpemUgPSBnZXRIZWFwTWF4KCk7CiAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgLjIgLyBjdXREb3duKTsKICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnbk1lbW9yeShNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZ3Jvd01lbW9yeShuZXdTaXplKTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgdmFyIEVOViA9IHt9OwogICAgdmFyIGdldEV4ZWN1dGFibGVOYW1lID0gKCkgPT4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgIHZhciBnZXRFbnZTdHJpbmdzID0gKCkgPT4gewogICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgIHZhciBsYW5nID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgIExPR05BTUU6ICJ3ZWJfdXNlciIsCiAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsCiAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKQogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgIGlmIChFTlZbeF0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIGVudlt4XTtlbHNlIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgc3RyaW5ncy5wdXNoKGAke3h9PSR7ZW52W3hdfWApOwogICAgICAgIH0KICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICB9CiAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICB9OwogICAgdmFyIHN0cmluZ1RvQXNjaWkgPSAoc3RyLCBidWZmZXIpID0+IHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICBIRUFQOFtidWZmZXIrK10gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgfQogICAgICBIRUFQOFtidWZmZXJdID0gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fZ2V0ID0gKF9fZW52aXJvbiwgZW52aXJvbl9idWYpID0+IHsKICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaCgoc3RyaW5nLCBpKSA9PiB7CiAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICBIRUFQVTMyW19fZW52aXJvbiArIGkgKiA0ID4+IDJdID0gcHRyOwogICAgICAgIHN0cmluZ1RvQXNjaWkoc3RyaW5nLCBwdHIpOwogICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgIH0pOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fc2l6ZXNfZ2V0ID0gKHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgPT4gewogICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgSEVBUFUzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgIHN0cmluZ3MuZm9yRWFjaChzdHJpbmcgPT4gYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMSk7CiAgICAgIEhFQVBVMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2ZkX2Nsb3NlID0gZmQgPT4gNTI7CiAgICB2YXIgSU5UNTNfTUFYID0gOTAwNzE5OTI1NDc0MDk5MjsKICAgIHZhciBJTlQ1M19NSU4gPSAtOTAwNzE5OTI1NDc0MDk5MjsKICAgIHZhciBiaWdpbnRUb0k1M0NoZWNrZWQgPSBudW0gPT4gbnVtIDwgSU5UNTNfTUlOIHx8IG51bSA+IElOVDUzX01BWCA/IE5hTiA6IE51bWJlcihudW0pOwogICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsKICAgICAgb2Zmc2V0ID0gYmlnaW50VG9JNTNDaGVja2VkKG9mZnNldCk7CiAgICAgIHJldHVybiA3MDsKICAgIH0KICAgIHZhciBwcmludENoYXJCdWZmZXJzID0gW251bGwsIFtdLCBbXV07CiAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoKSA6IHVuZGVmaW5lZDsKICAgIHZhciBVVEY4QXJyYXlUb1N0cmluZyA9IChoZWFwT3JBcnJheSwgaWR4ID0gMCwgbWF4Qnl0ZXNUb1JlYWQgPSBOYU4pID0+IHsKICAgICAgdmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkOwogICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICB3aGlsZSAoaGVhcE9yQXJyYXlbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKSArK2VuZFB0cjsKICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXBPckFycmF5LmJ1ZmZlciAmJiBVVEY4RGVjb2RlcikgewogICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcE9yQXJyYXkuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgfQogICAgICB2YXIgc3RyID0gIiI7CiAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICB2YXIgdTAgPSBoZWFwT3JBcnJheVtpZHgrK107CiAgICAgICAgaWYgKCEodTAgJiAxMjgpKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFyIHUxID0gaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgodTAgJiAzMSkgPDwgNiB8IHUxKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2YXIgdTIgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MzsKICAgICAgICBpZiAoKHUwICYgMjQwKSA9PSAyMjQpIHsKICAgICAgICAgIHUwID0gKHUwICYgMTUpIDw8IDEyIHwgdTEgPDwgNiB8IHUyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1MCA9ICh1MCAmIDcpIDw8IDE4IHwgdTEgPDwgMTIgfCB1MiA8PCA2IHwgaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgfQogICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBjaCA9IHUwIC0gNjU1MzY7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IGNoID4+IDEwLCA1NjMyMCB8IGNoICYgMTAyMyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHI7CiAgICB9OwogICAgdmFyIHByaW50Q2hhciA9IChzdHJlYW0sIGN1cnIpID0+IHsKICAgICAgdmFyIGJ1ZmZlciA9IHByaW50Q2hhckJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIpKTsKICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgfQogICAgfTsKICAgIHZhciBVVEY4VG9TdHJpbmcgPSAocHRyLCBtYXhCeXRlc1RvUmVhZCkgPT4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgdmFyIF9mZF93cml0ZSA9IChmZCwgaW92LCBpb3ZjbnQsIHBudW0pID0+IHsKICAgICAgdmFyIG51bSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICB2YXIgcHRyID0gSEVBUFUzMltpb3YgPj4gMl07CiAgICAgICAgdmFyIGxlbiA9IEhFQVBVMzJbaW92ICsgNCA+PiAyXTsKICAgICAgICBpb3YgKz0gODsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICBwcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgfQogICAgICAgIG51bSArPSBsZW47CiAgICAgIH0KICAgICAgSEVBUFUzMltwbnVtID4+IDJdID0gbnVtOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICBmdW5jdGlvbiBfZ3JheV90b19yZ2JhKGNvbXBHX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iX3BpeGVsczsgaSsrKSB7CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpXSA9IGltYWdlRGF0YVs0ICogaSArIDFdID0gaW1hZ2VEYXRhWzQgKiBpICsgMl0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAzXSA9IDI1NTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX2dyYXlhX3RvX3JnYmEoY29tcEdfcHRyLCBjb21wQV9wdHIsIG5iX3BpeGVscykgewogICAgICBjb21wR19wdHIgPj49IDI7CiAgICAgIGNvbXBBX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQSA9IEhFQVAzMi5zdWJhcnJheShjb21wQV9wdHIsIGNvbXBBX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gY29tcEFbaV07CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9qc1ByaW50V2FybmluZyhtZXNzYWdlX3B0cikgewogICAgICBjb25zdCBtZXNzYWdlID0gVVRGOFRvU3RyaW5nKG1lc3NhZ2VfcHRyKTsKICAgICAgKE1vZHVsZS53YXJuIHx8IGNvbnNvbGUud2FybikoYE9wZW5KUEVHOiAke21lc3NhZ2V9YCk7CiAgICB9CiAgICBmdW5jdGlvbiBfcmdiX3RvX3JnYmEoY29tcFJfcHRyLCBjb21wR19wdHIsIGNvbXBCX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gY29tcFJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBCW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gMjU1OwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfc3RvcmVFcnJvck1lc3NhZ2UobWVzc2FnZV9wdHIpIHsKICAgICAgY29uc3QgbWVzc2FnZSA9IFVURjhUb1N0cmluZyhtZXNzYWdlX3B0cik7CiAgICAgIGlmICghTW9kdWxlLmVycm9yTWVzc2FnZXMpIHsKICAgICAgICBNb2R1bGUuZXJyb3JNZXNzYWdlcyA9IG1lc3NhZ2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTW9kdWxlLmVycm9yTWVzc2FnZXMgKz0gIlxuIiArIG1lc3NhZ2U7CiAgICAgIH0KICAgIH0KICAgIHZhciB3YXNtSW1wb3J0cyA9IHsKICAgICAgbDogX19hYm9ydF9qcywKICAgICAgazogX19lbXNjcmlwdGVuX3J1bnRpbWVfa2VlcGFsaXZlX2NsZWFyLAogICAgICBtOiBfX3NldGl0aW1lcl9qcywKICAgICAgZzogX2NvcHlfcGl4ZWxzXzEsCiAgICAgIGY6IF9jb3B5X3BpeGVsc18zLAogICAgICBlOiBfY29weV9waXhlbHNfNCwKICAgICAgbjogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgIHA6IF9lbnZpcm9uX2dldCwKICAgICAgcTogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICBiOiBfZmRfY2xvc2UsCiAgICAgIG86IF9mZF9zZWVrLAogICAgICBjOiBfZmRfd3JpdGUsCiAgICAgIHI6IF9ncmF5X3RvX3JnYmEsCiAgICAgIGk6IF9ncmF5YV90b19yZ2JhLAogICAgICBkOiBfanNQcmludFdhcm5pbmcsCiAgICAgIGo6IF9wcm9jX2V4aXQsCiAgICAgIGg6IF9yZ2JfdG9fcmdiYSwKICAgICAgYTogX3N0b3JlRXJyb3JNZXNzYWdlCiAgICB9OwogICAgdmFyIHdhc21FeHBvcnRzID0gYXdhaXQgY3JlYXRlV2FzbSgpOwogICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IHdhc21FeHBvcnRzWyJ0Il07CiAgICB2YXIgX21hbGxvYyA9IE1vZHVsZVsiX21hbGxvYyJdID0gd2FzbUV4cG9ydHNbInUiXTsKICAgIHZhciBfZnJlZSA9IE1vZHVsZVsiX2ZyZWUiXSA9IHdhc21FeHBvcnRzWyJ2Il07CiAgICB2YXIgX2pwMl9kZWNvZGUgPSBNb2R1bGVbIl9qcDJfZGVjb2RlIl0gPSB3YXNtRXhwb3J0c1sieCJdOwogICAgdmFyIF9fZW1zY3JpcHRlbl90aW1lb3V0ID0gd2FzbUV4cG9ydHNbInkiXTsKICAgIGZ1bmN0aW9uIHJ1bigpIHsKICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW47CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHByZVJ1bigpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgTW9kdWxlWyJjYWxsZWRSdW4iXSA9IHRydWU7CiAgICAgICAgaWYgKEFCT1JUKSByZXR1cm47CiAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdPy4oKTsKICAgICAgICBwb3N0UnVuKCk7CiAgICAgIH0KICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IE1vZHVsZVsic2V0U3RhdHVzIl0oIiIpLCAxKTsKICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgfSwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9SdW4oKTsKICAgICAgfQogICAgfQogICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgIH0KICAgIH0KICAgIHJ1bigpOwogICAgbW9kdWxlUnRuID0gcmVhZHlQcm9taXNlOwogICAgcmV0dXJuIG1vZHVsZVJ0bjsKICB9Owp9KSgpOwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IG9wZW5qcGVnID0gKE9wZW5KUEVHKTsKOy8vIC4vc3JjL2NvcmUvanB4LmpzCgoKCgpjbGFzcyBKcHhFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSnB4RXJyb3IiKTsKICB9Cn0KY2xhc3MgSnB4SW1hZ2UgewogIHN0YXRpYyAjYnVmZmVyID0gbnVsbDsKICBzdGF0aWMgI2hhbmRsZXIgPSBudWxsOwogIHN0YXRpYyAjbW9kdWxlUHJvbWlzZSA9IG51bGw7CiAgc3RhdGljICN1c2VXYXNtID0gdHJ1ZTsKICBzdGF0aWMgI3VzZVdvcmtlckZldGNoID0gdHJ1ZTsKICBzdGF0aWMgI3dhc21VcmwgPSBudWxsOwogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGhhbmRsZXIsCiAgICB1c2VXYXNtLAogICAgdXNlV29ya2VyRmV0Y2gsCiAgICB3YXNtVXJsCiAgfSkgewogICAgdGhpcy4jdXNlV2FzbSA9IHVzZVdhc207CiAgICB0aGlzLiN1c2VXb3JrZXJGZXRjaCA9IHVzZVdvcmtlckZldGNoOwogICAgdGhpcy4jd2FzbVVybCA9IHdhc21Vcmw7CiAgICBpZiAoIXVzZVdvcmtlckZldGNoKSB7CiAgICAgIHRoaXMuI2hhbmRsZXIgPSBoYW5kbGVyOwogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgI2dldEpzTW9kdWxlKGZhbGxiYWNrQ2FsbGJhY2spIHsKICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLiN3YXNtVXJsfW9wZW5qcGVnX25vd2FzbV9mYWxsYmFjay5qc2A7CiAgICBsZXQgaW5zdGFuY2UgPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KAogICAgICAvKndlYnBhY2tJZ25vcmU6IHRydWUqLwogICAgICAvKkB2aXRlLWlnbm9yZSovCiAgICAgIHBhdGgpOwogICAgICBpbnN0YW5jZSA9IG1vZC5kZWZhdWx0KCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oYEpweEltYWdlI2dldEpzTW9kdWxlOiAke2V9YCk7CiAgICB9CiAgICBmYWxsYmFja0NhbGxiYWNrKGluc3RhbmNlKTsKICB9CiAgc3RhdGljIGFzeW5jICNpbnN0YW50aWF0ZVdhc20oZmFsbGJhY2tDYWxsYmFjaywgaW1wb3J0cywgc3VjY2Vzc0NhbGxiYWNrKSB7CiAgICBjb25zdCBmaWxlbmFtZSA9ICJvcGVuanBlZy53YXNtIjsKICAgIHRyeSB7CiAgICAgIGlmICghdGhpcy4jYnVmZmVyKSB7CiAgICAgICAgaWYgKHRoaXMuI3VzZVdvcmtlckZldGNoKSB7CiAgICAgICAgICB0aGlzLiNidWZmZXIgPSBhd2FpdCBmZXRjaEJpbmFyeURhdGEoYCR7dGhpcy4jd2FzbVVybH0ke2ZpbGVuYW1lfWApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLiNidWZmZXIgPSBhd2FpdCB0aGlzLiNoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCaW5hcnlEYXRhIiwgewogICAgICAgICAgICB0eXBlOiAid2FzbUZhY3RvcnkiLAogICAgICAgICAgICBmaWxlbmFtZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0aGlzLiNidWZmZXIsIGltcG9ydHMpOwogICAgICByZXR1cm4gc3VjY2Vzc0NhbGxiYWNrKHJlc3VsdHMuaW5zdGFuY2UpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYEpweEltYWdlI2luc3RhbnRpYXRlV2FzbTogJHtyZWFzb259YCk7CiAgICAgIHRoaXMuI2dldEpzTW9kdWxlKGZhbGxiYWNrQ2FsbGJhY2spOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZmluYWxseSB7CiAgICAgIHRoaXMuI2hhbmRsZXIgPSBudWxsOwogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgZGVjb2RlKGJ5dGVzLCB7CiAgICBudW1Db21wb25lbnRzID0gNCwKICAgIGlzSW5kZXhlZENvbG9ybWFwID0gZmFsc2UsCiAgICBzbWFza0luRGF0YSA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBpZiAoIXRoaXMuI21vZHVsZVByb21pc2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHByb21pc2UsCiAgICAgICAgcmVzb2x2ZQogICAgICB9ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VdOwogICAgICBpZiAoIXRoaXMuI3VzZVdhc20pIHsKICAgICAgICB0aGlzLiNnZXRKc01vZHVsZShyZXNvbHZlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcm9taXNlcy5wdXNoKG9wZW5qcGVnKHsKICAgICAgICAgIHdhcm46IHdhcm4sCiAgICAgICAgICBpbnN0YW50aWF0ZVdhc206IHRoaXMuI2luc3RhbnRpYXRlV2FzbS5iaW5kKHRoaXMsIHJlc29sdmUpCiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIHRoaXMuI21vZHVsZVByb21pc2UgPSBQcm9taXNlLnJhY2UocHJvbWlzZXMpOwogICAgfQogICAgY29uc3QgbW9kdWxlID0gYXdhaXQgdGhpcy4jbW9kdWxlUHJvbWlzZTsKICAgIGlmICghbW9kdWxlKSB7CiAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3BlbkpQRUcgZmFpbGVkIHRvIGluaXRpYWxpemUiKTsKICAgIH0KICAgIGxldCBwdHI7CiAgICB0cnkgewogICAgICBjb25zdCBzaXplID0gYnl0ZXMubGVuZ3RoOwogICAgICBwdHIgPSBtb2R1bGUuX21hbGxvYyhzaXplKTsKICAgICAgbW9kdWxlLkhFQVBVOC5zZXQoYnl0ZXMsIHB0cik7CiAgICAgIGNvbnN0IHJldCA9IG1vZHVsZS5fanAyX2RlY29kZShwdHIsIHNpemUsIG51bUNvbXBvbmVudHMgPiAwID8gbnVtQ29tcG9uZW50cyA6IDAsICEhaXNJbmRleGVkQ29sb3JtYXAsICEhc21hc2tJbkRhdGEpOwogICAgICBpZiAocmV0KSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgZXJyb3JNZXNzYWdlcwogICAgICAgIH0gPSBtb2R1bGU7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHsKICAgICAgICAgIGRlbGV0ZSBtb2R1bGUuZXJyb3JNZXNzYWdlczsKICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlcnJvck1lc3NhZ2VzKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJVbmtub3duIGVycm9yIik7CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGltYWdlRGF0YQogICAgICB9ID0gbW9kdWxlOwogICAgICBtb2R1bGUuaW1hZ2VEYXRhID0gbnVsbDsKICAgICAgcmV0dXJuIGltYWdlRGF0YTsKICAgIH0gZmluYWxseSB7CiAgICAgIGlmIChwdHIpIHsKICAgICAgICBtb2R1bGUuX2ZyZWUocHRyKTsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgY2xlYW51cCgpIHsKICAgIHRoaXMuI21vZHVsZVByb21pc2UgPSBudWxsOwogIH0KICBzdGF0aWMgcGFyc2VJbWFnZVByb3BlcnRpZXMoc3RyZWFtKSB7CiAgICBsZXQgbmV3Qnl0ZSA9IHN0cmVhbS5nZXRCeXRlKCk7CiAgICB3aGlsZSAobmV3Qnl0ZSA+PSAwKSB7CiAgICAgIGNvbnN0IG9sZEJ5dGUgPSBuZXdCeXRlOwogICAgICBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgY29uc3QgY29kZSA9IG9sZEJ5dGUgPDwgOCB8IG5ld0J5dGU7CiAgICAgIGlmIChjb2RlID09PSAweGZmNTEpIHsKICAgICAgICBzdHJlYW0uc2tpcCg0KTsKICAgICAgICBjb25zdCBYc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWXNpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIGNvbnN0IFhPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBzdHJlYW0uc2tpcCgxNik7CiAgICAgICAgY29uc3QgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgd2lkdGg6IFhzaXogLSBYT3NpeiwKICAgICAgICAgIGhlaWdodDogWXNpeiAtIFlPc2l6LAogICAgICAgICAgYml0c1BlckNvbXBvbmVudDogOCwKICAgICAgICAgIGNvbXBvbmVudHNDb3VudDogQ3NpegogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBKcHhFcnJvcigiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYmluYXJ5X2NtYXAuanMKCmZ1bmN0aW9uIGhleFRvSW50KGEsIHNpemUpIHsKICBsZXQgbiA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CiAgICBuID0gbiA8PCA4IHwgYVtpXTsKICB9CiAgcmV0dXJuIG4gPj4+IDA7Cn0KZnVuY3Rpb24gaGV4VG9TdHIoYSwgc2l6ZSkgewogIGlmIChzaXplID09PSAxKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdKTsKICB9CiAgaWYgKHNpemUgPT09IDMpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pOwogIH0KICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7Cn0KZnVuY3Rpb24gYWRkSGV4KGEsIGIsIHNpemUpIHsKICBsZXQgYyA9IDA7CiAgZm9yIChsZXQgaSA9IHNpemU7IGkgPj0gMDsgaS0tKSB7CiAgICBjICs9IGFbaV0gKyBiW2ldOwogICAgYVtpXSA9IGMgJiAyNTU7CiAgICBjID4+PSA4OwogIH0KfQpmdW5jdGlvbiBpbmNIZXgoYSwgc2l6ZSkgewogIGxldCBjID0gMTsKICBmb3IgKGxldCBpID0gc2l6ZTsgaSA+PSAwICYmIGMgPiAwOyBpLS0pIHsKICAgIGMgKz0gYVtpXTsKICAgIGFbaV0gPSBjICYgMjU1OwogICAgYyA+Pj0gODsKICB9Cn0KY29uc3QgTUFYX05VTV9TSVpFID0gMTY7CmNvbnN0IE1BWF9FTkNPREVEX05VTV9TSVpFID0gMTk7CmNsYXNzIEJpbmFyeUNNYXBTdHJlYW0gewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKICAgIHRoaXMucG9zID0gMDsKICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBVaW50OEFycmF5KE1BWF9FTkNPREVEX05VTV9TSVpFKTsKICB9CiAgcmVhZEJ5dGUoKSB7CiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdOwogIH0KICByZWFkTnVtYmVyKCkgewogICAgbGV0IG4gPSAwOwogICAgbGV0IGxhc3Q7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIG4gPSBuIDw8IDcgfCBiICYgMHg3ZjsKICAgIH0gd2hpbGUgKCFsYXN0KTsKICAgIHJldHVybiBuOwogIH0KICByZWFkU2lnbmVkKCkgewogICAgY29uc3QgbiA9IHRoaXMucmVhZE51bWJlcigpOwogICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7CiAgfQogIHJlYWRIZXgobnVtLCBzaXplKSB7CiAgICBudW0uc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zLCB0aGlzLnBvcyArIHNpemUgKyAxKSk7CiAgICB0aGlzLnBvcyArPSBzaXplICsgMTsKICB9CiAgcmVhZEhleE51bWJlcihudW0sIHNpemUpIHsKICAgIGxldCBsYXN0OwogICAgY29uc3Qgc3RhY2sgPSB0aGlzLnRtcEJ1ZjsKICAgIGxldCBzcCA9IDA7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIHN0YWNrW3NwKytdID0gYiAmIDB4N2Y7CiAgICB9IHdoaWxlICghbGFzdCk7CiAgICBsZXQgaSA9IHNpemUsCiAgICAgIGJ1ZmZlciA9IDAsCiAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgd2hpbGUgKGkgPj0gMCkgewogICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IDggJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgIGJ1ZmZlciB8PSBzdGFja1stLXNwXSA8PCBidWZmZXJTaXplOwogICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKICAgICAgfQogICAgICBudW1baV0gPSBidWZmZXIgJiAyNTU7CiAgICAgIGktLTsKICAgICAgYnVmZmVyID4+PSA4OwogICAgICBidWZmZXJTaXplIC09IDg7CiAgICB9CiAgfQogIHJlYWRIZXhTaWduZWQobnVtLCBzaXplKSB7CiAgICB0aGlzLnJlYWRIZXhOdW1iZXIobnVtLCBzaXplKTsKICAgIGNvbnN0IHNpZ24gPSBudW1bc2l6ZV0gJiAxID8gMjU1IDogMDsKICAgIGxldCBjID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykgewogICAgICBjID0gKGMgJiAxKSA8PCA4IHwgbnVtW2ldOwogICAgICBudW1baV0gPSBjID4+IDEgXiBzaWduOwogICAgfQogIH0KICByZWFkU3RyaW5nKCkgewogICAgY29uc3QgbGVuID0gdGhpcy5yZWFkTnVtYmVyKCksCiAgICAgIGJ1ZiA9IG5ldyBBcnJheShsZW4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBidWZbaV0gPSB0aGlzLnJlYWROdW1iZXIoKTsKICAgIH0KICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgfQp9CmNsYXNzIEJpbmFyeUNNYXBSZWFkZXIgewogIGFzeW5jIHByb2Nlc3MoZGF0YSwgY01hcCwgZXh0ZW5kKSB7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5Q01hcFN0cmVhbShkYXRhKTsKICAgIGNvbnN0IGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpOwogICAgY01hcC52ZXJ0aWNhbCA9ICEhKGhlYWRlciAmIDEpOwogICAgbGV0IHVzZUNNYXAgPSBudWxsOwogICAgY29uc3Qgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgZW5kID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGNvbnN0IGNoYXIgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgdG1wID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGxldCBjb2RlOwogICAgbGV0IGI7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkgewogICAgICBjb25zdCB0eXBlID0gYiA+PiA1OwogICAgICBpZiAodHlwZSA9PT0gNykgewogICAgICAgIHN3aXRjaCAoYiAmIDB4MWYpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgc3RyZWFtLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qgc2VxdWVuY2UgPSAhIShiICYgMHgxMCk7CiAgICAgIGNvbnN0IGRhdGFTaXplID0gYiAmIDE1OwogICAgICBpZiAoZGF0YVNpemUgKyAxID4gTUFYX05VTV9TSVpFKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7CiAgICAgIH0KICAgICAgY29uc3QgdWNzMkRhdGFTaXplID0gMTsKICAgICAgY29uc3Qgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKGRhdGFTaXplICsgMSwgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSkpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShkYXRhU2l6ZSArIDEsIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChjaGFyLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcih0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkU2lnbmVkKCkgKyAoY29kZSArIDEpOwogICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBDaWRSYW5nZShoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSwgY29kZSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoY2hhciwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgewogICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHRtcCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluY0hleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleFNpZ25lZCh0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGNoYXJDb2RlLCB0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKICAgICAgICAgIGNNYXAubWFwQmZSYW5nZShoZXhUb0ludChzdGFydCwgdWNzMkRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCB1Y3MyRGF0YVNpemUpLCBoZXhUb1N0cihjaGFyQ29kZSwgZGF0YVNpemUpKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3MgLSB1bmtub3duIHR5cGU6ICR7dHlwZX1gKTsKICAgICAgfQogICAgfQogICAgaWYgKHVzZUNNYXApIHsKICAgICAgcmV0dXJuIGV4dGVuZCh1c2VDTWFwKTsKICAgIH0KICAgIHJldHVybiBjTWFwOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYXNjaWlfODVfc3RyZWFtLmpzCgoKY2xhc3MgQXNjaWk4NVN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgaWYgKG1heWJlTGVuZ3RoKSB7CiAgICAgIG1heWJlTGVuZ3RoICo9IDAuODsKICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICB0aGlzLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoNSk7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IFRJTERBX0NIQVIgPSAweDdlOwogICAgY29uc3QgWl9MT1dFUl9DSEFSID0gMHg3YTsKICAgIGNvbnN0IEVPRiA9IC0xOwogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBsZXQgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7CiAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgfQogICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgYnVmZmVyLCBpOwogICAgaWYgKGMgPT09IFpfTE9XRVJfQ0hBUikgewogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTsKICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IDA7CiAgICAgIH0KICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gNDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dDsKICAgICAgaW5wdXRbMF0gPSBjOwogICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7CiAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICAgICAgd2hpbGUgKGlzV2hpdGVTcGFjZShjKSkgewogICAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICAgICAgfQogICAgICAgIGlucHV0W2ldID0gYzsKICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBpIC0gMSk7CiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxOwogICAgICBpZiAoaSA8IDUpIHsKICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkgewogICAgICAgICAgaW5wdXRbaV0gPSAweDIxICsgODQ7CiAgICAgICAgfQogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgdCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgICB0ID0gdCAqIDg1ICsgKGlucHV0W2ldIC0gMHgyMSk7CiAgICAgIH0KICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjsKICAgICAgICB0ID4+PSA4OwogICAgICB9CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hc2NpaV9oZXhfc3RyZWFtLmpzCgpjbGFzcyBBc2NpaUhleFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgaWYgKG1heWJlTGVuZ3RoKSB7CiAgICAgIG1heWJlTGVuZ3RoICo9IDAuNTsKICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICB0aGlzLmZpcnN0RGlnaXQgPSAtMTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3QgVVBTVFJFQU1fQkxPQ0tfU0laRSA9IDgwMDA7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKFVQU1RSRUFNX0JMT0NLX1NJWkUpOwogICAgaWYgKCFieXRlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBtYXhEZWNvZGVMZW5ndGggPSBieXRlcy5sZW5ndGggKyAxID4+IDE7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7CiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgZmlyc3REaWdpdCA9IHRoaXMuZmlyc3REaWdpdDsKICAgIGZvciAoY29uc3QgY2ggb2YgYnl0ZXMpIHsKICAgICAgbGV0IGRpZ2l0OwogICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7CiAgICAgICAgZGlnaXQgPSBjaCAmIDB4MGY7CiAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDQ2IHx8IGNoID49IDB4NjEgJiYgY2ggPD0gMHg2NikgewogICAgICAgIGRpZ2l0ID0gKGNoICYgMHgwZikgKyA5OwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChmaXJzdERpZ2l0IDwgMCkgewogICAgICAgIGZpcnN0RGlnaXQgPSBkaWdpdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0IHwgZGlnaXQ7CiAgICAgICAgZmlyc3REaWdpdCA9IC0xOwogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3REaWdpdCA+PSAwICYmIHRoaXMuZW9mKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBmaXJzdERpZ2l0IDw8IDQ7CiAgICAgIGZpcnN0RGlnaXQgPSAtMTsKICAgIH0KICAgIHRoaXMuZmlyc3REaWdpdCA9IGZpcnN0RGlnaXQ7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NjaXR0LmpzCgpjb25zdCBjY2l0dEVPTCA9IC0yOwpjb25zdCBjY2l0dEVPRiA9IC0xOwpjb25zdCB0d29EaW1QYXNzID0gMDsKY29uc3QgdHdvRGltSG9yaXogPSAxOwpjb25zdCB0d29EaW1WZXJ0MCA9IDI7CmNvbnN0IHR3b0RpbVZlcnRSMSA9IDM7CmNvbnN0IHR3b0RpbVZlcnRMMSA9IDQ7CmNvbnN0IHR3b0RpbVZlcnRSMiA9IDU7CmNvbnN0IHR3b0RpbVZlcnRMMiA9IDY7CmNvbnN0IHR3b0RpbVZlcnRSMyA9IDc7CmNvbnN0IHR3b0RpbVZlcnRMMyA9IDg7CmNvbnN0IHR3b0RpbVRhYmxlID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzcsIHR3b0RpbVZlcnRMM10sIFs3LCB0d29EaW1WZXJ0UjNdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNiwgdHdvRGltVmVydFIyXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXV07CmNvbnN0IHdoaXRlVGFibGUxID0gW1stMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdXTsKY29uc3Qgd2hpdGVUYWJsZTIgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs4LCAyOV0sIFs4LCAyOV0sIFs4LCAzMF0sIFs4LCAzMF0sIFs4LCA0NV0sIFs4LCA0NV0sIFs4LCA0Nl0sIFs4LCA0Nl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs4LCA0N10sIFs4LCA0N10sIFs4LCA0OF0sIFs4LCA0OF0sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs4LCAzM10sIFs4LCAzM10sIFs4LCAzNF0sIFs4LCAzNF0sIFs4LCAzNV0sIFs4LCAzNV0sIFs4LCAzNl0sIFs4LCAzNl0sIFs4LCAzN10sIFs4LCAzN10sIFs4LCAzOF0sIFs4LCAzOF0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs4LCAzMV0sIFs4LCAzMV0sIFs4LCAzMl0sIFs4LCAzMl0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbOCwgNTNdLCBbOCwgNTNdLCBbOCwgNTRdLCBbOCwgNTRdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbOCwgMzldLCBbOCwgMzldLCBbOCwgNDBdLCBbOCwgNDBdLCBbOCwgNDFdLCBbOCwgNDFdLCBbOCwgNDJdLCBbOCwgNDJdLCBbOCwgNDNdLCBbOCwgNDNdLCBbOCwgNDRdLCBbOCwgNDRdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbOCwgNjFdLCBbOCwgNjFdLCBbOCwgNjJdLCBbOCwgNjJdLCBbOCwgNjNdLCBbOCwgNjNdLCBbOCwgMF0sIFs4LCAwXSwgWzgsIDMyMF0sIFs4LCAzMjBdLCBbOCwgMzg0XSwgWzgsIDM4NF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs4LCA1OV0sIFs4LCA1OV0sIFs4LCA2MF0sIFs4LCA2MF0sIFs5LCAxNDcyXSwgWzksIDE1MzZdLCBbOSwgMTYwMF0sIFs5LCAxNzI4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzgsIDQ5XSwgWzgsIDQ5XSwgWzgsIDUwXSwgWzgsIDUwXSwgWzgsIDUxXSwgWzgsIDUxXSwgWzgsIDUyXSwgWzgsIDUyXSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzgsIDU1XSwgWzgsIDU1XSwgWzgsIDU2XSwgWzgsIDU2XSwgWzgsIDU3XSwgWzgsIDU3XSwgWzgsIDU4XSwgWzgsIDU4XSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzgsIDQ0OF0sIFs4LCA0NDhdLCBbOCwgNTEyXSwgWzgsIDUxMl0sIFs5LCA3MDRdLCBbOSwgNzY4XSwgWzgsIDY0MF0sIFs4LCA2NDBdLCBbOCwgNTc2XSwgWzgsIDU3Nl0sIFs5LCA4MzJdLCBbOSwgODk2XSwgWzksIDk2MF0sIFs5LCAxMDI0XSwgWzksIDEwODhdLCBbOSwgMTE1Ml0sIFs5LCAxMjE2XSwgWzksIDEyODBdLCBbOSwgMTM0NF0sIFs5LCAxNDA4XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XV07CmNvbnN0IGJsYWNrVGFibGUxID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzEyLCBjY2l0dEVPTF0sIFsxMiwgY2NpdHRFT0xdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzEyLCAxOTg0XSwgWzEyLCAxOTg0XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgWzEyLCAyMTc2XSwgWzEyLCAyMTc2XSwgWzEyLCAyMjQwXSwgWzEyLCAyMjQwXSwgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgWzEyLCAyNDMyXSwgWzEyLCAyNDMyXSwgWzEyLCAyNDk2XSwgWzEyLCAyNDk2XSwgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTIsIDUyXSwgWzEyLCA1Ml0sIFsxMywgNjQwXSwgWzEzLCA3MDRdLCBbMTMsIDc2OF0sIFsxMywgODMyXSwgWzEyLCA1NV0sIFsxMiwgNTVdLCBbMTIsIDU2XSwgWzEyLCA1Nl0sIFsxMywgMTI4MF0sIFsxMywgMTM0NF0sIFsxMywgMTQwOF0sIFsxMywgMTQ3Ml0sIFsxMiwgNTldLCBbMTIsIDU5XSwgWzEyLCA2MF0sIFsxMiwgNjBdLCBbMTMsIDE1MzZdLCBbMTMsIDE2MDBdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMywgMTY2NF0sIFsxMywgMTcyOF0sIFsxMiwgMzIwXSwgWzEyLCAzMjBdLCBbMTIsIDM4NF0sIFsxMiwgMzg0XSwgWzEyLCA0NDhdLCBbMTIsIDQ0OF0sIFsxMywgNTEyXSwgWzEzLCA1NzZdLCBbMTIsIDUzXSwgWzEyLCA1M10sIFsxMiwgNTRdLCBbMTIsIDU0XSwgWzEzLCA4OTZdLCBbMTMsIDk2MF0sIFsxMywgMTAyNF0sIFsxMywgMTA4OF0sIFsxMywgMTE1Ml0sIFsxMywgMTIxNl0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XV07CmNvbnN0IGJsYWNrVGFibGUyID0gW1s4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFsxMSwgMjNdLCBbMTEsIDIzXSwgWzEyLCA1MF0sIFsxMiwgNTFdLCBbMTIsIDQ0XSwgWzEyLCA0NV0sIFsxMiwgNDZdLCBbMTIsIDQ3XSwgWzEyLCA1N10sIFsxMiwgNThdLCBbMTIsIDYxXSwgWzEyLCAyNTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMiwgNDhdLCBbMTIsIDQ5XSwgWzEyLCA2Ml0sIFsxMiwgNjNdLCBbMTIsIDMwXSwgWzEyLCAzMV0sIFsxMiwgMzJdLCBbMTIsIDMzXSwgWzEyLCA0MF0sIFsxMiwgNDFdLCBbMTEsIDIyXSwgWzExLCAyMl0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFsxMiwgMTI4XSwgWzEyLCAxOTJdLCBbMTIsIDI2XSwgWzEyLCAyN10sIFsxMiwgMjhdLCBbMTIsIDI5XSwgWzExLCAxOV0sIFsxMSwgMTldLCBbMTEsIDIwXSwgWzExLCAyMF0sIFsxMiwgMzRdLCBbMTIsIDM1XSwgWzEyLCAzNl0sIFsxMiwgMzddLCBbMTIsIDM4XSwgWzEyLCAzOV0sIFsxMSwgMjFdLCBbMTEsIDIxXSwgWzEyLCA0Ml0sIFsxMiwgNDNdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXTsKY29uc3QgYmxhY2tUYWJsZTMgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs2LCA5XSwgWzYsIDhdLCBbNSwgN10sIFs1LCA3XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl1dOwpjbGFzcyBDQ0lUVEZheERlY29kZXIgewogIGNvbnN0cnVjdG9yKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7CiAgICBpZiAodHlwZW9mIHNvdXJjZT8ubmV4dCAhPT0gImZ1bmN0aW9uIikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgInNvdXJjZSIgcGFyYW1ldGVyLicpOwogICAgfQogICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuSyB8fCAwOwogICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTsKICAgIHRoaXMuYnl0ZUFsaWduID0gb3B0aW9ucy5FbmNvZGVkQnl0ZUFsaWduIHx8IGZhbHNlOwogICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5Db2x1bW5zIHx8IDE3Mjg7CiAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDsKICAgIHRoaXMuZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jayA/PyB0cnVlOwogICAgdGhpcy5ibGFjayA9IG9wdGlvbnMuQmxhY2tJczEgfHwgZmFsc2U7CiAgICB0aGlzLmNvZGluZ0xpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMSk7CiAgICB0aGlzLnJlZkxpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMik7CiAgICB0aGlzLmNvZGluZ0xpbmVbMF0gPSB0aGlzLmNvbHVtbnM7CiAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICB0aGlzLnJvdyA9IDA7CiAgICB0aGlzLm5leHRMaW5lMkQgPSB0aGlzLmVuY29kaW5nIDwgMDsKICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKICAgIHRoaXMuaW5wdXRCdWYgPSAwOwogICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKICAgIHRoaXMucm93c0RvbmUgPSBmYWxzZTsKICAgIGxldCBjb2RlMTsKICAgIHdoaWxlICgoY29kZTEgPSB0aGlzLl9sb29rQml0cygxMikpID09PSAwKSB7CiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICB9CiAgICBpZiAoY29kZTEgPT09IDEpIHsKICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICB9CiAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOwogICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgfQogIH0KICByZWFkTmV4dENoYXIoKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOwogICAgbGV0IHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7CiAgICBpZiAodGhpcy5vdXRwdXRCaXRzID09PSAwKSB7CiAgICAgIGlmICh0aGlzLnJvd3NEb25lKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICh0aGlzLmVvZikgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICB0aGlzLmVyciA9IGZhbHNlOwogICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMzsKICAgICAgaWYgKHRoaXMubmV4dExpbmUyRCkgewogICAgICAgIGZvciAoaSA9IDA7IGNvZGluZ0xpbmVbaV0gPCBjb2x1bW5zOyArK2kpIHsKICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2RpbmdMaW5lW2ldOwogICAgICAgIH0KICAgICAgICByZWZMaW5lW2krK10gPSBjb2x1bW5zOwogICAgICAgIHJlZkxpbmVbaV0gPSBjb2x1bW5zOwogICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOwogICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKICAgICAgICByZWZQb3MgPSAwOwogICAgICAgIGJsYWNrUGl4ZWxzID0gMDsKICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTsKICAgICAgICAgIHN3aXRjaCAoY29kZTEpIHsKICAgICAgICAgICAgY2FzZSB0d29EaW1QYXNzOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvcyArIDFdLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgaWYgKHJlZkxpbmVbcmVmUG9zICsgMV0gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltSG9yaXo6CiAgICAgICAgICAgICAgY29kZTEgPSBjb2RlMiA9IDA7CiAgICAgICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMiwgYmxhY2tQaXhlbHMgXiAxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIyOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAyLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIxOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAxLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMzoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMywgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHsKICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwyOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAyLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAtLXJlZlBvczsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGNjaXR0RU9GOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTsKICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaW5mbygiYmFkIDJkIGNvZGUiKTsKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CiAgICAgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICAgICAgYmxhY2tQaXhlbHMgPSAwOwogICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgIGNvZGUxID0gMDsKICAgICAgICAgIGlmIChibGFja1BpeGVscykgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CiAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZ290RU9MID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIHRoaXMuaW5wdXRCaXRzICY9IH43OwogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2Jsb2NrICYmIHRoaXMucm93ID09PSB0aGlzLnJvd3MgLSAxKSB7CiAgICAgICAgdGhpcy5yb3dzRG9uZSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgPT09IDApIHsKICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBnb3RFT0wgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHsKICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgfQogICAgICBpZiAodGhpcy5lb2Jsb2NrICYmIGdvdEVPTCAmJiB0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+PSAwKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKICAgICAgICAgICAgICAgIGluZm8oImJhZCBydGMgY29kZTogIiArIGNvZGUxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyICYmIHRoaXMuZW9saW5lKSB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTMpOwogICAgICAgICAgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgewogICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb2RlMSA+PiAxID09PSAxKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIShjb2RlMSAmIDEpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWzBdID4gMCA/IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAwXSA6IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAxXTsKICAgICAgdGhpcy5yb3crKzsKICAgIH0KICAgIGxldCBjOwogICAgaWYgKHRoaXMub3V0cHV0Qml0cyA+PSA4KSB7CiAgICAgIGMgPSB0aGlzLmNvZGluZ1BvcyAmIDEgPyAwIDogMHhmZjsKICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IDg7CiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYml0cyA9IDg7CiAgICAgIGMgPSAwOwogICAgICBkbyB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm91dHB1dEJpdHMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ0ludmFsaWQgL0NDSVRURmF4RGVjb2RlIGRhdGEsICJvdXRwdXRCaXRzIiBtdXN0IGJlIGEgbnVtYmVyLicpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgewogICAgICAgICAgYyA8PD0gYml0czsKICAgICAgICAgIGlmICghKHRoaXMuY29kaW5nUG9zICYgMSkpIHsKICAgICAgICAgICAgYyB8PSAweGZmID4+IDggLSBiaXRzOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IGJpdHM7CiAgICAgICAgICBiaXRzID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYyA8PD0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgewogICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKICAgICAgICAgIH0KICAgICAgICAgIGJpdHMgLT0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07CiAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7CiAgICAgICAgICAgIGMgPDw9IGJpdHM7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSB3aGlsZSAoYml0cyk7CiAgICB9CiAgICBpZiAodGhpcy5ibGFjaykgewogICAgICBjIF49IDB4ZmY7CiAgICB9CiAgICByZXR1cm4gYzsKICB9CiAgX2FkZFBpeGVscyhhMSwgYmxhY2tQaXhlbHMpIHsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CiAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CiAgICAgICAgaW5mbygicm93IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKICAgICAgfQogICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgKytjb2RpbmdQb3M7CiAgICAgIH0KICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CiAgICB9CiAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKICB9CiAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CiAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CiAgICAgICAgaW5mbygicm93IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKICAgICAgfQogICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgKytjb2RpbmdQb3M7CiAgICAgIH0KICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CiAgICB9IGVsc2UgaWYgKGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CiAgICAgIGlmIChhMSA8IDApIHsKICAgICAgICBpbmZvKCJpbnZhbGlkIGNvZGUiKTsKICAgICAgICB0aGlzLmVyciA9IHRydWU7CiAgICAgICAgYTEgPSAwOwogICAgICB9CiAgICAgIHdoaWxlIChjb2RpbmdQb3MgPiAwICYmIGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3MgLSAxXSkgewogICAgICAgIC0tY29kaW5nUG9zOwogICAgICB9CiAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOwogICAgfQogICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7CiAgfQogIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkgewogICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7CiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07CiAgICAgIH0KICAgICAgaWYgKGkgPCBlbmQpIHsKICAgICAgICBjb2RlIDw8PSBlbmQgLSBpOwogICAgICB9CiAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHsKICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdOwogICAgICAgIGlmIChwWzBdID09PSBpKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKGkpOwogICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTsKICB9CiAgX2dldFR3b0RpbUNvZGUoKSB7CiAgICBsZXQgY29kZSA9IDA7CiAgICBsZXQgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDcpOwogICAgICBwID0gdHdvRGltVGFibGVbY29kZV07CiAgICAgIGlmIChwPy5bMF0gPiAwKSB7CiAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKICAgICAgICByZXR1cm4gcFsxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA3LCB0d29EaW1UYWJsZSk7CiAgICAgIGlmIChyZXN1bHRbMF0gJiYgcmVzdWx0WzJdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgfQogICAgaW5mbygiQmFkIHR3byBkaW0gY29kZSIpOwogICAgcmV0dXJuIGNjaXR0RU9GOwogIH0KICBfZ2V0V2hpdGVDb2RlKCkgewogICAgbGV0IGNvZGUgPSAwOwogICAgbGV0IHA7CiAgICBpZiAodGhpcy5lb2Jsb2NrKSB7CiAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikgewogICAgICAgIHJldHVybiAxOwogICAgICB9CiAgICAgIHAgPSBjb2RlID4+IDUgPT09IDAgPyB3aGl0ZVRhYmxlMVtjb2RlXSA6IHdoaXRlVGFibGUyW2NvZGUgPj4gM107CiAgICAgIGlmIChwWzBdID4gMCkgewogICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CiAgICAgICAgcmV0dXJuIHBbMV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMSwgMTIsIHdoaXRlVGFibGUxKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgIGluZm8oImJhZCB3aGl0ZSBjb2RlIik7CiAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgcmV0dXJuIDE7CiAgfQogIF9nZXRCbGFja0NvZGUoKSB7CiAgICBsZXQgY29kZSwgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkgewogICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTsKICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7CiAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdOwogICAgICB9IGVsc2UgewogICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddOwogICAgICB9CiAgICAgIGlmIChwWzBdID4gMCkgewogICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CiAgICAgICAgcmV0dXJuIHBbMV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDIsIDYsIGJsYWNrVGFibGUzKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSg3LCAxMiwgYmxhY2tUYWJsZTIsIDY0KTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgIGluZm8oImJhZCBibGFjayBjb2RlIik7CiAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgcmV0dXJuIDE7CiAgfQogIF9sb29rQml0cyhuKSB7CiAgICBsZXQgYzsKICAgIHdoaWxlICh0aGlzLmlucHV0Qml0cyA8IG4pIHsKICAgICAgaWYgKChjID0gdGhpcy5zb3VyY2UubmV4dCgpKSA9PT0gLTEpIHsKICAgICAgICBpZiAodGhpcy5pbnB1dEJpdHMgPT09IDApIHsKICAgICAgICAgIHJldHVybiBjY2l0dEVPRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPDwgbiAtIHRoaXMuaW5wdXRCaXRzICYgMHhmZmZmID4+IDE2IC0gbjsKICAgICAgfQogICAgICB0aGlzLmlucHV0QnVmID0gdGhpcy5pbnB1dEJ1ZiA8PCA4IHwgYzsKICAgICAgdGhpcy5pbnB1dEJpdHMgKz0gODsKICAgIH0KICAgIHJldHVybiB0aGlzLmlucHV0QnVmID4+IHRoaXMuaW5wdXRCaXRzIC0gbiAmIDB4ZmZmZiA+PiAxNiAtIG47CiAgfQogIF9lYXRCaXRzKG4pIHsKICAgIGlmICgodGhpcy5pbnB1dEJpdHMgLT0gbikgPCAwKSB7CiAgICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NjaXR0X3N0cmVhbS5qcwoKCgpjbGFzcyBDQ0lUVEZheFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcGFyYW1zID0gRGljdC5lbXB0eTsKICAgIH0KICAgIGNvbnN0IHNvdXJjZSA9IHsKICAgICAgbmV4dCgpIHsKICAgICAgICByZXR1cm4gc3RyLmdldEJ5dGUoKTsKICAgICAgfQogICAgfTsKICAgIHRoaXMuY2NpdHRGYXhEZWNvZGVyID0gbmV3IENDSVRURmF4RGVjb2Rlcihzb3VyY2UsIHsKICAgICAgSzogcGFyYW1zLmdldCgiSyIpLAogICAgICBFbmRPZkxpbmU6IHBhcmFtcy5nZXQoIkVuZE9mTGluZSIpLAogICAgICBFbmNvZGVkQnl0ZUFsaWduOiBwYXJhbXMuZ2V0KCJFbmNvZGVkQnl0ZUFsaWduIiksCiAgICAgIENvbHVtbnM6IHBhcmFtcy5nZXQoIkNvbHVtbnMiKSwKICAgICAgUm93czogcGFyYW1zLmdldCgiUm93cyIpLAogICAgICBFbmRPZkJsb2NrOiBwYXJhbXMuZ2V0KCJFbmRPZkJsb2NrIiksCiAgICAgIEJsYWNrSXMxOiBwYXJhbXMuZ2V0KCJCbGFja0lzMSIpCiAgICB9KTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICBjb25zdCBjID0gdGhpcy5jY2l0dEZheERlY29kZXIucmVhZE5leHRDaGFyKCk7CiAgICAgIGlmIChjID09PSAtMSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyAxKTsKICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK10gPSBjOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZmxhdGVfc3RyZWFtLmpzCgoKCmNvbnN0IGNvZGVMZW5Db2RlTWFwID0gbmV3IEludDMyQXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTsKY29uc3QgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoWzB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsIDB4MTAwMGIsIDB4MTAwMGQsIDB4MTAwMGYsIDB4MTAwMTEsIDB4MjAwMTMsIDB4MjAwMTcsIDB4MjAwMWIsIDB4MjAwMWYsIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJdKTsKY29uc3QgZGlzdERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFsweDAwMDAxLCAweDAwMDAyLCAweDAwMDAzLCAweDAwMDA0LCAweDEwMDA1LCAweDEwMDA3LCAweDIwMDA5LCAweDIwMDBkLCAweDMwMDExLCAweDMwMDE5LCAweDQwMDIxLCAweDQwMDMxLCAweDUwMDQxLCAweDUwMDYxLCAweDYwMDgxLCAweDYwMGMxLCAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLCAweGIxMDAxLCAweGIxODAxLCAweGMyMDAxLCAweGMzMDAxLCAweGQ0MDAxLCAweGQ2MDAxXSk7CmNvbnN0IGZpeGVkTGl0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMCwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MCwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMCwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMCwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMCwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOCwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOCwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OCwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOCwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNCwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNCwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNCwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNCwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNCwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjYywgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYywgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5YywgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkYywgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiYywgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmYywgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMiwgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMiwgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMiwgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MiwgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMiwgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMiwgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYSwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYSwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYSwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYSwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYSwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNiwgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNiwgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NiwgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNiwgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNiwgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNiwgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZSwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZSwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZSwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZSwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSwgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMSwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMSwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMSwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMSwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMSwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOSwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OSwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOSwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOSwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOSwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNSwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNSwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NSwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNSwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjZCwgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhZCwgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlZCwgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCwgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiZCwgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmZCwgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMywgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMywgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MywgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMywgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMywgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMywgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYiwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYiwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYiwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YiwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYiwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYiwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNywgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNywgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNywgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNywgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNywgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNywgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZiwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZiwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZiwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZiwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZiwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZl0pLCA5XTsKY29uc3QgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYywgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCwgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCwgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMF0pLCA1XTsKY2xhc3MgRmxhdGVTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICBjb25zdCBjbWYgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgY29uc3QgZmxnID0gc3RyLmdldEJ5dGUoKTsKICAgIGlmIChjbWYgPT09IC0xIHx8IGZsZyA9PT0gLTEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoKGNtZiAmIDB4MGYpICE9PSAweDA4KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgaWYgKCgoY21mIDw8IDgpICsgZmxnKSAlIDMxICE9PSAwKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoZmxnICYgMHgyMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEZESUNUIGJpdCBzZXQgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgdGhpcy5jb2RlU2l6ZSA9IDA7CiAgICB0aGlzLmNvZGVCdWYgPSAwOwogIH0KICBhc3luYyBnZXRJbWFnZURhdGEobGVuZ3RoLCBfZGVjb2Rlck9wdGlvbnMpIHsKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmFzeW5jR2V0Qnl0ZXMoKTsKICAgIHJldHVybiBkYXRhPy5zdWJhcnJheSgwLCBsZW5ndGgpIHx8IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICB9CiAgYXN5bmMgYXN5bmNHZXRCeXRlcygpIHsKICAgIHRoaXMuc3RyLnJlc2V0KCk7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKCk7CiAgICB0cnkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVhZGFibGUsCiAgICAgICAgd3JpdGFibGUKICAgICAgfSA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCJkZWZsYXRlIik7CiAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICBhd2FpdCB3cml0ZXIucmVhZHk7CiAgICAgIHdyaXRlci53cml0ZShieXRlcykudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpOwogICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICBsZXQgdG90YWxMZW5ndGggPSAwOwogICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlYWRhYmxlKSB7CiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgIHRvdGFsTGVuZ3RoICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CiAgICAgICAgZGF0YS5zZXQoY2h1bmssIG9mZnNldCk7CiAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9IGNhdGNoIHsKICAgICAgdGhpcy5zdHIgPSBuZXcgU3RyZWFtKGJ5dGVzLCAyLCBieXRlcy5sZW5ndGgsIHRoaXMuc3RyLmRpY3QpOwogICAgICB0aGlzLnJlc2V0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICBnZXQgaXNBc3luYygpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXRCaXRzKGJpdHMpIHsKICAgIGNvbnN0IHN0ciA9IHRoaXMuc3RyOwogICAgbGV0IGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTsKICAgIGxldCBjb2RlQnVmID0gdGhpcy5jb2RlQnVmOwogICAgbGV0IGI7CiAgICB3aGlsZSAoY29kZVNpemUgPCBiaXRzKSB7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTsKICAgICAgY29kZVNpemUgKz0gODsKICAgIH0KICAgIGIgPSBjb2RlQnVmICYgKDEgPDwgYml0cykgLSAxOwogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBiaXRzOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7CiAgICByZXR1cm4gYjsKICB9CiAgZ2V0Q29kZSh0YWJsZSkgewogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBjb25zdCBjb2RlcyA9IHRhYmxlWzBdOwogICAgY29uc3QgbWF4TGVuID0gdGFibGVbMV07CiAgICBsZXQgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplOwogICAgbGV0IGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7CiAgICBsZXQgYjsKICAgIHdoaWxlIChjb2RlU2l6ZSA8IG1heExlbikgewogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7CiAgICAgIGNvZGVTaXplICs9IDg7CiAgICB9CiAgICBjb25zdCBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgxIDw8IG1heExlbikgLSAxXTsKICAgIGNvbnN0IGNvZGVMZW4gPSBjb2RlID4+IDE2OwogICAgY29uc3QgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7CiAgICBpZiAoY29kZUxlbiA8IDEgfHwgY29kZVNpemUgPCBjb2RlTGVuKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgfQogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC0gY29kZUxlbjsKICAgIHJldHVybiBjb2RlVmFsOwogIH0KICBnZW5lcmF0ZUh1ZmZtYW5UYWJsZShsZW5ndGhzKSB7CiAgICBjb25zdCBuID0gbGVuZ3Rocy5sZW5ndGg7CiAgICBsZXQgbWF4TGVuID0gMDsKICAgIGxldCBpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobGVuZ3Roc1tpXSA+IG1heExlbikgewogICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHNpemUgPSAxIDw8IG1heExlbjsKICAgIGNvbnN0IGNvZGVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7CiAgICBmb3IgKGxldCBsZW4gPSAxLCBjb2RlID0gMCwgc2tpcCA9IDI7IGxlbiA8PSBtYXhMZW47ICsrbGVuLCBjb2RlIDw8PSAxLCBza2lwIDw8PSAxKSB7CiAgICAgIGZvciAobGV0IHZhbCA9IDA7IHZhbCA8IG47ICsrdmFsKSB7CiAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7CiAgICAgICAgICBsZXQgY29kZTIgPSAwOwogICAgICAgICAgbGV0IHQgPSBjb2RlOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgIGNvZGUyID0gY29kZTIgPDwgMSB8IHQgJiAxOwogICAgICAgICAgICB0ID4+PSAxOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChpID0gY29kZTI7IGkgPCBzaXplOyBpICs9IHNraXApIHsKICAgICAgICAgICAgY29kZXNbaV0gPSBsZW4gPDwgMTYgfCB2YWw7CiAgICAgICAgICB9CiAgICAgICAgICArK2NvZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dOwogIH0KICAjZW5kc1N0cmVhbU9uRXJyb3IoZXJyKSB7CiAgICBpbmZvKGVycik7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGxldCBidWZmZXIsIGhkciwgbGVuOwogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICB0cnkgewogICAgICBoZHIgPSB0aGlzLmdldEJpdHMoMyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcihleC5tZXNzYWdlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGhkciAmIDEpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgfQogICAgaGRyID4+PSAxOwogICAgaWYgKGhkciA9PT0gMCkgewogICAgICBsZXQgYjsKICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CiAgICAgICAgdGhpcy4jZW5kc1N0cmVhbU9uRXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBibG9ja0xlbiA9IGI7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBibG9ja0xlbiB8PSBiIDw8IDg7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgY2hlY2sgPSBiOwogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY2hlY2sgfD0gYiA8PCA4OwogICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkJhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7CiAgICAgIHRoaXMuY29kZVNpemUgPSAwOwogICAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aCwKICAgICAgICBlbmQgPSBidWZmZXJMZW5ndGggKyBibG9ja0xlbjsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoZW5kKTsKICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7CiAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkgewogICAgICAgIGlmIChzdHIucGVla0J5dGUoKSA9PT0gLTEpIHsKICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmxvY2sgPSBzdHIuZ2V0Qnl0ZXMoYmxvY2tMZW4pOwogICAgICAgIGJ1ZmZlci5zZXQoYmxvY2ssIGJ1ZmZlckxlbmd0aCk7CiAgICAgICAgaWYgKGJsb2NrLmxlbmd0aCA8IGJsb2NrTGVuKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBsaXRDb2RlVGFibGU7CiAgICBsZXQgZGlzdENvZGVUYWJsZTsKICAgIGlmIChoZHIgPT09IDEpIHsKICAgICAgbGl0Q29kZVRhYmxlID0gZml4ZWRMaXRDb2RlVGFiOwogICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjsKICAgIH0gZWxzZSBpZiAoaGRyID09PSAyKSB7CiAgICAgIGNvbnN0IG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3OwogICAgICBjb25zdCBudW1EaXN0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAxOwogICAgICBjb25zdCBudW1Db2RlTGVuQ29kZXMgPSB0aGlzLmdldEJpdHMoNCkgKyA0OwogICAgICBjb25zdCBjb2RlTGVuQ29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuQ29kZU1hcC5sZW5ndGgpOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVMZW5Db2RlczsgKytpKSB7CiAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTsKICAgICAgfQogICAgICBjb25zdCBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTsKICAgICAgbGVuID0gMDsKICAgICAgaSA9IDA7CiAgICAgIGNvbnN0IGNvZGVzID0gbnVtTGl0Q29kZXMgKyBudW1EaXN0Q29kZXM7CiAgICAgIGNvbnN0IGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMpOwogICAgICBsZXQgYml0c0xlbmd0aCwgYml0c09mZnNldCwgd2hhdDsKICAgICAgd2hpbGUgKGkgPCBjb2RlcykgewogICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmdldENvZGUoY29kZUxlbkNvZGVUYWIpOwogICAgICAgIGlmIChjb2RlID09PSAxNikgewogICAgICAgICAgYml0c0xlbmd0aCA9IDI7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW47CiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxNykgewogICAgICAgICAgYml0c0xlbmd0aCA9IDM7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW4gPSAwOwogICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTgpIHsKICAgICAgICAgIGJpdHNMZW5ndGggPSA3OwogICAgICAgICAgYml0c09mZnNldCA9IDExOwogICAgICAgICAgd2hhdCA9IGxlbiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSBsZW4gPSBjb2RlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0OwogICAgICAgIHdoaWxlIChyZXBlYXRMZW5ndGgtLSA+IDApIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSB3aGF0OwogICAgICAgIH0KICAgICAgfQogICAgICBsaXRDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KDAsIG51bUxpdENvZGVzKSk7CiAgICAgIGRpc3RDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcykpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtIik7CiAgICB9CiAgICBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGxldCBsaW1pdCA9IGJ1ZmZlciA/IGJ1ZmZlci5sZW5ndGggOiAwOwogICAgbGV0IHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgbGV0IGNvZGUxID0gdGhpcy5nZXRDb2RlKGxpdENvZGVUYWJsZSk7CiAgICAgIGlmIChjb2RlMSA8IDI1NikgewogICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KSB7CiAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyAxKTsKICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGNvZGUxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjb2RlMSA9PT0gMjU2KSB7CiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvZGUxIC09IDI1NzsKICAgICAgY29kZTEgPSBsZW5ndGhEZWNvZGVbY29kZTFdOwogICAgICBsZXQgY29kZTIgPSBjb2RlMSA+PiAxNjsKICAgICAgaWYgKGNvZGUyID4gMCkgewogICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTsKICAgICAgfQogICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGNvZGUxID0gdGhpcy5nZXRDb2RlKGRpc3RDb2RlVGFibGUpOwogICAgICBjb2RlMSA9IGRpc3REZWNvZGVbY29kZTFdOwogICAgICBjb2RlMiA9IGNvZGUxID4+IDE2OwogICAgICBpZiAoY29kZTIgPiAwKSB7CiAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpOwogICAgICB9CiAgICAgIGNvbnN0IGRpc3QgPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHsKICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW4pOwogICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgfQogICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxlbjsgKytrLCArK3BvcykgewogICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGRpc3RdOwogICAgICB9CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hcml0aG1ldGljX2RlY29kZXIuanMKY29uc3QgUWVUYWJsZSA9IFt7CiAgcWU6IDB4NTYwMSwKICBubXBzOiAxLAogIG5scHM6IDEsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4MzQwMSwKICBubXBzOiAyLAogIG5scHM6IDYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTgwMSwKICBubXBzOiAzLAogIG5scHM6IDksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiA0LAogIG5scHM6IDEyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA1MjEsCiAgbm1wczogNSwKICBubHBzOiAyOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMjIxLAogIG5tcHM6IDM4LAogIG5scHM6IDMzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogNywKICBubHBzOiA2LAogIHN3aXRjaEZsYWc6IDEKfSwgewogIHFlOiAweDU0MDEsCiAgbm1wczogOCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg0ODAxLAogIG5tcHM6IDksCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxMCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzMDAxLAogIG5tcHM6IDExLAogIG5scHM6IDE3LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDI0MDEsCiAgbm1wczogMTIsCiAgbmxwczogMTgsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAxMywKICBubHBzOiAyMCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxNjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDIxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogMTUsCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4NTQwMSwKICBubXBzOiAxNiwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1MTAxLAogIG5tcHM6IDE3LAogIG5scHM6IDE1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDQ4MDEsCiAgbm1wczogMTgsCiAgbmxwczogMTYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxOSwKICBubHBzOiAxNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzNDAxLAogIG5tcHM6IDIwLAogIG5scHM6IDE4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDMwMDEsCiAgbm1wczogMjEsCiAgbmxwczogMTksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MjgwMSwKICBubXBzOiAyMiwKICBubHBzOiAxOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgyNDAxLAogIG5tcHM6IDIzLAogIG5scHM6IDIwLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDIyMDEsCiAgbm1wczogMjQsCiAgbmxwczogMjEsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAyNSwKICBubHBzOiAyMiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxODAxLAogIG5tcHM6IDI2LAogIG5scHM6IDIzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDE2MDEsCiAgbm1wczogMjcsCiAgbmxwczogMjQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTQwMSwKICBubXBzOiAyOCwKICBubHBzOiAyNSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxMjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDI2LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDExMDEsCiAgbm1wczogMzAsCiAgbmxwczogMjcsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiAzMSwKICBubHBzOiAyOCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwOWMxLAogIG5tcHM6IDMyLAogIG5scHM6IDI5LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA4YTEsCiAgbm1wczogMzMsCiAgbmxwczogMzAsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDUyMSwKICBubXBzOiAzNCwKICBubHBzOiAzMSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwNDQxLAogIG5tcHM6IDM1LAogIG5scHM6IDMyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAyYTEsCiAgbm1wczogMzYsCiAgbmxwczogMzMsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDIyMSwKICBubXBzOiAzNywKICBubHBzOiAzNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMTQxLAogIG5tcHM6IDM4LAogIG5scHM6IDM1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAxMTEsCiAgbm1wczogMzksCiAgbmxwczogMzYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDA4NSwKICBubXBzOiA0MCwKICBubHBzOiAzNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDQ5LAogIG5tcHM6IDQxLAogIG5scHM6IDM4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMjUsCiAgbm1wczogNDIsCiAgbmxwczogMzksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAxNSwKICBubXBzOiA0MywKICBubHBzOiA0MCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDA5LAogIG5tcHM6IDQ0LAogIG5scHM6IDQxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMDUsCiAgbm1wczogNDUsCiAgbmxwczogNDIsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAwMSwKICBubXBzOiA0NSwKICBubHBzOiA0MywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1NjAxLAogIG5tcHM6IDQ2LAogIG5scHM6IDQ2LAogIHN3aXRjaEZsYWc6IDAKfV07CmNsYXNzIEFyaXRobWV0aWNEZWNvZGVyIHsKICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy5icCA9IHN0YXJ0OwogICAgdGhpcy5kYXRhRW5kID0gZW5kOwogICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdOwogICAgdGhpcy5jbG93ID0gMDsKICAgIHRoaXMuYnl0ZUluKCk7CiAgICB0aGlzLmNoaWdoID0gdGhpcy5jaGlnaCA8PCA3ICYgMHhmZmZmIHwgdGhpcy5jbG93ID4+IDkgJiAweDdmOwogICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDcgJiAweGZmZmY7CiAgICB0aGlzLmN0IC09IDc7CiAgICB0aGlzLmEgPSAweDgwMDA7CiAgfQogIGJ5dGVJbigpIHsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICBsZXQgYnAgPSB0aGlzLmJwOwogICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7CiAgICAgIGlmIChkYXRhW2JwICsgMV0gPiAweDhmKSB7CiAgICAgICAgdGhpcy5jbG93ICs9IDB4ZmYwMDsKICAgICAgICB0aGlzLmN0ID0gODsKICAgICAgfSBlbHNlIHsKICAgICAgICBicCsrOwogICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5OwogICAgICAgIHRoaXMuY3QgPSA3OwogICAgICAgIHRoaXMuYnAgPSBicDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYnArKzsKICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDsKICAgICAgdGhpcy5jdCA9IDg7CiAgICAgIHRoaXMuYnAgPSBicDsKICAgIH0KICAgIGlmICh0aGlzLmNsb3cgPiAweGZmZmYpIHsKICAgICAgdGhpcy5jaGlnaCArPSB0aGlzLmNsb3cgPj4gMTY7CiAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7CiAgICB9CiAgfQogIHJlYWRCaXQoY29udGV4dHMsIHBvcykgewogICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLAogICAgICBjeF9tcHMgPSBjb250ZXh0c1twb3NdICYgMTsKICAgIGNvbnN0IHFlVGFibGVJY3ggPSBRZVRhYmxlW2N4X2luZGV4XTsKICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTsKICAgIGxldCBkOwogICAgbGV0IGEgPSB0aGlzLmEgLSBxZUljeDsKICAgIGlmICh0aGlzLmNoaWdoIDwgcWVJY3gpIHsKICAgICAgaWYgKGEgPCBxZUljeCkgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gY3hfbXBzOwogICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOwogICAgICB9IGVsc2UgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gMSBeIGN4X21wczsKICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7CiAgICAgICAgICBjeF9tcHMgPSBkOwogICAgICAgIH0KICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jaGlnaCAtPSBxZUljeDsKICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkgewogICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgcmV0dXJuIGN4X21wczsKICAgICAgfQogICAgICBpZiAoYSA8IHFlSWN4KSB7CiAgICAgICAgZCA9IDEgXiBjeF9tcHM7CiAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgewogICAgICAgICAgY3hfbXBzID0gZDsKICAgICAgICB9CiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZCA9IGN4X21wczsKICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wczsKICAgICAgfQogICAgfQogICAgZG8gewogICAgICBpZiAodGhpcy5jdCA9PT0gMCkgewogICAgICAgIHRoaXMuYnl0ZUluKCk7CiAgICAgIH0KICAgICAgYSA8PD0gMTsKICAgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgMSAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiAxNSAmIDE7CiAgICAgIHRoaXMuY2xvdyA9IHRoaXMuY2xvdyA8PCAxICYgMHhmZmZmOwogICAgICB0aGlzLmN0LS07CiAgICB9IHdoaWxlICgoYSAmIDB4ODAwMCkgPT09IDApOwogICAgdGhpcy5hID0gYTsKICAgIGNvbnRleHRzW3Bvc10gPSBjeF9pbmRleCA8PCAxIHwgY3hfbXBzOwogICAgcmV0dXJuIGQ7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qYmlnMi5qcwoKCgoKY2xhc3MgSmJpZzJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSmJpZzJFcnJvciIpOwogIH0KfQpjbGFzcyBDb250ZXh0Q2FjaGUgewogIGdldENvbnRleHRzKGlkKSB7CiAgICBpZiAoaWQgaW4gdGhpcykgewogICAgICByZXR1cm4gdGhpc1tpZF07CiAgICB9CiAgICByZXR1cm4gdGhpc1tpZF0gPSBuZXcgSW50OEFycmF5KDEgPDwgMTYpOwogIH0KfQpjbGFzcyBEZWNvZGluZ0NvbnRleHQgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICB9CiAgZ2V0IGRlY29kZXIoKSB7CiAgICBjb25zdCBkZWNvZGVyID0gbmV3IEFyaXRobWV0aWNEZWNvZGVyKHRoaXMuZGF0YSwgdGhpcy5zdGFydCwgdGhpcy5lbmQpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZGVjb2RlciIsIGRlY29kZXIpOwogIH0KICBnZXQgY29udGV4dENhY2hlKCkgewogICAgY29uc3QgY2FjaGUgPSBuZXcgQ29udGV4dENhY2hlKCk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjb250ZXh0Q2FjaGUiLCBjYWNoZSk7CiAgfQp9CmZ1bmN0aW9uIGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBwcm9jZWR1cmUsIGRlY29kZXIpIHsKICBjb25zdCBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpOwogIGxldCBwcmV2ID0gMTsKICBmdW5jdGlvbiByZWFkQml0cyhsZW5ndGgpIHsKICAgIGxldCB2ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKICAgICAgcHJldiA9IHByZXYgPCAyNTYgPyBwcmV2IDw8IDEgfCBiaXQgOiAocHJldiA8PCAxIHwgYml0KSAmIDUxMSB8IDI1NjsKICAgICAgdiA9IHYgPDwgMSB8IGJpdDsKICAgIH0KICAgIHJldHVybiB2ID4+PiAwOwogIH0KICBjb25zdCBzaWduID0gcmVhZEJpdHMoMSk7CiAgY29uc3QgdmFsdWUgPSByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMzIpICsgNDQzNiA6IHJlYWRCaXRzKDEyKSArIDM0MCA6IHJlYWRCaXRzKDgpICsgODQgOiByZWFkQml0cyg2KSArIDIwIDogcmVhZEJpdHMoNCkgKyA0IDogcmVhZEJpdHMoMik7CiAgbGV0IHNpZ25lZFZhbHVlOwogIGlmIChzaWduID09PSAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IHZhbHVlOwogIH0gZWxzZSBpZiAodmFsdWUgPiAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IC12YWx1ZTsKICB9CiAgaWYgKHNpZ25lZFZhbHVlID49IE1JTl9JTlRfMzIgJiYgc2lnbmVkVmFsdWUgPD0gTUFYX0lOVF8zMikgewogICAgcmV0dXJuIHNpZ25lZFZhbHVlOwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkgewogIGNvbnN0IGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKCJJQUlEIik7CiAgbGV0IHByZXYgPSAxOwogIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpOwogICAgcHJldiA9IHByZXYgPDwgMSB8IGJpdDsKICB9CiAgaWYgKGNvZGVMZW5ndGggPCAzMSkgewogICAgcmV0dXJuIHByZXYgJiAoMSA8PCBjb2RlTGVuZ3RoKSAtIDE7CiAgfQogIHJldHVybiBwcmV2ICYgMHg3ZmZmZmZmZjsKfQpjb25zdCBTZWdtZW50VHlwZXMgPSBbIlN5bWJvbERpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVUZXh0UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYXR0ZXJuRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYWdlSW5mb3JtYXRpb24iLCAiRW5kT2ZQYWdlIiwgIkVuZE9mU3RyaXBlIiwgIkVuZE9mRmlsZSIsICJQcm9maWxlcyIsICJUYWJsZXMiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiRXh0ZW5zaW9uIl07CmNvbnN0IENvZGluZ1RlbXBsYXRlcyA9IFtbewogIHg6IC0xLAogIHk6IC0yCn0sIHsKICB4OiAwLAogIHk6IC0yCn0sIHsKICB4OiAxLAogIHk6IC0yCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IDIsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV0sIFt7CiAgeDogLTEsCiAgeTogLTIKfSwgewogIHg6IDAsCiAgeTogLTIKfSwgewogIHg6IDEsCiAgeTogLTIKfSwgewogIHg6IDIsCiAgeTogLTIKfSwgewogIHg6IC0yLAogIHk6IC0xCn0sIHsKICB4OiAtMSwKICB5OiAtMQp9LCB7CiAgeDogMCwKICB5OiAtMQp9LCB7CiAgeDogMSwKICB5OiAtMQp9LCB7CiAgeDogMiwKICB5OiAtMQp9LCB7CiAgeDogLTMsCiAgeTogMAp9LCB7CiAgeDogLTIsCiAgeTogMAp9LCB7CiAgeDogLTEsCiAgeTogMAp9XSwgW3sKICB4OiAtMSwKICB5OiAtMgp9LCB7CiAgeDogMCwKICB5OiAtMgp9LCB7CiAgeDogMSwKICB5OiAtMgp9LCB7CiAgeDogLTIsCiAgeTogLTEKfSwgewogIHg6IC0xLAogIHk6IC0xCn0sIHsKICB4OiAwLAogIHk6IC0xCn0sIHsKICB4OiAxLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAwCn0sIHsKICB4OiAtMSwKICB5OiAwCn1dLCBbewogIHg6IC0zLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV1dOwpjb25zdCBSZWZpbmVtZW50VGVtcGxhdGVzID0gW3sKICBjb2Rpbmc6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9XSwKICByZWZlcmVuY2U6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAwLAogICAgeTogMAogIH0sIHsKICAgIHg6IDEsCiAgICB5OiAwCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAxCiAgfSwgewogICAgeDogMCwKICAgIHk6IDEKICB9LCB7CiAgICB4OiAxLAogICAgeTogMQogIH1dCn0sIHsKICBjb2Rpbmc6IFt7CiAgICB4OiAtMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfV0sCiAgcmVmZXJlbmNlOiBbewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfSwgewogICAgeDogMCwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAxLAogICAgeTogMAogIH0sIHsKICAgIHg6IDAsCiAgICB5OiAxCiAgfSwgewogICAgeDogMSwKICAgIHk6IDEKICB9XQp9XTsKY29uc3QgUmV1c2VkQ29udGV4dHMgPSBbMHg5YjI1LCAweDA3OTUsIDB4MDBlNSwgMHgwMTk1XTsKY29uc3QgUmVmaW5lbWVudFJldXNlZENvbnRleHRzID0gWzB4MDAyMCwgMHgwMDA4XTsKZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdCIik7CiAgY29uc3QgYml0bWFwID0gW107CiAgbGV0IGNvbnRleHRMYWJlbCwgaSwgaiwgcGl4ZWwsIHJvdywgcm93MSwgcm93MjsKICBjb25zdCBPTERfUElYRUxfTUFTSyA9IDB4N2JmNzsKICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIHJvdyA9IGJpdG1hcFtpXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIHJvdzEgPSBpIDwgMSA/IHJvdyA6IGJpdG1hcFtpIC0gMV07CiAgICByb3cyID0gaSA8IDIgPyByb3cgOiBiaXRtYXBbaSAtIDJdOwogICAgY29udGV4dExhYmVsID0gcm93MlswXSA8PCAxMyB8IHJvdzJbMV0gPDwgMTIgfCByb3cyWzJdIDw8IDExIHwgcm93MVswXSA8PCA3IHwgcm93MVsxXSA8PCA2IHwgcm93MVsyXSA8PCA1IHwgcm93MVszXSA8PCA0OwogICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKICAgICAgcm93W2pdID0gcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CiAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgJiBPTERfUElYRUxfTUFTSykgPDwgMSB8IChqICsgMyA8IHdpZHRoID8gcm93MltqICsgM10gPDwgMTEgOiAwKSB8IChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHwgcGl4ZWw7CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlQml0bWFwKG1tciwgd2lkdGgsIGhlaWdodCwgdGVtcGxhdGVJbmRleCwgcHJlZGljdGlvbiwgc2tpcCwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGlmIChtbXIpIHsKICAgIGNvbnN0IGlucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKICAgIHJldHVybiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKICB9CiAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDAgJiYgIXNraXAgJiYgIXByZWRpY3Rpb24gJiYgYXQubGVuZ3RoID09PSA0ICYmIGF0WzBdLnggPT09IDMgJiYgYXRbMF0ueSA9PT0gLTEgJiYgYXRbMV0ueCA9PT0gLTMgJiYgYXRbMV0ueSA9PT0gLTEgJiYgYXRbMl0ueCA9PT0gMiAmJiBhdFsyXS55ID09PSAtMiAmJiBhdFszXS54ID09PSAtMiAmJiBhdFszXS55ID09PSAtMikgewogICAgcmV0dXJuIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpOwogIH0KICBjb25zdCB1c2Vza2lwID0gISFza2lwOwogIGNvbnN0IHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7CiAgdGVtcGxhdGUuc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7CiAgY29uc3QgdGVtcGxhdGVMZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgdGVtcGxhdGVYID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMgPSBbXTsKICBsZXQgcmV1c2VNYXNrID0gMCwKICAgIG1pblggPSAwLAogICAgbWF4WCA9IDAsCiAgICBtaW5ZID0gMDsKICBsZXQgYywgazsKICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDsKICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7CiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7CiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7CiAgICBpZiAoayA8IHRlbXBsYXRlTGVuZ3RoIC0gMSAmJiB0ZW1wbGF0ZVtrXS55ID09PSB0ZW1wbGF0ZVtrICsgMV0ueSAmJiB0ZW1wbGF0ZVtrXS54ID09PSB0ZW1wbGF0ZVtrICsgMV0ueCAtIDEpIHsKICAgICAgcmV1c2VNYXNrIHw9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKICAgIH0gZWxzZSB7CiAgICAgIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLnB1c2goayk7CiAgICB9CiAgfQogIGNvbnN0IGNoYW5naW5nRW50cmllc0xlbmd0aCA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLmxlbmd0aDsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlQml0ID0gbmV3IFVpbnQxNkFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CiAgZm9yIChjID0gMDsgYyA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgYysrKSB7CiAgICBrID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXNbY107CiAgICBjaGFuZ2luZ1RlbXBsYXRlWFtjXSA9IHRlbXBsYXRlW2tdLng7CiAgICBjaGFuZ2luZ1RlbXBsYXRlWVtjXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBjaGFuZ2luZ1RlbXBsYXRlQml0W2NdID0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOwogIH0KICBjb25zdCBzYmJfbGVmdCA9IC1taW5YOwogIGNvbnN0IHNiYl90b3AgPSAtbWluWTsKICBjb25zdCBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7CiAgY29uc3QgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CiAgbGV0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOwogIGxldCBsdHAgPSAwLAogICAgaiwKICAgIGkwLAogICAgajAsCiAgICBjb250ZXh0TGFiZWwgPSAwLAogICAgYml0LAogICAgc2hpZnQ7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgaWYgKHByZWRpY3Rpb24pIHsKICAgICAgY29uc3Qgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKICAgICAgbHRwIF49IHNsdHA7CiAgICAgIGlmIChsdHApIHsKICAgICAgICBiaXRtYXAucHVzaChyb3cpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICByb3cgPSBuZXcgVWludDhBcnJheShyb3cpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHsKICAgICAgICByb3dbal0gPSAwOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChqID49IHNiYl9sZWZ0ICYmIGogPCBzYmJfcmlnaHQgJiYgaSA+PSBzYmJfdG9wKSB7CiAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgJiByZXVzZU1hc2s7CiAgICAgICAgZm9yIChrID0gMDsgayA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgaysrKSB7CiAgICAgICAgICBpMCA9IGkgKyBjaGFuZ2luZ1RlbXBsYXRlWVtrXTsKICAgICAgICAgIGowID0gaiArIGNoYW5naW5nVGVtcGxhdGVYW2tdOwogICAgICAgICAgYml0ID0gYml0bWFwW2kwXVtqMF07CiAgICAgICAgICBpZiAoYml0KSB7CiAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107CiAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRleHRMYWJlbCA9IDA7CiAgICAgICAgc2hpZnQgPSB0ZW1wbGF0ZUxlbmd0aCAtIDE7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHsKICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTsKICAgICAgICAgIGlmIChqMCA+PSAwICYmIGowIDwgd2lkdGgpIHsKICAgICAgICAgICAgaTAgPSBpICsgdGVtcGxhdGVZW2tdOwogICAgICAgICAgICBpZiAoaTAgPj0gMCkgewogICAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOwogICAgICAgICAgICAgIGlmIChiaXQpIHsKICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVSZWZpbmVtZW50KHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHJlZmVyZW5jZUJpdG1hcCwgb2Zmc2V0WCwgb2Zmc2V0WSwgcHJlZGljdGlvbiwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGxldCBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTsKICB9CiAgY29uc3QgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgY29kaW5nVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IGNvZGluZ1RlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKICBsZXQgazsKICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDsKICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7CiAgfQogIGxldCByZWZlcmVuY2VUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0ucmVmZXJlbmNlOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICByZWZlcmVuY2VUZW1wbGF0ZSA9IHJlZmVyZW5jZVRlbXBsYXRlLmNvbmNhdChbYXRbMV1dKTsKICB9CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGggPSByZWZlcmVuY2VUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IHJlZmVyZW5jZVRlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTsKICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgcmVmZXJlbmNlVGVtcGxhdGVYW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueDsKICAgIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLnk7CiAgfQogIGNvbnN0IHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDsKICBjb25zdCByZWZlcmVuY2VIZWlnaHQgPSByZWZlcmVuY2VCaXRtYXAubGVuZ3RoOwogIGNvbnN0IHBzZXVkb1BpeGVsQ29udGV4dCA9IFJlZmluZW1lbnRSZXVzZWRDb250ZXh0c1t0ZW1wbGF0ZUluZGV4XTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpOwogIGxldCBsdHAgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGlmIChwcmVkaWN0aW9uKSB7CiAgICAgIGNvbnN0IHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CiAgICAgIGx0cCBePSBzbHRwOwogICAgICBpZiAobHRwKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICB9CiAgICB9CiAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICBiaXRtYXAucHVzaChyb3cpOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGxldCBpMCwgajA7CiAgICAgIGxldCBjb250ZXh0TGFiZWwgPSAwOwogICAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgICAgIGkwID0gaSArIGNvZGluZ1RlbXBsYXRlWVtrXTsKICAgICAgICBqMCA9IGogKyBjb2RpbmdUZW1wbGF0ZVhba107CiAgICAgICAgaWYgKGkwIDwgMCB8fCBqMCA8IDAgfHwgajAgPj0gd2lkdGgpIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCBiaXRtYXBbaTBdW2owXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgICAgICBpMCA9IGkgKyByZWZlcmVuY2VUZW1wbGF0ZVlba10gLSBvZmZzZXRZOwogICAgICAgIGowID0gaiArIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSAtIG9mZnNldFg7CiAgICAgICAgaWYgKGkwIDwgMCB8fCBpMCA+PSByZWZlcmVuY2VIZWlnaHQgfHwgajAgPCAwIHx8IGowID49IHJlZmVyZW5jZVdpZHRoKSB7CiAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgcmVmZXJlbmNlQml0bWFwW2kwXVtqMF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGh1ZmZtYW4sIHJlZmluZW1lbnQsIHN5bWJvbHMsIG51bWJlck9mTmV3U3ltYm9scywgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIHRlbXBsYXRlSW5kZXgsIGF0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCkgewogIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBjb25zdCBuZXdTeW1ib2xzID0gW107CiAgbGV0IGN1cnJlbnRIZWlnaHQgPSAwOwogIGxldCBzeW1ib2xDb2RlTGVuZ3RoID0gbG9nMihzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9scyk7CiAgY29uc3QgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOwogIGNvbnN0IGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7CiAgbGV0IHRhYmxlQjEsIHN5bWJvbFdpZHRoczsKICBpZiAoaHVmZm1hbikgewogICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgICBzeW1ib2xXaWR0aHMgPSBbXTsKICAgIHN5bWJvbENvZGVMZW5ndGggPSBNYXRoLm1heChzeW1ib2xDb2RlTGVuZ3RoLCAxKTsKICB9CiAgd2hpbGUgKG5ld1N5bWJvbHMubGVuZ3RoIDwgbnVtYmVyT2ZOZXdTeW1ib2xzKSB7CiAgICBjb25zdCBkZWx0YUhlaWdodCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFIZWlnaHQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBREgiLCBkZWNvZGVyKTsKICAgIGN1cnJlbnRIZWlnaHQgKz0gZGVsdGFIZWlnaHQ7CiAgICBsZXQgY3VycmVudFdpZHRoID0gMCwKICAgICAgdG90YWxXaWR0aCA9IDA7CiAgICBjb25zdCBmaXJzdFN5bWJvbCA9IGh1ZmZtYW4gPyBzeW1ib2xXaWR0aHMubGVuZ3RoIDogMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IGRlbHRhV2lkdGggPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhV2lkdGguZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFciLCBkZWNvZGVyKTsKICAgICAgaWYgKGRlbHRhV2lkdGggPT09IG51bGwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDsKICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7CiAgICAgIGxldCBiaXRtYXA7CiAgICAgIGlmIChyZWZpbmVtZW50KSB7CiAgICAgICAgY29uc3QgbnVtYmVyT2ZJbnN0YW5jZXMgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBQUkiLCBkZWNvZGVyKTsKICAgICAgICBpZiAobnVtYmVyT2ZJbnN0YW5jZXMgPiAxKSB7CiAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgMCwgbnVtYmVyT2ZJbnN0YW5jZXMsIDEsIHN5bWJvbHMuY29uY2F0KG5ld1N5bWJvbHMpLCBzeW1ib2xDb2RlTGVuZ3RoLCAwLCAwLCAxLCAwLCBodWZmbWFuVGFibGVzLCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIDAsIGh1ZmZtYW5JbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHN5bWJvbElkID0gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOwogICAgICAgICAgY29uc3QgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOwogICAgICAgICAgY29uc3QgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOwogICAgICAgICAgY29uc3Qgc3ltYm9sID0gc3ltYm9sSWQgPCBzeW1ib2xzLmxlbmd0aCA/IHN5bWJvbHNbc3ltYm9sSWRdIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTsKICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgc3ltYm9sLCByZHgsIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7CiAgICAgIH0gZWxzZSBpZiAoaHVmZm1hbikgewogICAgICAgIHN5bWJvbFdpZHRocy5wdXNoKGN1cnJlbnRXaWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYml0bWFwID0gZGVjb2RlQml0bWFwKGZhbHNlLCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHRlbXBsYXRlSW5kZXgsIGZhbHNlLCBudWxsLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKICAgICAgfQogICAgfQogICAgaWYgKGh1ZmZtYW4gJiYgIXJlZmluZW1lbnQpIHsKICAgICAgY29uc3QgYml0bWFwU2l6ZSA9IGh1ZmZtYW5UYWJsZXMudGFibGVCaXRtYXBTaXplLmRlY29kZShodWZmbWFuSW5wdXQpOwogICAgICBodWZmbWFuSW5wdXQuYnl0ZUFsaWduKCk7CiAgICAgIGxldCBjb2xsZWN0aXZlQml0bWFwOwogICAgICBpZiAoYml0bWFwU2l6ZSA9PT0gMCkgewogICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSByZWFkVW5jb21wcmVzc2VkQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kOwogICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7CiAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDsKICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCwgZmFsc2UpOwogICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBvcmlnaW5hbEVuZDsKICAgICAgICBodWZmbWFuSW5wdXQucG9zaXRpb24gPSBiaXRtYXBFbmQ7CiAgICAgIH0KICAgICAgY29uc3QgbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCA9IHN5bWJvbFdpZHRocy5sZW5ndGg7CiAgICAgIGlmIChmaXJzdFN5bWJvbCA9PT0gbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCAtIDEpIHsKICAgICAgICBuZXdTeW1ib2xzLnB1c2goY29sbGVjdGl2ZUJpdG1hcCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGksCiAgICAgICAgICB5LAogICAgICAgICAgeE1pbiA9IDAsCiAgICAgICAgICB4TWF4LAogICAgICAgICAgYml0bWFwV2lkdGgsCiAgICAgICAgICBzeW1ib2xCaXRtYXA7CiAgICAgICAgZm9yIChpID0gZmlyc3RTeW1ib2w7IGkgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBpKyspIHsKICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW2ldOwogICAgICAgICAgeE1heCA9IHhNaW4gKyBiaXRtYXBXaWR0aDsKICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IFtdOwogICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykgewogICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKICAgICAgICAgIH0KICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChzeW1ib2xCaXRtYXApOwogICAgICAgICAgeE1pbiA9IHhNYXg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IGV4cG9ydGVkU3ltYm9scyA9IFtdLAogICAgZmxhZ3MgPSBbXTsKICBsZXQgY3VycmVudEZsYWcgPSBmYWxzZSwKICAgIGksCiAgICBpaTsKICBjb25zdCB0b3RhbFN5bWJvbHNMZW5ndGggPSBzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9sczsKICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgdG90YWxTeW1ib2xzTGVuZ3RoKSB7CiAgICBsZXQgcnVuTGVuZ3RoID0gaHVmZm1hbiA/IHRhYmxlQjEuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRVgiLCBkZWNvZGVyKTsKICAgIHdoaWxlIChydW5MZW5ndGgtLSkgewogICAgICBmbGFncy5wdXNoKGN1cnJlbnRGbGFnKTsKICAgIH0KICAgIGN1cnJlbnRGbGFnID0gIWN1cnJlbnRGbGFnOwogIH0KICBmb3IgKGkgPSAwLCBpaSA9IHN5bWJvbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKGZsYWdzW2ldKSB7CiAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKHN5bWJvbHNbaV0pOwogICAgfQogIH0KICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlck9mTmV3U3ltYm9sczsgaSsrLCBqKyspIHsKICAgIGlmIChmbGFnc1tpXSkgewogICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChuZXdTeW1ib2xzW2pdKTsKICAgIH0KICB9CiAgcmV0dXJuIGV4cG9ydGVkU3ltYm9sczsKfQpmdW5jdGlvbiBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcywgc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHRyYW5zcG9zZWQsIGRzT2Zmc2V0LCByZWZlcmVuY2VDb3JuZXIsIGNvbWJpbmF0aW9uT3BlcmF0b3IsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgbG9nU3RyaXBTaXplLCBodWZmbWFuSW5wdXQpIHsKICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBjb25zdCBiaXRtYXAgPSBbXTsKICBsZXQgaSwgcm93OwogIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CiAgICAgIHJvdy5maWxsKGRlZmF1bHRQaXhlbFZhbHVlKTsKICAgIH0KICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgfQogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOwogIGxldCBzdHJpcFQgPSBodWZmbWFuID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiAtZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CiAgbGV0IGZpcnN0UyA9IDA7CiAgaSA9IDA7CiAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykgewogICAgY29uc3QgZGVsdGFUID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFQiLCBkZWNvZGVyKTsKICAgIHN0cmlwVCArPSBkZWx0YVQ7CiAgICBjb25zdCBkZWx0YUZpcnN0UyA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUZTIiwgZGVjb2Rlcik7CiAgICBmaXJzdFMgKz0gZGVsdGFGaXJzdFM7CiAgICBsZXQgY3VycmVudFMgPSBmaXJzdFM7CiAgICBkbyB7CiAgICAgIGxldCBjdXJyZW50VCA9IDA7CiAgICAgIGlmIChzdHJpcFNpemUgPiAxKSB7CiAgICAgICAgY3VycmVudFQgPSBodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBSVQiLCBkZWNvZGVyKTsKICAgICAgfQogICAgICBjb25zdCB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7CiAgICAgIGNvbnN0IHN5bWJvbElkID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMuc3ltYm9sSURUYWJsZS5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTsKICAgICAgY29uc3QgYXBwbHlSZWZpbmVtZW50ID0gcmVmaW5lbWVudCAmJiAoaHVmZm1hbiA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkkiLCBkZWNvZGVyKSk7CiAgICAgIGxldCBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdOwogICAgICBsZXQgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoOwogICAgICBsZXQgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDsKICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkgewogICAgICAgIGNvbnN0IHJkdyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFciLCBkZWNvZGVyKTsKICAgICAgICBjb25zdCByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRIIiwgZGVjb2Rlcik7CiAgICAgICAgY29uc3QgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOwogICAgICAgIGNvbnN0IHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFkiLCBkZWNvZGVyKTsKICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7CiAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDsKICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KHN5bWJvbFdpZHRoLCBzeW1ib2xIZWlnaHQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCBzeW1ib2xCaXRtYXAsIChyZHcgPj4gMSkgKyByZHgsIChyZGggPj4gMSkgKyByZHksIGZhbHNlLCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCk7CiAgICAgIH0KICAgICAgbGV0IGluY3JlbWVudCA9IDA7CiAgICAgIGlmICghdHJhbnNwb3NlZCkgewogICAgICAgIGlmIChyZWZlcmVuY2VDb3JuZXIgPiAxKSB7CiAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xXaWR0aCAtIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluY3JlbWVudCA9IHN5bWJvbFdpZHRoIC0gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIShyZWZlcmVuY2VDb3JuZXIgJiAxKSkgewogICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbEhlaWdodCAtIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5jcmVtZW50ID0gc3ltYm9sSGVpZ2h0IC0gMTsKICAgICAgfQogICAgICBjb25zdCBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpOwogICAgICBjb25zdCBvZmZzZXRTID0gY3VycmVudFMgLSAocmVmZXJlbmNlQ29ybmVyICYgMiA/IHN5bWJvbFdpZHRoIC0gMSA6IDApOwogICAgICBsZXQgczIsIHQyLCBzeW1ib2xSb3c7CiAgICAgIGlmICh0cmFuc3Bvc2VkKSB7CiAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sSGVpZ2h0OyBzMisrKSB7CiAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0UyArIHMyXTsKICAgICAgICAgIGlmICghcm93KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3MyXTsKICAgICAgICAgIGNvbnN0IG1heFdpZHRoID0gTWF0aC5taW4od2lkdGggLSBvZmZzZXRULCBzeW1ib2xXaWR0aCk7CiAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSB8PSBzeW1ib2xSb3dbdDJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSBePSBzeW1ib2xSb3dbdDJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykgewogICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07CiAgICAgICAgICBpZiAoIXJvdykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07CiAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSBePSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkrKzsKICAgICAgY29uc3QgZGVsdGFTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFMiLCBkZWNvZGVyKTsKICAgICAgaWYgKGRlbHRhUyA9PT0gbnVsbCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGN1cnJlbnRTICs9IGluY3JlbWVudCArIGRlbHRhUyArIGRzT2Zmc2V0OwogICAgfSB3aGlsZSAodHJ1ZSk7CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlUGF0dGVybkRpY3Rpb25hcnkobW1yLCBwYXR0ZXJuV2lkdGgsIHBhdHRlcm5IZWlnaHQsIG1heFBhdHRlcm5JbmRleCwgdGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IGF0ID0gW107CiAgaWYgKCFtbXIpIHsKICAgIGF0LnB1c2goewogICAgICB4OiAtcGF0dGVybldpZHRoLAogICAgICB5OiAwCiAgICB9KTsKICAgIGlmICh0ZW1wbGF0ZSA9PT0gMCkgewogICAgICBhdC5wdXNoKHsKICAgICAgICB4OiAtMywKICAgICAgICB5OiAtMQogICAgICB9LCB7CiAgICAgICAgeDogMiwKICAgICAgICB5OiAtMgogICAgICB9LCB7CiAgICAgICAgeDogLTIsCiAgICAgICAgeTogLTIKICAgICAgfSk7CiAgICB9CiAgfQogIGNvbnN0IGNvbGxlY3RpdmVXaWR0aCA9IChtYXhQYXR0ZXJuSW5kZXggKyAxKSAqIHBhdHRlcm5XaWR0aDsKICBjb25zdCBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlQml0bWFwKG1tciwgY29sbGVjdGl2ZVdpZHRoLCBwYXR0ZXJuSGVpZ2h0LCB0ZW1wbGF0ZSwgZmFsc2UsIG51bGwsIGF0LCBkZWNvZGluZ0NvbnRleHQpOwogIGNvbnN0IHBhdHRlcm5zID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4UGF0dGVybkluZGV4OyBpKyspIHsKICAgIGNvbnN0IHBhdHRlcm5CaXRtYXAgPSBbXTsKICAgIGNvbnN0IHhNaW4gPSBwYXR0ZXJuV2lkdGggKiBpOwogICAgY29uc3QgeE1heCA9IHhNaW4gKyBwYXR0ZXJuV2lkdGg7CiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHBhdHRlcm5IZWlnaHQ7IHkrKykgewogICAgICBwYXR0ZXJuQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CiAgICB9CiAgICBwYXR0ZXJucy5wdXNoKHBhdHRlcm5CaXRtYXApOwogIH0KICByZXR1cm4gcGF0dGVybnM7Cn0KZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24obW1yLCBwYXR0ZXJucywgdGVtcGxhdGUsIHJlZ2lvbldpZHRoLCByZWdpb25IZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBlbmFibGVTa2lwLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRPZmZzZXRYLCBncmlkT2Zmc2V0WSwgZ3JpZFZlY3RvclgsIGdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpIHsKICBjb25zdCBza2lwID0gbnVsbDsKICBpZiAoZW5hYmxlU2tpcCkgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNraXAgaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBpZiAoY29tYmluYXRpb25PcGVyYXRvciAhPT0gMCkgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICIke2NvbWJpbmF0aW9uT3BlcmF0b3J9IiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvbmApOwogIH0KICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTsKICBsZXQgaSwgaiwgcm93OwogIGZvciAoaSA9IDA7IGkgPCByZWdpb25IZWlnaHQ7IGkrKykgewogICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocmVnaW9uV2lkdGgpOwogICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CiAgICAgIHJvdy5maWxsKGRlZmF1bHRQaXhlbFZhbHVlKTsKICAgIH0KICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7CiAgfQogIGNvbnN0IG51bWJlck9mUGF0dGVybnMgPSBwYXR0ZXJucy5sZW5ndGg7CiAgY29uc3QgcGF0dGVybjAgPSBwYXR0ZXJuc1swXTsKICBjb25zdCBwYXR0ZXJuV2lkdGggPSBwYXR0ZXJuMFswXS5sZW5ndGgsCiAgICBwYXR0ZXJuSGVpZ2h0ID0gcGF0dGVybjAubGVuZ3RoOwogIGNvbnN0IGJpdHNQZXJWYWx1ZSA9IGxvZzIobnVtYmVyT2ZQYXR0ZXJucyk7CiAgY29uc3QgYXQgPSBbXTsKICBpZiAoIW1tcikgewogICAgYXQucHVzaCh7CiAgICAgIHg6IHRlbXBsYXRlIDw9IDEgPyAzIDogMiwKICAgICAgeTogLTEKICAgIH0pOwogICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CiAgICAgIGF0LnB1c2goewogICAgICAgIHg6IC0zLAogICAgICAgIHk6IC0xCiAgICAgIH0sIHsKICAgICAgICB4OiAyLAogICAgICAgIHk6IC0yCiAgICAgIH0sIHsKICAgICAgICB4OiAtMiwKICAgICAgICB5OiAtMgogICAgICB9KTsKICAgIH0KICB9CiAgY29uc3QgZ3JheVNjYWxlQml0UGxhbmVzID0gW107CiAgbGV0IG1tcklucHV0LCBiaXRtYXA7CiAgaWYgKG1tcikgewogICAgbW1ySW5wdXQgPSBuZXcgUmVhZGVyKGRlY29kaW5nQ29udGV4dC5kYXRhLCBkZWNvZGluZ0NvbnRleHQuc3RhcnQsIGRlY29kaW5nQ29udGV4dC5lbmQpOwogIH0KICBmb3IgKGkgPSBiaXRzUGVyVmFsdWUgLSAxOyBpID49IDA7IGktLSkgewogICAgaWYgKG1tcikgewogICAgICBiaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAobW1ySW5wdXQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgIH0KICAgIGdyYXlTY2FsZUJpdFBsYW5lc1tpXSA9IGJpdG1hcDsKICB9CiAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdzsKICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7CiAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHsKICAgICAgYml0ID0gMDsKICAgICAgcGF0dGVybkluZGV4ID0gMDsKICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICBiaXQgXj0gZ3JheVNjYWxlQml0UGxhbmVzW2pdW21nXVtuZ107CiAgICAgICAgcGF0dGVybkluZGV4IHw9IGJpdCA8PCBqOwogICAgICB9CiAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdOwogICAgICB4ID0gZ3JpZE9mZnNldFggKyBtZyAqIGdyaWRWZWN0b3JZICsgbmcgKiBncmlkVmVjdG9yWCA+PiA4OwogICAgICB5ID0gZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSA+PiA4OwogICAgICBpZiAoeCA+PSAwICYmIHggKyBwYXR0ZXJuV2lkdGggPD0gcmVnaW9uV2lkdGggJiYgeSA+PSAwICYmIHkgKyBwYXR0ZXJuSGVpZ2h0IDw9IHJlZ2lvbkhlaWdodCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07CiAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykgewogICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTsKICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTsKICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CiAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajsKICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHsKICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVnaW9uQml0bWFwOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHN0YXJ0KSB7CiAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHt9OwogIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCk7CiAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0ICsgNF07CiAgY29uc3Qgc2VnbWVudFR5cGUgPSBmbGFncyAmIDB4M2Y7CiAgaWYgKCFTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdKSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIgKyBzZWdtZW50VHlwZSk7CiAgfQogIHNlZ21lbnRIZWFkZXIudHlwZSA9IHNlZ21lbnRUeXBlOwogIHNlZ21lbnRIZWFkZXIudHlwZU5hbWUgPSBTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdOwogIHNlZ21lbnRIZWFkZXIuZGVmZXJyZWROb25SZXRhaW4gPSAhIShmbGFncyAmIDB4ODApOwogIGNvbnN0IHBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSA9ICEhKGZsYWdzICYgMHg0MCk7CiAgY29uc3QgcmVmZXJyZWRGbGFncyA9IGRhdGFbc3RhcnQgKyA1XTsKICBsZXQgcmVmZXJyZWRUb0NvdW50ID0gcmVmZXJyZWRGbGFncyA+PiA1ICYgNzsKICBjb25zdCByZXRhaW5CaXRzID0gW3JlZmVycmVkRmxhZ3MgJiAzMV07CiAgbGV0IHBvc2l0aW9uID0gc3RhcnQgKyA2OwogIGlmIChyZWZlcnJlZEZsYWdzID09PSA3KSB7CiAgICByZWZlcnJlZFRvQ291bnQgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uIC0gMSkgJiAweDFmZmZmZmZmOwogICAgcG9zaXRpb24gKz0gMzsKICAgIGxldCBieXRlcyA9IHJlZmVycmVkVG9Db3VudCArIDcgPj4gMzsKICAgIHJldGFpbkJpdHNbMF0gPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgd2hpbGUgKC0tYnl0ZXMgPiAwKSB7CiAgICAgIHJldGFpbkJpdHMucHVzaChkYXRhW3Bvc2l0aW9uKytdKTsKICAgIH0KICB9IGVsc2UgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDUgfHwgcmVmZXJyZWRGbGFncyA9PT0gNikgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgcmVmZXJyZWQtdG8gZmxhZ3MiKTsKICB9CiAgc2VnbWVudEhlYWRlci5yZXRhaW5CaXRzID0gcmV0YWluQml0czsKICBsZXQgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gNDsKICBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gMjU2KSB7CiAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAxOwogIH0gZWxzZSBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gNjU1MzYpIHsKICAgIHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDI7CiAgfQogIGNvbnN0IHJlZmVycmVkVG8gPSBbXTsKICBsZXQgaSwgaWk7CiAgZm9yIChpID0gMDsgaSA8IHJlZmVycmVkVG9Db3VudDsgaSsrKSB7CiAgICBsZXQgbnVtYmVyOwogICAgaWYgKHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9PT0gMSkgewogICAgICBudW1iZXIgPSBkYXRhW3Bvc2l0aW9uXTsKICAgIH0gZWxzZSBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAyKSB7CiAgICAgIG51bWJlciA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgbnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICB9CiAgICByZWZlcnJlZFRvLnB1c2gobnVtYmVyKTsKICAgIHBvc2l0aW9uICs9IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZTsKICB9CiAgc2VnbWVudEhlYWRlci5yZWZlcnJlZFRvID0gcmVmZXJyZWRUbzsKICBpZiAoIXBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSkgewogICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSBkYXRhW3Bvc2l0aW9uKytdOwogIH0gZWxzZSB7CiAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgcG9zaXRpb24gKz0gNDsKICB9CiAgc2VnbWVudEhlYWRlci5sZW5ndGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICBwb3NpdGlvbiArPSA0OwogIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgewogICAgaWYgKHNlZ21lbnRUeXBlID09PSAzOCkgewogICAgICBjb25zdCBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBjb25zdCBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoXTsKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvbk1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgY29uc3Qgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7CiAgICAgIGNvbnN0IHNlYXJjaFBhdHRlcm4gPSBuZXcgVWludDhBcnJheShzZWFyY2hQYXR0ZXJuTGVuZ3RoKTsKICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7CiAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7CiAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7CiAgICAgIH0KICAgICAgc2VhcmNoUGF0dGVyblsyXSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+Pj4gMjQgJiAweGZmOwogICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDE2ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls0XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls1XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCAmIDB4ZmY7CiAgICAgIGZvciAoaSA9IHBvc2l0aW9uLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCBqID0gMDsKICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHsKICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaWYgKGogPT09IHNlYXJjaFBhdHRlcm5MZW5ndGgpIHsKICAgICAgICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gaSArIHNlYXJjaFBhdHRlcm5MZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpOwogICAgfQogIH0KICBzZWdtZW50SGVhZGVyLmhlYWRlckVuZCA9IHBvc2l0aW9uOwogIHJldHVybiBzZWdtZW50SGVhZGVyOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICBjb25zdCBzZWdtZW50cyA9IFtdOwogIGxldCBwb3NpdGlvbiA9IHN0YXJ0OwogIHdoaWxlIChwb3NpdGlvbiA8IGVuZCkgewogICAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTsKICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7CiAgICBjb25zdCBzZWdtZW50ID0gewogICAgICBoZWFkZXI6IHNlZ21lbnRIZWFkZXIsCiAgICAgIGRhdGEKICAgIH07CiAgICBpZiAoIWhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgICAgc2VnbWVudC5zdGFydCA9IHBvc2l0aW9uOwogICAgICBwb3NpdGlvbiArPSBzZWdtZW50SGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudC5lbmQgPSBwb3NpdGlvbjsKICAgIH0KICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7CiAgICBpZiAoc2VnbWVudEhlYWRlci50eXBlID09PSA1MSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgc2VnbWVudHNbaV0uc3RhcnQgPSBwb3NpdGlvbjsKICAgICAgcG9zaXRpb24gKz0gc2VnbWVudHNbaV0uaGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudHNbaV0uZW5kID0gcG9zaXRpb247CiAgICB9CiAgfQogIHJldHVybiBzZWdtZW50czsKfQpmdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHN0YXJ0KSB7CiAgcmV0dXJuIHsKICAgIHdpZHRoOiByZWFkVWludDMyKGRhdGEsIHN0YXJ0KSwKICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDQpLAogICAgeDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDgpLAogICAgeTogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEyKSwKICAgIGNvbWJpbmF0aW9uT3BlcmF0b3I6IGRhdGFbc3RhcnQgKyAxNl0gJiA3CiAgfTsKfQpjb25zdCBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3OwpmdW5jdGlvbiBwcm9jZXNzU2VnbWVudChzZWdtZW50LCB2aXNpdG9yKSB7CiAgY29uc3QgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7CiAgY29uc3QgZGF0YSA9IHNlZ21lbnQuZGF0YSwKICAgIGVuZCA9IHNlZ21lbnQuZW5kOwogIGxldCBwb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CiAgbGV0IGFyZ3MsIGF0LCBpLCBhdExlbmd0aDsKICBzd2l0Y2ggKGhlYWRlci50eXBlKSB7CiAgICBjYXNlIDA6CiAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB7fTsKICAgICAgY29uc3QgZGljdGlvbmFyeUZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpOwogICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTsKICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiAyICYgMzsKICAgICAgZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA0ICYgMzsKICAgICAgZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNiAmIDE7CiAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA3ICYgMTsKICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDI1Nik7CiAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkID0gISEoZGljdGlvbmFyeUZsYWdzICYgNTEyKTsKICAgICAgZGljdGlvbmFyeS50ZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMCAmIDM7CiAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEyICYgMTsKICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgaWYgKCFkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHsKICAgICAgICBhdExlbmd0aCA9IGRpY3Rpb25hcnkudGVtcGxhdGUgPT09IDAgPyA0IDogMTsKICAgICAgICBhdCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7CiAgICAgICAgICBhdC5wdXNoKHsKICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLAogICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpCiAgICAgICAgICB9KTsKICAgICAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgICAgfQogICAgICAgIGRpY3Rpb25hcnkuYXQgPSBhdDsKICAgICAgfQogICAgICBpZiAoZGljdGlvbmFyeS5yZWZpbmVtZW50ICYmICFkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSkgewogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgYXQucHVzaCh7CiAgICAgICAgICAgIHg6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uKSwKICAgICAgICAgICAgeTogcmVhZEludDgoZGF0YSwgcG9zaXRpb24gKyAxKQogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbiArPSAyOwogICAgICAgIH0KICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCA9IGF0OwogICAgICB9CiAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgYXJncyA9IFtkaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2OgogICAgY2FzZSA3OgogICAgICBjb25zdCB0ZXh0UmVnaW9uID0ge307CiAgICAgIHRleHRSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKICAgICAgY29uc3QgdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSAyOwogICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW4gPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CiAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAyKTsKICAgICAgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemUgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDIgJiAzOwogICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7CiAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA0ICYgMzsKICAgICAgdGV4dFJlZ2lvbi50cmFuc3Bvc2VkID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDY0KTsKICAgICAgdGV4dFJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3ICYgMzsKICAgICAgdGV4dFJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gOSAmIDE7CiAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIDw8IDE3ID4+IDI3OwogICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUgJiAxOwogICAgICBpZiAodGV4dFJlZ2lvbi5odWZmbWFuKSB7CiAgICAgICAgY29uc3QgdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRlMgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5EUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMiAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFQgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDQgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREVyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNiAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERIID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA4ICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFggPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEwICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFkgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEyICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yID0gISEodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDB4NDAwMCk7CiAgICAgIH0KICAgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCAmJiAhdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUpIHsKICAgICAgICBhdCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgIGF0LnB1c2goewogICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50QXQgPSBhdDsKICAgICAgfQogICAgICB0ZXh0UmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGFyZ3MgPSBbdGV4dFJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOwogICAgICBicmVhazsKICAgIGNhc2UgMTY6CiAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5ID0ge307CiAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBwYXR0ZXJuRGljdGlvbmFyeS5tbXIgPSAhIShwYXR0ZXJuRGljdGlvbmFyeUZsYWdzICYgMSk7CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnRlbXBsYXRlID0gcGF0dGVybkRpY3Rpb25hcnlGbGFncyA+PiAxICYgMzsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybldpZHRoID0gZGF0YVtwb3NpdGlvbisrXTsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybkhlaWdodCA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDIyOgogICAgY2FzZSAyMzoKICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTsKICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTsKICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDEgJiAzOwogICAgICBoYWxmdG9uZVJlZ2lvbi5lbmFibGVTa2lwID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDgpOwogICAgICBoYWxmdG9uZVJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0ICYgNzsKICAgICAgaGFsZnRvbmVSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDcgJiAxOwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OgogICAgY2FzZSAzOToKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvbiA9IHt9OwogICAgICBnZW5lcmljUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CiAgICAgIGNvbnN0IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBnZW5lcmljUmVnaW9uLm1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSAmIDM7CiAgICAgIGdlbmVyaWNSZWdpb24ucHJlZGljdGlvbiA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiA4KTsKICAgICAgaWYgKCFnZW5lcmljUmVnaW9uLm1tcikgewogICAgICAgIGF0TGVuZ3RoID0gZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOwogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGF0LnB1c2goewogICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgZ2VuZXJpY1JlZ2lvbi5hdCA9IGF0OwogICAgICB9CiAgICAgIGFyZ3MgPSBbZ2VuZXJpY1JlZ2lvbiwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA0ODoKICAgICAgY29uc3QgcGFnZUluZm8gPSB7CiAgICAgICAgd2lkdGg6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pLAogICAgICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDQpLAogICAgICAgIHJlc29sdXRpb25YOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgOCksCiAgICAgICAgcmVzb2x1dGlvblk6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxMikKICAgICAgfTsKICAgICAgaWYgKHBhZ2VJbmZvLmhlaWdodCA9PT0gMHhmZmZmZmZmZikgewogICAgICAgIGRlbGV0ZSBwYWdlSW5mby5oZWlnaHQ7CiAgICAgIH0KICAgICAgY29uc3QgcGFnZVNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyAxNl07CiAgICAgIHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAxNyk7CiAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpOwogICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpOwogICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMiAmIDE7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlU2VnbWVudEZsYWdzID4+IDMgJiAzOwogICAgICBwYWdlSW5mby5yZXF1aXJlc0J1ZmZlciA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAzMik7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiA2NCk7CiAgICAgIGFyZ3MgPSBbcGFnZUluZm9dOwogICAgICBicmVhazsKICAgIGNhc2UgNDk6CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MDoKICAgICAgYnJlYWs7CiAgICBjYXNlIDUxOgogICAgICBicmVhazsKICAgIGNhc2UgNTM6CiAgICAgIGFyZ3MgPSBbaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2MjoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc2VnbWVudCB0eXBlICR7aGVhZGVyLnR5cGVOYW1lfSgke2hlYWRlci50eXBlfSkgaXMgbm90IGltcGxlbWVudGVkYCk7CiAgfQogIGNvbnN0IGNhbGxiYWNrTmFtZSA9ICJvbiIgKyBoZWFkZXIudHlwZU5hbWU7CiAgaWYgKGNhbGxiYWNrTmFtZSBpbiB2aXNpdG9yKSB7CiAgICB2aXNpdG9yW2NhbGxiYWNrTmFtZV0uYXBwbHkodmlzaXRvciwgYXJncyk7CiAgfQp9CmZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpIHsKICBjb25zdCB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldOwogICAgY29uc3Qgc2VnbWVudHMgPSByZWFkU2VnbWVudHMoe30sIGNodW5rLmRhdGEsIGNodW5rLnN0YXJ0LCBjaHVuay5lbmQpOwogICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKICB9CiAgcmV0dXJuIHZpc2l0b3IuYnVmZmVyOwp9CmZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkgewogIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBwYXJzZUpiaWcyIik7Cn0KY2xhc3MgU2ltcGxlU2VnbWVudFZpc2l0b3IgewogIG9uUGFnZUluZm9ybWF0aW9uKGluZm8pIHsKICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbzsKICAgIGNvbnN0IHJvd1NpemUgPSBpbmZvLndpZHRoICsgNyA+PiAzOwogICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJvd1NpemUgKiBpbmZvLmhlaWdodCk7CiAgICBpZiAoaW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSkgewogICAgICBidWZmZXIuZmlsbCgweGZmKTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogIH0KICBkcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCkgewogICAgY29uc3QgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbzsKICAgIGNvbnN0IHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCwKICAgICAgaGVpZ2h0ID0gcmVnaW9uSW5mby5oZWlnaHQ7CiAgICBjb25zdCByb3dTaXplID0gcGFnZUluZm8ud2lkdGggKyA3ID4+IDM7CiAgICBjb25zdCBjb21iaW5hdGlvbk9wZXJhdG9yID0gcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlID8gcmVnaW9uSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yIDogcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvcjsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgY29uc3QgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpOwogICAgbGV0IG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTsKICAgIGxldCBpLCBqLCBtYXNrLCBvZmZzZXQ7CiAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgICAgbWFzayA9IG1hc2swOwogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSB8PSBtYXNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hc2sgPj49IDE7CiAgICAgICAgICAgIGlmICghbWFzaykgewogICAgICAgICAgICAgIG1hc2sgPSAxMjg7CiAgICAgICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgICAgICAgIG1hc2sgPSBtYXNrMDsKICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CiAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gXj0gbWFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXNrID4+PSAxOwogICAgICAgICAgICBpZiAoIW1hc2spIHsKICAgICAgICAgICAgICBtYXNrID0gMTI4OwogICAgICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgIH0KICB9CiAgb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKHJlZ2lvbiwgZGF0YSwgc3RhcnQsIGVuZCkgewogICAgY29uc3QgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOwogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZUJpdG1hcChyZWdpb24ubW1yLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLnRlbXBsYXRlLCByZWdpb24ucHJlZGljdGlvbiwgbnVsbCwgcmVnaW9uLmF0LCBkZWNvZGluZ0NvbnRleHQpOwogICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CiAgfQogIG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCkgewogICAgdGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24oLi4uYXJndW1lbnRzKTsKICB9CiAgb25TeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikgewogICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRTZWdtZW50cywgdGhpcy5jdXN0b21UYWJsZXMpOwogICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgfQogICAgbGV0IHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7CiAgICBpZiAoIXN5bWJvbHMpIHsKICAgICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scyA9IHt9OwogICAgfQogICAgY29uc3QgaW5wdXRTeW1ib2xzID0gW107CiAgICBmb3IgKGNvbnN0IHJlZmVycmVkU2VnbWVudCBvZiByZWZlcnJlZFNlZ21lbnRzKSB7CiAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50XTsKICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgewogICAgICAgIGlucHV0U3ltYm9scy5wdXNoKC4uLnJlZmVycmVkU3ltYm9scyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeS5odWZmbWFuLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnQsIGlucHV0U3ltYm9scywgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRpY3Rpb25hcnkuYXQsIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBodWZmbWFuSW5wdXQpOwogIH0KICBvbkltbWVkaWF0ZVRleHRSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgY29uc3Qgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKICAgIGNvbnN0IGlucHV0U3ltYm9scyA9IFtdOwogICAgZm9yIChjb25zdCByZWZlcnJlZFNlZ21lbnQgb2YgcmVmZXJyZWRTZWdtZW50cykgewogICAgICBjb25zdCByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudF07CiAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHsKICAgICAgICBpbnB1dFN5bWJvbHMucHVzaCguLi5yZWZlcnJlZFN5bWJvbHMpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzeW1ib2xDb2RlTGVuZ3RoID0gbG9nMihpbnB1dFN5bWJvbHMubGVuZ3RoKTsKICAgIGlmIChyZWdpb24uaHVmZm1hbikgewogICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgICBodWZmbWFuVGFibGVzID0gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCB0aGlzLmN1c3RvbVRhYmxlcywgaW5wdXRTeW1ib2xzLmxlbmd0aCwgaHVmZm1hbklucHV0KTsKICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBjb25zdCBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKHJlZ2lvbi5odWZmbWFuLCByZWdpb24ucmVmaW5lbWVudCwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCByZWdpb24uc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHJlZ2lvbi50cmFuc3Bvc2VkLCByZWdpb24uZHNPZmZzZXQsIHJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlLCByZWdpb24ucmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIHJlZ2lvbi5sb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCk7CiAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKICB9CiAgb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKSB7CiAgICB0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiguLi5hcmd1bWVudHMpOwogIH0KICBvblBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zOwogICAgaWYgKCFwYXR0ZXJucykgewogICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTsKICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5Lm1tciwgZGljdGlvbmFyeS5wYXR0ZXJuV2lkdGgsIGRpY3Rpb25hcnkucGF0dGVybkhlaWdodCwgZGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXgsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCk7CiAgfQogIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnNbcmVmZXJyZWRTZWdtZW50c1swXV07CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBjb25zdCBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgY29uc3QgYml0bWFwID0gZGVjb2RlSGFsZnRvbmVSZWdpb24ocmVnaW9uLm1tciwgcGF0dGVybnMsIHJlZ2lvbi50ZW1wbGF0ZSwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLmVuYWJsZVNraXAsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCByZWdpb24uZ3JpZFdpZHRoLCByZWdpb24uZ3JpZEhlaWdodCwgcmVnaW9uLmdyaWRPZmZzZXRYLCByZWdpb24uZ3JpZE9mZnNldFksIHJlZ2lvbi5ncmlkVmVjdG9yWCwgcmVnaW9uLmdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpOwogICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CiAgfQogIG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpIHsKICAgIHRoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiguLi5hcmd1bWVudHMpOwogIH0KICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgewogICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzOwogICAgaWYgKCFjdXN0b21UYWJsZXMpIHsKICAgICAgdGhpcy5jdXN0b21UYWJsZXMgPSBjdXN0b21UYWJsZXMgPSB7fTsKICAgIH0KICAgIGN1c3RvbVRhYmxlc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpOwogIH0KfQpjbGFzcyBIdWZmbWFuTGluZSB7CiAgY29uc3RydWN0b3IobGluZURhdGEpIHsKICAgIGlmIChsaW5lRGF0YS5sZW5ndGggPT09IDIpIHsKICAgICAgdGhpcy5pc09PQiA9IHRydWU7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSAwOwogICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdOwogICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gMDsKICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbMV07CiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzT09CID0gZmFsc2U7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lRGF0YVswXTsKICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBsaW5lRGF0YVsxXTsKICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmVEYXRhWzJdOwogICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVszXTsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lRGF0YVs0XSA9PT0gImxvd2VyIjsKICAgIH0KICB9Cn0KY2xhc3MgSHVmZm1hblRyZWVOb2RlIHsKICBjb25zdHJ1Y3RvcihsaW5lKSB7CiAgICB0aGlzLmNoaWxkcmVuID0gW107CiAgICBpZiAobGluZSkgewogICAgICB0aGlzLmlzTGVhZiA9IHRydWU7CiAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSBsaW5lLnJhbmdlTGVuZ3RoOwogICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdzsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lLmlzTG93ZXJSYW5nZTsKICAgICAgdGhpcy5pc09PQiA9IGxpbmUuaXNPT0I7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzTGVhZiA9IGZhbHNlOwogICAgfQogIH0KICBidWlsZFRyZWUobGluZSwgc2hpZnQpIHsKICAgIGNvbnN0IGJpdCA9IGxpbmUucHJlZml4Q29kZSA+PiBzaGlmdCAmIDE7CiAgICBpZiAoc2hpZnQgPD0gMCkgewogICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpOwogICAgfSBlbHNlIHsKICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07CiAgICAgIGlmICghbm9kZSkgewogICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOwogICAgICB9CiAgICAgIG5vZGUuYnVpbGRUcmVlKGxpbmUsIHNoaWZ0IC0gMSk7CiAgICB9CiAgfQogIGRlY29kZU5vZGUocmVhZGVyKSB7CiAgICBpZiAodGhpcy5pc0xlYWYpIHsKICAgICAgaWYgKHRoaXMuaXNPT0IpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBodE9mZnNldCA9IHJlYWRlci5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMucmFuZ2VMb3cgKyAodGhpcy5pc0xvd2VyUmFuZ2UgPyAtaHRPZmZzZXQgOiBodE9mZnNldCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gdGhpcy5jaGlsZHJlbltyZWFkZXIucmVhZEJpdCgpXTsKICAgIGlmICghbm9kZSkgewogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTsKICAgIH0KICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTsKICB9Cn0KY2xhc3MgSHVmZm1hblRhYmxlIHsKICBjb25zdHJ1Y3RvcihsaW5lcywgcHJlZml4Q29kZXNEb25lKSB7CiAgICBpZiAoIXByZWZpeENvZGVzRG9uZSkgewogICAgICB0aGlzLmFzc2lnblByZWZpeENvZGVzKGxpbmVzKTsKICAgIH0KICAgIHRoaXMucm9vdE5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CiAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnJvb3ROb2RlLmJ1aWxkVHJlZShsaW5lLCBsaW5lLnByZWZpeExlbmd0aCAtIDEpOwogICAgICB9CiAgICB9CiAgfQogIGRlY29kZShyZWFkZXIpIHsKICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTsKICB9CiAgYXNzaWduUHJlZml4Q29kZXMobGluZXMpIHsKICAgIGNvbnN0IGxpbmVzTGVuZ3RoID0gbGluZXMubGVuZ3RoOwogICAgbGV0IHByZWZpeExlbmd0aE1heCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHsKICAgICAgcHJlZml4TGVuZ3RoTWF4ID0gTWF0aC5tYXgocHJlZml4TGVuZ3RoTWF4LCBsaW5lc1tpXS5wcmVmaXhMZW5ndGgpOwogICAgfQogICAgY29uc3QgaGlzdG9ncmFtID0gbmV3IFVpbnQzMkFycmF5KHByZWZpeExlbmd0aE1heCArIDEpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CiAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7CiAgICB9CiAgICBsZXQgY3VycmVudExlbmd0aCA9IDEsCiAgICAgIGZpcnN0Q29kZSA9IDAsCiAgICAgIGN1cnJlbnRDb2RlLAogICAgICBjdXJyZW50VGVtcCwKICAgICAgbGluZTsKICAgIGhpc3RvZ3JhbVswXSA9IDA7CiAgICB3aGlsZSAoY3VycmVudExlbmd0aCA8PSBwcmVmaXhMZW5ndGhNYXgpIHsKICAgICAgZmlyc3RDb2RlID0gZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSA8PCAxOwogICAgICBjdXJyZW50Q29kZSA9IGZpcnN0Q29kZTsKICAgICAgY3VycmVudFRlbXAgPSAwOwogICAgICB3aGlsZSAoY3VycmVudFRlbXAgPCBsaW5lc0xlbmd0aCkgewogICAgICAgIGxpbmUgPSBsaW5lc1tjdXJyZW50VGVtcF07CiAgICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKSB7CiAgICAgICAgICBsaW5lLnByZWZpeENvZGUgPSBjdXJyZW50Q29kZTsKICAgICAgICAgIGN1cnJlbnRDb2RlKys7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRUZW1wKys7CiAgICAgIH0KICAgICAgY3VycmVudExlbmd0aCsrOwogICAgfQogIH0KfQpmdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpIHsKICBjb25zdCBmbGFncyA9IGRhdGFbc3RhcnRdOwogIGNvbnN0IGxvd2VzdFZhbHVlID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEpICYgMHhmZmZmZmZmZjsKICBjb25zdCBoaWdoZXN0VmFsdWUgPSByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgNSkgJiAweGZmZmZmZmZmOwogIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQgKyA5LCBlbmQpOwogIGNvbnN0IHByZWZpeFNpemVCaXRzID0gKGZsYWdzID4+IDEgJiA3KSArIDE7CiAgY29uc3QgcmFuZ2VTaXplQml0cyA9IChmbGFncyA+PiA0ICYgNykgKyAxOwogIGNvbnN0IGxpbmVzID0gW107CiAgbGV0IHByZWZpeExlbmd0aCwKICAgIHJhbmdlTGVuZ3RoLAogICAgY3VycmVudFJhbmdlTG93ID0gbG93ZXN0VmFsdWU7CiAgZG8gewogICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2N1cnJlbnRSYW5nZUxvdywgcHJlZml4TGVuZ3RoLCByYW5nZUxlbmd0aCwgMF0pKTsKICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoOwogIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7CiAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbbG93ZXN0VmFsdWUgLSAxLCBwcmVmaXhMZW5ndGgsIDMyLCAwLCAibG93ZXIiXSkpOwogIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CiAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2hpZ2hlc3RWYWx1ZSwgcHJlZml4TGVuZ3RoLCAzMiwgMF0pKTsKICBpZiAoZmxhZ3MgJiAxKSB7CiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTsKICB9CiAgcmV0dXJuIG5ldyBIdWZmbWFuVGFibGUobGluZXMsIGZhbHNlKTsKfQpjb25zdCBzdGFuZGFyZFRhYmxlc0NhY2hlID0ge307CmZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7CiAgbGV0IHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdOwogIGlmICh0YWJsZSkgewogICAgcmV0dXJuIHRhYmxlOwogIH0KICBsZXQgbGluZXM7CiAgc3dpdGNoIChudW1iZXIpIHsKICAgIGNhc2UgMToKICAgICAgbGluZXMgPSBbWzAsIDEsIDQsIDB4MF0sIFsxNiwgMiwgOCwgMHgyXSwgWzI3MiwgMywgMTYsIDB4Nl0sIFs2NTgwOCwgMywgMzIsIDB4N11dOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgbGluZXMgPSBbWzAsIDEsIDAsIDB4MF0sIFsxLCAyLCAwLCAweDJdLCBbMiwgMywgMCwgMHg2XSwgWzMsIDQsIDMsIDB4ZV0sIFsxMSwgNSwgNiwgMHgxZV0sIFs3NSwgNiwgMzIsIDB4M2VdLCBbNiwgMHgzZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgbGluZXMgPSBbWy0yNTYsIDgsIDgsIDB4ZmVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWy0yNTcsIDgsIDMyLCAweGZmLCAibG93ZXIiXSwgWzc1LCA3LCAzMiwgMHg3ZV0sIFs2LCAweDNlXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWzc2LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgNToKICAgICAgbGluZXMgPSBbWy0yNTUsIDcsIDgsIDB4N2VdLCBbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWy0yNTYsIDcsIDMyLCAweDdmLCAibG93ZXIiXSwgWzc2LCA2LCAzMiwgMHgzZV1dOwogICAgICBicmVhazsKICAgIGNhc2UgNjoKICAgICAgbGluZXMgPSBbWy0yMDQ4LCA1LCAxMCwgMHgxY10sIFstMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDQsIDgsIDB4OV0sIFstMjU2LCA0LCA3LCAweGFdLCBbLTEyOCwgNSwgNiwgMHgxZF0sIFstNjQsIDUsIDUsIDB4MWVdLCBbLTMyLCA0LCA1LCAweGJdLCBbMCwgMiwgNywgMHgwXSwgWzEyOCwgMywgNywgMHgyXSwgWzI1NiwgMywgOCwgMHgzXSwgWzUxMiwgNCwgOSwgMHhjXSwgWzEwMjQsIDQsIDEwLCAweGRdLCBbLTIwNDksIDYsIDMyLCAweDNlLCAibG93ZXIiXSwgWzIwNDgsIDYsIDMyLCAweDNmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA3OgogICAgICBsaW5lcyA9IFtbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCAzLCA4LCAweDBdLCBbLTI1NiwgNCwgNywgMHg5XSwgWy0xMjgsIDUsIDYsIDB4MWFdLCBbLTY0LCA1LCA1LCAweDFiXSwgWy0zMiwgNCwgNSwgMHhhXSwgWzAsIDQsIDUsIDB4Yl0sIFszMiwgNSwgNSwgMHgxY10sIFs2NCwgNSwgNiwgMHgxZF0sIFsxMjgsIDQsIDcsIDB4Y10sIFsyNTYsIDMsIDgsIDB4MV0sIFs1MTIsIDMsIDksIDB4Ml0sIFsxMDI0LCAzLCAxMCwgMHgzXSwgWy0xMDI1LCA1LCAzMiwgMHgxZSwgImxvd2VyIl0sIFsyMDQ4LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgODoKICAgICAgbGluZXMgPSBbWy0xNSwgOCwgMywgMHhmY10sIFstNywgOSwgMSwgMHgxZmNdLCBbLTUsIDgsIDEsIDB4ZmRdLCBbLTMsIDksIDAsIDB4MWZkXSwgWy0yLCA3LCAwLCAweDdjXSwgWy0xLCA0LCAwLCAweGFdLCBbMCwgMiwgMSwgMHgwXSwgWzIsIDUsIDAsIDB4MWFdLCBbMywgNiwgMCwgMHgzYV0sIFs0LCAzLCA0LCAweDRdLCBbMjAsIDYsIDEsIDB4M2JdLCBbMjIsIDQsIDQsIDB4Yl0sIFszOCwgNCwgNSwgMHhjXSwgWzcwLCA1LCA2LCAweDFiXSwgWzEzNCwgNSwgNywgMHgxY10sIFsyNjIsIDYsIDcsIDB4M2NdLCBbMzkwLCA3LCA4LCAweDdkXSwgWzY0NiwgNiwgMTAsIDB4M2RdLCBbLTE2LCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMTY3MCwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MV1dOwogICAgICBicmVhazsKICAgIGNhc2UgOToKICAgICAgbGluZXMgPSBbWy0zMSwgOCwgNCwgMHhmY10sIFstMTUsIDksIDIsIDB4MWZjXSwgWy0xMSwgOCwgMiwgMHhmZF0sIFstNywgOSwgMSwgMHgxZmRdLCBbLTUsIDcsIDEsIDB4N2NdLCBbLTMsIDQsIDEsIDB4YV0sIFstMSwgMywgMSwgMHgyXSwgWzEsIDMsIDEsIDB4M10sIFszLCA1LCAxLCAweDFhXSwgWzUsIDYsIDEsIDB4M2FdLCBbNywgMywgNSwgMHg0XSwgWzM5LCA2LCAyLCAweDNiXSwgWzQzLCA0LCA1LCAweGJdLCBbNzUsIDQsIDYsIDB4Y10sIFsxMzksIDUsIDcsIDB4MWJdLCBbMjY3LCA1LCA4LCAweDFjXSwgWzUyMywgNiwgOCwgMHgzY10sIFs3NzksIDcsIDksIDB4N2RdLCBbMTI5MSwgNiwgMTEsIDB4M2RdLCBbLTMyLCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMzMzOSwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MF1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTA6CiAgICAgIGxpbmVzID0gW1stMjEsIDcsIDQsIDB4N2FdLCBbLTUsIDgsIDAsIDB4ZmNdLCBbLTQsIDcsIDAsIDB4N2JdLCBbLTMsIDUsIDAsIDB4MThdLCBbLTIsIDIsIDIsIDB4MF0sIFsyLCA1LCAwLCAweDE5XSwgWzMsIDYsIDAsIDB4MzZdLCBbNCwgNywgMCwgMHg3Y10sIFs1LCA4LCAwLCAweGZkXSwgWzYsIDIsIDYsIDB4MV0sIFs3MCwgNSwgNSwgMHgxYV0sIFsxMDIsIDYsIDUsIDB4MzddLCBbMTM0LCA2LCA2LCAweDM4XSwgWzE5OCwgNiwgNywgMHgzOV0sIFszMjYsIDYsIDgsIDB4M2FdLCBbNTgyLCA2LCA5LCAweDNiXSwgWzEwOTQsIDYsIDEwLCAweDNjXSwgWzIxMTgsIDcsIDExLCAweDdkXSwgWy0yMiwgOCwgMzIsIDB4ZmUsICJsb3dlciJdLCBbNDE2NiwgOCwgMzIsIDB4ZmZdLCBbMiwgMHgyXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMToKICAgICAgbGluZXMgPSBbWzEsIDEsIDAsIDB4MF0sIFsyLCAyLCAxLCAweDJdLCBbNCwgNCwgMCwgMHhjXSwgWzUsIDQsIDEsIDB4ZF0sIFs3LCA1LCAxLCAweDFjXSwgWzksIDUsIDIsIDB4MWRdLCBbMTMsIDYsIDIsIDB4M2NdLCBbMTcsIDcsIDIsIDB4N2FdLCBbMjEsIDcsIDMsIDB4N2JdLCBbMjksIDcsIDQsIDB4N2NdLCBbNDUsIDcsIDUsIDB4N2RdLCBbNzcsIDcsIDYsIDB4N2VdLCBbMTQxLCA3LCAzMiwgMHg3Zl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTI6CiAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDEsIDB4Nl0sIFs1LCA1LCAwLCAweDFjXSwgWzYsIDUsIDEsIDB4MWRdLCBbOCwgNiwgMSwgMHgzY10sIFsxMCwgNywgMCwgMHg3YV0sIFsxMSwgNywgMSwgMHg3Yl0sIFsxMywgNywgMiwgMHg3Y10sIFsxNywgNywgMywgMHg3ZF0sIFsyNSwgNywgNCwgMHg3ZV0sIFs0MSwgOCwgNSwgMHhmZV0sIFs3MywgOCwgMzIsIDB4ZmZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDEzOgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDMsIDAsIDB4NF0sIFszLCA0LCAwLCAweGNdLCBbNCwgNSwgMCwgMHgxY10sIFs1LCA0LCAxLCAweGRdLCBbNywgMywgMywgMHg1XSwgWzE1LCA2LCAxLCAweDNhXSwgWzE3LCA2LCAyLCAweDNiXSwgWzIxLCA2LCAzLCAweDNjXSwgWzI5LCA2LCA0LCAweDNkXSwgWzQ1LCA2LCA1LCAweDNlXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE0OgogICAgICBsaW5lcyA9IFtbLTIsIDMsIDAsIDB4NF0sIFstMSwgMywgMCwgMHg1XSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAzLCAwLCAweDZdLCBbMiwgMywgMCwgMHg3XV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxNToKICAgICAgbGluZXMgPSBbWy0yNCwgNywgNCwgMHg3Y10sIFstOCwgNiwgMiwgMHgzY10sIFstNCwgNSwgMSwgMHgxY10sIFstMiwgNCwgMCwgMHhjXSwgWy0xLCAzLCAwLCAweDRdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4NV0sIFsyLCA0LCAwLCAweGRdLCBbMywgNSwgMSwgMHgxZF0sIFs1LCA2LCAyLCAweDNkXSwgWzksIDcsIDQsIDB4N2RdLCBbLTI1LCA3LCAzMiwgMHg3ZSwgImxvd2VyIl0sIFsyNSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTsKICB9CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgbGluZXNbaV0gPSBuZXcgSHVmZm1hbkxpbmUobGluZXNbaV0pOwogIH0KICB0YWJsZSA9IG5ldyBIdWZmbWFuVGFibGUobGluZXMsIHRydWUpOwogIHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXSA9IHRhYmxlOwogIHJldHVybiB0YWJsZTsKfQpjbGFzcyBSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwOwogIH0KICByZWFkQml0KCkgewogICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7CiAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImVuZCBvZiBkYXRhIHdoaWxlIHJlYWRpbmcgYml0Iik7CiAgICAgIH0KICAgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOwogICAgICB0aGlzLnNoaWZ0ID0gNzsKICAgIH0KICAgIGNvbnN0IGJpdCA9IHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCAmIDE7CiAgICB0aGlzLnNoaWZ0LS07CiAgICByZXR1cm4gYml0OwogIH0KICByZWFkQml0cyhudW1CaXRzKSB7CiAgICBsZXQgcmVzdWx0ID0gMCwKICAgICAgaTsKICAgIGZvciAoaSA9IG51bUJpdHMgLSAxOyBpID49IDA7IGktLSkgewogICAgICByZXN1bHQgfD0gdGhpcy5yZWFkQml0KCkgPDwgaTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGJ5dGVBbGlnbigpIHsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICB9CiAgbmV4dCgpIHsKICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKICB9Cn0KZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKICBsZXQgY3VycmVudEluZGV4ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dOwogICAgaWYgKHRhYmxlKSB7CiAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudEluZGV4KSB7CiAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgICB9CiAgICAgIGN1cnJlbnRJbmRleCsrOwogICAgfQogIH0KICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpOwp9CmZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKHRleHRSZWdpb24sIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcywgbnVtYmVyT2ZTeW1ib2xzLCByZWFkZXIpIHsKICBjb25zdCBjb2RlcyA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHsKICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7CiAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICB9CiAgY29uc3QgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBjb2Rlcy5sZW5ndGggPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZTeW1ib2xzOykgewogICAgY29uc3QgY29kZUxlbmd0aCA9IHJ1bkNvZGVzVGFibGUuZGVjb2RlKHJlYWRlcik7CiAgICBpZiAoY29kZUxlbmd0aCA+PSAzMikgewogICAgICBsZXQgcmVwZWF0ZWRMZW5ndGgsIG51bWJlck9mUmVwZWF0cywgajsKICAgICAgc3dpdGNoIChjb2RlTGVuZ3RoKSB7CiAgICAgICAgY2FzZSAzMjoKICAgICAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgICAgIH0KICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7CiAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW2kgLSAxXS5wcmVmaXhMZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMzOgogICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMzsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZSZXBlYXRzOyBqKyspIHsKICAgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgcmVwZWF0ZWRMZW5ndGgsIDAsIDBdKSk7CiAgICAgICAgaSsrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICAgICAgaSsrOwogICAgfQogIH0KICByZWFkZXIuYnl0ZUFsaWduKCk7CiAgY29uc3Qgc3ltYm9sSURUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBsZXQgY3VzdG9tSW5kZXggPSAwLAogICAgdGFibGVGaXJzdFMsCiAgICB0YWJsZURlbHRhUywKICAgIHRhYmxlRGVsdGFUOwogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRlMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVGaXJzdFMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkZTICsgNik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZUZpcnN0UyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRTICsgOCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhUyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFQpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRUICsgMTEpOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpOwogIH0KICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICByZXR1cm4gewogICAgc3ltYm9sSURUYWJsZSwKICAgIHRhYmxlRmlyc3RTLAogICAgdGFibGVEZWx0YVMsCiAgICB0YWJsZURlbHRhVAogIH07Cn0KZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CiAgbGV0IGN1c3RvbUluZGV4ID0gMCwKICAgIHRhYmxlRGVsdGFIZWlnaHQsCiAgICB0YWJsZURlbHRhV2lkdGg7CiAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgKyA0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpOwogIH0KICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yICsgMik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpOwogIH0KICBsZXQgdGFibGVCaXRtYXBTaXplLCB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczsKICBpZiAoZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IpIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgIGN1c3RvbUluZGV4Kys7CiAgfSBlbHNlIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIGlmIChkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IpIHsKICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOwogIH0gZWxzZSB7CiAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIHJldHVybiB7CiAgICB0YWJsZURlbHRhSGVpZ2h0LAogICAgdGFibGVEZWx0YVdpZHRoLAogICAgdGFibGVCaXRtYXBTaXplLAogICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMKICB9Owp9CmZ1bmN0aW9uIHJlYWRVbmNvbXByZXNzZWRCaXRtYXAocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB7CiAgY29uc3QgYml0bWFwID0gW107CiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpOwogICAgfQogICAgcmVhZGVyLmJ5dGVBbGlnbigpOwogIH0KICByZXR1cm4gYml0bWFwOwp9CmZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZW5kT2ZCbG9jaykgewogIGNvbnN0IHBhcmFtcyA9IHsKICAgIEs6IC0xLAogICAgQ29sdW1uczogd2lkdGgsCiAgICBSb3dzOiBoZWlnaHQsCiAgICBCbGFja0lzMTogdHJ1ZSwKICAgIEVuZE9mQmxvY2s6IGVuZE9mQmxvY2sKICB9OwogIGNvbnN0IGRlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKGlucHV0LCBwYXJhbXMpOwogIGNvbnN0IGJpdG1hcCA9IFtdOwogIGxldCBjdXJyZW50Qnl0ZSwKICAgIGVvZiA9IGZhbHNlOwogIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgIGNvbnN0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgICBsZXQgc2hpZnQgPSAtMTsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICBpZiAoc2hpZnQgPCAwKSB7CiAgICAgICAgY3VycmVudEJ5dGUgPSBkZWNvZGVyLnJlYWROZXh0Q2hhcigpOwogICAgICAgIGlmIChjdXJyZW50Qnl0ZSA9PT0gLTEpIHsKICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDsKICAgICAgICAgIGVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHNoaWZ0ID0gNzsKICAgICAgfQogICAgICByb3dbeF0gPSBjdXJyZW50Qnl0ZSA+PiBzaGlmdCAmIDE7CiAgICAgIHNoaWZ0LS07CiAgICB9CiAgfQogIGlmIChlbmRPZkJsb2NrICYmICFlb2YpIHsKICAgIGNvbnN0IGxvb2tGb3JFT0ZMaW1pdCA9IDU7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2tGb3JFT0ZMaW1pdDsgaSsrKSB7CiAgICAgIGlmIChkZWNvZGVyLnJlYWROZXh0Q2hhcigpID09PSAtMSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KY2xhc3MgSmJpZzJJbWFnZSB7CiAgcGFyc2VDaHVua3MoY2h1bmtzKSB7CiAgICByZXR1cm4gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpOwogIH0KICBwYXJzZShkYXRhKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogSmJpZzJJbWFnZS5wYXJzZSIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvamJpZzJfc3RyZWFtLmpzCgoKCgoKY2xhc3MgSmJpZzJTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmRpY3QgPSBzdHJlYW0uZGljdDsKICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogIH0KICBnZXQgYnl0ZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge30KICByZWFkQmxvY2soKSB7CiAgICB0aGlzLmRlY29kZUltYWdlKCk7CiAgfQogIGRlY29kZUltYWdlKGJ5dGVzKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgfHw9IHRoaXMuYnl0ZXM7CiAgICBjb25zdCBqYmlnMkltYWdlID0gbmV3IEpiaWcySW1hZ2UoKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgaWYgKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBnbG9iYWxzU3RyZWFtID0gdGhpcy5wYXJhbXMuZ2V0KCJKQklHMkdsb2JhbHMiKTsKICAgICAgaWYgKGdsb2JhbHNTdHJlYW0gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgY29uc3QgZ2xvYmFscyA9IGdsb2JhbHNTdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgICAgICBjaHVua3MucHVzaCh7CiAgICAgICAgICBkYXRhOiBnbG9iYWxzLAogICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICBlbmQ6IGdsb2JhbHMubGVuZ3RoCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGNodW5rcy5wdXNoKHsKICAgICAgZGF0YTogYnl0ZXMsCiAgICAgIHN0YXJ0OiAwLAogICAgICBlbmQ6IGJ5dGVzLmxlbmd0aAogICAgfSk7CiAgICBjb25zdCBkYXRhID0gamJpZzJJbWFnZS5wYXJzZUNodW5rcyhjaHVua3MpOwogICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHsKICAgICAgZGF0YVtpXSBePSAweGZmOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBkYXRhOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBkYXRhTGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2pweF9zdHJlYW0uanMKCgoKY2xhc3MgSnB4U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CiAgfQogIGVuc3VyZUJ1ZmZlcihyZXF1ZXN0ZWQpIHt9CiAgcmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKSB7CiAgICB1bnJlYWNoYWJsZSgiSnB4U3RyZWFtLnJlYWRCbG9jayIpOwogIH0KICBnZXQgaXNBc3luY0RlY29kZXIoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgYXN5bmMgZGVjb2RlSW1hZ2UoYnl0ZXMsIGRlY29kZXJPcHRpb25zKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgfHw9IHRoaXMuYnl0ZXM7CiAgICB0aGlzLmJ1ZmZlciA9IGF3YWl0IEpweEltYWdlLmRlY29kZShieXRlcywgZGVjb2Rlck9wdGlvbnMpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgICByZXR1cm4gdGhpcy5idWZmZXI7CiAgfQogIGdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbS5pc0FzeW5jOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvbHp3X3N0cmVhbS5qcwoKY2xhc3MgTFpXU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSkgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuY2FjaGVkRGF0YSA9IDA7CiAgICB0aGlzLmJpdHNDYWNoZWQgPSAwOwogICAgY29uc3QgbWF4THp3RGljdGlvbmFyeVNpemUgPSA0MDk2OwogICAgY29uc3QgbHp3U3RhdGUgPSB7CiAgICAgIGVhcmx5Q2hhbmdlLAogICAgICBjb2RlTGVuZ3RoOiA5LAogICAgICBuZXh0Q29kZTogMjU4LAogICAgICBkaWN0aW9uYXJ5VmFsdWVzOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCiAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBjdXJyZW50U2VxdWVuY2U6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzW2ldID0gaTsKICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHNbaV0gPSAxOwogICAgfQogICAgdGhpcy5sendTdGF0ZSA9IGx6d1N0YXRlOwogIH0KICByZWFkQml0cyhuKSB7CiAgICBsZXQgYml0c0NhY2hlZCA9IHRoaXMuYml0c0NhY2hlZDsKICAgIGxldCBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhOwogICAgd2hpbGUgKGJpdHNDYWNoZWQgPCBuKSB7CiAgICAgIGNvbnN0IGMgPSB0aGlzLnN0ci5nZXRCeXRlKCk7CiAgICAgIGlmIChjID09PSAtMSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjYWNoZWREYXRhID0gY2FjaGVkRGF0YSA8PCA4IHwgYzsKICAgICAgYml0c0NhY2hlZCArPSA4OwogICAgfQogICAgdGhpcy5iaXRzQ2FjaGVkID0gYml0c0NhY2hlZCAtPSBuOwogICAgdGhpcy5jYWNoZWREYXRhID0gY2FjaGVkRGF0YTsKICAgIHRoaXMubGFzdENvZGUgPSBudWxsOwogICAgcmV0dXJuIGNhY2hlZERhdGEgPj4+IGJpdHNDYWNoZWQgJiAoMSA8PCBuKSAtIDE7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IGJsb2NrU2l6ZSA9IDUxMiwKICAgICAgZGVjb2RlZFNpemVEZWx0YSA9IGJsb2NrU2l6ZTsKICAgIGxldCBlc3RpbWF0ZWREZWNvZGVkU2l6ZSA9IGJsb2NrU2l6ZSAqIDI7CiAgICBsZXQgaSwgaiwgcTsKICAgIGNvbnN0IGx6d1N0YXRlID0gdGhpcy5sendTdGF0ZTsKICAgIGlmICghbHp3U3RhdGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZWFybHlDaGFuZ2UgPSBsendTdGF0ZS5lYXJseUNoYW5nZTsKICAgIGxldCBuZXh0Q29kZSA9IGx6d1N0YXRlLm5leHRDb2RlOwogICAgY29uc3QgZGljdGlvbmFyeVZhbHVlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXM7CiAgICBjb25zdCBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzOwogICAgY29uc3QgZGljdGlvbmFyeVByZXZDb2RlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlQcmV2Q29kZXM7CiAgICBsZXQgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7CiAgICBsZXQgcHJldkNvZGUgPSBsendTdGF0ZS5wcmV2Q29kZTsKICAgIGNvbnN0IGN1cnJlbnRTZXF1ZW5jZSA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZTsKICAgIGxldCBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGg7CiAgICBsZXQgZGVjb2RlZExlbmd0aCA9IDA7CiAgICBsZXQgY3VycmVudEJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOwogICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CiAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLnJlYWRCaXRzKGNvZGVMZW5ndGgpOwogICAgICBjb25zdCBoYXNQcmV2ID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoID4gMDsKICAgICAgaWYgKGNvZGUgPCAyNTYpIHsKICAgICAgICBjdXJyZW50U2VxdWVuY2VbMF0gPSBjb2RlOwogICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDE7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA+PSAyNTgpIHsKICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7CiAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBkaWN0aW9uYXJ5TGVuZ3Roc1tjb2RlXTsKICAgICAgICAgIGZvciAoaiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCAtIDEsIHEgPSBjb2RlOyBqID49IDA7IGotLSkgewogICAgICAgICAgICBjdXJyZW50U2VxdWVuY2Vbal0gPSBkaWN0aW9uYXJ5VmFsdWVzW3FdOwogICAgICAgICAgICBxID0gZGljdGlvbmFyeVByZXZDb2Rlc1txXTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFNlcXVlbmNlW2N1cnJlbnRTZXF1ZW5jZUxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMjU2KSB7CiAgICAgICAgY29kZUxlbmd0aCA9IDk7CiAgICAgICAgbmV4dENvZGUgPSAyNTg7CiAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMDsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgZGVsZXRlIHRoaXMubHp3U3RhdGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGhhc1ByZXYpIHsKICAgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzW25leHRDb2RlXSA9IHByZXZDb2RlOwogICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzW25leHRDb2RlXSA9IGRpY3Rpb25hcnlMZW5ndGhzW3ByZXZDb2RlXSArIDE7CiAgICAgICAgZGljdGlvbmFyeVZhbHVlc1tuZXh0Q29kZV0gPSBjdXJyZW50U2VxdWVuY2VbMF07CiAgICAgICAgbmV4dENvZGUrKzsKICAgICAgICBjb2RlTGVuZ3RoID0gbmV4dENvZGUgKyBlYXJseUNoYW5nZSAmIG5leHRDb2RlICsgZWFybHlDaGFuZ2UgLSAxID8gY29kZUxlbmd0aCA6IE1hdGgubWluKE1hdGgubG9nKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpIC8gMC42OTMxNDcxODA1NTk5NDUzICsgMSwgMTIpIHwgMDsKICAgICAgfQogICAgICBwcmV2Q29kZSA9IGNvZGU7CiAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOwogICAgICBpZiAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKSB7CiAgICAgICAgZG8gewogICAgICAgICAgZXN0aW1hdGVkRGVjb2RlZFNpemUgKz0gZGVjb2RlZFNpemVEZWx0YTsKICAgICAgICB9IHdoaWxlIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpOwogICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50U2VxdWVuY2VMZW5ndGg7IGorKykgewogICAgICAgIGJ1ZmZlcltjdXJyZW50QnVmZmVyTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlW2pdOwogICAgICB9CiAgICB9CiAgICBsendTdGF0ZS5uZXh0Q29kZSA9IG5leHRDb2RlOwogICAgbHp3U3RhdGUuY29kZUxlbmd0aCA9IGNvZGVMZW5ndGg7CiAgICBsendTdGF0ZS5wcmV2Q29kZSA9IHByZXZDb2RlOwogICAgbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBjdXJyZW50QnVmZmVyTGVuZ3RoOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvcHJlZGljdG9yX3N0cmVhbS5qcwoKCgpjbGFzcyBQcmVkaWN0b3JTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHN0cjsKICAgIH0KICAgIGNvbnN0IHByZWRpY3RvciA9IHRoaXMucHJlZGljdG9yID0gcGFyYW1zLmdldCgiUHJlZGljdG9yIikgfHwgMTsKICAgIGlmIChwcmVkaWN0b3IgPD0gMSkgewogICAgICByZXR1cm4gc3RyOwogICAgfQogICAgaWYgKHByZWRpY3RvciAhPT0gMiAmJiAocHJlZGljdG9yIDwgMTAgfHwgcHJlZGljdG9yID4gMTUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3ByZWRpY3Rvcn1gKTsKICAgIH0KICAgIHRoaXMucmVhZEJsb2NrID0gcHJlZGljdG9yID09PSAyID8gdGhpcy5yZWFkQmxvY2tUaWZmIDogdGhpcy5yZWFkQmxvY2tQbmc7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnMgPSBwYXJhbXMuZ2V0KCJDb2xvcnMiKSB8fCAxOwogICAgY29uc3QgYml0cyA9IHRoaXMuYml0cyA9IHBhcmFtcy5nZXQoIkJQQyIsICJCaXRzUGVyQ29tcG9uZW50IikgfHwgODsKICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMgPSBwYXJhbXMuZ2V0KCJDb2x1bW5zIikgfHwgMTsKICAgIHRoaXMucGl4Qnl0ZXMgPSBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOwogICAgdGhpcy5yb3dCeXRlcyA9IGNvbHVtbnMgKiBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHJlYWRCbG9ja1RpZmYoKSB7CiAgICBjb25zdCByb3dCeXRlcyA9IHRoaXMucm93Qnl0ZXM7CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIHJvd0J5dGVzKTsKICAgIGNvbnN0IGJpdHMgPSB0aGlzLmJpdHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpOwogICAgdGhpcy5lb2YgPSAhcmF3Qnl0ZXMubGVuZ3RoOwogICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBpbmJ1ZiA9IDAsCiAgICAgIG91dGJ1ZiA9IDA7CiAgICBsZXQgaW5iaXRzID0gMCwKICAgICAgb3V0Yml0cyA9IDA7CiAgICBsZXQgcG9zID0gYnVmZmVyTGVuZ3RoOwogICAgbGV0IGk7CiAgICBpZiAoYml0cyA9PT0gMSAmJiBjb2xvcnMgPT09IDEpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICBsZXQgYyA9IHJhd0J5dGVzW2ldIF4gaW5idWY7CiAgICAgICAgYyBePSBjID4+IDE7CiAgICAgICAgYyBePSBjID4+IDI7CiAgICAgICAgYyBePSBjID4+IDQ7CiAgICAgICAgaW5idWYgPSAoYyAmIDEpIDw8IDc7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGM7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYml0cyA9PT0gOCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyArK2kpIHsKICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07CiAgICAgIH0KICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gY29sb3JzXSArIHJhd0J5dGVzW2ldOwogICAgICAgIHBvcysrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGJpdHMgPT09IDE2KSB7CiAgICAgIGNvbnN0IGJ5dGVzUGVyUGl4ZWwgPSBjb2xvcnMgKiAyOwogICAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXNQZXJQaXhlbDsgKytpKSB7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldOwogICAgICB9CiAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7IGkgKz0gMikgewogICAgICAgIGNvbnN0IHN1bSA9ICgocmF3Qnl0ZXNbaV0gJiAweGZmKSA8PCA4KSArIChyYXdCeXRlc1tpICsgMV0gJiAweGZmKSArICgoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWxdICYgMHhmZikgPDwgOCkgKyAoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWwgKyAxXSAmIDB4ZmYpOwogICAgICAgIGJ1ZmZlcltwb3MrK10gPSBzdW0gPj4gOCAmIDB4ZmY7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSAmIDB4ZmY7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNvbXBBcnJheSA9IG5ldyBVaW50OEFycmF5KGNvbG9ycyArIDEpOwogICAgICBjb25zdCBiaXRNYXNrID0gKDEgPDwgYml0cykgLSAxOwogICAgICBsZXQgaiA9IDAsCiAgICAgICAgayA9IGJ1ZmZlckxlbmd0aDsKICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uczsKICAgICAgZm9yIChpID0gMDsgaSA8IGNvbHVtbnM7ICsraSkgewogICAgICAgIGZvciAobGV0IGtrID0gMDsga2sgPCBjb2xvcnM7ICsra2spIHsKICAgICAgICAgIGlmIChpbmJpdHMgPCBiaXRzKSB7CiAgICAgICAgICAgIGluYnVmID0gaW5idWYgPDwgOCB8IHJhd0J5dGVzW2orK10gJiAweGZmOwogICAgICAgICAgICBpbmJpdHMgKz0gODsKICAgICAgICAgIH0KICAgICAgICAgIGNvbXBBcnJheVtra10gPSBjb21wQXJyYXlba2tdICsgKGluYnVmID4+IGluYml0cyAtIGJpdHMpICYgYml0TWFzazsKICAgICAgICAgIGluYml0cyAtPSBiaXRzOwogICAgICAgICAgb3V0YnVmID0gb3V0YnVmIDw8IGJpdHMgfCBjb21wQXJyYXlba2tdOwogICAgICAgICAgb3V0Yml0cyArPSBiaXRzOwogICAgICAgICAgaWYgKG91dGJpdHMgPj0gOCkgewogICAgICAgICAgICBidWZmZXJbaysrXSA9IG91dGJ1ZiA+PiBvdXRiaXRzIC0gOCAmIDB4ZmY7CiAgICAgICAgICAgIG91dGJpdHMgLT0gODsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG91dGJpdHMgPiAwKSB7CiAgICAgICAgYnVmZmVyW2srK10gPSAob3V0YnVmIDw8IDggLSBvdXRiaXRzKSArIChpbmJ1ZiAmICgxIDw8IDggLSBvdXRiaXRzKSAtIDEpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKICB9CiAgcmVhZEJsb2NrUG5nKCkgewogICAgY29uc3Qgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzOwogICAgY29uc3QgcGl4Qnl0ZXMgPSB0aGlzLnBpeEJ5dGVzOwogICAgY29uc3QgcHJlZGljdG9yID0gdGhpcy5zdHIuZ2V0Qnl0ZSgpOwogICAgY29uc3QgcmF3Qnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhyb3dCeXRlcyk7CiAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7CiAgICBsZXQgcHJldlJvdyA9IGJ1ZmZlci5zdWJhcnJheShidWZmZXJMZW5ndGggLSByb3dCeXRlcywgYnVmZmVyTGVuZ3RoKTsKICAgIGlmIChwcmV2Um93Lmxlbmd0aCA9PT0gMCkgewogICAgICBwcmV2Um93ID0gbmV3IFVpbnQ4QXJyYXkocm93Qnl0ZXMpOwogICAgfQogICAgbGV0IGksCiAgICAgIGogPSBidWZmZXJMZW5ndGgsCiAgICAgIHVwLAogICAgICBjOwogICAgc3dpdGNoIChwcmVkaWN0b3IpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqXSA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdICsgcmF3Qnl0ZXNbaV0gJiAweGZmOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHByZXZSb3dbaV0gKyByYXdCeXRlc1tpXSAmIDB4ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gPj4gMSkgKyByYXdCeXRlc1tpXTsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbal0gPSAocHJldlJvd1tpXSArIGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdID4+IDEpICsgcmF3Qnl0ZXNbaV0gJiAweGZmOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CiAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07CiAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYzsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CiAgICAgICAgICBjb25zdCB1cExlZnQgPSBwcmV2Um93W2kgLSBwaXhCeXRlc107CiAgICAgICAgICBjb25zdCBsZWZ0ID0gYnVmZmVyW2ogLSBwaXhCeXRlc107CiAgICAgICAgICBjb25zdCBwID0gbGVmdCArIHVwIC0gdXBMZWZ0OwogICAgICAgICAgbGV0IHBhID0gcCAtIGxlZnQ7CiAgICAgICAgICBpZiAocGEgPCAwKSB7CiAgICAgICAgICAgIHBhID0gLXBhOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHBiID0gcCAtIHVwOwogICAgICAgICAgaWYgKHBiIDwgMCkgewogICAgICAgICAgICBwYiA9IC1wYjsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBwYyA9IHAgLSB1cExlZnQ7CiAgICAgICAgICBpZiAocGMgPCAwKSB7CiAgICAgICAgICAgIHBjID0gLXBjOwogICAgICAgICAgfQogICAgICAgICAgYyA9IHJhd0J5dGVzW2ldOwogICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7CiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbGVmdCArIGM7CiAgICAgICAgICB9IGVsc2UgaWYgKHBiIDw9IHBjKSB7CiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyW2orK10gPSB1cExlZnQgKyBjOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtwcmVkaWN0b3J9YCk7CiAgICB9CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3J1bl9sZW5ndGhfc3RyZWFtLmpzCgpjbGFzcyBSdW5MZW5ndGhTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IHJlcGVhdEhlYWRlciA9IHRoaXMuc3RyLmdldEJ5dGVzKDIpOwogICAgaWYgKCFyZXBlYXRIZWFkZXIgfHwgcmVwZWF0SGVhZGVyLmxlbmd0aCA8IDIgfHwgcmVwZWF0SGVhZGVyWzBdID09PSAxMjgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgYnVmZmVyOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IG4gPSByZXBlYXRIZWFkZXJbMF07CiAgICBpZiAobiA8IDEyOCkgewogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSByZXBlYXRIZWFkZXJbMV07CiAgICAgIGlmIChuID4gMCkgewogICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc3RyLmdldEJ5dGVzKG4pOwogICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpOwogICAgICAgIGJ1ZmZlckxlbmd0aCArPSBuOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuID0gMjU3IC0gbjsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpOwogICAgICBidWZmZXIuZmlsbChyZXBlYXRIZWFkZXJbMV0sIGJ1ZmZlckxlbmd0aCwgYnVmZmVyTGVuZ3RoICsgbik7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSBuOwogICAgfQogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wYXJzZXIuanMKCgoKCgoKCgoKCgoKCgpjb25zdCBNQVhfTEVOR1RIX1RPX0NBQ0hFID0gMTAwMDsKZnVuY3Rpb24gZ2V0SW5saW5lSW1hZ2VDYWNoZUtleShieXRlcykgewogIGNvbnN0IHN0ckJ1ZiA9IFtdLAogICAgaWkgPSBieXRlcy5sZW5ndGg7CiAgbGV0IGkgPSAwOwogIHdoaWxlIChpIDwgaWkgLSAxKSB7CiAgICBzdHJCdWYucHVzaChieXRlc1tpKytdIDw8IDggfCBieXRlc1tpKytdKTsKICB9CiAgaWYgKGkgPCBpaSkgewogICAgc3RyQnVmLnB1c2goYnl0ZXNbaV0pOwogIH0KICByZXR1cm4gaWkgKyAiXyIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHN0ckJ1Zik7Cn0KY2xhc3MgUGFyc2VyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBsZXhlciwKICAgIHhyZWYsCiAgICBhbGxvd1N0cmVhbXMgPSBmYWxzZSwKICAgIHJlY292ZXJ5TW9kZSA9IGZhbHNlCiAgfSkgewogICAgdGhpcy5sZXhlciA9IGxleGVyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuYWxsb3dTdHJlYW1zID0gYWxsb3dTdHJlYW1zOwogICAgdGhpcy5yZWNvdmVyeU1vZGUgPSByZWNvdmVyeU1vZGU7CiAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5faW1hZ2VJZCA9IDA7CiAgICB0aGlzLnJlZmlsbCgpOwogIH0KICByZWZpbGwoKSB7CiAgICB0aGlzLmJ1ZjEgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgdGhpcy5idWYyID0gdGhpcy5sZXhlci5nZXRPYmooKTsKICB9CiAgc2hpZnQoKSB7CiAgICBpZiAodGhpcy5idWYyIGluc3RhbmNlb2YgQ21kICYmIHRoaXMuYnVmMi5jbWQgPT09ICJJRCIpIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgfQogIH0KICB0cnlTaGlmdCgpIHsKICAgIHRyeSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSA9IG51bGwpIHsKICAgIGNvbnN0IGJ1ZjEgPSB0aGlzLmJ1ZjE7CiAgICB0aGlzLnNoaWZ0KCk7CiAgICBpZiAoYnVmMSBpbnN0YW5jZW9mIENtZCkgewogICAgICBzd2l0Y2ggKGJ1ZjEuY21kKSB7CiAgICAgICAgY2FzZSAiQkkiOgogICAgICAgICAgcmV0dXJuIHRoaXMubWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSk7CiAgICAgICAgY2FzZSAiWyI6CiAgICAgICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICJdIikgJiYgdGhpcy5idWYxICE9PSBFT0YpIHsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlckVPRkV4Y2VwdGlvbigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5LiIpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIGNhc2UgIjw8IjoKICAgICAgICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICI+PiIpICYmIHRoaXMuYnVmMSAhPT0gRU9GKSB7CiAgICAgICAgICAgIGlmICghKHRoaXMuYnVmMSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgaW5mbygiTWFsZm9ybWVkIGRpY3Rpb25hcnk6IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gRU9GKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc0NtZCh0aGlzLmJ1ZjIsICJzdHJlYW0iKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXMgPyB0aGlzLm1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKSA6IGRpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGJ1ZjE7CiAgICAgIH0KICAgIH0KICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGJ1ZjEpKSB7CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuYnVmMSkgJiYgaXNDbWQodGhpcy5idWYyLCAiUiIpKSB7CiAgICAgICAgY29uc3QgcmVmID0gUmVmLmdldChidWYxLCB0aGlzLmJ1ZjEpOwogICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgcmV0dXJuIHJlZjsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKICAgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBjaXBoZXJUcmFuc2Zvcm0uZGVjcnlwdFN0cmluZyhidWYxKTsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIHJldHVybiBidWYxOwogIH0KICBmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEUgPSAweDQ1LAogICAgICBJID0gMHg0OSwKICAgICAgU1BBQ0UgPSAweDIwLAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIE5VTCA9IDB4MDsKICAgIGNvbnN0IHsKICAgICAgICBrbm93bkNvbW1hbmRzCiAgICAgIH0gPSB0aGlzLmxleGVyLAogICAgICBzdGFydFBvcyA9IHN0cmVhbS5wb3MsCiAgICAgIG4gPSAxNTsKICAgIGxldCBzdGF0ZSA9IDAsCiAgICAgIGNoLAogICAgICBtYXliZUVJUG9zOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNoID09PSBTUEFDRSB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSKSB7CiAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKICAgICAgICAgIGNvbnN0IGZvbGxvd2luZ0J5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhuKTsKICAgICAgICAgIGNvbnN0IGlpID0gZm9sbG93aW5nQnl0ZXMubGVuZ3RoOwogICAgICAgICAgaWYgKGlpID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIGNoID0gZm9sbG93aW5nQnl0ZXNbaV07CiAgICAgICAgICAgIGlmIChjaCA9PT0gTlVMICYmIGZvbGxvd2luZ0J5dGVzW2kgKyAxXSAhPT0gTlVMKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgewogICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlICE9PSAyKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmRzKSB7CiAgICAgICAgICAgIHdhcm4oImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIC0gYGxleGVyLmtub3duQ29tbWFuZHNgIGlzIHVuZGVmaW5lZC4iKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB0bXBMZXhlciA9IG5ldyBMZXhlcihuZXcgU3RyZWFtKHN0cmVhbS5wZWVrQnl0ZXMoNSAqIG4pKSwga25vd25Db21tYW5kcyk7CiAgICAgICAgICB0bXBMZXhlci5faGV4U3RyaW5nV2FybiA9ICgpID0+IHt9OwogICAgICAgICAgbGV0IG51bUFyZ3MgPSAwOwogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbmV4dE9iaiA9IHRtcExleGVyLmdldE9iaigpOwogICAgICAgICAgICBpZiAobmV4dE9iaiA9PT0gRU9GKSB7CiAgICAgICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgQ21kKSB7CiAgICAgICAgICAgICAgY29uc3Qga25vd25Db21tYW5kID0ga25vd25Db21tYW5kc1tuZXh0T2JqLmNtZF07CiAgICAgICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoa25vd25Db21tYW5kLnZhcmlhYmxlQXJncyA/IG51bUFyZ3MgPD0ga25vd25Db21tYW5kLm51bUFyZ3MgOiBudW1BcmdzID09PSBrbm93bkNvbW1hbmQubnVtQXJncykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG51bUFyZ3MgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG51bUFyZ3MrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNoID09PSAtMSkgewogICAgICB3YXJuKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZDogIiArICJSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3aXRob3V0IGZpbmRpbmcgYSB2YWxpZCBFSSBtYXJrZXIiKTsKICAgICAgaWYgKG1heWJlRUlQb3MpIHsKICAgICAgICB3YXJuKCcuLi4gdHJ5aW5nIHRvIHJlY292ZXIgYnkgdXNpbmcgdGhlIGxhc3QgIkVJIiBvY2N1cnJlbmNlLicpOwogICAgICAgIHN0cmVhbS5za2lwKC0oc3RyZWFtLnBvcyAtIG1heWJlRUlQb3MpKTsKICAgICAgfQogICAgfQogICAgbGV0IGVuZE9mZnNldCA9IDQ7CiAgICBzdHJlYW0uc2tpcCgtZW5kT2Zmc2V0KTsKICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICBzdHJlYW0uc2tpcChlbmRPZmZzZXQpOwogICAgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgIGVuZE9mZnNldC0tOwogICAgfQogICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBlbmRPZmZzZXQgLSBzdGFydFBvczsKICB9CiAgZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBmb3VuZEVPSSA9IGZhbHNlLAogICAgICBiLAogICAgICBtYXJrZXJMZW5ndGg7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGIgIT09IDB4ZmYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKHN0cmVhbS5nZXRCeXRlKCkpIHsKICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmY6CiAgICAgICAgICBzdHJlYW0uc2tpcCgtMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZDk6CiAgICAgICAgICBmb3VuZEVPSSA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4YzA6CiAgICAgICAgY2FzZSAweGMxOgogICAgICAgIGNhc2UgMHhjMjoKICAgICAgICBjYXNlIDB4YzM6CiAgICAgICAgY2FzZSAweGM1OgogICAgICAgIGNhc2UgMHhjNjoKICAgICAgICBjYXNlIDB4Yzc6CiAgICAgICAgY2FzZSAweGM5OgogICAgICAgIGNhc2UgMHhjYToKICAgICAgICBjYXNlIDB4Y2I6CiAgICAgICAgY2FzZSAweGNkOgogICAgICAgIGNhc2UgMHhjZToKICAgICAgICBjYXNlIDB4Y2Y6CiAgICAgICAgY2FzZSAweGM0OgogICAgICAgIGNhc2UgMHhjYzoKICAgICAgICBjYXNlIDB4ZGE6CiAgICAgICAgY2FzZSAweGRiOgogICAgICAgIGNhc2UgMHhkYzoKICAgICAgICBjYXNlIDB4ZGQ6CiAgICAgICAgY2FzZSAweGRlOgogICAgICAgIGNhc2UgMHhkZjoKICAgICAgICBjYXNlIDB4ZTA6CiAgICAgICAgY2FzZSAweGUxOgogICAgICAgIGNhc2UgMHhlMjoKICAgICAgICBjYXNlIDB4ZTM6CiAgICAgICAgY2FzZSAweGU0OgogICAgICAgIGNhc2UgMHhlNToKICAgICAgICBjYXNlIDB4ZTY6CiAgICAgICAgY2FzZSAweGU3OgogICAgICAgIGNhc2UgMHhlODoKICAgICAgICBjYXNlIDB4ZTk6CiAgICAgICAgY2FzZSAweGVhOgogICAgICAgIGNhc2UgMHhlYjoKICAgICAgICBjYXNlIDB4ZWM6CiAgICAgICAgY2FzZSAweGVkOgogICAgICAgIGNhc2UgMHhlZToKICAgICAgICBjYXNlIDB4ZWY6CiAgICAgICAgY2FzZSAweGZlOgogICAgICAgICAgbWFya2VyTGVuZ3RoID0gc3RyZWFtLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKG1hcmtlckxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXAobWFya2VyTGVuZ3RoIC0gMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0uc2tpcCgtMik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoZm91bmRFT0kpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zOwogICAgaWYgKGIgPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiAiICsgIkVPSSBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTsKICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICB9CiAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pOwogICAgcmV0dXJuIGxlbmd0aDsKICB9CiAgZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7CiAgICBjb25zdCBUSUxERSA9IDB4N2UsCiAgICAgIEdUID0gMHgzZTsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGNoID09PSBUSUxERSkgewogICAgICAgIGNvbnN0IHRpbGRlUG9zID0gc3RyZWFtLnBvczsKICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOwogICAgICAgIHdoaWxlIChpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcCgpOwogICAgICAgICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNoID09PSBHVCkgewogICAgICAgICAgc3RyZWFtLnNraXAoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHRpbGRlUG9zKSB7CiAgICAgICAgICBjb25zdCBtYXliZUVJID0gc3RyZWFtLnBlZWtCeXRlcygyKTsKICAgICAgICAgIGlmIChtYXliZUVJWzBdID09PSAweDQ1ICYmIG1heWJlRUlbMV0gPT09IDB4NDkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CiAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgfQogICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEdUID0gMHgzZTsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGNoID09PSBHVCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOwogICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KICBpbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKSB7CiAgICBjb25zdCBFID0gMHg0NSwKICAgICAgSSA9IDB4NDk7CiAgICBsZXQgc3RhdGUgPSAwLAogICAgICBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKHN0YXRlID09PSAwKSB7CiAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwOwogICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7CiAgICAgICAgc3RhdGUgPSBjaCA9PT0gSSA/IDIgOiAwOwogICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAyKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgbWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSkgewogICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyOwogICAgY29uc3Qgc3RyZWFtID0gbGV4ZXIuc3RyZWFtOwogICAgY29uc3QgZGljdE1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBsZXQgZGljdExlbmd0aDsKICAgIHdoaWxlICghaXNDbWQodGhpcy5idWYxLCAiSUQiKSAmJiB0aGlzLmJ1ZjEgIT09IEVPRikgewogICAgICBpZiAoISh0aGlzLmJ1ZjEgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRGljdGlvbmFyeSBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7CiAgICAgIH0KICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gRU9GKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGljdE1hcFtrZXldID0gdGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKTsKICAgIH0KICAgIGlmIChsZXhlci5iZWdpbklubGluZUltYWdlUG9zICE9PSAtMSkgewogICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkaWN0TWFwLkYgfHwgZGljdE1hcC5GaWx0ZXIpOwogICAgbGV0IGZpbHRlck5hbWU7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJaZXJvID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyWzBdKTsKICAgICAgaWYgKGZpbHRlclplcm8gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlclplcm8ubmFtZTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogICAgbGV0IGxlbmd0aDsKICAgIHN3aXRjaCAoZmlsdGVyTmFtZSkgewogICAgICBjYXNlICJEQ1QiOgogICAgICBjYXNlICJEQ1REZWNvZGUiOgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJBODUiOgogICAgICBjYXNlICJBU0NJSTg1RGVjb2RlIjoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkFIeCI6CiAgICAgIGNhc2UgIkFTQ0lJSGV4RGVjb2RlIjoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIGxldCBjYWNoZUtleTsKICAgIGlmIChsZW5ndGggPCBNQVhfTEVOR1RIX1RPX0NBQ0hFICYmIGRpY3RMZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGluaXRpYWxTdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvczsKICAgICAgY2FjaGVLZXkgPSBnZXRJbmxpbmVJbWFnZUNhY2hlS2V5KHN0cmVhbS5nZXRCeXRlcyhkaWN0TGVuZ3RoICsgbGVuZ3RoKSk7CiAgICAgIHN0cmVhbS5wb3MgPSBpbml0aWFsU3RyZWFtUG9zOwogICAgICBjb25zdCBjYWNoZUVudHJ5ID0gdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XTsKICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoIkVJIik7CiAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTsKICAgICAgICByZXR1cm4gY2FjaGVFbnRyeTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBkaWN0TWFwKSB7CiAgICAgIGRpY3Quc2V0KGtleSwgZGljdE1hcFtrZXldKTsKICAgIH0KICAgIGxldCBpbWFnZVN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOwogICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICBpbWFnZVN0cmVhbSA9IGNpcGhlclRyYW5zZm9ybS5jcmVhdGVTdHJlYW0oaW1hZ2VTdHJlYW0sIGxlbmd0aCk7CiAgICB9CiAgICBpbWFnZVN0cmVhbSA9IHRoaXMuZmlsdGVyKGltYWdlU3RyZWFtLCBkaWN0LCBsZW5ndGgpOwogICAgaW1hZ2VTdHJlYW0uZGljdCA9IGRpY3Q7CiAgICBpZiAoY2FjaGVLZXkgIT09IHVuZGVmaW5lZCkgewogICAgICBpbWFnZVN0cmVhbS5jYWNoZUtleSA9IGBpbmxpbmVfaW1nXyR7Kyt0aGlzLl9pbWFnZUlkfWA7CiAgICAgIHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV0gPSBpbWFnZVN0cmVhbTsKICAgIH0KICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoIkVJIik7CiAgICB0aGlzLnNoaWZ0KCk7CiAgICByZXR1cm4gaW1hZ2VTdHJlYW07CiAgfQogICNmaW5kU3RyZWFtTGVuZ3RoKHN0YXJ0UG9zKSB7CiAgICBjb25zdCB7CiAgICAgIHN0cmVhbQogICAgfSA9IHRoaXMubGV4ZXI7CiAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3M7CiAgICBjb25zdCBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CiAgICBjb25zdCBzaWduYXR1cmVMZW5ndGggPSAiZW5kc3RyZWFtIi5sZW5ndGg7CiAgICBjb25zdCBFTkRfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NmUsIDB4NjRdKTsKICAgIGNvbnN0IGVuZExlbmd0aCA9IEVORF9TSUdOQVRVUkUubGVuZ3RoOwogICAgY29uc3QgUEFSVElBTF9TSUdOQVRVUkUgPSBbbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NmRdKSwgbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NjUsIDB4NjEsIDB4NmRdKSwgbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjFdKV07CiAgICBjb25zdCBub3JtYWxMZW5ndGggPSBzaWduYXR1cmVMZW5ndGggLSBlbmRMZW5ndGg7CiAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IHN0cmVhbS5lbmQpIHsKICAgICAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhTQ0FOX0JMT0NLX0xFTkdUSCk7CiAgICAgIGNvbnN0IHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogICAgICBpZiAoc2Nhbkxlbmd0aCA8PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbGV0IHBvcyA9IDA7CiAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7CiAgICAgICAgbGV0IGogPSAwOwogICAgICAgIHdoaWxlIChqIDwgZW5kTGVuZ3RoICYmIHNjYW5CeXRlc1twb3MgKyBqXSA9PT0gRU5EX1NJR05BVFVSRVtqXSkgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoaiA+PSBlbmRMZW5ndGgpIHsKICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIFBBUlRJQUxfU0lHTkFUVVJFKSB7CiAgICAgICAgICAgIGNvbnN0IHBhcnRMZW4gPSBwYXJ0Lmxlbmd0aDsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICB3aGlsZSAoayA8IHBhcnRMZW4gJiYgc2NhbkJ5dGVzW3BvcyArIGogKyBrXSA9PT0gcGFydFtrXSkgewogICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoayA+PSBub3JtYWxMZW5ndGgpIHsKICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGsgPj0gcGFydExlbikgewogICAgICAgICAgICAgIGNvbnN0IGxhc3RCeXRlID0gc2NhbkJ5dGVzW3BvcyArIGogKyBrXTsKICAgICAgICAgICAgICBpZiAoaXNXaGl0ZVNwYWNlKGxhc3RCeXRlKSkgewogICAgICAgICAgICAgICAgaW5mbyhgRm91bmQgIiR7Ynl0ZXNUb1N0cmluZyhbLi4uRU5EX1NJR05BVFVSRSwgLi4ucGFydF0pfSIgd2hlbiBgICsgInNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuIik7CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgc3RyZWFtLnBvcyArPSBwb3M7CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcysrOwogICAgICB9CiAgICAgIHN0cmVhbS5wb3MgKz0gc2Nhbkxlbmd0aDsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgbWFrZVN0cmVhbShkaWN0LCBjaXBoZXJUcmFuc2Zvcm0pIHsKICAgIGNvbnN0IGxleGVyID0gdGhpcy5sZXhlcjsKICAgIGxldCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CiAgICBsZXhlci5za2lwVG9OZXh0TGluZSgpOwogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zIC0gMTsKICAgIGxldCBsZW5ndGggPSBkaWN0LmdldCgiTGVuZ3RoIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkgewogICAgICBpbmZvKGBCYWQgbGVuZ3RoICIke2xlbmd0aCAmJiBsZW5ndGgudG9TdHJpbmcoKX0iIGluIHN0cmVhbS5gKTsKICAgICAgbGVuZ3RoID0gMDsKICAgIH0KICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvcyArIGxlbmd0aDsKICAgIGxleGVyLm5leHRDaGFyKCk7CiAgICBpZiAodGhpcy50cnlTaGlmdCgpICYmIGlzQ21kKHRoaXMuYnVmMiwgImVuZHN0cmVhbSIpKSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGxlbmd0aCA9IHRoaXMuI2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MpOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWlzc2luZyBlbmRzdHJlYW0gY29tbWFuZC4iKTsKICAgICAgfQogICAgICBsZXhlci5uZXh0Q2hhcigpOwogICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgIH0KICAgIHRoaXMuc2hpZnQoKTsKICAgIHN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOwogICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICBzdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKHN0cmVhbSwgbGVuZ3RoKTsKICAgIH0KICAgIHN0cmVhbSA9IHRoaXMuZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKTsKICAgIHN0cmVhbS5kaWN0ID0gZGljdDsKICAgIHJldHVybiBzdHJlYW07CiAgfQogIGZpbHRlcihzdHJlYW0sIGRpY3QsIGxlbmd0aCkgewogICAgbGV0IGZpbHRlciA9IGRpY3QuZ2V0KCJGIiwgIkZpbHRlciIpOwogICAgbGV0IHBhcmFtcyA9IGRpY3QuZ2V0KCJEUCIsICJEZWNvZGVQYXJtcyIpOwogICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkgewogICAgICAgIHdhcm4oIi9EZWNvZGVQYXJtcyBzaG91bGQgbm90IGJlIGFuIEFycmF5LCB3aGVuIC9GaWx0ZXIgaXMgYSBOYW1lLiIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm1ha2VGaWx0ZXIoc3RyZWFtLCBmaWx0ZXIubmFtZSwgbGVuZ3RoLCBwYXJhbXMpOwogICAgfQogICAgbGV0IG1heWJlTGVuZ3RoID0gbGVuZ3RoOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJBcnJheSA9IGZpbHRlcjsKICAgICAgY29uc3QgcGFyYW1zQXJyYXkgPSBwYXJhbXM7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZpbHRlckFycmF5Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBmaWx0ZXIgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJBcnJheVtpXSk7CiAgICAgICAgaWYgKCEoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQmFkIGZpbHRlciBuYW1lICIke2ZpbHRlcn0iYCk7CiAgICAgICAgfQogICAgICAgIHBhcmFtcyA9IG51bGw7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zQXJyYXkpICYmIGkgaW4gcGFyYW1zQXJyYXkpIHsKICAgICAgICAgIHBhcmFtcyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHBhcmFtc0FycmF5W2ldKTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtID0gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIG1heWJlTGVuZ3RoID0gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0cmVhbTsKICB9CiAgbWFrZUZpbHRlcihzdHJlYW0sIG5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIGlmIChtYXliZUxlbmd0aCA9PT0gMCkgewogICAgICB3YXJuKGBFbXB0eSAiJHtuYW1lfSIgc3RyZWFtLmApOwogICAgICByZXR1cm4gbmV3IE51bGxTdHJlYW0oKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgIGNhc2UgIkZsIjoKICAgICAgICBjYXNlICJGbGF0ZURlY29kZSI6CiAgICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljdG9yU3RyZWFtKG5ldyBGbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IEZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkxaVyI6CiAgICAgICAgY2FzZSAiTFpXRGVjb2RlIjoKICAgICAgICAgIGxldCBlYXJseUNoYW5nZSA9IDE7CiAgICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCJFYXJseUNoYW5nZSIpKSB7CiAgICAgICAgICAgICAgZWFybHlDaGFuZ2UgPSBwYXJhbXMuZ2V0KCJFYXJseUNoYW5nZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljdG9yU3RyZWFtKG5ldyBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuZXcgTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKTsKICAgICAgICBjYXNlICJEQ1QiOgogICAgICAgIGNhc2UgIkRDVERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICBjYXNlICJKUFgiOgogICAgICAgIGNhc2UgIkpQWERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEpweFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIGNhc2UgIkE4NSI6CiAgICAgICAgY2FzZSAiQVNDSUk4NURlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEFzY2lpODVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiQUh4IjoKICAgICAgICBjYXNlICJBU0NJSUhleERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkNDRiI6CiAgICAgICAgY2FzZSAiQ0NJVFRGYXhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBDQ0lUVEZheFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIGNhc2UgIlJMIjoKICAgICAgICBjYXNlICJSdW5MZW5ndGhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBSdW5MZW5ndGhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBKYmlnMlN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICB9CiAgICAgIHdhcm4oYEZpbHRlciAiJHtuYW1lfSIgaXMgbm90IHN1cHBvcnRlZC5gKTsKICAgICAgcmV0dXJuIHN0cmVhbTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgSW52YWxpZCBzdHJlYW06ICIke2V4fSJgKTsKICAgICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7CiAgICB9CiAgfQp9CmNvbnN0IHNwZWNpYWxDaGFycyA9IFsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKZnVuY3Rpb24gdG9IZXhEaWdpdChjaCkgewogIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgIHJldHVybiBjaCAmIDB4MGY7CiAgfQogIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CiAgICByZXR1cm4gKGNoICYgMHgwZikgKyA5OwogIH0KICByZXR1cm4gLTE7Cn0KY2xhc3MgTGV4ZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwga25vd25Db21tYW5kcyA9IG51bGwpIHsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5uZXh0Q2hhcigpOwogICAgdGhpcy5zdHJCdWYgPSBbXTsKICAgIHRoaXMua25vd25Db21tYW5kcyA9IGtub3duQ29tbWFuZHM7CiAgICB0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID0gMDsKICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IC0xOwogIH0KICBuZXh0Q2hhcigpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBwZWVrQ2hhcigpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbS5wZWVrQnl0ZSgpOwogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgbGV0IGVOb3RhdGlvbiA9IGZhbHNlOwogICAgbGV0IGRpdmlkZUJ5ID0gMDsKICAgIGxldCBzaWduID0gMTsKICAgIGlmIChjaCA9PT0gMHgyZCkgewogICAgICBzaWduID0gLTE7CiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICBpZiAoY2ggPT09IDB4MmQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyYikgewogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICBkbyB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgIH0gd2hpbGUgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKTsKICAgIH0KICAgIGlmIChjaCA9PT0gMHgyZSkgewogICAgICBkaXZpZGVCeSA9IDEwOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChjaCA8IDB4MzAgfHwgY2ggPiAweDM5KSB7CiAgICAgIGNvbnN0IG1zZyA9IGBJbnZhbGlkIG51bWJlcjogJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0gKGNoYXJDb2RlICR7Y2h9KWA7CiAgICAgIGlmIChpc1doaXRlU3BhY2UoY2gpIHx8IGNoID09PSAweDI4IHx8IGNoID09PSAweDNjIHx8IGNoID09PSAtMSkgewogICAgICAgIGluZm8oYExleGVyLmdldE51bWJlciAtICIke21zZ30iLmApOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogICAgfQogICAgbGV0IGJhc2VWYWx1ZSA9IGNoIC0gMHgzMDsKICAgIGxldCBwb3dlclZhbHVlID0gMDsKICAgIGxldCBwb3dlclZhbHVlU2lnbiA9IDE7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwKSB7CiAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7CiAgICAgICAgaWYgKGVOb3RhdGlvbikgewogICAgICAgICAgcG93ZXJWYWx1ZSA9IHBvd2VyVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CiAgICAgICAgICAgIGRpdmlkZUJ5ICo9IDEwOwogICAgICAgICAgfQogICAgICAgICAgYmFzZVZhbHVlID0gYmFzZVZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJlKSB7CiAgICAgICAgaWYgKGRpdmlkZUJ5ID09PSAwKSB7CiAgICAgICAgICBkaXZpZGVCeSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyZCkgewogICAgICAgIHdhcm4oIkJhZGx5IGZvcm1hdHRlZCBudW1iZXI6IG1pbnVzIHNpZ24gaW4gdGhlIG1pZGRsZSIpOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDQ1IHx8IGNoID09PSAweDY1KSB7CiAgICAgICAgY2ggPSB0aGlzLnBlZWtDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDJiIHx8IGNoID09PSAweDJkKSB7CiAgICAgICAgICBwb3dlclZhbHVlU2lnbiA9IGNoID09PSAweDJkID8gLTEgOiAxOwogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPCAweDMwIHx8IGNoID4gMHgzOSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVOb3RhdGlvbiA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChkaXZpZGVCeSAhPT0gMCkgewogICAgICBiYXNlVmFsdWUgLz0gZGl2aWRlQnk7CiAgICB9CiAgICBpZiAoZU5vdGF0aW9uKSB7CiAgICAgIGJhc2VWYWx1ZSAqPSAxMCAqKiAocG93ZXJWYWx1ZVNpZ24gKiBwb3dlclZhbHVlKTsKICAgIH0KICAgIHJldHVybiBzaWduICogYmFzZVZhbHVlOwogIH0KICBnZXRTdHJpbmcoKSB7CiAgICBsZXQgbnVtUGFyZW4gPSAxOwogICAgbGV0IGRvbmUgPSBmYWxzZTsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBsZXQgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBsZXQgY2hhckJ1ZmZlcmVkID0gZmFsc2U7CiAgICAgIHN3aXRjaCAoY2ggfCAwKSB7CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgIHdhcm4oIlVudGVybWluYXRlZCBzdHJpbmciKTsKICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDI4OgogICAgICAgICAgKytudW1QYXJlbjsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIoIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4Mjk6CiAgICAgICAgICBpZiAoLS1udW1QYXJlbiA9PT0gMCkgewogICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyQnVmLnB1c2goIikiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg1YzoKICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgIHdhcm4oIlVudGVybWluYXRlZCBzdHJpbmciKTsKICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDZlOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcbiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NzI6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxyIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg3NDoKICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXHQiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDYyOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcYiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NjY6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxmIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg1YzoKICAgICAgICAgICAgY2FzZSAweDI4OgogICAgICAgICAgICBjYXNlIDB4Mjk6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MzA6CiAgICAgICAgICAgIGNhc2UgMHgzMToKICAgICAgICAgICAgY2FzZSAweDMyOgogICAgICAgICAgICBjYXNlIDB4MzM6CiAgICAgICAgICAgIGNhc2UgMHgzNDoKICAgICAgICAgICAgY2FzZSAweDM1OgogICAgICAgICAgICBjYXNlIDB4MzY6CiAgICAgICAgICAgIGNhc2UgMHgzNzoKICAgICAgICAgICAgICBsZXQgeCA9IGNoICYgMHgwZjsKICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgICBjaGFyQnVmZmVyZWQgPSB0cnVlOwogICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKICAgICAgICAgICAgICAgIHggPSAoeCA8PCAzKSArIChjaCAmIDB4MGYpOwogICAgICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM3KSB7CiAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh4KSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHgwZDoKICAgICAgICAgICAgICBpZiAodGhpcy5wZWVrQ2hhcigpID09PSAweDBhKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MGE6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChkb25lKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFjaGFyQnVmZmVyZWQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0TmFtZSgpIHsKICAgIGxldCBjaCwgcHJldmlvdXNDaDsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmICFzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgIGlmIChjaCA9PT0gMHgyMykgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgICAgICB3YXJuKCJMZXhlcl9nZXROYW1lOiAiICsgIk5VTUJFUiBTSUdOICgjKSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCBudW1iZXIuIik7CiAgICAgICAgICBzdHJCdWYucHVzaCgiIyIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHggPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICBpZiAoeCAhPT0gLTEpIHsKICAgICAgICAgIHByZXZpb3VzQ2ggPSBjaDsKICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgY29uc3QgeDIgPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICAgIGlmICh4MiA9PT0gLTEpIHsKICAgICAgICAgICAgd2FybihgTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0pIGAgKyAiaW4gaGV4YWRlY2ltYWwgbnVtYmVyLiIpOwogICAgICAgICAgICBzdHJCdWYucHVzaCgiIyIsIFN0cmluZy5mcm9tQ2hhckNvZGUocHJldmlvdXNDaCkpOwogICAgICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHggPDwgNCB8IHgyKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIiwgU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdHJCdWYubGVuZ3RoID4gMTI3KSB7CiAgICAgIHdhcm4oYE5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogJHtzdHJCdWYubGVuZ3RofWApOwogICAgfQogICAgcmV0dXJuIE5hbWUuZ2V0KHN0ckJ1Zi5qb2luKCIiKSk7CiAgfQogIF9oZXhTdHJpbmdXYXJuKGNoKSB7CiAgICBjb25zdCBNQVhfSEVYX1NUUklOR19OVU1fV0FSTiA9IDU7CiAgICBpZiAodGhpcy5faGV4U3RyaW5nTnVtV2FybisrID09PSBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgewogICAgICB3YXJuKCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBhZGRpdGlvbmFsIGludmFsaWQgY2hhcmFjdGVycy4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4gPiBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgewogICAgICByZXR1cm47CiAgICB9CiAgICB3YXJuKGBnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogJHtjaH1gKTsKICB9CiAgZ2V0SGV4U3RyaW5nKCkgewogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICBsZXQgZmlyc3REaWdpdCA9IC0xLAogICAgICBkaWdpdCA9IC0xOwogICAgdGhpcy5faGV4U3RyaW5nTnVtV2FybiA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgd2FybigiVW50ZXJtaW5hdGVkIGhleCBzdHJpbmciKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgzZSkgewogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdID09PSAxKSB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGlnaXQgPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICBpZiAoZGlnaXQgPT09IC0xKSB7CiAgICAgICAgICB0aGlzLl9oZXhTdHJpbmdXYXJuKGNoKTsKICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RGlnaXQgPT09IC0xKSB7CiAgICAgICAgICBmaXJzdERpZ2l0ID0gZGlnaXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZmlyc3REaWdpdCA8PCA0IHwgZGlnaXQpKTsKICAgICAgICAgIGZpcnN0RGlnaXQgPSAtMTsKICAgICAgICB9CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmaXJzdERpZ2l0ICE9PSAtMSkgewogICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGZpcnN0RGlnaXQgPDwgNCkpOwogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0T2JqKCkgewogICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgcmV0dXJuIEVPRjsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFyc1tjaF0gIT09IDEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIHN3aXRjaCAoY2ggfCAwKSB7CiAgICAgIGNhc2UgMHgzMDoKICAgICAgY2FzZSAweDMxOgogICAgICBjYXNlIDB4MzI6CiAgICAgIGNhc2UgMHgzMzoKICAgICAgY2FzZSAweDM0OgogICAgICBjYXNlIDB4MzU6CiAgICAgIGNhc2UgMHgzNjoKICAgICAgY2FzZSAweDM3OgogICAgICBjYXNlIDB4Mzg6CiAgICAgIGNhc2UgMHgzOToKICAgICAgY2FzZSAweDJiOgogICAgICBjYXNlIDB4MmQ6CiAgICAgIGNhc2UgMHgyZToKICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTsKICAgICAgY2FzZSAweDI4OgogICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpOwogICAgICBjYXNlIDB4MmY6CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpOwogICAgICBjYXNlIDB4NWI6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KCJbIik7CiAgICAgIGNhc2UgMHg1ZDoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIl0iKTsKICAgICAgY2FzZSAweDNjOgogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgzYykgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgcmV0dXJuIENtZC5nZXQoIjw8Iik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmdldEhleFN0cmluZygpOwogICAgICBjYXNlIDB4M2U6CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICByZXR1cm4gQ21kLmdldCgiPj4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIj4iKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gQ21kLmdldCgieyIpOwogICAgICBjYXNlIDB4N2Q6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KCJ9Iik7CiAgICAgIGNhc2UgMHgyOToKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbGxlZ2FsIGNoYXJhY3RlcjogJHtjaH1gKTsKICAgIH0KICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIGlmIChjaCA8IDB4MjAgfHwgY2ggPiAweDdmKSB7CiAgICAgIGNvbnN0IG5leHRDaCA9IHRoaXMucGVla0NoYXIoKTsKICAgICAgaWYgKG5leHRDaCA+PSAweDIwICYmIG5leHRDaCA8PSAweDdmKSB7CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KHN0cik7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGtub3duQ29tbWFuZHMgPSB0aGlzLmtub3duQ29tbWFuZHM7CiAgICBsZXQga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkgewogICAgICBjb25zdCBwb3NzaWJsZUNvbW1hbmQgPSBzdHIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgaWYgKGtub3duQ29tbWFuZEZvdW5kICYmIGtub3duQ29tbWFuZHNbcG9zc2libGVDb21tYW5kXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEyOCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApOwogICAgICB9CiAgICAgIHN0ciA9IHBvc3NpYmxlQ29tbWFuZDsKICAgICAga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgfQogICAgaWYgKHN0ciA9PT0gInRydWUiKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHN0ciA9PT0gImZhbHNlIikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RyID09PSAibnVsbCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3RyID09PSAiQkkiKSB7CiAgICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IHRoaXMuc3RyZWFtLnBvczsKICAgIH0KICAgIHJldHVybiBDbWQuZ2V0KHN0cik7CiAgfQogIHNraXBUb05leHRMaW5lKCkgewogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIHdoaWxlIChjaCA+PSAwKSB7CiAgICAgIGlmIChjaCA9PT0gMHgwZCkgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICB9Cn0KY2xhc3MgTGluZWFyaXphdGlvbiB7CiAgc3RhdGljIGNyZWF0ZShzdHJlYW0pIHsKICAgIGZ1bmN0aW9uIGdldEludChsaW5EaWN0LCBuYW1lLCBhbGxvd1plcm9WYWx1ZSA9IGZhbHNlKSB7CiAgICAgIGNvbnN0IG9iaiA9IGxpbkRpY3QuZ2V0KG5hbWUpOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopICYmIChhbGxvd1plcm9WYWx1ZSA/IG9iaiA+PSAwIDogb2JqID4gMCkpIHsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICIke25hbWV9IiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gYCArICJkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRIaW50cyhsaW5EaWN0KSB7CiAgICAgIGNvbnN0IGhpbnRzID0gbGluRGljdC5nZXQoIkgiKTsKICAgICAgbGV0IGhpbnRzTGVuZ3RoOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShoaW50cykgJiYgKChoaW50c0xlbmd0aCA9IGhpbnRzLmxlbmd0aCkgPT09IDIgfHwgaGludHNMZW5ndGggPT09IDQpKSB7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhpbnRzTGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICBjb25zdCBoaW50ID0gaGludHNbaW5kZXhdOwogICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihoaW50KSAmJiBoaW50ID4gMCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIaW50ICgke2luZGV4fSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaGludHM7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKTsKICAgIH0KICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IG51bGwKICAgIH0pOwogICAgY29uc3Qgb2JqMSA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBjb25zdCBvYmozID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3QgbGluRGljdCA9IHBhcnNlci5nZXRPYmooKTsKICAgIGxldCBvYmosIGxlbmd0aDsKICAgIGlmICghKE51bWJlci5pc0ludGVnZXIob2JqMSkgJiYgTnVtYmVyLmlzSW50ZWdlcihvYmoyKSAmJiBpc0NtZChvYmozLCAib2JqIikgJiYgbGluRGljdCBpbnN0YW5jZW9mIERpY3QgJiYgdHlwZW9mIChvYmogPSBsaW5EaWN0LmdldCgiTGluZWFyaXplZCIpKSA9PT0gIm51bWJlciIgJiYgb2JqID4gMCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKChsZW5ndGggPSBnZXRJbnQobGluRGljdCwgIkwiKSkgIT09IHN0cmVhbS5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgIkwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5ICcgKyAiZG9lcyBub3QgZXF1YWwgdGhlIHN0cmVhbSBsZW5ndGguIik7CiAgICB9CiAgICByZXR1cm4gewogICAgICBsZW5ndGgsCiAgICAgIGhpbnRzOiBnZXRIaW50cyhsaW5EaWN0KSwKICAgICAgb2JqZWN0TnVtYmVyRmlyc3Q6IGdldEludChsaW5EaWN0LCAiTyIpLAogICAgICBlbmRGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJFIiksCiAgICAgIG51bVBhZ2VzOiBnZXRJbnQobGluRGljdCwgIk4iKSwKICAgICAgbWFpblhSZWZFbnRyaWVzT2Zmc2V0OiBnZXRJbnQobGluRGljdCwgIlQiKSwKICAgICAgcGFnZUZpcnN0OiBsaW5EaWN0LmhhcygiUCIpID8gZ2V0SW50KGxpbkRpY3QsICJQIiwgdHJ1ZSkgOiAwCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY21hcC5qcwoKCgoKCgoKY29uc3QgQlVJTFRfSU5fQ01BUFMgPSBbIkFkb2JlLUdCMS1VQ1MyIiwgIkFkb2JlLUNOUzEtVUNTMiIsICJBZG9iZS1KYXBhbjEtVUNTMiIsICJBZG9iZS1Lb3JlYTEtVUNTMiIsICI3OC1FVUMtSCIsICI3OC1FVUMtViIsICI3OC1IIiwgIjc4LVJLU0otSCIsICI3OC1SS1NKLVYiLCAiNzgtViIsICI3OG1zLVJLU0otSCIsICI3OG1zLVJLU0otViIsICI4M3B2LVJLU0otSCIsICI5MG1zLVJLU0otSCIsICI5MG1zLVJLU0otViIsICI5MG1zcC1SS1NKLUgiLCAiOTBtc3AtUktTSi1WIiwgIjkwcHYtUktTSi1IIiwgIjkwcHYtUktTSi1WIiwgIkFkZC1IIiwgIkFkZC1SS1NKLUgiLCAiQWRkLVJLU0otViIsICJBZGQtViIsICJBZG9iZS1DTlMxLTAiLCAiQWRvYmUtQ05TMS0xIiwgIkFkb2JlLUNOUzEtMiIsICJBZG9iZS1DTlMxLTMiLCAiQWRvYmUtQ05TMS00IiwgIkFkb2JlLUNOUzEtNSIsICJBZG9iZS1DTlMxLTYiLCAiQWRvYmUtR0IxLTAiLCAiQWRvYmUtR0IxLTEiLCAiQWRvYmUtR0IxLTIiLCAiQWRvYmUtR0IxLTMiLCAiQWRvYmUtR0IxLTQiLCAiQWRvYmUtR0IxLTUiLCAiQWRvYmUtSmFwYW4xLTAiLCAiQWRvYmUtSmFwYW4xLTEiLCAiQWRvYmUtSmFwYW4xLTIiLCAiQWRvYmUtSmFwYW4xLTMiLCAiQWRvYmUtSmFwYW4xLTQiLCAiQWRvYmUtSmFwYW4xLTUiLCAiQWRvYmUtSmFwYW4xLTYiLCAiQWRvYmUtS29yZWExLTAiLCAiQWRvYmUtS29yZWExLTEiLCAiQWRvYmUtS29yZWExLTIiLCAiQjUtSCIsICJCNS1WIiwgIkI1cGMtSCIsICJCNXBjLVYiLCAiQ05TLUVVQy1IIiwgIkNOUy1FVUMtViIsICJDTlMxLUgiLCAiQ05TMS1WIiwgIkNOUzItSCIsICJDTlMyLVYiLCAiRVRISy1CNS1IIiwgIkVUSEstQjUtViIsICJFVGVuLUI1LUgiLCAiRVRlbi1CNS1WIiwgIkVUZW5tcy1CNS1IIiwgIkVUZW5tcy1CNS1WIiwgIkVVQy1IIiwgIkVVQy1WIiwgIkV4dC1IIiwgIkV4dC1SS1NKLUgiLCAiRXh0LVJLU0otViIsICJFeHQtViIsICJHQi1FVUMtSCIsICJHQi1FVUMtViIsICJHQi1IIiwgIkdCLVYiLCAiR0JLLUVVQy1IIiwgIkdCSy1FVUMtViIsICJHQksySy1IIiwgIkdCSzJLLVYiLCAiR0JLcC1FVUMtSCIsICJHQktwLUVVQy1WIiwgIkdCVC1FVUMtSCIsICJHQlQtRVVDLVYiLCAiR0JULUgiLCAiR0JULVYiLCAiR0JUcGMtRVVDLUgiLCAiR0JUcGMtRVVDLVYiLCAiR0JwYy1FVUMtSCIsICJHQnBjLUVVQy1WIiwgIkgiLCAiSEtkbGEtQjUtSCIsICJIS2RsYS1CNS1WIiwgIkhLZGxiLUI1LUgiLCAiSEtkbGItQjUtViIsICJIS2djY3MtQjUtSCIsICJIS2djY3MtQjUtViIsICJIS20zMTQtQjUtSCIsICJIS20zMTQtQjUtViIsICJIS200NzEtQjUtSCIsICJIS200NzEtQjUtViIsICJIS3Njcy1CNS1IIiwgIkhLc2NzLUI1LVYiLCAiSGFua2FrdSIsICJIaXJhZ2FuYSIsICJLU0MtRVVDLUgiLCAiS1NDLUVVQy1WIiwgIktTQy1IIiwgIktTQy1Kb2hhYi1IIiwgIktTQy1Kb2hhYi1WIiwgIktTQy1WIiwgIktTQ21zLVVIQy1IIiwgIktTQ21zLVVIQy1IVy1IIiwgIktTQ21zLVVIQy1IVy1WIiwgIktTQ21zLVVIQy1WIiwgIktTQ3BjLUVVQy1IIiwgIktTQ3BjLUVVQy1WIiwgIkthdGFrYW5hIiwgIk5XUC1IIiwgIk5XUC1WIiwgIlJLU0otSCIsICJSS1NKLVYiLCAiUm9tYW4iLCAiVW5pQ05TLVVDUzItSCIsICJVbmlDTlMtVUNTMi1WIiwgIlVuaUNOUy1VVEYxNi1IIiwgIlVuaUNOUy1VVEYxNi1WIiwgIlVuaUNOUy1VVEYzMi1IIiwgIlVuaUNOUy1VVEYzMi1WIiwgIlVuaUNOUy1VVEY4LUgiLCAiVW5pQ05TLVVURjgtViIsICJVbmlHQi1VQ1MyLUgiLCAiVW5pR0ItVUNTMi1WIiwgIlVuaUdCLVVURjE2LUgiLCAiVW5pR0ItVVRGMTYtViIsICJVbmlHQi1VVEYzMi1IIiwgIlVuaUdCLVVURjMyLVYiLCAiVW5pR0ItVVRGOC1IIiwgIlVuaUdCLVVURjgtViIsICJVbmlKSVMtVUNTMi1IIiwgIlVuaUpJUy1VQ1MyLUhXLUgiLCAiVW5pSklTLVVDUzItSFctViIsICJVbmlKSVMtVUNTMi1WIiwgIlVuaUpJUy1VVEYxNi1IIiwgIlVuaUpJUy1VVEYxNi1WIiwgIlVuaUpJUy1VVEYzMi1IIiwgIlVuaUpJUy1VVEYzMi1WIiwgIlVuaUpJUy1VVEY4LUgiLCAiVW5pSklTLVVURjgtViIsICJVbmlKSVMyMDA0LVVURjE2LUgiLCAiVW5pSklTMjAwNC1VVEYxNi1WIiwgIlVuaUpJUzIwMDQtVVRGMzItSCIsICJVbmlKSVMyMDA0LVVURjMyLVYiLCAiVW5pSklTMjAwNC1VVEY4LUgiLCAiVW5pSklTMjAwNC1VVEY4LVYiLCAiVW5pSklTUHJvLVVDUzItSFctViIsICJVbmlKSVNQcm8tVUNTMi1WIiwgIlVuaUpJU1Byby1VVEY4LVYiLCAiVW5pSklTWDAyMTMtVVRGMzItSCIsICJVbmlKSVNYMDIxMy1VVEYzMi1WIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwgIlVuaUtTLVVDUzItSCIsICJVbmlLUy1VQ1MyLVYiLCAiVW5pS1MtVVRGMTYtSCIsICJVbmlLUy1VVEYxNi1WIiwgIlVuaUtTLVVURjMyLUgiLCAiVW5pS1MtVVRGMzItViIsICJVbmlLUy1VVEY4LUgiLCAiVW5pS1MtVVRGOC1WIiwgIlYiLCAiV1AtU3ltYm9sIl07CmNvbnN0IE1BWF9NQVBfUkFOR0UgPSAyICoqIDI0IC0gMTsKY2xhc3MgQ01hcCB7CiAgY29uc3RydWN0b3IoYnVpbHRJbkNNYXAgPSBmYWxzZSkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXMgPSBbW10sIFtdLCBbXSwgW11dOwogICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwOwogICAgdGhpcy5fbWFwID0gW107CiAgICB0aGlzLm5hbWUgPSAiIjsKICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTsKICAgIHRoaXMudXNlQ01hcCA9IG51bGw7CiAgICB0aGlzLmJ1aWx0SW5DTWFwID0gYnVpbHRJbkNNYXA7CiAgfQogIGFkZENvZGVzcGFjZVJhbmdlKG4sIGxvdywgaGlnaCkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXNbbiAtIDFdLnB1c2gobG93LCBoaWdoKTsKICAgIHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKys7CiAgfQogIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKICAgIH0KICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICB0aGlzLl9tYXBbbG93KytdID0gZHN0TG93Kys7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7CiAgICB9CiAgICBjb25zdCBsYXN0Qnl0ZSA9IGRzdExvdy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3c7CiAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGRzdExvdy5jaGFyQ29kZUF0KGxhc3RCeXRlKSArIDE7CiAgICAgIGlmIChuZXh0Q2hhckNvZGUgPiAweGZmKSB7CiAgICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSAtIDEpICsgU3RyaW5nLmZyb21DaGFyQ29kZShkc3RMb3cuY2hhckNvZGVBdChsYXN0Qnl0ZSAtIDEpICsgMSkgKyAiXHgwMCI7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSk7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpOwogICAgfQogICAgY29uc3QgaWkgPSBhcnJheS5sZW5ndGg7CiAgICBsZXQgaSA9IDA7CiAgICB3aGlsZSAobG93IDw9IGhpZ2ggJiYgaSA8IGlpKSB7CiAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTsKICAgICAgKytsb3c7CiAgICB9CiAgfQogIG1hcE9uZShzcmMsIGRzdCkgewogICAgdGhpcy5fbWFwW3NyY10gPSBkc3Q7CiAgfQogIGxvb2t1cChjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdOwogIH0KICBjb250YWlucyhjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdICE9PSB1bmRlZmluZWQ7CiAgfQogIGZvckVhY2goY2FsbGJhY2spIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGNvbnN0IGxlbmd0aCA9IG1hcC5sZW5ndGg7CiAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIGlmIChtYXBbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoY29uc3QgaSBpbiBtYXApIHsKICAgICAgICBjYWxsYmFjayhpLCBtYXBbaV0pOwogICAgICB9CiAgICB9CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgcmV0dXJuIG1hcC5pbmRleE9mKHZhbHVlKTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIGlmIChtYXBbY2hhckNvZGVdID09PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgZ2V0TWFwKCkgewogICAgcmV0dXJuIHRoaXMuX21hcDsKICB9CiAgcmVhZENoYXJDb2RlKHN0ciwgb2Zmc2V0LCBvdXQpIHsKICAgIGxldCBjID0gMDsKICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlcyA9IHRoaXMuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgbiA9IDAsIG5uID0gY29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgbiA8IG5uOyBuKyspIHsKICAgICAgYyA9IChjIDw8IDggfCBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyBuKSkgPj4+IDA7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjID49IGxvdyAmJiBjIDw9IGhpZ2gpIHsKICAgICAgICAgIG91dC5jaGFyY29kZSA9IGM7CiAgICAgICAgICBvdXQubGVuZ3RoID0gbiArIDE7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBvdXQuY2hhcmNvZGUgPSAwOwogICAgb3V0Lmxlbmd0aCA9IDE7CiAgfQogIGdldENoYXJDb2RlTGVuZ3RoKGNoYXJDb2RlKSB7CiAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZXMgPSB0aGlzLmNvZGVzcGFjZVJhbmdlczsKICAgIGZvciAobGV0IG4gPSAwLCBubiA9IGNvZGVzcGFjZVJhbmdlcy5sZW5ndGg7IG4gPCBubjsgbisrKSB7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjaGFyQ29kZSA+PSBsb3cgJiYgY2hhckNvZGUgPD0gaGlnaCkgewogICAgICAgICAgcmV0dXJuIG4gKyAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZ2V0IGlzSWRlbnRpdHlDTWFwKCkgewogICAgaWYgKCEodGhpcy5uYW1lID09PSAiSWRlbnRpdHktSCIgfHwgdGhpcy5uYW1lID09PSAiSWRlbnRpdHktViIpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLl9tYXAubGVuZ3RoICE9PSAweDEwMDAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBJZGVudGl0eUNNYXAgZXh0ZW5kcyBDTWFwIHsKICBjb25zdHJ1Y3Rvcih2ZXJ0aWNhbCwgbikgewogICAgc3VwZXIoKTsKICAgIHRoaXMudmVydGljYWwgPSB2ZXJ0aWNhbDsKICAgIHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UobiwgMCwgMHhmZmZmKTsKICB9CiAgbWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKTsKICB9CiAgbWFwQmZSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgewogICAgdW5yZWFjaGFibGUoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlIik7CiAgfQogIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZVRvQXJyYXkiKTsKICB9CiAgbWFwT25lKHNyYywgZHN0KSB7CiAgICB1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBjYWxsIG1hcENpZE9uZSIpOwogIH0KICBsb29rdXAoY29kZSkgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29kZSkgJiYgY29kZSA8PSAweGZmZmYgPyBjb2RlIDogdW5kZWZpbmVkOwogIH0KICBjb250YWlucyhjb2RlKSB7CiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZjsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMHhmZmZmOyBpKyspIHsKICAgICAgY2FsbGJhY2soaSwgaSk7CiAgICB9CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA8PSAweGZmZmYgPyB2YWx1ZSA6IC0xOwogIH0KICBnZXRNYXAoKSB7CiAgICBjb25zdCBtYXAgPSBuZXcgQXJyYXkoMHgxMDAwMCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAweGZmZmY7IGkrKykgewogICAgICBtYXBbaV0gPSBpOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiAweDEwMDAwOwogIH0KICBnZXQgaXNJZGVudGl0eUNNYXAoKSB7CiAgICB1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBhY2Nlc3MgLmlzSWRlbnRpdHlDTWFwIik7CiAgfQp9CmZ1bmN0aW9uIHN0clRvSW50KHN0cikgewogIGxldCBhID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgYSA9IGEgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkpOwogIH0KICByZXR1cm4gYSA+Pj4gMDsKfQpmdW5jdGlvbiBleHBlY3RTdHJpbmcob2JqKSB7CiAgaWYgKHR5cGVvZiBvYmogIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBzdHJpbmcuIik7CiAgfQp9CmZ1bmN0aW9uIGV4cGVjdEludChvYmopIHsKICBpZiAoIU51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgaW50LiIpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaXNDbWQob2JqLCAiZW5kYmZjaGFyIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBzcmMgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGRzdCA9IG9iajsKICAgIGNNYXAubWFwT25lKHNyYywgZHN0KTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRiZnJhbmdlIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGhpZ2ggPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8IHR5cGVvZiBvYmogPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGRzdExvdyA9IE51bWJlci5pc0ludGVnZXIob2JqKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUob2JqKSA6IG9iajsKICAgICAgY01hcC5tYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKICAgIH0gZWxzZSBpZiAoaXNDbWQob2JqLCAiWyIpKSB7CiAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICB3aGlsZSAoIWlzQ21kKG9iaiwgIl0iKSAmJiBvYmogIT09IEVPRikgewogICAgICAgIGFycmF5LnB1c2gob2JqKTsKICAgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgICAgfQogICAgICBjTWFwLm1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBiZiByYW5nZS4iKTsKfQpmdW5jdGlvbiBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpIHsKICB3aGlsZSAodHJ1ZSkgewogICAgbGV0IG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgaWYgKG9iaiA9PT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGlzQ21kKG9iaiwgImVuZGNpZGNoYXIiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IHNyYyA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGV4cGVjdEludChvYmopOwogICAgY29uc3QgZHN0ID0gb2JqOwogICAgY01hcC5tYXBPbmUoc3JjLCBkc3QpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRjaWRyYW5nZSIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGV4cGVjdFN0cmluZyhvYmopOwogICAgY29uc3QgbG93ID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBoaWdoID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0SW50KG9iaik7CiAgICBjb25zdCBkc3RMb3cgPSBvYmo7CiAgICBjTWFwLm1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VDb2Rlc3BhY2VSYW5nZShjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaXNDbWQob2JqLCAiZW5kY29kZXNwYWNlcmFuZ2UiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBoaWdoID0gc3RyVG9JbnQob2JqKTsKICAgIGNNYXAuYWRkQ29kZXNwYWNlUmFuZ2Uob2JqLmxlbmd0aCwgbG93LCBoaWdoKTsKICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS4iKTsKfQpmdW5jdGlvbiBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKSB7CiAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgY01hcC52ZXJ0aWNhbCA9ICEhb2JqOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKSB7CiAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgIGNNYXAubmFtZSA9IG9iai5uYW1lOwogIH0KfQphc3luYyBmdW5jdGlvbiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApIHsKICBsZXQgcHJldmlvdXMsIGVtYmVkZGVkVXNlQ01hcDsKICBvYmpMb29wOiB3aGlsZSAodHJ1ZSkgewogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICAgIGlmIChvYmogPT09IEVPRikgewogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBpZiAob2JqLm5hbWUgPT09ICJXTW9kZSIpIHsKICAgICAgICAgIHBhcnNlV01vZGUoY01hcCwgbGV4ZXIpOwogICAgICAgIH0gZWxzZSBpZiAob2JqLm5hbWUgPT09ICJDTWFwTmFtZSIpIHsKICAgICAgICAgIHBhcnNlQ01hcE5hbWUoY01hcCwgbGV4ZXIpOwogICAgICAgIH0KICAgICAgICBwcmV2aW91cyA9IG9iajsKICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDbWQpIHsKICAgICAgICBzd2l0Y2ggKG9iai5jbWQpIHsKICAgICAgICAgIGNhc2UgImVuZGNtYXAiOgogICAgICAgICAgICBicmVhayBvYmpMb29wOwogICAgICAgICAgY2FzZSAidXNlY21hcCI6CiAgICAgICAgICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICBlbWJlZGRlZFVzZUNNYXAgPSBwcmV2aW91cy5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5jb2Rlc3BhY2VyYW5nZSI6CiAgICAgICAgICAgIHBhcnNlQ29kZXNwYWNlUmFuZ2UoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luYmZjaGFyIjoKICAgICAgICAgICAgcGFyc2VCZkNoYXIoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luY2lkY2hhciI6CiAgICAgICAgICAgIHBhcnNlQ2lkQ2hhcihjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5iZnJhbmdlIjoKICAgICAgICAgICAgcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWdpbmNpZHJhbmdlIjoKICAgICAgICAgICAgcGFyc2VDaWRSYW5nZShjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJJbnZhbGlkIGNNYXAgZGF0YTogIiArIGV4KTsKICAgICAgY29udGludWU7CiAgICB9CiAgfQogIGlmICghdXNlQ01hcCAmJiBlbWJlZGRlZFVzZUNNYXApIHsKICAgIHVzZUNNYXAgPSBlbWJlZGRlZFVzZUNNYXA7CiAgfQogIGlmICh1c2VDTWFwKSB7CiAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKICB9CiAgcmV0dXJuIGNNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7CiAgY01hcC51c2VDTWFwID0gYXdhaXQgY3JlYXRlQnVpbHRJbkNNYXAodXNlQ01hcCwgZmV0Y2hCdWlsdEluQ01hcCk7CiAgaWYgKGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID09PSAwKSB7CiAgICBjb25zdCB1c2VDb2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgY01hcC5jb2Rlc3BhY2VSYW5nZXNbaV0gPSB1c2VDb2Rlc3BhY2VSYW5nZXNbaV0uc2xpY2UoKTsKICAgIH0KICAgIGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlczsKICB9CiAgY01hcC51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgIGlmICghY01hcC5jb250YWlucyhrZXkpKSB7CiAgICAgIGNNYXAubWFwT25lKGtleSwgdmFsdWUpOwogICAgfQogIH0pOwogIHJldHVybiBjTWFwOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKG5hbWUsIGZldGNoQnVpbHRJbkNNYXApIHsKICBpZiAobmFtZSA9PT0gIklkZW50aXR5LUgiKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5Q01hcChmYWxzZSwgMik7CiAgfSBlbHNlIGlmIChuYW1lID09PSAiSWRlbnRpdHktViIpIHsKICAgIHJldHVybiBuZXcgSWRlbnRpdHlDTWFwKHRydWUsIDIpOwogIH0KICBpZiAoIUJVSUxUX0lOX0NNQVBTLmluY2x1ZGVzKG5hbWUpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gQ01hcCBuYW1lOiAiICsgbmFtZSk7CiAgfQogIGlmICghZmV0Y2hCdWlsdEluQ01hcCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC4iKTsKICB9CiAgY29uc3QgewogICAgY01hcERhdGEsCiAgICBpc0NvbXByZXNzZWQKICB9ID0gYXdhaXQgZmV0Y2hCdWlsdEluQ01hcChuYW1lKTsKICBjb25zdCBjTWFwID0gbmV3IENNYXAodHJ1ZSk7CiAgaWYgKGlzQ29tcHJlc3NlZCkgewogICAgcmV0dXJuIG5ldyBCaW5hcnlDTWFwUmVhZGVyKCkucHJvY2VzcyhjTWFwRGF0YSwgY01hcCwgdXNlQ01hcCA9PiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApKTsKICB9CiAgY29uc3QgbGV4ZXIgPSBuZXcgTGV4ZXIobmV3IFN0cmVhbShjTWFwRGF0YSkpOwogIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIG51bGwpOwp9CmNsYXNzIENNYXBGYWN0b3J5IHsKICBzdGF0aWMgYXN5bmMgY3JlYXRlKHsKICAgIGVuY29kaW5nLAogICAgZmV0Y2hCdWlsdEluQ01hcCwKICAgIHVzZUNNYXAKICB9KSB7CiAgICBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcChlbmNvZGluZy5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKTsKICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGNvbnN0IHBhcnNlZENNYXAgPSBhd2FpdCBwYXJzZUNNYXAobmV3IENNYXAoKSwgbmV3IExleGVyKGVuY29kaW5nKSwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCk7CiAgICAgIGlmIChwYXJzZWRDTWFwLmlzSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHBhcnNlZENNYXAubmFtZSwgZmV0Y2hCdWlsdEluQ01hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlZENNYXA7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoIkVuY29kaW5nIHJlcXVpcmVkLiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2hhcnNldHMuanMKY29uc3QgSVNPQWRvYmVDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iXTsKY29uc3QgRXhwZXJ0Q2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgInF1ZXN0aW9uc21hbGwiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJuc3VwZXJpb3IiLCAib3N1cGVyaW9yIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICJEb3RhY2NlbnRzbWFsbCIsICJNYWNyb25zbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCJdOwpjb25zdCBFeHBlcnRTdWJzZXRDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJoeXBoZW5zdXBlcmlvciIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiY2VudG9sZHN0eWxlIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiXTsKCjsvLyAuL3NyYy9jb3JlL2VuY29kaW5ncy5qcwpjb25zdCBFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICIiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgIiIsICIiLCAiIiwgImlzdXBlcmlvciIsICIiLCAiIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICIiLCAiIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIiIsICJEb3RhY2NlbnRzbWFsbCIsICIiLCAiIiwgIk1hY3JvbnNtYWxsIiwgIiIsICIiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICIiLCAiIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiemVyb3N1cGVyaW9yIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIl07CmNvbnN0IE1hY0V4cGVydEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbXNtYWxsIiwgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAiIiwgInF1ZXN0aW9uc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIkV0aHNtYWxsIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAiIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuaW5mZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgIiIsICIiLCAiYXN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICIiLCAiIiwgIiIsICIiLCAiQWFjdXRlc21hbGwiLCAiQWdyYXZlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT3RpbGRlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICIiLCAiZWlnaHRzdXBlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiU2Nhcm9uc21hbGwiLCAiIiwgImNlbnRpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICIiLCAiRGllcmVzaXNzbWFsbCIsICIiLCAiQ2Fyb25zbWFsbCIsICJvc3VwZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgIiIsICJjb21tYWluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgIllhY3V0ZXNtYWxsIiwgIiIsICJkb2xsYXJpbmZlcmlvciIsICIiLCAiIiwgIlRob3Juc21hbGwiLCAiIiwgIm5pbmVpbmZlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAiWmNhcm9uc21hbGwiLCAiQUVzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJxdWVzdGlvbmRvd25zbWFsbCIsICJvbmVpbmZlcmlvciIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJPRXNtYWxsIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd25zbWFsbCIsICIiLCAiWWRpZXJlc2lzc21hbGwiLCAiIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvc3VwZXJpb3IiLCAiIiwgImVzdXBlcmlvciIsICJyc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICIiLCAiaXN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJsc3VwZXJpb3IiLCAiT2dvbmVrc21hbGwiLCAiQnJldmVzbWFsbCIsICJNYWNyb25zbWFsbCIsICJic3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJjb21tYXN1cGVyaW9yIiwgInBlcmlvZHN1cGVyaW9yIiwgIkRvdGFjY2VudHNtYWxsIiwgIlJpbmdzbWFsbCIsICIiLCAiIiwgIiIsICIiXTsKY29uc3QgTWFjUm9tYW5FbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICIiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkNjZWRpbGxhIiwgIkVhY3V0ZSIsICJOdGlsZGUiLCAiT2RpZXJlc2lzIiwgIlVkaWVyZXNpcyIsICJhYWN1dGUiLCAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLCAiYXJpbmciLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVncmF2ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWFjdXRlIiwgImlncmF2ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm90aWxkZSIsICJ1YWN1dGUiLCAidWdyYXZlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJkYWdnZXIiLCAiZGVncmVlIiwgImNlbnQiLCAic3RlcmxpbmciLCAic2VjdGlvbiIsICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLCAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLCAidHJhZGVtYXJrIiwgImFjdXRlIiwgImRpZXJlc2lzIiwgIm5vdGVxdWFsIiwgIkFFIiwgIk9zbGFzaCIsICJpbmZpbml0eSIsICJwbHVzbWludXMiLCAibGVzc2VxdWFsIiwgImdyZWF0ZXJlcXVhbCIsICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLCAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwgImFlIiwgIm9zbGFzaCIsICJxdWVzdGlvbmRvd24iLCAiZXhjbGFtZG93biIsICJsb2dpY2Fsbm90IiwgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAic3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIl07CmNvbnN0IFN0YW5kYXJkRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgInF1b3RlbGVmdCIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICIiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAiIiwgInBhcmFncmFwaCIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAiIiwgInF1ZXN0aW9uZG93biIsICIiLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgIiIsICJyaW5nIiwgImNlZGlsbGEiLCAiIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJBRSIsICIiLCAib3JkZmVtaW5pbmUiLCAiIiwgIiIsICIiLCAiIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYWUiLCAiIiwgIiIsICIiLCAiZG90bGVzc2kiLCAiIiwgIiIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAiIiwgIiIsICIiLCAiIl07CmNvbnN0IFdpbkFuc2lFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJidWxsZXQiLCAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgImNpcmN1bWZsZXgiLCAicGVydGhvdXNhbmQiLCAiU2Nhcm9uIiwgImd1aWxzaW5nbGxlZnQiLCAiT0UiLCAiYnVsbGV0IiwgIlpjYXJvbiIsICJidWxsZXQiLCAiYnVsbGV0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgImJ1bGxldCIsICJlbmRhc2giLCAiZW1kYXNoIiwgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLCAic3BhY2UiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImN1cnJlbmN5IiwgInllbiIsICJicm9rZW5iYXIiLCAic2VjdGlvbiIsICJkaWVyZXNpcyIsICJjb3B5cmlnaHQiLCAib3JkZmVtaW5pbmUiLCAiZ3VpbGxlbW90bGVmdCIsICJsb2dpY2Fsbm90IiwgImh5cGhlbiIsICJyZWdpc3RlcmVkIiwgIm1hY3JvbiIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwgImNlZGlsbGEiLCAib25lc3VwZXJpb3IiLCAib3JkbWFzY3VsaW5lIiwgImd1aWxsZW1vdHJpZ2h0IiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93biIsICJBZ3JhdmUiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkF0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQUUiLCAiQ2NlZGlsbGEiLCAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiRXRoIiwgIk50aWxkZSIsICJPZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk90aWxkZSIsICJPZGllcmVzaXMiLCAibXVsdGlwbHkiLCAiT3NsYXNoIiwgIlVncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIllhY3V0ZSIsICJUaG9ybiIsICJnZXJtYW5kYmxzIiwgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsICJlZ3JhdmUiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJldGgiLCAibnRpbGRlIiwgIm9ncmF2ZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib3RpbGRlIiwgIm9kaWVyZXNpcyIsICJkaXZpZGUiLCAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiXTsKY29uc3QgU3ltYm9sU2V0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInVuaXZlcnNhbCIsICJudW1iZXJzaWduIiwgImV4aXN0ZW50aWFsIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInN1Y2h0aGF0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrbWF0aCIsICJwbHVzIiwgImNvbW1hIiwgIm1pbnVzIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiY29uZ3J1ZW50IiwgIkFscGhhIiwgIkJldGEiLCAiQ2hpIiwgIkRlbHRhIiwgIkVwc2lsb24iLCAiUGhpIiwgIkdhbW1hIiwgIkV0YSIsICJJb3RhIiwgInRoZXRhMSIsICJLYXBwYSIsICJMYW1iZGEiLCAiTXUiLCAiTnUiLCAiT21pY3JvbiIsICJQaSIsICJUaGV0YSIsICJSaG8iLCAiU2lnbWEiLCAiVGF1IiwgIlVwc2lsb24iLCAic2lnbWExIiwgIk9tZWdhIiwgIlhpIiwgIlBzaSIsICJaZXRhIiwgImJyYWNrZXRsZWZ0IiwgInRoZXJlZm9yZSIsICJicmFja2V0cmlnaHQiLCAicGVycGVuZGljdWxhciIsICJ1bmRlcnNjb3JlIiwgInJhZGljYWxleCIsICJhbHBoYSIsICJiZXRhIiwgImNoaSIsICJkZWx0YSIsICJlcHNpbG9uIiwgInBoaSIsICJnYW1tYSIsICJldGEiLCAiaW90YSIsICJwaGkxIiwgImthcHBhIiwgImxhbWJkYSIsICJtdSIsICJudSIsICJvbWljcm9uIiwgInBpIiwgInRoZXRhIiwgInJobyIsICJzaWdtYSIsICJ0YXUiLCAidXBzaWxvbiIsICJvbWVnYTEiLCAib21lZ2EiLCAieGkiLCAicHNpIiwgInpldGEiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgInNpbWlsYXIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiRXVybyIsICJVcHNpbG9uMSIsICJtaW51dGUiLCAibGVzc2VxdWFsIiwgImZyYWN0aW9uIiwgImluZmluaXR5IiwgImZsb3JpbiIsICJjbHViIiwgImRpYW1vbmQiLCAiaGVhcnQiLCAic3BhZGUiLCAiYXJyb3dib3RoIiwgImFycm93bGVmdCIsICJhcnJvd3VwIiwgImFycm93cmlnaHQiLCAiYXJyb3dkb3duIiwgImRlZ3JlZSIsICJwbHVzbWludXMiLCAic2Vjb25kIiwgImdyZWF0ZXJlcXVhbCIsICJtdWx0aXBseSIsICJwcm9wb3J0aW9uYWwiLCAicGFydGlhbGRpZmYiLCAiYnVsbGV0IiwgImRpdmlkZSIsICJub3RlcXVhbCIsICJlcXVpdmFsZW5jZSIsICJhcHByb3hlcXVhbCIsICJlbGxpcHNpcyIsICJhcnJvd3ZlcnRleCIsICJhcnJvd2hvcml6ZXgiLCAiY2FycmlhZ2VyZXR1cm4iLCAiYWxlcGgiLCAiSWZyYWt0dXIiLCAiUmZyYWt0dXIiLCAid2VpZXJzdHJhc3MiLCAiY2lyY2xlbXVsdGlwbHkiLCAiY2lyY2xlcGx1cyIsICJlbXB0eXNldCIsICJpbnRlcnNlY3Rpb24iLCAidW5pb24iLCAicHJvcGVyc3VwZXJzZXQiLCAicmVmbGV4c3VwZXJzZXQiLCAibm90c3Vic2V0IiwgInByb3BlcnN1YnNldCIsICJyZWZsZXhzdWJzZXQiLCAiZWxlbWVudCIsICJub3RlbGVtZW50IiwgImFuZ2xlIiwgImdyYWRpZW50IiwgInJlZ2lzdGVyc2VyaWYiLCAiY29weXJpZ2h0c2VyaWYiLCAidHJhZGVtYXJrc2VyaWYiLCAicHJvZHVjdCIsICJyYWRpY2FsIiwgImRvdG1hdGgiLCAibG9naWNhbG5vdCIsICJsb2dpY2FsYW5kIiwgImxvZ2ljYWxvciIsICJhcnJvd2RibGJvdGgiLCAiYXJyb3dkYmxsZWZ0IiwgImFycm93ZGJsdXAiLCAiYXJyb3dkYmxyaWdodCIsICJhcnJvd2RibGRvd24iLCAibG96ZW5nZSIsICJhbmdsZWxlZnQiLCAicmVnaXN0ZXJzYW5zIiwgImNvcHlyaWdodHNhbnMiLCAidHJhZGVtYXJrc2FucyIsICJzdW1tYXRpb24iLCAicGFyZW5sZWZ0dHAiLCAicGFyZW5sZWZ0ZXgiLCAicGFyZW5sZWZ0YnQiLCAiYnJhY2tldGxlZnR0cCIsICJicmFja2V0bGVmdGV4IiwgImJyYWNrZXRsZWZ0YnQiLCAiYnJhY2VsZWZ0dHAiLCAiYnJhY2VsZWZ0bWlkIiwgImJyYWNlbGVmdGJ0IiwgImJyYWNlZXgiLCAiIiwgImFuZ2xlcmlnaHQiLCAiaW50ZWdyYWwiLCAiaW50ZWdyYWx0cCIsICJpbnRlZ3JhbGV4IiwgImludGVncmFsYnQiLCAicGFyZW5yaWdodHRwIiwgInBhcmVucmlnaHRleCIsICJwYXJlbnJpZ2h0YnQiLCAiYnJhY2tldHJpZ2h0dHAiLCAiYnJhY2tldHJpZ2h0ZXgiLCAiYnJhY2tldHJpZ2h0YnQiLCAiYnJhY2VyaWdodHRwIiwgImJyYWNlcmlnaHRtaWQiLCAiYnJhY2VyaWdodGJ0IiwgIiJdOwpjb25zdCBaYXBmRGluZ2JhdHNFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJhMSIsICJhMiIsICJhMjAyIiwgImEzIiwgImE0IiwgImE1IiwgImExMTkiLCAiYTExOCIsICJhMTE3IiwgImExMSIsICJhMTIiLCAiYTEzIiwgImExNCIsICJhMTUiLCAiYTE2IiwgImExMDUiLCAiYTE3IiwgImExOCIsICJhMTkiLCAiYTIwIiwgImEyMSIsICJhMjIiLCAiYTIzIiwgImEyNCIsICJhMjUiLCAiYTI2IiwgImEyNyIsICJhMjgiLCAiYTYiLCAiYTciLCAiYTgiLCAiYTkiLCAiYTEwIiwgImEyOSIsICJhMzAiLCAiYTMxIiwgImEzMiIsICJhMzMiLCAiYTM0IiwgImEzNSIsICJhMzYiLCAiYTM3IiwgImEzOCIsICJhMzkiLCAiYTQwIiwgImE0MSIsICJhNDIiLCAiYTQzIiwgImE0NCIsICJhNDUiLCAiYTQ2IiwgImE0NyIsICJhNDgiLCAiYTQ5IiwgImE1MCIsICJhNTEiLCAiYTUyIiwgImE1MyIsICJhNTQiLCAiYTU1IiwgImE1NiIsICJhNTciLCAiYTU4IiwgImE1OSIsICJhNjAiLCAiYTYxIiwgImE2MiIsICJhNjMiLCAiYTY0IiwgImE2NSIsICJhNjYiLCAiYTY3IiwgImE2OCIsICJhNjkiLCAiYTcwIiwgImE3MSIsICJhNzIiLCAiYTczIiwgImE3NCIsICJhMjAzIiwgImE3NSIsICJhMjA0IiwgImE3NiIsICJhNzciLCAiYTc4IiwgImE3OSIsICJhODEiLCAiYTgyIiwgImE4MyIsICJhODQiLCAiYTk3IiwgImE5OCIsICJhOTkiLCAiYTEwMCIsICIiLCAiYTg5IiwgImE5MCIsICJhOTMiLCAiYTk0IiwgImE5MSIsICJhOTIiLCAiYTIwNSIsICJhODUiLCAiYTIwNiIsICJhODYiLCAiYTg3IiwgImE4OCIsICJhOTUiLCAiYTk2IiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJhMTAxIiwgImExMDIiLCAiYTEwMyIsICJhMTA0IiwgImExMDYiLCAiYTEwNyIsICJhMTA4IiwgImExMTIiLCAiYTExMSIsICJhMTEwIiwgImExMDkiLCAiYTEyMCIsICJhMTIxIiwgImExMjIiLCAiYTEyMyIsICJhMTI0IiwgImExMjUiLCAiYTEyNiIsICJhMTI3IiwgImExMjgiLCAiYTEyOSIsICJhMTMwIiwgImExMzEiLCAiYTEzMiIsICJhMTMzIiwgImExMzQiLCAiYTEzNSIsICJhMTM2IiwgImExMzciLCAiYTEzOCIsICJhMTM5IiwgImExNDAiLCAiYTE0MSIsICJhMTQyIiwgImExNDMiLCAiYTE0NCIsICJhMTQ1IiwgImExNDYiLCAiYTE0NyIsICJhMTQ4IiwgImExNDkiLCAiYTE1MCIsICJhMTUxIiwgImExNTIiLCAiYTE1MyIsICJhMTU0IiwgImExNTUiLCAiYTE1NiIsICJhMTU3IiwgImExNTgiLCAiYTE1OSIsICJhMTYwIiwgImExNjEiLCAiYTE2MyIsICJhMTY0IiwgImExOTYiLCAiYTE2NSIsICJhMTkyIiwgImExNjYiLCAiYTE2NyIsICJhMTY4IiwgImExNjkiLCAiYTE3MCIsICJhMTcxIiwgImExNzIiLCAiYTE3MyIsICJhMTYyIiwgImExNzQiLCAiYTE3NSIsICJhMTc2IiwgImExNzciLCAiYTE3OCIsICJhMTc5IiwgImExOTMiLCAiYTE4MCIsICJhMTk5IiwgImExODEiLCAiYTIwMCIsICJhMTgyIiwgIiIsICJhMjAxIiwgImExODMiLCAiYTE4NCIsICJhMTk3IiwgImExODUiLCAiYTE5NCIsICJhMTk4IiwgImExODYiLCAiYTE5NSIsICJhMTg3IiwgImExODgiLCAiYTE4OSIsICJhMTkwIiwgImExOTEiLCAiIl07CmZ1bmN0aW9uIGdldEVuY29kaW5nKGVuY29kaW5nTmFtZSkgewogIHN3aXRjaCAoZW5jb2RpbmdOYW1lKSB7CiAgICBjYXNlICJXaW5BbnNpRW5jb2RpbmciOgogICAgICByZXR1cm4gV2luQW5zaUVuY29kaW5nOwogICAgY2FzZSAiU3RhbmRhcmRFbmNvZGluZyI6CiAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nOwogICAgY2FzZSAiTWFjUm9tYW5FbmNvZGluZyI6CiAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nOwogICAgY2FzZSAiU3ltYm9sU2V0RW5jb2RpbmciOgogICAgICByZXR1cm4gU3ltYm9sU2V0RW5jb2Rpbmc7CiAgICBjYXNlICJaYXBmRGluZ2JhdHNFbmNvZGluZyI6CiAgICAgIHJldHVybiBaYXBmRGluZ2JhdHNFbmNvZGluZzsKICAgIGNhc2UgIkV4cGVydEVuY29kaW5nIjoKICAgICAgcmV0dXJuIEV4cGVydEVuY29kaW5nOwogICAgY2FzZSAiTWFjRXhwZXJ0RW5jb2RpbmciOgogICAgICByZXR1cm4gTWFjRXhwZXJ0RW5jb2Rpbmc7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NmZl9wYXJzZXIuanMKCgoKCmNvbnN0IE1BWF9TVUJSX05FU1RJTkcgPSAxMDsKY29uc3QgQ0ZGU3RhbmRhcmRTdHJpbmdzID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIiwgIjAwMS4wMDAiLCAiMDAxLjAwMSIsICIwMDEuMDAyIiwgIjAwMS4wMDMiLCAiQmxhY2siLCAiQm9sZCIsICJCb29rIiwgIkxpZ2h0IiwgIk1lZGl1bSIsICJSZWd1bGFyIiwgIlJvbWFuIiwgIlNlbWlib2xkIl07CmNvbnN0IE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA9IDM5MTsKY29uc3QgQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhID0gW251bGwsIHsKICBpZDogImhzdGVtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIG51bGwsIHsKICBpZDogInZzdGVtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIHsKICBpZDogInZtb3ZldG8iLAogIG1pbjogMSwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInJsaW5ldG8iLAogIG1pbjogMiwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImhsaW5ldG8iLAogIG1pbjogMSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInZsaW5ldG8iLAogIG1pbjogMSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJyY3VydmV0byIsCiAgbWluOiA2LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgbnVsbCwgewogIGlkOiAiY2FsbHN1YnIiLAogIG1pbjogMSwKICB1bmRlZlN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJldHVybiIsCiAgbWluOiAwLAogIHVuZGVmU3RhY2s6IHRydWUKfSwgbnVsbCwgbnVsbCwgewogIGlkOiAiZW5kY2hhciIsCiAgbWluOiAwLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiaHN0ZW1obSIsCiAgbWluOiAyLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgc3RlbTogdHJ1ZQp9LCB7CiAgaWQ6ICJoaW50bWFzayIsCiAgbWluOiAwLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUKfSwgewogIGlkOiAiY250cm1hc2siLAogIG1pbjogMCwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInJtb3ZldG8iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogImhtb3ZldG8iLAogIG1pbjogMSwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInZzdGVtaG0iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlLAogIHN0ZW06IHRydWUKfSwgewogIGlkOiAicmN1cnZlbGluZSIsCiAgbWluOiA4LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAicmxpbmVjdXJ2ZSIsCiAgbWluOiA4LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAidnZjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJoaGN1cnZldG8iLAogIG1pbjogNCwKICByZXNldFN0YWNrOiB0cnVlCn0sIG51bGwsIHsKICBpZDogImNhbGxnc3ViciIsCiAgbWluOiAxLAogIHVuZGVmU3RhY2s6IHRydWUKfSwgewogIGlkOiAidmhjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJodmN1cnZldG8iLAogIG1pbjogNCwKICByZXNldFN0YWNrOiB0cnVlCn1dOwpjb25zdCBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMiA9IFtudWxsLCBudWxsLCBudWxsLCB7CiAgaWQ6ICJhbmQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMQp9LCB7CiAgaWQ6ICJvciIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xCn0sIHsKICBpZDogIm5vdCIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDAKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiYWJzIiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJhZGQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMSwKICBzdGFja0ZuKHN0YWNrLCBpbmRleCkgewogICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKyBzdGFja1tpbmRleCAtIDFdOwogIH0KfSwgewogIGlkOiAic3ViIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdIC0gc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIHsKICBpZDogImRpdiIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAvIHN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCBudWxsLCB7CiAgaWQ6ICJuZWciLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDFdID0gLXN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCB7CiAgaWQ6ICJlcSIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xCn0sIG51bGwsIG51bGwsIHsKICBpZDogImRyb3AiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAtMQp9LCBudWxsLCB7CiAgaWQ6ICJwdXQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMgp9LCB7CiAgaWQ6ICJnZXQiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImlmZWxzZSIsCiAgbWluOiA0LAogIHN0YWNrRGVsdGE6IC0zCn0sIHsKICBpZDogInJhbmRvbSIsCiAgbWluOiAwLAogIHN0YWNrRGVsdGE6IDEKfSwgewogIGlkOiAibXVsIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdICogc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIG51bGwsIHsKICBpZDogInNxcnQiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImR1cCIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDEKfSwgewogIGlkOiAiZXhjaCIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IDAKfSwgewogIGlkOiAiaW5kZXgiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogInJvbGwiLAogIG1pbjogMywKICBzdGFja0RlbHRhOiAtMgp9LCBudWxsLCBudWxsLCBudWxsLCB7CiAgaWQ6ICJoZmxleCIsCiAgbWluOiA3LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiZmxleCIsCiAgbWluOiAxMywKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImhmbGV4MSIsCiAgbWluOiA5LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiZmxleDEiLAogIG1pbjogMTEsCiAgcmVzZXRTdGFjazogdHJ1ZQp9XTsKY2xhc3MgQ0ZGUGFyc2VyIHsKICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICB0aGlzLmJ5dGVzID0gZmlsZS5nZXRCeXRlcygpOwogICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzOwogICAgY29uc3QgY2ZmID0gbmV3IENGRigpOwogICAgdGhpcy5jZmYgPSBjZmY7CiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnBhcnNlSGVhZGVyKCk7CiAgICBjb25zdCBuYW1lSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoaGVhZGVyLmVuZFBvcyk7CiAgICBjb25zdCB0b3BEaWN0SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgobmFtZUluZGV4LmVuZFBvcyk7CiAgICBjb25zdCBzdHJpbmdJbmRleCA9IHRoaXMucGFyc2VJbmRleCh0b3BEaWN0SW5kZXguZW5kUG9zKTsKICAgIGNvbnN0IGdsb2JhbFN1YnJJbmRleCA9IHRoaXMucGFyc2VJbmRleChzdHJpbmdJbmRleC5lbmRQb3MpOwogICAgY29uc3QgdG9wRGljdFBhcnNlZCA9IHRoaXMucGFyc2VEaWN0KHRvcERpY3RJbmRleC5vYmouZ2V0KDApKTsKICAgIGNvbnN0IHRvcERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdG9wRGljdFBhcnNlZCwgY2ZmLnN0cmluZ3MpOwogICAgY2ZmLmhlYWRlciA9IGhlYWRlci5vYmo7CiAgICBjZmYubmFtZXMgPSB0aGlzLnBhcnNlTmFtZUluZGV4KG5hbWVJbmRleC5vYmopOwogICAgY2ZmLnN0cmluZ3MgPSB0aGlzLnBhcnNlU3RyaW5nSW5kZXgoc3RyaW5nSW5kZXgub2JqKTsKICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKICAgIGNmZi5nbG9iYWxTdWJySW5kZXggPSBnbG9iYWxTdWJySW5kZXgub2JqOwogICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGNmZi50b3BEaWN0KTsKICAgIGNmZi5pc0NJREZvbnQgPSB0b3BEaWN0Lmhhc05hbWUoIlJPUyIpOwogICAgY29uc3QgY2hhclN0cmluZ09mZnNldCA9IHRvcERpY3QuZ2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIpOwogICAgY29uc3QgY2hhclN0cmluZ0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KGNoYXJTdHJpbmdPZmZzZXQpLm9iajsKICAgIGNvbnN0IGZvbnRNYXRyaXggPSB0b3BEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpOwogICAgaWYgKGZvbnRNYXRyaXgpIHsKICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKICAgIH0KICAgIGNvbnN0IGZvbnRCQm94ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRCQm94Iik7CiAgICBpZiAoZm9udEJCb3gpIHsKICAgICAgcHJvcGVydGllcy5hc2NlbnQgPSBNYXRoLm1heChmb250QkJveFszXSwgZm9udEJCb3hbMV0pOwogICAgICBwcm9wZXJ0aWVzLmRlc2NlbnQgPSBNYXRoLm1pbihmb250QkJveFsxXSwgZm9udEJCb3hbM10pOwogICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICB9CiAgICBsZXQgY2hhcnNldCwgZW5jb2Rpbmc7CiAgICBpZiAoY2ZmLmlzQ0lERm9udCkgewogICAgICBjb25zdCBmZEFycmF5SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdC5nZXRCeU5hbWUoIkZEQXJyYXkiKSkub2JqOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmZEFycmF5SW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgY29uc3QgZGljdFJhdyA9IGZkQXJyYXlJbmRleC5nZXQoaSk7CiAgICAgICAgY29uc3QgZm9udERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdGhpcy5wYXJzZURpY3QoZGljdFJhdyksIGNmZi5zdHJpbmdzKTsKICAgICAgICB0aGlzLnBhcnNlUHJpdmF0ZURpY3QoZm9udERpY3QpOwogICAgICAgIGNmZi5mZEFycmF5LnB1c2goZm9udERpY3QpOwogICAgICB9CiAgICAgIGVuY29kaW5nID0gbnVsbDsKICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCB0cnVlKTsKICAgICAgY2ZmLmZkU2VsZWN0ID0gdGhpcy5wYXJzZUZEU2VsZWN0KHRvcERpY3QuZ2V0QnlOYW1lKCJGRFNlbGVjdCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQpOwogICAgfSBlbHNlIHsKICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCBmYWxzZSk7CiAgICAgIGVuY29kaW5nID0gdGhpcy5wYXJzZUVuY29kaW5nKHRvcERpY3QuZ2V0QnlOYW1lKCJFbmNvZGluZyIpLCBwcm9wZXJ0aWVzLCBjZmYuc3RyaW5ncywgY2hhcnNldC5jaGFyc2V0KTsKICAgIH0KICAgIGNmZi5jaGFyc2V0ID0gY2hhcnNldDsKICAgIGNmZi5lbmNvZGluZyA9IGVuY29kaW5nOwogICAgY29uc3QgY2hhclN0cmluZ3NBbmRTZWFjcyA9IHRoaXMucGFyc2VDaGFyU3RyaW5ncyh7CiAgICAgIGNoYXJTdHJpbmdzOiBjaGFyU3RyaW5nSW5kZXgsCiAgICAgIGxvY2FsU3VickluZGV4OiB0b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgsCiAgICAgIGdsb2JhbFN1YnJJbmRleDogZ2xvYmFsU3VickluZGV4Lm9iaiwKICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCwKICAgICAgZmRBcnJheTogY2ZmLmZkQXJyYXksCiAgICAgIHByaXZhdGVEaWN0OiB0b3BEaWN0LnByaXZhdGVEaWN0CiAgICB9KTsKICAgIGNmZi5jaGFyU3RyaW5ncyA9IGNoYXJTdHJpbmdzQW5kU2VhY3MuY2hhclN0cmluZ3M7CiAgICBjZmYuc2VhY3MgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLnNlYWNzOwogICAgY2ZmLndpZHRocyA9IGNoYXJTdHJpbmdzQW5kU2VhY3Mud2lkdGhzOwogICAgcmV0dXJuIGNmZjsKICB9CiAgcGFyc2VIZWFkZXIoKSB7CiAgICBsZXQgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIHdoaWxlIChvZmZzZXQgPCBieXRlc0xlbmd0aCAmJiBieXRlc1tvZmZzZXRdICE9PSAxKSB7CiAgICAgICsrb2Zmc2V0OwogICAgfQogICAgaWYgKG9mZnNldCA+PSBieXRlc0xlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgQ0ZGIGhlYWRlciIpOwogICAgfQogICAgaWYgKG9mZnNldCAhPT0gMCkgewogICAgICBpbmZvKCJjZmYgZGF0YSBpcyBzaGlmdGVkIik7CiAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0KTsKICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwogICAgfQogICAgY29uc3QgbWFqb3IgPSBieXRlc1swXTsKICAgIGNvbnN0IG1pbm9yID0gYnl0ZXNbMV07CiAgICBjb25zdCBoZHJTaXplID0gYnl0ZXNbMl07CiAgICBjb25zdCBvZmZTaXplID0gYnl0ZXNbM107CiAgICBjb25zdCBoZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSk7CiAgICByZXR1cm4gewogICAgICBvYmo6IGhlYWRlciwKICAgICAgZW5kUG9zOiBoZHJTaXplCiAgICB9OwogIH0KICBwYXJzZURpY3QoZGljdCkgewogICAgbGV0IHBvcyA9IDA7CiAgICBmdW5jdGlvbiBwYXJzZU9wZXJhbmQoKSB7CiAgICAgIGxldCB2YWx1ZSA9IGRpY3RbcG9zKytdOwogICAgICBpZiAodmFsdWUgPT09IDMwKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKCk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7CiAgICAgICAgdmFsdWUgPSByZWFkSW50MTYoZGljdCwgcG9zKTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI5KSB7CiAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIC0gMTM5OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTApIHsKICAgICAgICByZXR1cm4gKHZhbHVlIC0gMjQ3KSAqIDI1NiArIGRpY3RbcG9zKytdICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI1MSAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICByZXR1cm4gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGRpY3RbcG9zKytdIC0gMTA4OwogICAgICB9CiAgICAgIHdhcm4oJ0NGRlBhcnNlcl9wYXJzZURpY3Q6ICInICsgdmFsdWUgKyAnIiBpcyBhIHJlc2VydmVkIGNvbW1hbmQuJyk7CiAgICAgIHJldHVybiBOYU47CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUZsb2F0T3BlcmFuZCgpIHsKICAgICAgbGV0IHN0ciA9ICIiOwogICAgICBjb25zdCBlb2YgPSAxNTsKICAgICAgY29uc3QgbG9va3VwID0gWyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIi4iLCAiRSIsICJFLSIsIG51bGwsICItIl07CiAgICAgIGNvbnN0IGxlbmd0aCA9IGRpY3QubGVuZ3RoOwogICAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7CiAgICAgICAgY29uc3QgYiA9IGRpY3RbcG9zKytdOwogICAgICAgIGNvbnN0IGIxID0gYiA+PiA0OwogICAgICAgIGNvbnN0IGIyID0gYiAmIDE1OwogICAgICAgIGlmIChiMSA9PT0gZW9mKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyICs9IGxvb2t1cFtiMV07CiAgICAgICAgaWYgKGIyID09PSBlb2YpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHIgKz0gbG9va3VwW2IyXTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIpOwogICAgfQogICAgbGV0IG9wZXJhbmRzID0gW107CiAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICBwb3MgPSAwOwogICAgY29uc3QgZW5kID0gZGljdC5sZW5ndGg7CiAgICB3aGlsZSAocG9zIDwgZW5kKSB7CiAgICAgIGxldCBiID0gZGljdFtwb3NdOwogICAgICBpZiAoYiA8PSAyMSkgewogICAgICAgIGlmIChiID09PSAxMikgewogICAgICAgICAgYiA9IGIgPDwgOCB8IGRpY3RbKytwb3NdOwogICAgICAgIH0KICAgICAgICBlbnRyaWVzLnB1c2goW2IsIG9wZXJhbmRzXSk7CiAgICAgICAgb3BlcmFuZHMgPSBbXTsKICAgICAgICArK3BvczsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcGVyYW5kcy5wdXNoKHBhcnNlT3BlcmFuZCgpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIHBhcnNlSW5kZXgocG9zKSB7CiAgICBjb25zdCBjZmZJbmRleCA9IG5ldyBDRkZJbmRleCgpOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgIGNvbnN0IG9mZnNldHMgPSBbXTsKICAgIGxldCBlbmQgPSBwb3M7CiAgICBsZXQgaSwgaWk7CiAgICBpZiAoY291bnQgIT09IDApIHsKICAgICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGJ5dGVzW3BvcysrXTsKICAgICAgY29uc3Qgc3RhcnRQb3MgPSBwb3MgKyAoY291bnQgKyAxKSAqIG9mZnNldFNpemUgLSAxOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNvdW50ICsgMTsgaSA8IGlpOyArK2kpIHsKICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9mZnNldFNpemU7ICsraikgewogICAgICAgICAgb2Zmc2V0IDw8PSA4OwogICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzW3BvcysrXTsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0cy5wdXNoKHN0YXJ0UG9zICsgb2Zmc2V0KTsKICAgICAgfQogICAgICBlbmQgPSBvZmZzZXRzW2NvdW50XTsKICAgIH0KICAgIGZvciAoaSA9IDAsIGlpID0gb2Zmc2V0cy5sZW5ndGggLSAxOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBvZmZzZXRTdGFydCA9IG9mZnNldHNbaV07CiAgICAgIGNvbnN0IG9mZnNldEVuZCA9IG9mZnNldHNbaSArIDFdOwogICAgICBjZmZJbmRleC5hZGQoYnl0ZXMuc3ViYXJyYXkob2Zmc2V0U3RhcnQsIG9mZnNldEVuZCkpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb2JqOiBjZmZJbmRleCwKICAgICAgZW5kUG9zOiBlbmQKICAgIH07CiAgfQogIHBhcnNlTmFtZUluZGV4KGluZGV4KSB7CiAgICBjb25zdCBuYW1lcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBpbmRleC5nZXQoaSk7CiAgICAgIG5hbWVzLnB1c2goYnl0ZXNUb1N0cmluZyhuYW1lKSk7CiAgICB9CiAgICByZXR1cm4gbmFtZXM7CiAgfQogIHBhcnNlU3RyaW5nSW5kZXgoaW5kZXgpIHsKICAgIGNvbnN0IHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBpbmRleC5nZXQoaSk7CiAgICAgIHN0cmluZ3MuYWRkKGJ5dGVzVG9TdHJpbmcoZGF0YSkpOwogICAgfQogICAgcmV0dXJuIHN0cmluZ3M7CiAgfQogIGNyZWF0ZURpY3QoVHlwZSwgZGljdCwgc3RyaW5ncykgewogICAgY29uc3QgY2ZmRGljdCA9IG5ldyBUeXBlKHN0cmluZ3MpOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZGljdCkgewogICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIGNmZkRpY3Q7CiAgfQogIHBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgZGF0YSwgbG9jYWxTdWJySW5kZXgsIGdsb2JhbFN1YnJJbmRleCkgewogICAgaWYgKCFkYXRhIHx8IHN0YXRlLmNhbGxEZXB0aCA+IE1BWF9TVUJSX05FU1RJTkcpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbGV0IHN0YWNrU2l6ZSA9IHN0YXRlLnN0YWNrU2l6ZTsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgICBsZXQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbmd0aDspIHsKICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2orK107CiAgICAgIGxldCB2YWxpZGF0aW9uQ29tbWFuZCA9IG51bGw7CiAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKICAgICAgICBjb25zdCBxID0gZGF0YVtqKytdOwogICAgICAgIGlmIChxID09PSAwKSB7CiAgICAgICAgICBkYXRhW2ogLSAyXSA9IDEzOTsKICAgICAgICAgIGRhdGFbaiAtIDFdID0gMjI7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyW3FdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjgpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gcmVhZEludDE2KGRhdGEsIGopOwogICAgICAgIGogKz0gMjsKICAgICAgICBzdGFja1NpemUrKzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTQpIHsKICAgICAgICBpZiAoc3RhY2tTaXplID49IDQpIHsKICAgICAgICAgIHN0YWNrU2l6ZSAtPSA0OwogICAgICAgICAgaWYgKHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICBzdGF0ZS5zZWFjID0gc3RhY2suc2xpY2Uoc3RhY2tTaXplLCBzdGFja1NpemUgKyA0KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IHZhbHVlIC0gMTM5OwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgPCAyNTEgPyAodmFsdWUgLSAyNDcgPDwgOCkgKyBkYXRhW2pdICsgMTA4IDogLSh2YWx1ZSAtIDI1MSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7CiAgICAgICAgaisrOwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gKGRhdGFbal0gPDwgMjQgfCBkYXRhW2ogKyAxXSA8PCAxNiB8IGRhdGFbaiArIDJdIDw8IDggfCBkYXRhW2ogKyAzXSkgLyA2NTUzNjsKICAgICAgICBqICs9IDQ7CiAgICAgICAgc3RhY2tTaXplKys7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDE5IHx8IHZhbHVlID09PSAyMCkgewogICAgICAgIHN0YXRlLmhpbnRzICs9IHN0YWNrU2l6ZSA+PiAxOwogICAgICAgIGlmIChzdGF0ZS5oaW50cyA9PT0gMCkgewogICAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgICBqIC09IDE7CiAgICAgICAgICBsZW5ndGggLT0gMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBqICs9IHN0YXRlLmhpbnRzICsgNyA+PiAzOwogICAgICAgIHN0YWNrU2l6ZSAlPSAyOwogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTAgfHwgdmFsdWUgPT09IDI5KSB7CiAgICAgICAgY29uc3Qgc3VicnNJbmRleCA9IHZhbHVlID09PSAxMCA/IGxvY2FsU3VickluZGV4IDogZ2xvYmFsU3VickluZGV4OwogICAgICAgIGlmICghc3VicnNJbmRleCkgewogICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOwogICAgICAgICAgd2FybigiTWlzc2luZyBzdWJyc0luZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsZXQgYmlhcyA9IDMyNzY4OwogICAgICAgIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMTI0MCkgewogICAgICAgICAgYmlhcyA9IDEwNzsKICAgICAgICB9IGVsc2UgaWYgKHN1YnJzSW5kZXguY291bnQgPCAzMzkwMCkgewogICAgICAgICAgYmlhcyA9IDExMzE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1YnJOdW1iZXIgPSBzdGFja1stLXN0YWNrU2l6ZV0gKyBiaWFzOwogICAgICAgIGlmIChzdWJyTnVtYmVyIDwgMCB8fCBzdWJyTnVtYmVyID49IHN1YnJzSW5kZXguY291bnQgfHwgaXNOYU4oc3Vick51bWJlcikpIHsKICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgICAgIHdhcm4oIk91dCBvZiBib3VuZHMgc3VickluZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CiAgICAgICAgc3RhdGUuY2FsbERlcHRoKys7CiAgICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgc3VicnNJbmRleC5nZXQoc3Vick51bWJlciksIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpOwogICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGUuY2FsbERlcHRoLS07CiAgICAgICAgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMSkgewogICAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCAmJiBqID09PSBkYXRhLmxlbmd0aCkgewogICAgICAgIGRhdGFbaiAtIDFdID0gMTQ7CiAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbMTRdOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSA5KSB7CiAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgaiAtPSAxOwogICAgICAgIGxlbmd0aCAtPSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfQogICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHsKICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgewogICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7CiAgICAgICAgICBpZiAodmFsdWUgPT09IDMgfHwgdmFsdWUgPT09IDIzKSB7CiAgICAgICAgICAgIHN0YXRlLmhhc1ZTdGVtcyA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhhc1ZTdGVtcyAmJiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDE4KSkgewogICAgICAgICAgICB3YXJuKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKTsKICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJtaW4iIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CiAgICAgICAgICBpZiAoIXN0YXRlLnVuZGVmU3RhY2sgJiYgc3RhY2tTaXplIDwgdmFsaWRhdGlvbkNvbW1hbmQubWluKSB7CiAgICAgICAgICAgIHdhcm4oIk5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgIiArIHZhbGlkYXRpb25Db21tYW5kLmlkICsgIjsgYWN0dWFsOiAiICsgc3RhY2tTaXplICsgIiwgZXhwZWN0ZWQ6ICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5taW4pOwogICAgICAgICAgICBpZiAoc3RhY2tTaXplID09PSAwKSB7CiAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSAxNDsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgewogICAgICAgICAgc3RhdGUuZmlyc3RTdGFja0NsZWFyaW5nID0gZmFsc2U7CiAgICAgICAgICBzdGFja1NpemUgLT0gdmFsaWRhdGlvbkNvbW1hbmQubWluOwogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSAyICYmIHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHsKICAgICAgICAgICAgc3RhY2tTaXplICU9IDI7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrU2l6ZSA+IDEpIHsKICAgICAgICAgICAgd2FybigiRm91bmQgdG9vIG1hbnkgcGFyYW1ldGVycyBmb3Igc3RhY2stY2xlYXJpbmcgY29tbWFuZCIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+IDApIHsKICAgICAgICAgICAgc3RhdGUud2lkdGggPSBzdGFja1tzdGFja1NpemUgLSAxXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJzdGFja0RlbHRhIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgaWYgKCJzdGFja0ZuIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0ZuKHN0YWNrLCBzdGFja1NpemUpOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2tTaXplICs9IHZhbGlkYXRpb25Db21tYW5kLnN0YWNrRGVsdGE7CiAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQucmVzZXRTdGFjaykgewogICAgICAgICAgc3RhY2tTaXplID0gMDsKICAgICAgICAgIHN0YXRlLnVuZGVmU3RhY2sgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnVuZGVmU3RhY2spIHsKICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CiAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGxlbmd0aCA8IGRhdGEubGVuZ3RoKSB7CiAgICAgIGRhdGEuZmlsbCgxNCwgbGVuZ3RoKTsKICAgIH0KICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBwYXJzZUNoYXJTdHJpbmdzKHsKICAgIGNoYXJTdHJpbmdzLAogICAgbG9jYWxTdWJySW5kZXgsCiAgICBnbG9iYWxTdWJySW5kZXgsCiAgICBmZFNlbGVjdCwKICAgIGZkQXJyYXksCiAgICBwcml2YXRlRGljdAogIH0pIHsKICAgIGNvbnN0IHNlYWNzID0gW107CiAgICBjb25zdCB3aWR0aHMgPSBbXTsKICAgIGNvbnN0IGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgY29uc3Qgc3RhdGUgPSB7CiAgICAgICAgY2FsbERlcHRoOiAwLAogICAgICAgIHN0YWNrU2l6ZTogMCwKICAgICAgICBzdGFjazogW10sCiAgICAgICAgdW5kZWZTdGFjazogdHJ1ZSwKICAgICAgICBoaW50czogMCwKICAgICAgICBmaXJzdFN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgICAgICAgc2VhYzogbnVsbCwKICAgICAgICB3aWR0aDogbnVsbCwKICAgICAgICBoYXNWU3RlbXM6IGZhbHNlCiAgICAgIH07CiAgICAgIGxldCB2YWxpZCA9IHRydWU7CiAgICAgIGxldCBsb2NhbFN1YnJUb1VzZSA9IG51bGw7CiAgICAgIGxldCBwcml2YXRlRGljdFRvVXNlID0gcHJpdmF0ZURpY3Q7CiAgICAgIGlmIChmZFNlbGVjdCAmJiBmZEFycmF5Lmxlbmd0aCkgewogICAgICAgIGNvbnN0IGZkSW5kZXggPSBmZFNlbGVjdC5nZXRGREluZGV4KGkpOwogICAgICAgIGlmIChmZEluZGV4ID09PSAtMSkgewogICAgICAgICAgd2FybigiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgcHJpdmF0ZURpY3RUb1VzZSA9IGZkQXJyYXlbZmRJbmRleF0ucHJpdmF0ZURpY3Q7CiAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IHByaXZhdGVEaWN0VG9Vc2Uuc3VicnNJbmRleDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobG9jYWxTdWJySW5kZXgpIHsKICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IGxvY2FsU3VickluZGV4OwogICAgICB9CiAgICAgIGlmICh2YWxpZCkgewogICAgICAgIHZhbGlkID0gdGhpcy5wYXJzZUNoYXJTdHJpbmcoc3RhdGUsIGNoYXJzdHJpbmcsIGxvY2FsU3ViclRvVXNlLCBnbG9iYWxTdWJySW5kZXgpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS53aWR0aCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IG5vbWluYWxXaWR0aCA9IHByaXZhdGVEaWN0VG9Vc2UuZ2V0QnlOYW1lKCJub21pbmFsV2lkdGhYIik7CiAgICAgICAgd2lkdGhzW2ldID0gbm9taW5hbFdpZHRoICsgc3RhdGUud2lkdGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTsKICAgICAgICB3aWR0aHNbaV0gPSBkZWZhdWx0V2lkdGg7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnNlYWMgIT09IG51bGwpIHsKICAgICAgICBzZWFjc1tpXSA9IHN0YXRlLnNlYWM7CiAgICAgIH0KICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgIGNoYXJTdHJpbmdzLnNldChpLCBuZXcgVWludDhBcnJheShbMTRdKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGNoYXJTdHJpbmdzLAogICAgICBzZWFjcywKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBlbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpIHsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBbXSwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3Quc2V0QnlLZXkoMTgsIFswLCAwXSk7CiAgICBwYXJlbnREaWN0LnByaXZhdGVEaWN0ID0gcHJpdmF0ZURpY3Q7CiAgfQogIHBhcnNlUHJpdmF0ZURpY3QocGFyZW50RGljdCkgewogICAgaWYgKCFwYXJlbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVPZmZzZXQgPSBwYXJlbnREaWN0LmdldEJ5TmFtZSgiUHJpdmF0ZSIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHByaXZhdGVPZmZzZXQpIHx8IHByaXZhdGVPZmZzZXQubGVuZ3RoICE9PSAyKSB7CiAgICAgIHBhcmVudERpY3QucmVtb3ZlQnlOYW1lKCJQcml2YXRlIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHNpemUgPSBwcml2YXRlT2Zmc2V0WzBdOwogICAgY29uc3Qgb2Zmc2V0ID0gcHJpdmF0ZU9mZnNldFsxXTsKICAgIGlmIChzaXplID09PSAwIHx8IG9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVEaWN0RW5kID0gb2Zmc2V0ICsgc2l6ZTsKICAgIGNvbnN0IGRpY3REYXRhID0gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIHByaXZhdGVEaWN0RW5kKTsKICAgIGNvbnN0IGRpY3QgPSB0aGlzLnBhcnNlRGljdChkaWN0RGF0YSk7CiAgICBjb25zdCBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgZGljdCwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKICAgIGlmIChwcml2YXRlRGljdC5nZXRCeU5hbWUoIkV4cGFuc2lvbkZhY3RvciIpID09PSAwKSB7CiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZSgiRXhwYW5zaW9uRmFjdG9yIiwgMC4wNik7CiAgICB9CiAgICBpZiAoIXByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc09mZnNldCA9IHByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKTsKICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gb2Zmc2V0ICsgc3VicnNPZmZzZXQ7CiAgICBpZiAoc3VicnNPZmZzZXQgPT09IDAgfHwgcmVsYXRpdmVPZmZzZXQgPj0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KHJlbGF0aXZlT2Zmc2V0KTsKICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJyc0luZGV4Lm9iajsKICB9CiAgcGFyc2VDaGFyc2V0cyhwb3MsIGxlbmd0aCwgc3RyaW5ncywgY2lkKSB7CiAgICBpZiAocG9zID09PSAwKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLklTT19BRE9CRSwgSVNPQWRvYmVDaGFyc2V0KTsKICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLkVYUEVSVCwgRXhwZXJ0Q2hhcnNldCk7CiAgICB9IGVsc2UgaWYgKHBvcyA9PT0gMikgewogICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQodHJ1ZSwgQ0ZGQ2hhcnNldFByZWRlZmluZWRUeXBlcy5FWFBFUlRfU1VCU0VULCBFeHBlcnRTdWJzZXRDaGFyc2V0KTsKICAgIH0KICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHN0YXJ0ID0gcG9zOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgY2hhcnNldCA9IFtjaWQgPyAwIDogIi5ub3RkZWYiXTsKICAgIGxldCBpZCwgY291bnQsIGk7CiAgICBsZW5ndGggLT0gMTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQgOiBzdHJpbmdzLmdldChpZCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbGVuZ3RoKSB7CiAgICAgICAgICBpZCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgICAgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNoYXJzZXQgZm9ybWF0Iik7CiAgICB9CiAgICBjb25zdCBlbmQgPSBwb3M7CiAgICBjb25zdCByYXcgPSBieXRlcy5zdWJhcnJheShzdGFydCwgZW5kKTsKICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgZm9ybWF0LCBjaGFyc2V0LCByYXcpOwogIH0KICBwYXJzZUVuY29kaW5nKHBvcywgcHJvcGVydGllcywgc3RyaW5ncywgY2hhcnNldCkgewogICAgY29uc3QgZW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgbGV0IHByZWRlZmluZWQgPSBmYWxzZTsKICAgIGxldCBmb3JtYXQsIGksIGlpOwogICAgbGV0IHJhdyA9IG51bGw7CiAgICBmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpIHsKICAgICAgY29uc3Qgc3VwcGxlbWVudHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgZm9yIChpID0gMDsgaSA8IHN1cHBsZW1lbnRzQ291bnQ7IGkrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBieXRlc1twb3MrK107CiAgICAgICAgY29uc3Qgc2lkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSArIChieXRlc1twb3MrK10gJiAweGZmKTsKICAgICAgICBlbmNvZGluZ1tjb2RlXSA9IGNoYXJzZXQuaW5kZXhPZihzdHJpbmdzLmdldChzaWQpKTsKICAgICAgfQogICAgfQogICAgaWYgKHBvcyA9PT0gMCB8fCBwb3MgPT09IDEpIHsKICAgICAgcHJlZGVmaW5lZCA9IHRydWU7CiAgICAgIGZvcm1hdCA9IHBvczsKICAgICAgY29uc3QgYmFzZUVuY29kaW5nID0gcG9zID8gRXhwZXJ0RW5jb2RpbmcgOiBTdGFuZGFyZEVuY29kaW5nOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGluZGV4ID0gYmFzZUVuY29kaW5nLmluZGV4T2YoY2hhcnNldFtpXSk7CiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGRhdGFTdGFydCA9IHBvczsKICAgICAgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgICBzd2l0Y2ggKGZvcm1hdCAmIDB4N2YpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBjb25zdCBnbHlwaHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykgewogICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIGNvbnN0IHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgbGV0IGdpZCA9IDE7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykgewogICAgICAgICAgICBjb25zdCBzdGFydCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgY29uc3QgbGVmdCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IHN0YXJ0ICsgbGVmdDsgaisrKSB7CiAgICAgICAgICAgICAgZW5jb2Rpbmdbal0gPSBnaWQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICR7Zm9ybWF0fSBpbiBDRkZgKTsKICAgICAgfQogICAgICBjb25zdCBkYXRhRW5kID0gcG9zOwogICAgICBpZiAoZm9ybWF0ICYgMHg4MCkgewogICAgICAgIGJ5dGVzW2RhdGFTdGFydF0gJj0gMHg3ZjsKICAgICAgICByZWFkU3VwcGxlbWVudCgpOwogICAgICB9CiAgICAgIHJhdyA9IGJ5dGVzLnN1YmFycmF5KGRhdGFTdGFydCwgZGF0YUVuZCk7CiAgICB9CiAgICBmb3JtYXQgJj0gMHg3ZjsKICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTsKICB9CiAgcGFyc2VGRFNlbGVjdChwb3MsIGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgZmRTZWxlY3QgPSBbXTsKICAgIGxldCBpOwogICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgaWQgPSBieXRlc1twb3MrK107CiAgICAgICAgICBmZFNlbGVjdC5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBjb25zdCByYW5nZXNDb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXNDb3VudDsgKytpKSB7CiAgICAgICAgICBsZXQgZmlyc3QgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGlmIChpID09PSAwICYmIGZpcnN0ICE9PSAwKSB7CiAgICAgICAgICAgIHdhcm4oInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCIgKyAiIC0tIHRyeWluZyB0byByZWNvdmVyLiIpOwogICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBmZEluZGV4ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgY29uc3QgbmV4dCA9IGJ5dGVzW3Bvc10gPDwgOCB8IGJ5dGVzW3BvcyArIDFdOwogICAgICAgICAgZm9yIChsZXQgaiA9IGZpcnN0OyBqIDwgbmV4dDsgKytqKSB7CiAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goZmRJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcyArPSAyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgcGFyc2VGRFNlbGVjdDogVW5rbm93biBmb3JtYXQgIiR7Zm9ybWF0fSIuYCk7CiAgICB9CiAgICBpZiAoZmRTZWxlY3QubGVuZ3RoICE9PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ0ZGRkRTZWxlY3QoZm9ybWF0LCBmZFNlbGVjdCk7CiAgfQp9CmNsYXNzIENGRiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmhlYWRlciA9IG51bGw7CiAgICB0aGlzLm5hbWVzID0gW107CiAgICB0aGlzLnRvcERpY3QgPSBudWxsOwogICAgdGhpcy5zdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIHRoaXMuZ2xvYmFsU3VickluZGV4ID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOwogICAgdGhpcy5jaGFyc2V0ID0gbnVsbDsKICAgIHRoaXMuY2hhclN0cmluZ3MgPSBudWxsOwogICAgdGhpcy5mZEFycmF5ID0gW107CiAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDsKICAgIHRoaXMuaXNDSURGb250ID0gZmFsc2U7CiAgfQogIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKSB7CiAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkgewogICAgICB3YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZ2x5cGhaZXJvID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoMCk7CiAgICB0aGlzLmNoYXJTdHJpbmdzLmFkZChnbHlwaFplcm8pOwogICAgaWYgKHRoaXMuaXNDSURGb250KSB7CiAgICAgIHRoaXMuZmRTZWxlY3QuZmRTZWxlY3QucHVzaCh0aGlzLmZkU2VsZWN0LmZkU2VsZWN0WzBdKTsKICAgIH0KICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLmNoYXJTdHJpbmdzLmNvdW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IGdseXBoID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoaWQpOwogICAgcmV0dXJuIGdseXBoLmxlbmd0aCA+IDA7CiAgfQp9CmNsYXNzIENGRkhlYWRlciB7CiAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7CiAgICB0aGlzLm1ham9yID0gbWFqb3I7CiAgICB0aGlzLm1pbm9yID0gbWlub3I7CiAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplOwogICAgdGhpcy5vZmZTaXplID0gb2ZmU2l6ZTsKICB9Cn0KY2xhc3MgQ0ZGU3RyaW5ncyB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnN0cmluZ3MgPSBbXTsKICB9CiAgZ2V0KGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1MgLSAxKSB7CiAgICAgIHJldHVybiBDRkZTdGFuZGFyZFN0cmluZ3NbaW5kZXhdOwogICAgfQogICAgaWYgKGluZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIDw9IHRoaXMuc3RyaW5ncy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nc1tpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HU107CiAgICB9CiAgICByZXR1cm4gQ0ZGU3RhbmRhcmRTdHJpbmdzWzBdOwogIH0KICBnZXRTSUQoc3RyKSB7CiAgICBsZXQgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihzdHIpOwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICBpbmRleCA9IHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cik7CiAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgIHJldHVybiBpbmRleCArIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUzsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgYWRkKHZhbHVlKSB7CiAgICB0aGlzLnN0cmluZ3MucHVzaCh2YWx1ZSk7CiAgfQogIGdldCBjb3VudCgpIHsKICAgIHJldHVybiB0aGlzLnN0cmluZ3MubGVuZ3RoOwogIH0KfQpjbGFzcyBDRkZJbmRleCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9iamVjdHMgPSBbXTsKICAgIHRoaXMubGVuZ3RoID0gMDsKICB9CiAgYWRkKGRhdGEpIHsKICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5vYmplY3RzLnB1c2goZGF0YSk7CiAgfQogIHNldChpbmRleCwgZGF0YSkgewogICAgdGhpcy5sZW5ndGggKz0gZGF0YS5sZW5ndGggLSB0aGlzLm9iamVjdHNbaW5kZXhdLmxlbmd0aDsKICAgIHRoaXMub2JqZWN0c1tpbmRleF0gPSBkYXRhOwogIH0KICBnZXQoaW5kZXgpIHsKICAgIHJldHVybiB0aGlzLm9iamVjdHNbaW5kZXhdOwogIH0KICBnZXQgY291bnQoKSB7CiAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDsKICB9Cn0KY2xhc3MgQ0ZGRGljdCB7CiAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7CiAgICB0aGlzLmtleVRvTmFtZU1hcCA9IHRhYmxlcy5rZXlUb05hbWVNYXA7CiAgICB0aGlzLm5hbWVUb0tleU1hcCA9IHRhYmxlcy5uYW1lVG9LZXlNYXA7CiAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzOwogICAgdGhpcy50eXBlcyA9IHRhYmxlcy50eXBlczsKICAgIHRoaXMub3Bjb2RlcyA9IHRhYmxlcy5vcGNvZGVzOwogICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjsKICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICB0aGlzLnZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgfQogIHNldEJ5S2V5KGtleSwgdmFsdWUpIHsKICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGlmIChpc05hTih2YWwpKSB7CiAgICAgICAgd2FybihgSW52YWxpZCBDRkZEaWN0IHZhbHVlOiAiJHt2YWx1ZX0iIGZvciBrZXkgIiR7a2V5fSIuYCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzW2tleV07CiAgICBpZiAodHlwZSA9PT0gIm51bSIgfHwgdHlwZSA9PT0gInNpZCIgfHwgdHlwZSA9PT0gIm9mZnNldCIpIHsKICAgICAgdmFsdWUgPSB2YWx1ZVswXTsKICAgIH0KICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBzZXRCeU5hbWUobmFtZSwgdmFsdWUpIHsKICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgIiR7bmFtZX0iYCk7CiAgICB9CiAgICB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV0gPSB2YWx1ZTsKICB9CiAgaGFzTmFtZShuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV0gaW4gdGhpcy52YWx1ZXM7CiAgfQogIGdldEJ5TmFtZShuYW1lKSB7CiAgICBpZiAoIShuYW1lIGluIHRoaXMubmFtZVRvS2V5TWFwKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZGljdGlvbmFyeSBuYW1lICR7bmFtZX0iYCk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLm5hbWVUb0tleU1hcFtuYW1lXTsKICAgIGlmICghKGtleSBpbiB0aGlzLnZhbHVlcykpIHsKICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdHNba2V5XTsKICAgIH0KICAgIHJldHVybiB0aGlzLnZhbHVlc1trZXldOwogIH0KICByZW1vdmVCeU5hbWUobmFtZSkgewogICAgZGVsZXRlIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW25hbWVdXTsKICB9CiAgc3RhdGljIGNyZWF0ZVRhYmxlcyhsYXlvdXQpIHsKICAgIGNvbnN0IHRhYmxlcyA9IHsKICAgICAga2V5VG9OYW1lTWFwOiB7fSwKICAgICAgbmFtZVRvS2V5TWFwOiB7fSwKICAgICAgZGVmYXVsdHM6IHt9LAogICAgICB0eXBlczoge30sCiAgICAgIG9wY29kZXM6IHt9LAogICAgICBvcmRlcjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxheW91dCkgewogICAgICBjb25zdCBrZXkgPSBBcnJheS5pc0FycmF5KGVudHJ5WzBdKSA/IChlbnRyeVswXVswXSA8PCA4KSArIGVudHJ5WzBdWzFdIDogZW50cnlbMF07CiAgICAgIHRhYmxlcy5rZXlUb05hbWVNYXBba2V5XSA9IGVudHJ5WzFdOwogICAgICB0YWJsZXMubmFtZVRvS2V5TWFwW2VudHJ5WzFdXSA9IGtleTsKICAgICAgdGFibGVzLnR5cGVzW2tleV0gPSBlbnRyeVsyXTsKICAgICAgdGFibGVzLmRlZmF1bHRzW2tleV0gPSBlbnRyeVszXTsKICAgICAgdGFibGVzLm9wY29kZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gZW50cnlbMF0gOiBbZW50cnlbMF1dOwogICAgICB0YWJsZXMub3JkZXIucHVzaChrZXkpOwogICAgfQogICAgcmV0dXJuIHRhYmxlczsKICB9Cn0KY29uc3QgQ0ZGVG9wRGljdExheW91dCA9IFtbWzEyLCAzMF0sICJST1MiLCBbInNpZCIsICJzaWQiLCAibnVtIl0sIG51bGxdLCBbWzEyLCAyMF0sICJTeW50aGV0aWNCYXNlIiwgIm51bSIsIG51bGxdLCBbMCwgInZlcnNpb24iLCAic2lkIiwgbnVsbF0sIFsxLCAiTm90aWNlIiwgInNpZCIsIG51bGxdLCBbWzEyLCAwXSwgIkNvcHlyaWdodCIsICJzaWQiLCBudWxsXSwgWzIsICJGdWxsTmFtZSIsICJzaWQiLCBudWxsXSwgWzMsICJGYW1pbHlOYW1lIiwgInNpZCIsIG51bGxdLCBbNCwgIldlaWdodCIsICJzaWQiLCBudWxsXSwgW1sxMiwgMV0sICJpc0ZpeGVkUGl0Y2giLCAibnVtIiwgMF0sIFtbMTIsIDJdLCAiSXRhbGljQW5nbGUiLCAibnVtIiwgMF0sIFtbMTIsIDNdLCAiVW5kZXJsaW5lUG9zaXRpb24iLCAibnVtIiwgLTEwMF0sIFtbMTIsIDRdLCAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgIm51bSIsIDUwXSwgW1sxMiwgNV0sICJQYWludFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDZdLCAiQ2hhcnN0cmluZ1R5cGUiLCAibnVtIiwgMl0sIFtbMTIsIDddLCAiRm9udE1hdHJpeCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIiwgIm51bSIsICJudW0iXSwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF1dLCBbMTMsICJVbmlxdWVJRCIsICJudW0iLCBudWxsXSwgWzUsICJGb250QkJveCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIl0sIFswLCAwLCAwLCAwXV0sIFtbMTIsIDhdLCAiU3Ryb2tlV2lkdGgiLCAibnVtIiwgMF0sIFsxNCwgIlhVSUQiLCAiYXJyYXkiLCBudWxsXSwgWzE1LCAiY2hhcnNldCIsICJvZmZzZXQiLCAwXSwgWzE2LCAiRW5jb2RpbmciLCAib2Zmc2V0IiwgMF0sIFsxNywgIkNoYXJTdHJpbmdzIiwgIm9mZnNldCIsIDBdLCBbMTgsICJQcml2YXRlIiwgWyJvZmZzZXQiLCAib2Zmc2V0Il0sIG51bGxdLCBbWzEyLCAyMV0sICJQb3N0U2NyaXB0IiwgInNpZCIsIG51bGxdLCBbWzEyLCAyMl0sICJCYXNlRm9udE5hbWUiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDIzXSwgIkJhc2VGb250QmxlbmQiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMzFdLCAiQ0lERm9udFZlcnNpb24iLCAibnVtIiwgMF0sIFtbMTIsIDMyXSwgIkNJREZvbnRSZXZpc2lvbiIsICJudW0iLCAwXSwgW1sxMiwgMzNdLCAiQ0lERm9udFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDM0XSwgIkNJRENvdW50IiwgIm51bSIsIDg3MjBdLCBbWzEyLCAzNV0sICJVSURCYXNlIiwgIm51bSIsIG51bGxdLCBbWzEyLCAzN10sICJGRFNlbGVjdCIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzZdLCAiRkRBcnJheSIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzhdLCAiRm9udE5hbWUiLCAic2lkIiwgbnVsbF1dOwpjbGFzcyBDRkZUb3BEaWN0IGV4dGVuZHMgQ0ZGRGljdCB7CiAgc3RhdGljIGdldCB0YWJsZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ0YWJsZXMiLCB0aGlzLmNyZWF0ZVRhYmxlcyhDRkZUb3BEaWN0TGF5b3V0KSk7CiAgfQogIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHsKICAgIHN1cGVyKENGRlRvcERpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMucHJpdmF0ZURpY3QgPSBudWxsOwogIH0KfQpjb25zdCBDRkZQcml2YXRlRGljdExheW91dCA9IFtbNiwgIkJsdWVWYWx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzcsICJPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFs4LCAiRmFtaWx5Qmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzksICJGYW1pbHlPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDldLCAiQmx1ZVNjYWxlIiwgIm51bSIsIDAuMDM5NjI1XSwgW1sxMiwgMTBdLCAiQmx1ZVNoaWZ0IiwgIm51bSIsIDddLCBbWzEyLCAxMV0sICJCbHVlRnV6eiIsICJudW0iLCAxXSwgWzEwLCAiU3RkSFciLCAibnVtIiwgbnVsbF0sIFsxMSwgIlN0ZFZXIiwgIm51bSIsIG51bGxdLCBbWzEyLCAxMl0sICJTdGVtU25hcEgiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMTNdLCAiU3RlbVNuYXBWIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDE0XSwgIkZvcmNlQm9sZCIsICJudW0iLCAwXSwgW1sxMiwgMTddLCAiTGFuZ3VhZ2VHcm91cCIsICJudW0iLCAwXSwgW1sxMiwgMThdLCAiRXhwYW5zaW9uRmFjdG9yIiwgIm51bSIsIDAuMDZdLCBbWzEyLCAxOV0sICJpbml0aWFsUmFuZG9tU2VlZCIsICJudW0iLCAwXSwgWzIwLCAiZGVmYXVsdFdpZHRoWCIsICJudW0iLCAwXSwgWzIxLCAibm9taW5hbFdpZHRoWCIsICJudW0iLCAwXSwgWzE5LCAiU3VicnMiLCAib2Zmc2V0IiwgbnVsbF1dOwpjbGFzcyBDRkZQcml2YXRlRGljdCBleHRlbmRzIENGRkRpY3QgewogIHN0YXRpYyBnZXQgdGFibGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidGFibGVzIiwgdGhpcy5jcmVhdGVUYWJsZXMoQ0ZGUHJpdmF0ZURpY3RMYXlvdXQpKTsKICB9CiAgY29uc3RydWN0b3Ioc3RyaW5ncykgewogICAgc3VwZXIoQ0ZGUHJpdmF0ZURpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMuc3VicnNJbmRleCA9IG51bGw7CiAgfQp9CmNvbnN0IENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7CiAgSVNPX0FET0JFOiAwLAogIEVYUEVSVDogMSwKICBFWFBFUlRfU1VCU0VUOiAyCn07CmNsYXNzIENGRkNoYXJzZXQgewogIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgY2hhcnNldCwgcmF3KSB7CiAgICB0aGlzLnByZWRlZmluZWQgPSBwcmVkZWZpbmVkOwogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OwogICAgdGhpcy5yYXcgPSByYXc7CiAgfQp9CmNsYXNzIENGRkVuY29kaW5nIHsKICBjb25zdHJ1Y3RvcihwcmVkZWZpbmVkLCBmb3JtYXQsIGVuY29kaW5nLCByYXcpIHsKICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgIHRoaXMucmF3ID0gcmF3OwogIH0KfQpjbGFzcyBDRkZGRFNlbGVjdCB7CiAgY29uc3RydWN0b3IoZm9ybWF0LCBmZFNlbGVjdCkgewogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gZmRTZWxlY3Q7CiAgfQogIGdldEZESW5kZXgoZ2x5cGhJbmRleCkgewogICAgaWYgKGdseXBoSW5kZXggPCAwIHx8IGdseXBoSW5kZXggPj0gdGhpcy5mZFNlbGVjdC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuZmRTZWxlY3RbZ2x5cGhJbmRleF07CiAgfQp9CmNsYXNzIENGRk9mZnNldFRyYWNrZXIgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5vZmZzZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgaXNUcmFja2luZyhrZXkpIHsKICAgIHJldHVybiBrZXkgaW4gdGhpcy5vZmZzZXRzOwogIH0KICB0cmFjayhrZXksIGxvY2F0aW9uKSB7CiAgICBpZiAoa2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtrZXl9YCk7CiAgICB9CiAgICB0aGlzLm9mZnNldHNba2V5XSA9IGxvY2F0aW9uOwogIH0KICBvZmZzZXQodmFsdWUpIHsKICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aGlzLm9mZnNldHNba2V5XSArPSB2YWx1ZTsKICAgIH0KICB9CiAgc2V0RW50cnlMb2NhdGlvbihrZXksIHZhbHVlcywgb3V0cHV0KSB7CiAgICBpZiAoIShrZXkgaW4gdGhpcy5vZmZzZXRzKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYE5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAke2tleX1gKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBvdXRwdXQuZGF0YTsKICAgIGNvbnN0IGRhdGFPZmZzZXQgPSB0aGlzLm9mZnNldHNba2V5XTsKICAgIGNvbnN0IHNpemUgPSA1OwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3Qgb2Zmc2V0MCA9IGkgKiBzaXplICsgZGF0YU9mZnNldDsKICAgICAgY29uc3Qgb2Zmc2V0MSA9IG9mZnNldDAgKyAxOwogICAgICBjb25zdCBvZmZzZXQyID0gb2Zmc2V0MCArIDI7CiAgICAgIGNvbnN0IG9mZnNldDMgPSBvZmZzZXQwICsgMzsKICAgICAgY29uc3Qgb2Zmc2V0NCA9IG9mZnNldDAgKyA0OwogICAgICBpZiAoZGF0YVtvZmZzZXQwXSAhPT0gMHgxZCB8fCBkYXRhW29mZnNldDFdICE9PSAwIHx8IGRhdGFbb2Zmc2V0Ml0gIT09IDAgfHwgZGF0YVtvZmZzZXQzXSAhPT0gMCB8fCBkYXRhW29mZnNldDRdICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eSIpOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldOwogICAgICBkYXRhW29mZnNldDBdID0gMHgxZDsKICAgICAgZGF0YVtvZmZzZXQxXSA9IHZhbHVlID4+IDI0ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQyXSA9IHZhbHVlID4+IDE2ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQzXSA9IHZhbHVlID4+IDggJiAweGZmOwogICAgICBkYXRhW29mZnNldDRdID0gdmFsdWUgJiAweGZmOwogICAgfQogIH0KfQpjbGFzcyBDRkZDb21waWxlciB7CiAgY29uc3RydWN0b3IoY2ZmKSB7CiAgICB0aGlzLmNmZiA9IGNmZjsKICB9CiAgY29tcGlsZSgpIHsKICAgIGNvbnN0IGNmZiA9IHRoaXMuY2ZmOwogICAgY29uc3Qgb3V0cHV0ID0gewogICAgICBkYXRhOiBbXSwKICAgICAgbGVuZ3RoOiAwLAogICAgICBhZGQoZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmRhdGEucHVzaCguLi5kYXRhKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7CiAgICAgICAgfQogICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuY29tcGlsZUhlYWRlcihjZmYuaGVhZGVyKTsKICAgIG91dHB1dC5hZGQoaGVhZGVyKTsKICAgIGNvbnN0IG5hbWVJbmRleCA9IHRoaXMuY29tcGlsZU5hbWVJbmRleChjZmYubmFtZXMpOwogICAgb3V0cHV0LmFkZChuYW1lSW5kZXgpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgaWYgKGNmZi50b3BEaWN0Lmhhc05hbWUoIkZvbnRNYXRyaXgiKSkgewogICAgICAgIGNvbnN0IGJhc2UgPSBjZmYudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBjZmYudG9wRGljdC5yZW1vdmVCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBmb3IgKGNvbnN0IHN1YkRpY3Qgb2YgY2ZmLmZkQXJyYXkpIHsKICAgICAgICAgIGxldCBtYXRyaXggPSBiYXNlLnNsaWNlKDApOwogICAgICAgICAgaWYgKHN1YkRpY3QuaGFzTmFtZSgiRm9udE1hdHJpeCIpKSB7CiAgICAgICAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgc3ViRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBzdWJEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB4dWlkID0gY2ZmLnRvcERpY3QuZ2V0QnlOYW1lKCJYVUlEIik7CiAgICBpZiAoeHVpZD8ubGVuZ3RoID4gMTYpIHsKICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJYVUlEIik7CiAgICB9CiAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCAwKTsKICAgIGxldCBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKFtjZmYudG9wRGljdF0sIG91dHB1dC5sZW5ndGgsIGNmZi5pc0NJREZvbnQpOwogICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOwogICAgY29uc3QgdG9wRGljdFRyYWNrZXIgPSBjb21waWxlZC50cmFja2Vyc1swXTsKICAgIGNvbnN0IHN0cmluZ0luZGV4ID0gdGhpcy5jb21waWxlU3RyaW5nSW5kZXgoY2ZmLnN0cmluZ3Muc3RyaW5ncyk7CiAgICBvdXRwdXQuYWRkKHN0cmluZ0luZGV4KTsKICAgIGNvbnN0IGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGNmZi5nbG9iYWxTdWJySW5kZXgpOwogICAgb3V0cHV0LmFkZChnbG9iYWxTdWJySW5kZXgpOwogICAgaWYgKGNmZi5lbmNvZGluZyAmJiBjZmYudG9wRGljdC5oYXNOYW1lKCJFbmNvZGluZyIpKSB7CiAgICAgIGlmIChjZmYuZW5jb2RpbmcucHJlZGVmaW5lZCkgewogICAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIiwgW2NmZi5lbmNvZGluZy5mb3JtYXRdLCBvdXRwdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTsKICAgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKGVuY29kaW5nKTsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hhcnNldCA9IHRoaXMuY29tcGlsZUNoYXJzZXQoY2ZmLmNoYXJzZXQsIGNmZi5jaGFyU3RyaW5ncy5jb3VudCwgY2ZmLnN0cmluZ3MsIGNmZi5pc0NJREZvbnQpOwogICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhcnNldCk7CiAgICBjb25zdCBjaGFyU3RyaW5ncyA9IHRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGNmZi5jaGFyU3RyaW5ncyk7CiAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJDaGFyU3RyaW5ncyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhclN0cmluZ3MpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CiAgICAgIGNvbnN0IGZkU2VsZWN0ID0gdGhpcy5jb21waWxlRkRTZWxlY3QoY2ZmLmZkU2VsZWN0KTsKICAgICAgb3V0cHV0LmFkZChmZFNlbGVjdCk7CiAgICAgIGNvbXBpbGVkID0gdGhpcy5jb21waWxlVG9wRGljdHMoY2ZmLmZkQXJyYXksIG91dHB1dC5sZW5ndGgsIHRydWUpOwogICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJGREFycmF5IiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBjb21waWxlZC50cmFja2VyczsKICAgICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGNmZi5mZEFycmF5LCBmb250RGljdFRyYWNrZXJzLCBvdXRwdXQpOwogICAgfQogICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKFtjZmYudG9wRGljdF0sIFt0b3BEaWN0VHJhY2tlcl0sIG91dHB1dCk7CiAgICBvdXRwdXQuYWRkKFswXSk7CiAgICByZXR1cm4gb3V0cHV0LmRhdGE7CiAgfQogIGVuY29kZU51bWJlcih2YWx1ZSkgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CiAgICAgIHJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZW5jb2RlRmxvYXQodmFsdWUpOwogIH0KICBzdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRW5jb2RlRmxvYXRSZWdFeHAiLCAvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyk7CiAgfQogIGVuY29kZUZsb2F0KG51bSkgewogICAgbGV0IHZhbHVlID0gbnVtLnRvU3RyaW5nKCk7CiAgICBjb25zdCBtID0gQ0ZGQ29tcGlsZXIuRW5jb2RlRmxvYXRSZWdFeHAuZXhlYyh2YWx1ZSk7CiAgICBpZiAobSkgewogICAgICBjb25zdCBlcHNpbG9uID0gcGFyc2VGbG9hdCgiMWUiICsgKChtWzJdID8gK21bMl0gOiAwKSArIG1bMV0ubGVuZ3RoKSk7CiAgICAgIHZhbHVlID0gKE1hdGgucm91bmQobnVtICogZXBzaWxvbikgLyBlcHNpbG9uKS50b1N0cmluZygpOwogICAgfQogICAgbGV0IG5pYmJsZXMgPSAiIjsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBhID0gdmFsdWVbaV07CiAgICAgIGlmIChhID09PSAiZSIpIHsKICAgICAgICBuaWJibGVzICs9IHZhbHVlWysraV0gPT09ICItIiA/ICJjIiA6ICJiIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLiIpIHsKICAgICAgICBuaWJibGVzICs9ICJhIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLSIpIHsKICAgICAgICBuaWJibGVzICs9ICJlIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuaWJibGVzICs9IGE7CiAgICAgIH0KICAgIH0KICAgIG5pYmJsZXMgKz0gbmliYmxlcy5sZW5ndGggJiAxID8gImYiIDogImZmIjsKICAgIGNvbnN0IG91dCA9IFszMF07CiAgICBmb3IgKGkgPSAwLCBpaSA9IG5pYmJsZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBvdXQucHVzaChwYXJzZUludChuaWJibGVzLnN1YnN0cmluZyhpLCBpICsgMiksIDE2KSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBlbmNvZGVJbnRlZ2VyKHZhbHVlKSB7CiAgICBsZXQgY29kZTsKICAgIGlmICh2YWx1ZSA+PSAtMTA3ICYmIHZhbHVlIDw9IDEwNykgewogICAgICBjb2RlID0gW3ZhbHVlICsgMTM5XTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHsKICAgICAgdmFsdWUgLT0gMTA4OwogICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gLTExMzEgJiYgdmFsdWUgPD0gLTEwOCkgewogICAgICB2YWx1ZSA9IC12YWx1ZSAtIDEwODsKICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07CiAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0zMjc2OCAmJiB2YWx1ZSA8PSAzMjc2NykgewogICAgICBjb2RlID0gWzB4MWMsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOwogICAgfSBlbHNlIHsKICAgICAgY29kZSA9IFsweDFkLCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZl07CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9CiAgY29tcGlsZUhlYWRlcihoZWFkZXIpIHsKICAgIHJldHVybiBbaGVhZGVyLm1ham9yLCBoZWFkZXIubWlub3IsIDQsIGhlYWRlci5vZmZTaXplXTsKICB9CiAgY29tcGlsZU5hbWVJbmRleChuYW1lcykgewogICAgY29uc3QgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7CiAgICAgIGxldCBzYW5pdGl6ZWROYW1lID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICBsZXQgY2hhciA9IG5hbWVbal07CiAgICAgICAgaWYgKGNoYXIgPCAiISIgfHwgY2hhciA+ICJ+IiB8fCBjaGFyID09PSAiWyIgfHwgY2hhciA9PT0gIl0iIHx8IGNoYXIgPT09ICIoIiB8fCBjaGFyID09PSAiKSIgfHwgY2hhciA9PT0gInsiIHx8IGNoYXIgPT09ICJ9IiB8fCBjaGFyID09PSAiPCIgfHwgY2hhciA9PT0gIj4iIHx8IGNoYXIgPT09ICIvIiB8fCBjaGFyID09PSAiJSIpIHsKICAgICAgICAgIGNoYXIgPSAiXyI7CiAgICAgICAgfQogICAgICAgIHNhbml0aXplZE5hbWVbal0gPSBjaGFyOwogICAgICB9CiAgICAgIHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZWROYW1lLmpvaW4oIiIpOwogICAgICBpZiAoc2FuaXRpemVkTmFtZSA9PT0gIiIpIHsKICAgICAgICBzYW5pdGl6ZWROYW1lID0gIkJhZF9Gb250X05hbWUiOwogICAgICB9CiAgICAgIG5hbWVJbmRleC5hZGQoc3RyaW5nVG9CeXRlcyhzYW5pdGl6ZWROYW1lKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgobmFtZUluZGV4KTsKICB9CiAgY29tcGlsZVRvcERpY3RzKGRpY3RzLCBsZW5ndGgsIHJlbW92ZUNpZEtleXMpIHsKICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBbXTsKICAgIGxldCBmZEFycmF5SW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3QgZm9udERpY3Qgb2YgZGljdHMpIHsKICAgICAgaWYgKHJlbW92ZUNpZEtleXMpIHsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURGb250UmV2aXNpb24iKTsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRUeXBlIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpOwogICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiVUlEQmFzZSIpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IGZvbnREaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QoZm9udERpY3QsIGZvbnREaWN0VHJhY2tlcik7CiAgICAgIGZvbnREaWN0VHJhY2tlcnMucHVzaChmb250RGljdFRyYWNrZXIpOwogICAgICBmZEFycmF5SW5kZXguYWRkKGZvbnREaWN0RGF0YSk7CiAgICAgIGZvbnREaWN0VHJhY2tlci5vZmZzZXQobGVuZ3RoKTsKICAgIH0KICAgIGZkQXJyYXlJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGZkQXJyYXlJbmRleCwgZm9udERpY3RUcmFja2Vycyk7CiAgICByZXR1cm4gewogICAgICB0cmFja2VyczogZm9udERpY3RUcmFja2VycywKICAgICAgb3V0cHV0OiBmZEFycmF5SW5kZXgKICAgIH07CiAgfQogIGNvbXBpbGVQcml2YXRlRGljdHMoZGljdHMsIHRyYWNrZXJzLCBvdXRwdXQpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3QgZm9udERpY3QgPSBkaWN0c1tpXTsKICAgICAgY29uc3QgcHJpdmF0ZURpY3QgPSBmb250RGljdC5wcml2YXRlRGljdDsKICAgICAgaWYgKCFwcml2YXRlRGljdCB8fCAhZm9udERpY3QuaGFzTmFtZSgiUHJpdmF0ZSIpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpOwogICAgICB9CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QocHJpdmF0ZURpY3QsIHByaXZhdGVEaWN0VHJhY2tlcik7CiAgICAgIGxldCBvdXRwdXRMZW5ndGggPSBvdXRwdXQubGVuZ3RoOwogICAgICBwcml2YXRlRGljdFRyYWNrZXIub2Zmc2V0KG91dHB1dExlbmd0aCk7CiAgICAgIGlmICghcHJpdmF0ZURpY3REYXRhLmxlbmd0aCkgewogICAgICAgIG91dHB1dExlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgdHJhY2tlcnNbaV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoLCBvdXRwdXRMZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKHByaXZhdGVEaWN0RGF0YSk7CiAgICAgIGlmIChwcml2YXRlRGljdC5zdWJyc0luZGV4ICYmIHByaXZhdGVEaWN0Lmhhc05hbWUoIlN1YnJzIikpIHsKICAgICAgICBjb25zdCBzdWJycyA9IHRoaXMuY29tcGlsZUluZGV4KHByaXZhdGVEaWN0LnN1YnJzSW5kZXgpOwogICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJTdWJycyIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKHN1YnJzKTsKICAgICAgfQogICAgfQogIH0KICBjb21waWxlRGljdChkaWN0LCBvZmZzZXRUcmFja2VyKSB7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGRpY3Qub3JkZXIpIHsKICAgICAgaWYgKCEoa2V5IGluIGRpY3QudmFsdWVzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCB2YWx1ZXMgPSBkaWN0LnZhbHVlc1trZXldOwogICAgICBsZXQgdHlwZXMgPSBkaWN0LnR5cGVzW2tleV07CiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlcykpIHsKICAgICAgICB0eXBlcyA9IFt0eXBlc107CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHsKICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICAgICAgfQogICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHR5cGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbal07CiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbal07CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlICJudW0iOgogICAgICAgICAgY2FzZSAic2lkIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJvZmZzZXQiOgogICAgICAgICAgICBjb25zdCBuYW1lID0gZGljdC5rZXlUb05hbWVNYXBba2V5XTsKICAgICAgICAgICAgaWYgKCFvZmZzZXRUcmFja2VyLmlzVHJhY2tpbmcobmFtZSkpIHsKICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLnRyYWNrKG5hbWUsIG91dC5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dC5wdXNoKDB4MWQsIDAsIDAsIDAsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgIGNhc2UgImRlbHRhIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDEsIGtrID0gdmFsdWVzLmxlbmd0aDsgayA8IGtrOyArK2spIHsKICAgICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLmVuY29kZU51bWJlcih2YWx1ZXNba10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgb2YgJHt0eXBlfWApOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXQucHVzaCguLi5kaWN0Lm9wY29kZXNba2V5XSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBjb21waWxlU3RyaW5nSW5kZXgoc3RyaW5ncykgewogICAgY29uc3Qgc3RyaW5nSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3Qgc3RyaW5nIG9mIHN0cmluZ3MpIHsKICAgICAgc3RyaW5nSW5kZXguYWRkKHN0cmluZ1RvQnl0ZXMoc3RyaW5nKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgoc3RyaW5nSW5kZXgpOwogIH0KICBjb21waWxlQ2hhclN0cmluZ3MoY2hhclN0cmluZ3MpIHsKICAgIGNvbnN0IGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhclN0cmluZ3MuY291bnQ7IGkrKykgewogICAgICBjb25zdCBnbHlwaCA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgaWYgKGdseXBoLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKG5ldyBVaW50OEFycmF5KFsweDhiLCAweDBlXSkpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChjaGFyU3RyaW5nc0luZGV4KTsKICB9CiAgY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBzdHJpbmdzLCBpc0NJREZvbnQpIHsKICAgIGxldCBvdXQ7CiAgICBjb25zdCBudW1HbHlwaHNMZXNzTm90RGVmID0gbnVtR2x5cGhzIC0gMTsKICAgIGlmIChpc0NJREZvbnQpIHsKICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoWzIsIDAsIDAsIG51bUdseXBoc0xlc3NOb3REZWYgPj4gOCAmIDB4ZmYsIG51bUdseXBoc0xlc3NOb3REZWYgJiAweGZmXSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBsZW5ndGggPSAxICsgbnVtR2x5cGhzTGVzc05vdERlZiAqIDI7CiAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgICAgIG91dFswXSA9IDA7CiAgICAgIGxldCBjaGFyc2V0SW5kZXggPSAwOwogICAgICBjb25zdCBudW1DaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldC5sZW5ndGg7CiAgICAgIGxldCB3YXJuZWQgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBsZXQgc2lkID0gMDsKICAgICAgICBpZiAoY2hhcnNldEluZGV4IDwgbnVtQ2hhcnNldHMpIHsKICAgICAgICAgIGNvbnN0IG5hbWUgPSBjaGFyc2V0LmNoYXJzZXRbY2hhcnNldEluZGV4KytdOwogICAgICAgICAgc2lkID0gc3RyaW5ncy5nZXRTSUQobmFtZSk7CiAgICAgICAgICBpZiAoc2lkID09PSAtMSkgewogICAgICAgICAgICBzaWQgPSAwOwogICAgICAgICAgICBpZiAoIXdhcm5lZCkgewogICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CiAgICAgICAgICAgICAgd2FybihgQ291bGRuJ3QgZmluZCAke25hbWV9IGluIENGRiBzdHJpbmdzYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3V0W2ldID0gc2lkID4+IDggJiAweGZmOwogICAgICAgIG91dFtpICsgMV0gPSBzaWQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHsKICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGVuY29kaW5nLnJhdyk7CiAgfQogIGNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCkgewogICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0OwogICAgbGV0IG91dCwgaTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBvdXQgPSBuZXcgVWludDhBcnJheSgxICsgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoKTsKICAgICAgICBvdXRbMF0gPSBmb3JtYXQ7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBvdXRbaSArIDFdID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY29uc3Qgc3RhcnQgPSAwOwogICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTsKICAgICAgICBjb25zdCByYW5nZXMgPSBbZm9ybWF0LCAwLCAwLCBzdGFydCA+PiA4ICYgMHhmZiwgc3RhcnQgJiAweGZmLCBsYXN0RkRdOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY3VycmVudEZEID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHsKICAgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7CiAgICAgICAgICAgIGxhc3RGRCA9IGN1cnJlbnRGRDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7CiAgICAgICAgcmFuZ2VzWzFdID0gbnVtUmFuZ2VzID4+IDggJiAweGZmOwogICAgICAgIHJhbmdlc1syXSA9IG51bVJhbmdlcyAmIDB4ZmY7CiAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYpOwogICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHJhbmdlcyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkYXRhKTsKICB9CiAgY29tcGlsZUluZGV4KGluZGV4LCB0cmFja2VycyA9IFtdKSB7CiAgICBjb25zdCBvYmplY3RzID0gaW5kZXgub2JqZWN0czsKICAgIGNvbnN0IGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7CiAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgcmV0dXJuIFswLCAwXTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBbY291bnQgPj4gOCAmIDB4ZmYsIGNvdW50ICYgMHhmZl07CiAgICBsZXQgbGFzdE9mZnNldCA9IDEsCiAgICAgIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBsYXN0T2Zmc2V0ICs9IG9iamVjdHNbaV0ubGVuZ3RoOwogICAgfQogICAgbGV0IG9mZnNldFNpemU7CiAgICBpZiAobGFzdE9mZnNldCA8IDB4MTAwKSB7CiAgICAgIG9mZnNldFNpemUgPSAxOwogICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMjsKICAgIH0gZWxzZSBpZiAobGFzdE9mZnNldCA8IDB4MTAwMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMzsKICAgIH0gZWxzZSB7CiAgICAgIG9mZnNldFNpemUgPSA0OwogICAgfQogICAgZGF0YS5wdXNoKG9mZnNldFNpemUpOwogICAgbGV0IHJlbGF0aXZlT2Zmc2V0ID0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCArIDE7IGkrKykgewogICAgICBpZiAob2Zmc2V0U2l6ZSA9PT0gMSkgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgaWYgKG9mZnNldFNpemUgPT09IDIpIHsKICAgICAgICBkYXRhLnB1c2gocmVsYXRpdmVPZmZzZXQgPj4gOCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0U2l6ZSA9PT0gMykgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9CiAgICAgIGlmIChvYmplY3RzW2ldKSB7CiAgICAgICAgcmVsYXRpdmVPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlmICh0cmFja2Vyc1tpXSkgewogICAgICAgIHRyYWNrZXJzW2ldLm9mZnNldChkYXRhLmxlbmd0aCk7CiAgICAgIH0KICAgICAgZGF0YS5wdXNoKC4uLm9iamVjdHNbaV0pOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9nbHlwaGxpc3QuanMKCmNvbnN0IGdldEdseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkEgPSAweDAwNDE7CiAgdC5BRSA9IDB4MDBjNjsKICB0LkFFYWN1dGUgPSAweDAxZmM7CiAgdC5BRW1hY3JvbiA9IDB4MDFlMjsKICB0LkFFc21hbGwgPSAweGY3ZTY7CiAgdC5BYWN1dGUgPSAweDAwYzE7CiAgdC5BYWN1dGVzbWFsbCA9IDB4ZjdlMTsKICB0LkFicmV2ZSA9IDB4MDEwMjsKICB0LkFicmV2ZWFjdXRlID0gMHgxZWFlOwogIHQuQWJyZXZlY3lyaWxsaWMgPSAweDA0ZDA7CiAgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjsKICB0LkFicmV2ZWdyYXZlID0gMHgxZWIwOwogIHQuQWJyZXZlaG9va2Fib3ZlID0gMHgxZWIyOwogIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7CiAgdC5BY2Fyb24gPSAweDAxY2Q7CiAgdC5BY2lyY2xlID0gMHgyNGI2OwogIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7CiAgdC5BY2lyY3VtZmxleGFjdXRlID0gMHgxZWE0OwogIHQuQWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVhYzsKICB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7CiAgdC5BY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhODsKICB0LkFjaXJjdW1mbGV4c21hbGwgPSAweGY3ZTI7CiAgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhOwogIHQuQWN1dGUgPSAweGY2Yzk7CiAgdC5BY3V0ZXNtYWxsID0gMHhmN2I0OwogIHQuQWN5cmlsbGljID0gMHgwNDEwOwogIHQuQWRibGdyYXZlID0gMHgwMjAwOwogIHQuQWRpZXJlc2lzID0gMHgwMGM0OwogIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7CiAgdC5BZGllcmVzaXNtYWNyb24gPSAweDAxZGU7CiAgdC5BZGllcmVzaXNzbWFsbCA9IDB4ZjdlNDsKICB0LkFkb3RiZWxvdyA9IDB4MWVhMDsKICB0LkFkb3RtYWNyb24gPSAweDAxZTA7CiAgdC5BZ3JhdmUgPSAweDAwYzA7CiAgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDsKICB0LkFob29rYWJvdmUgPSAweDFlYTI7CiAgdC5BaWVjeXJpbGxpYyA9IDB4MDRkNDsKICB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyOwogIHQuQWxwaGEgPSAweDAzOTE7CiAgdC5BbHBoYXRvbm9zID0gMHgwMzg2OwogIHQuQW1hY3JvbiA9IDB4MDEwMDsKICB0LkFtb25vc3BhY2UgPSAweGZmMjE7CiAgdC5Bb2dvbmVrID0gMHgwMTA0OwogIHQuQXJpbmcgPSAweDAwYzU7CiAgdC5BcmluZ2FjdXRlID0gMHgwMWZhOwogIHQuQXJpbmdiZWxvdyA9IDB4MWUwMDsKICB0LkFyaW5nc21hbGwgPSAweGY3ZTU7CiAgdC5Bc21hbGwgPSAweGY3NjE7CiAgdC5BdGlsZGUgPSAweDAwYzM7CiAgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMzsKICB0LkF5YmFybWVuaWFuID0gMHgwNTMxOwogIHQuQiA9IDB4MDA0MjsKICB0LkJjaXJjbGUgPSAweDI0Yjc7CiAgdC5CZG90YWNjZW50ID0gMHgxZTAyOwogIHQuQmRvdGJlbG93ID0gMHgxZTA0OwogIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTsKICB0LkJlbmFybWVuaWFuID0gMHgwNTMyOwogIHQuQmV0YSA9IDB4MDM5MjsKICB0LkJob29rID0gMHgwMTgxOwogIHQuQmxpbmViZWxvdyA9IDB4MWUwNjsKICB0LkJtb25vc3BhY2UgPSAweGZmMjI7CiAgdC5CcmV2ZXNtYWxsID0gMHhmNmY0OwogIHQuQnNtYWxsID0gMHhmNzYyOwogIHQuQnRvcGJhciA9IDB4MDE4MjsKICB0LkMgPSAweDAwNDM7CiAgdC5DYWFybWVuaWFuID0gMHgwNTNlOwogIHQuQ2FjdXRlID0gMHgwMTA2OwogIHQuQ2Fyb24gPSAweGY2Y2E7CiAgdC5DYXJvbnNtYWxsID0gMHhmNmY1OwogIHQuQ2Nhcm9uID0gMHgwMTBjOwogIHQuQ2NlZGlsbGEgPSAweDAwYzc7CiAgdC5DY2VkaWxsYWFjdXRlID0gMHgxZTA4OwogIHQuQ2NlZGlsbGFzbWFsbCA9IDB4ZjdlNzsKICB0LkNjaXJjbGUgPSAweDI0Yjg7CiAgdC5DY2lyY3VtZmxleCA9IDB4MDEwODsKICB0LkNkb3QgPSAweDAxMGE7CiAgdC5DZG90YWNjZW50ID0gMHgwMTBhOwogIHQuQ2VkaWxsYXNtYWxsID0gMHhmN2I4OwogIHQuQ2hhYXJtZW5pYW4gPSAweDA1NDk7CiAgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYzsKICB0LkNoZWN5cmlsbGljID0gMHgwNDI3OwogIHQuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmU7CiAgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjsKICB0LkNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjQ7CiAgdC5DaGVoYXJtZW5pYW4gPSAweDA1NDM7CiAgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7CiAgdC5DaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI4OwogIHQuQ2hpID0gMHgwM2E3OwogIHQuQ2hvb2sgPSAweDAxODc7CiAgdC5DaXJjdW1mbGV4c21hbGwgPSAweGY2ZjY7CiAgdC5DbW9ub3NwYWNlID0gMHhmZjIzOwogIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTsKICB0LkNzbWFsbCA9IDB4Zjc2MzsKICB0LkQgPSAweDAwNDQ7CiAgdC5EWiA9IDB4MDFmMTsKICB0LkRaY2Fyb24gPSAweDAxYzQ7CiAgdC5EYWFybWVuaWFuID0gMHgwNTM0OwogIHQuRGFmcmljYW4gPSAweDAxODk7CiAgdC5EY2Fyb24gPSAweDAxMGU7CiAgdC5EY2VkaWxsYSA9IDB4MWUxMDsKICB0LkRjaXJjbGUgPSAweDI0Yjk7CiAgdC5EY2lyY3VtZmxleGJlbG93ID0gMHgxZTEyOwogIHQuRGNyb2F0ID0gMHgwMTEwOwogIHQuRGRvdGFjY2VudCA9IDB4MWUwYTsKICB0LkRkb3RiZWxvdyA9IDB4MWUwYzsKICB0LkRlY3lyaWxsaWMgPSAweDA0MTQ7CiAgdC5EZWljb3B0aWMgPSAweDAzZWU7CiAgdC5EZWx0YSA9IDB4MjIwNjsKICB0LkRlbHRhZ3JlZWsgPSAweDAzOTQ7CiAgdC5EaG9vayA9IDB4MDE4YTsKICB0LkRpZXJlc2lzID0gMHhmNmNiOwogIHQuRGllcmVzaXNBY3V0ZSA9IDB4ZjZjYzsKICB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7CiAgdC5EaWVyZXNpc3NtYWxsID0gMHhmN2E4OwogIHQuRGlnYW1tYWdyZWVrID0gMHgwM2RjOwogIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7CiAgdC5EbGluZWJlbG93ID0gMHgxZTBlOwogIHQuRG1vbm9zcGFjZSA9IDB4ZmYyNDsKICB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3OwogIHQuRHNsYXNoID0gMHgwMTEwOwogIHQuRHNtYWxsID0gMHhmNzY0OwogIHQuRHRvcGJhciA9IDB4MDE4YjsKICB0LkR6ID0gMHgwMWYyOwogIHQuRHpjYXJvbiA9IDB4MDFjNTsKICB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwOwogIHQuRHplY3lyaWxsaWMgPSAweDA0MDU7CiAgdC5EemhlY3lyaWxsaWMgPSAweDA0MGY7CiAgdC5FID0gMHgwMDQ1OwogIHQuRWFjdXRlID0gMHgwMGM5OwogIHQuRWFjdXRlc21hbGwgPSAweGY3ZTk7CiAgdC5FYnJldmUgPSAweDAxMTQ7CiAgdC5FY2Fyb24gPSAweDAxMWE7CiAgdC5FY2VkaWxsYWJyZXZlID0gMHgxZTFjOwogIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7CiAgdC5FY2lyY2xlID0gMHgyNGJhOwogIHQuRWNpcmN1bWZsZXggPSAweDAwY2E7CiAgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlOwogIHQuRWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxODsKICB0LkVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzY7CiAgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwOwogIHQuRWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzI7CiAgdC5FY2lyY3VtZmxleHNtYWxsID0gMHhmN2VhOwogIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDsKICB0LkVjeXJpbGxpYyA9IDB4MDQwNDsKICB0LkVkYmxncmF2ZSA9IDB4MDIwNDsKICB0LkVkaWVyZXNpcyA9IDB4MDBjYjsKICB0LkVkaWVyZXNpc3NtYWxsID0gMHhmN2ViOwogIHQuRWRvdCA9IDB4MDExNjsKICB0LkVkb3RhY2NlbnQgPSAweDAxMTY7CiAgdC5FZG90YmVsb3cgPSAweDFlYjg7CiAgdC5FZmN5cmlsbGljID0gMHgwNDI0OwogIHQuRWdyYXZlID0gMHgwMGM4OwogIHQuRWdyYXZlc21hbGwgPSAweGY3ZTg7CiAgdC5FaGFybWVuaWFuID0gMHgwNTM3OwogIHQuRWhvb2thYm92ZSA9IDB4MWViYTsKICB0LkVpZ2h0cm9tYW4gPSAweDIxNjc7CiAgdC5FaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNjsKICB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0OwogIHQuRWxjeXJpbGxpYyA9IDB4MDQxYjsKICB0LkVsZXZlbnJvbWFuID0gMHgyMTZhOwogIHQuRW1hY3JvbiA9IDB4MDExMjsKICB0LkVtYWNyb25hY3V0ZSA9IDB4MWUxNjsKICB0LkVtYWNyb25ncmF2ZSA9IDB4MWUxNDsKICB0LkVtY3lyaWxsaWMgPSAweDA0MWM7CiAgdC5FbW9ub3NwYWNlID0gMHhmZjI1OwogIHQuRW5jeXJpbGxpYyA9IDB4MDQxZDsKICB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7CiAgdC5FbmcgPSAweDAxNGE7CiAgdC5FbmdoZWN5cmlsbGljID0gMHgwNGE0OwogIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7CiAgdC5Fb2dvbmVrID0gMHgwMTE4OwogIHQuRW9wZW4gPSAweDAxOTA7CiAgdC5FcHNpbG9uID0gMHgwMzk1OwogIHQuRXBzaWxvbnRvbm9zID0gMHgwMzg4OwogIHQuRXJjeXJpbGxpYyA9IDB4MDQyMDsKICB0LkVyZXZlcnNlZCA9IDB4MDE4ZTsKICB0LkVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDJkOwogIHQuRXNjeXJpbGxpYyA9IDB4MDQyMTsKICB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7CiAgdC5Fc2ggPSAweDAxYTk7CiAgdC5Fc21hbGwgPSAweGY3NjU7CiAgdC5FdGEgPSAweDAzOTc7CiAgdC5FdGFybWVuaWFuID0gMHgwNTM4OwogIHQuRXRhdG9ub3MgPSAweDAzODk7CiAgdC5FdGggPSAweDAwZDA7CiAgdC5FdGhzbWFsbCA9IDB4ZjdmMDsKICB0LkV0aWxkZSA9IDB4MWViYzsKICB0LkV0aWxkZWJlbG93ID0gMHgxZTFhOwogIHQuRXVybyA9IDB4MjBhYzsKICB0LkV6aCA9IDB4MDFiNzsKICB0LkV6aGNhcm9uID0gMHgwMWVlOwogIHQuRXpocmV2ZXJzZWQgPSAweDAxYjg7CiAgdC5GID0gMHgwMDQ2OwogIHQuRmNpcmNsZSA9IDB4MjRiYjsKICB0LkZkb3RhY2NlbnQgPSAweDFlMWU7CiAgdC5GZWhhcm1lbmlhbiA9IDB4MDU1NjsKICB0LkZlaWNvcHRpYyA9IDB4MDNlNDsKICB0LkZob29rID0gMHgwMTkxOwogIHQuRml0YWN5cmlsbGljID0gMHgwNDcyOwogIHQuRml2ZXJvbWFuID0gMHgyMTY0OwogIHQuRm1vbm9zcGFjZSA9IDB4ZmYyNjsKICB0LkZvdXJyb21hbiA9IDB4MjE2MzsKICB0LkZzbWFsbCA9IDB4Zjc2NjsKICB0LkcgPSAweDAwNDc7CiAgdC5HQnNxdWFyZSA9IDB4MzM4NzsKICB0LkdhY3V0ZSA9IDB4MDFmNDsKICB0LkdhbW1hID0gMHgwMzkzOwogIHQuR2FtbWFhZnJpY2FuID0gMHgwMTk0OwogIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhOwogIHQuR2JyZXZlID0gMHgwMTFlOwogIHQuR2Nhcm9uID0gMHgwMWU2OwogIHQuR2NlZGlsbGEgPSAweDAxMjI7CiAgdC5HY2lyY2xlID0gMHgyNGJjOwogIHQuR2NpcmN1bWZsZXggPSAweDAxMWM7CiAgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7CiAgdC5HZG90ID0gMHgwMTIwOwogIHQuR2RvdGFjY2VudCA9IDB4MDEyMDsKICB0LkdlY3lyaWxsaWMgPSAweDA0MTM7CiAgdC5HaGFkYXJtZW5pYW4gPSAweDA1NDI7CiAgdC5HaGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTQ7CiAgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjsKICB0LkdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkwOwogIHQuR2hvb2sgPSAweDAxOTM7CiAgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMzsKICB0LkdqZWN5cmlsbGljID0gMHgwNDAzOwogIHQuR21hY3JvbiA9IDB4MWUyMDsKICB0Lkdtb25vc3BhY2UgPSAweGZmMjc7CiAgdC5HcmF2ZSA9IDB4ZjZjZTsKICB0LkdyYXZlc21hbGwgPSAweGY3NjA7CiAgdC5Hc21hbGwgPSAweGY3Njc7CiAgdC5Hc21hbGxob29rID0gMHgwMjliOwogIHQuR3N0cm9rZSA9IDB4MDFlNDsKICB0LkggPSAweDAwNDg7CiAgdC5IMTg1MzMgPSAweDI1Y2Y7CiAgdC5IMTg1NDMgPSAweDI1YWE7CiAgdC5IMTg1NTEgPSAweDI1YWI7CiAgdC5IMjIwNzMgPSAweDI1YTE7CiAgdC5IUHNxdWFyZSA9IDB4MzNjYjsKICB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7CiAgdC5IYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIyOwogIHQuSGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQyYTsKICB0LkhiYXIgPSAweDAxMjY7CiAgdC5IYnJldmViZWxvdyA9IDB4MWUyYTsKICB0LkhjZWRpbGxhID0gMHgxZTI4OwogIHQuSGNpcmNsZSA9IDB4MjRiZDsKICB0LkhjaXJjdW1mbGV4ID0gMHgwMTI0OwogIHQuSGRpZXJlc2lzID0gMHgxZTI2OwogIHQuSGRvdGFjY2VudCA9IDB4MWUyMjsKICB0Lkhkb3RiZWxvdyA9IDB4MWUyNDsKICB0Lkhtb25vc3BhY2UgPSAweGZmMjg7CiAgdC5Ib2FybWVuaWFuID0gMHgwNTQwOwogIHQuSG9yaWNvcHRpYyA9IDB4MDNlODsKICB0LkhzbWFsbCA9IDB4Zjc2ODsKICB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjsKICB0Lkh1bmdhcnVtbGF1dHNtYWxsID0gMHhmNmY4OwogIHQuSHpzcXVhcmUgPSAweDMzOTA7CiAgdC5JID0gMHgwMDQ5OwogIHQuSUFjeXJpbGxpYyA9IDB4MDQyZjsKICB0LklKID0gMHgwMTMyOwogIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTsKICB0LklhY3V0ZSA9IDB4MDBjZDsKICB0LklhY3V0ZXNtYWxsID0gMHhmN2VkOwogIHQuSWJyZXZlID0gMHgwMTJjOwogIHQuSWNhcm9uID0gMHgwMWNmOwogIHQuSWNpcmNsZSA9IDB4MjRiZTsKICB0LkljaXJjdW1mbGV4ID0gMHgwMGNlOwogIHQuSWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlZTsKICB0LkljeXJpbGxpYyA9IDB4MDQwNjsKICB0LklkYmxncmF2ZSA9IDB4MDIwODsKICB0LklkaWVyZXNpcyA9IDB4MDBjZjsKICB0LklkaWVyZXNpc2FjdXRlID0gMHgxZTJlOwogIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7CiAgdC5JZGllcmVzaXNzbWFsbCA9IDB4ZjdlZjsKICB0Lklkb3QgPSAweDAxMzA7CiAgdC5JZG90YWNjZW50ID0gMHgwMTMwOwogIHQuSWRvdGJlbG93ID0gMHgxZWNhOwogIHQuSWVicmV2ZWN5cmlsbGljID0gMHgwNGQ2OwogIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTsKICB0LklmcmFrdHVyID0gMHgyMTExOwogIHQuSWdyYXZlID0gMHgwMGNjOwogIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7CiAgdC5JaG9va2Fib3ZlID0gMHgxZWM4OwogIHQuSWljeXJpbGxpYyA9IDB4MDQxODsKICB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhOwogIHQuSWlzaG9ydGN5cmlsbGljID0gMHgwNDE5OwogIHQuSW1hY3JvbiA9IDB4MDEyYTsKICB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjsKICB0Lkltb25vc3BhY2UgPSAweGZmMjk7CiAgdC5Jbmlhcm1lbmlhbiA9IDB4MDUzYjsKICB0LklvY3lyaWxsaWMgPSAweDA0MDE7CiAgdC5Jb2dvbmVrID0gMHgwMTJlOwogIHQuSW90YSA9IDB4MDM5OTsKICB0LklvdGFhZnJpY2FuID0gMHgwMTk2OwogIHQuSW90YWRpZXJlc2lzID0gMHgwM2FhOwogIHQuSW90YXRvbm9zID0gMHgwMzhhOwogIHQuSXNtYWxsID0gMHhmNzY5OwogIHQuSXN0cm9rZSA9IDB4MDE5NzsKICB0Lkl0aWxkZSA9IDB4MDEyODsKICB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjOwogIHQuSXpoaXRzYWN5cmlsbGljID0gMHgwNDc0OwogIHQuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0NzY7CiAgdC5KID0gMHgwMDRhOwogIHQuSmFhcm1lbmlhbiA9IDB4MDU0MTsKICB0LkpjaXJjbGUgPSAweDI0YmY7CiAgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDsKICB0LkplY3lyaWxsaWMgPSAweDA0MDg7CiAgdC5KaGVoYXJtZW5pYW4gPSAweDA1NGI7CiAgdC5KbW9ub3NwYWNlID0gMHhmZjJhOwogIHQuSnNtYWxsID0gMHhmNzZhOwogIHQuSyA9IDB4MDA0YjsKICB0LktCc3F1YXJlID0gMHgzMzg1OwogIHQuS0tzcXVhcmUgPSAweDMzY2Q7CiAgdC5LYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMDsKICB0LkthY3V0ZSA9IDB4MWUzMDsKICB0LkthY3lyaWxsaWMgPSAweDA0MWE7CiAgdC5LYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDlhOwogIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7CiAgdC5LYXBwYSA9IDB4MDM5YTsKICB0Lkthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWU7CiAgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7CiAgdC5LY2Fyb24gPSAweDAxZTg7CiAgdC5LY2VkaWxsYSA9IDB4MDEzNjsKICB0LktjaXJjbGUgPSAweDI0YzA7CiAgdC5LY29tbWFhY2NlbnQgPSAweDAxMzY7CiAgdC5LZG90YmVsb3cgPSAweDFlMzI7CiAgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDsKICB0LktlbmFybWVuaWFuID0gMHgwNTNmOwogIHQuS2hhY3lyaWxsaWMgPSAweDA0MjU7CiAgdC5LaGVpY29wdGljID0gMHgwM2U2OwogIHQuS2hvb2sgPSAweDAxOTg7CiAgdC5LamVjeXJpbGxpYyA9IDB4MDQwYzsKICB0LktsaW5lYmVsb3cgPSAweDFlMzQ7CiAgdC5LbW9ub3NwYWNlID0gMHhmZjJiOwogIHQuS29wcGFjeXJpbGxpYyA9IDB4MDQ4MDsKICB0LktvcHBhZ3JlZWsgPSAweDAzZGU7CiAgdC5Lc2ljeXJpbGxpYyA9IDB4MDQ2ZTsKICB0LktzbWFsbCA9IDB4Zjc2YjsKICB0LkwgPSAweDAwNGM7CiAgdC5MSiA9IDB4MDFjNzsKICB0LkxMID0gMHhmNmJmOwogIHQuTGFjdXRlID0gMHgwMTM5OwogIHQuTGFtYmRhID0gMHgwMzliOwogIHQuTGNhcm9uID0gMHgwMTNkOwogIHQuTGNlZGlsbGEgPSAweDAxM2I7CiAgdC5MY2lyY2xlID0gMHgyNGMxOwogIHQuTGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzYzsKICB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjsKICB0Lkxkb3QgPSAweDAxM2Y7CiAgdC5MZG90YWNjZW50ID0gMHgwMTNmOwogIHQuTGRvdGJlbG93ID0gMHgxZTM2OwogIHQuTGRvdGJlbG93bWFjcm9uID0gMHgxZTM4OwogIHQuTGl3bmFybWVuaWFuID0gMHgwNTNjOwogIHQuTGogPSAweDAxYzg7CiAgdC5MamVjeXJpbGxpYyA9IDB4MDQwOTsKICB0LkxsaW5lYmVsb3cgPSAweDFlM2E7CiAgdC5MbW9ub3NwYWNlID0gMHhmZjJjOwogIHQuTHNsYXNoID0gMHgwMTQxOwogIHQuTHNsYXNoc21hbGwgPSAweGY2Zjk7CiAgdC5Mc21hbGwgPSAweGY3NmM7CiAgdC5NID0gMHgwMDRkOwogIHQuTUJzcXVhcmUgPSAweDMzODY7CiAgdC5NYWNyb24gPSAweGY2ZDA7CiAgdC5NYWNyb25zbWFsbCA9IDB4ZjdhZjsKICB0Lk1hY3V0ZSA9IDB4MWUzZTsKICB0Lk1jaXJjbGUgPSAweDI0YzI7CiAgdC5NZG90YWNjZW50ID0gMHgxZTQwOwogIHQuTWRvdGJlbG93ID0gMHgxZTQyOwogIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7CiAgdC5NbW9ub3NwYWNlID0gMHhmZjJkOwogIHQuTXNtYWxsID0gMHhmNzZkOwogIHQuTXR1cm5lZCA9IDB4MDE5YzsKICB0Lk11ID0gMHgwMzljOwogIHQuTiA9IDB4MDA0ZTsKICB0Lk5KID0gMHgwMWNhOwogIHQuTmFjdXRlID0gMHgwMTQzOwogIHQuTmNhcm9uID0gMHgwMTQ3OwogIHQuTmNlZGlsbGEgPSAweDAxNDU7CiAgdC5OY2lyY2xlID0gMHgyNGMzOwogIHQuTmNpcmN1bWZsZXhiZWxvdyA9IDB4MWU0YTsKICB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTsKICB0Lk5kb3RhY2NlbnQgPSAweDFlNDQ7CiAgdC5OZG90YmVsb3cgPSAweDFlNDY7CiAgdC5OaG9va2xlZnQgPSAweDAxOWQ7CiAgdC5OaW5lcm9tYW4gPSAweDIxNjg7CiAgdC5OaiA9IDB4MDFjYjsKICB0Lk5qZWN5cmlsbGljID0gMHgwNDBhOwogIHQuTmxpbmViZWxvdyA9IDB4MWU0ODsKICB0Lk5tb25vc3BhY2UgPSAweGZmMmU7CiAgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjsKICB0Lk5zbWFsbCA9IDB4Zjc2ZTsKICB0Lk50aWxkZSA9IDB4MDBkMTsKICB0Lk50aWxkZXNtYWxsID0gMHhmN2YxOwogIHQuTnUgPSAweDAzOWQ7CiAgdC5PID0gMHgwMDRmOwogIHQuT0UgPSAweDAxNTI7CiAgdC5PRXNtYWxsID0gMHhmNmZhOwogIHQuT2FjdXRlID0gMHgwMGQzOwogIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7CiAgdC5PYmFycmVkY3lyaWxsaWMgPSAweDA0ZTg7CiAgdC5PYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYTsKICB0Lk9icmV2ZSA9IDB4MDE0ZTsKICB0Lk9jYXJvbiA9IDB4MDFkMTsKICB0Lk9jZW50ZXJlZHRpbGRlID0gMHgwMTlmOwogIHQuT2NpcmNsZSA9IDB4MjRjNDsKICB0Lk9jaXJjdW1mbGV4ID0gMHgwMGQ0OwogIHQuT2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMDsKICB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7CiAgdC5PY2lyY3VtZmxleGdyYXZlID0gMHgxZWQyOwogIHQuT2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDQ7CiAgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0OwogIHQuT2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNjsKICB0Lk9jeXJpbGxpYyA9IDB4MDQxZTsKICB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDsKICB0Lk9kYmxncmF2ZSA9IDB4MDIwYzsKICB0Lk9kaWVyZXNpcyA9IDB4MDBkNjsKICB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2OwogIHQuT2RpZXJlc2lzc21hbGwgPSAweGY3ZjY7CiAgdC5PZG90YmVsb3cgPSAweDFlY2M7CiAgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjsKICB0Lk9ncmF2ZSA9IDB4MDBkMjsKICB0Lk9ncmF2ZXNtYWxsID0gMHhmN2YyOwogIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTsKICB0Lk9obSA9IDB4MjEyNjsKICB0Lk9ob29rYWJvdmUgPSAweDFlY2U7CiAgdC5PaG9ybiA9IDB4MDFhMDsKICB0Lk9ob3JuYWN1dGUgPSAweDFlZGE7CiAgdC5PaG9ybmRvdGJlbG93ID0gMHgxZWUyOwogIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYzsKICB0Lk9ob3JuaG9va2Fib3ZlID0gMHgxZWRlOwogIHQuT2hvcm50aWxkZSA9IDB4MWVlMDsKICB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7CiAgdC5PaSA9IDB4MDFhMjsKICB0Lk9pbnZlcnRlZGJyZXZlID0gMHgwMjBlOwogIHQuT21hY3JvbiA9IDB4MDE0YzsKICB0Lk9tYWNyb25hY3V0ZSA9IDB4MWU1MjsKICB0Lk9tYWNyb25ncmF2ZSA9IDB4MWU1MDsKICB0Lk9tZWdhID0gMHgyMTI2OwogIHQuT21lZ2FjeXJpbGxpYyA9IDB4MDQ2MDsKICB0Lk9tZWdhZ3JlZWsgPSAweDAzYTk7CiAgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7CiAgdC5PbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2M7CiAgdC5PbWVnYXRvbm9zID0gMHgwMzhmOwogIHQuT21pY3JvbiA9IDB4MDM5ZjsKICB0Lk9taWNyb250b25vcyA9IDB4MDM4YzsKICB0Lk9tb25vc3BhY2UgPSAweGZmMmY7CiAgdC5PbmVyb21hbiA9IDB4MjE2MDsKICB0Lk9vZ29uZWsgPSAweDAxZWE7CiAgdC5Pb2dvbmVrbWFjcm9uID0gMHgwMWVjOwogIHQuT29wZW4gPSAweDAxODY7CiAgdC5Pc2xhc2ggPSAweDAwZDg7CiAgdC5Pc2xhc2hhY3V0ZSA9IDB4MDFmZTsKICB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4OwogIHQuT3NtYWxsID0gMHhmNzZmOwogIHQuT3N0cm9rZWFjdXRlID0gMHgwMWZlOwogIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTsKICB0Lk90aWxkZSA9IDB4MDBkNTsKICB0Lk90aWxkZWFjdXRlID0gMHgxZTRjOwogIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7CiAgdC5PdGlsZGVzbWFsbCA9IDB4ZjdmNTsKICB0LlAgPSAweDAwNTA7CiAgdC5QYWN1dGUgPSAweDFlNTQ7CiAgdC5QY2lyY2xlID0gMHgyNGM1OwogIHQuUGRvdGFjY2VudCA9IDB4MWU1NjsKICB0LlBlY3lyaWxsaWMgPSAweDA0MWY7CiAgdC5QZWhhcm1lbmlhbiA9IDB4MDU0YTsKICB0LlBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE2OwogIHQuUGhpID0gMHgwM2E2OwogIHQuUGhvb2sgPSAweDAxYTQ7CiAgdC5QaSA9IDB4MDNhMDsKICB0LlBpd3Jhcm1lbmlhbiA9IDB4MDU1MzsKICB0LlBtb25vc3BhY2UgPSAweGZmMzA7CiAgdC5Qc2kgPSAweDAzYTg7CiAgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDsKICB0LlBzbWFsbCA9IDB4Zjc3MDsKICB0LlEgPSAweDAwNTE7CiAgdC5RY2lyY2xlID0gMHgyNGM2OwogIHQuUW1vbm9zcGFjZSA9IDB4ZmYzMTsKICB0LlFzbWFsbCA9IDB4Zjc3MTsKICB0LlIgPSAweDAwNTI7CiAgdC5SYWFybWVuaWFuID0gMHgwNTRjOwogIHQuUmFjdXRlID0gMHgwMTU0OwogIHQuUmNhcm9uID0gMHgwMTU4OwogIHQuUmNlZGlsbGEgPSAweDAxNTY7CiAgdC5SY2lyY2xlID0gMHgyNGM3OwogIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2OwogIHQuUmRibGdyYXZlID0gMHgwMjEwOwogIHQuUmRvdGFjY2VudCA9IDB4MWU1ODsKICB0LlJkb3RiZWxvdyA9IDB4MWU1YTsKICB0LlJkb3RiZWxvd21hY3JvbiA9IDB4MWU1YzsKICB0LlJlaGFybWVuaWFuID0gMHgwNTUwOwogIHQuUmZyYWt0dXIgPSAweDIxMWM7CiAgdC5SaG8gPSAweDAzYTE7CiAgdC5SaW5nc21hbGwgPSAweGY2ZmM7CiAgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjsKICB0LlJsaW5lYmVsb3cgPSAweDFlNWU7CiAgdC5SbW9ub3NwYWNlID0gMHhmZjMyOwogIHQuUnNtYWxsID0gMHhmNzcyOwogIHQuUnNtYWxsaW52ZXJ0ZWQgPSAweDAyODE7CiAgdC5Sc21hbGxpbnZlcnRlZHN1cGVyaW9yID0gMHgwMmI2OwogIHQuUyA9IDB4MDA1MzsKICB0LlNGMDEwMDAwID0gMHgyNTBjOwogIHQuU0YwMjAwMDAgPSAweDI1MTQ7CiAgdC5TRjAzMDAwMCA9IDB4MjUxMDsKICB0LlNGMDQwMDAwID0gMHgyNTE4OwogIHQuU0YwNTAwMDAgPSAweDI1M2M7CiAgdC5TRjA2MDAwMCA9IDB4MjUyYzsKICB0LlNGMDcwMDAwID0gMHgyNTM0OwogIHQuU0YwODAwMDAgPSAweDI1MWM7CiAgdC5TRjA5MDAwMCA9IDB4MjUyNDsKICB0LlNGMTAwMDAwID0gMHgyNTAwOwogIHQuU0YxMTAwMDAgPSAweDI1MDI7CiAgdC5TRjE5MDAwMCA9IDB4MjU2MTsKICB0LlNGMjAwMDAwID0gMHgyNTYyOwogIHQuU0YyMTAwMDAgPSAweDI1NTY7CiAgdC5TRjIyMDAwMCA9IDB4MjU1NTsKICB0LlNGMjMwMDAwID0gMHgyNTYzOwogIHQuU0YyNDAwMDAgPSAweDI1NTE7CiAgdC5TRjI1MDAwMCA9IDB4MjU1NzsKICB0LlNGMjYwMDAwID0gMHgyNTVkOwogIHQuU0YyNzAwMDAgPSAweDI1NWM7CiAgdC5TRjI4MDAwMCA9IDB4MjU1YjsKICB0LlNGMzYwMDAwID0gMHgyNTVlOwogIHQuU0YzNzAwMDAgPSAweDI1NWY7CiAgdC5TRjM4MDAwMCA9IDB4MjU1YTsKICB0LlNGMzkwMDAwID0gMHgyNTU0OwogIHQuU0Y0MDAwMDAgPSAweDI1Njk7CiAgdC5TRjQxMDAwMCA9IDB4MjU2NjsKICB0LlNGNDIwMDAwID0gMHgyNTYwOwogIHQuU0Y0MzAwMDAgPSAweDI1NTA7CiAgdC5TRjQ0MDAwMCA9IDB4MjU2YzsKICB0LlNGNDUwMDAwID0gMHgyNTY3OwogIHQuU0Y0NjAwMDAgPSAweDI1Njg7CiAgdC5TRjQ3MDAwMCA9IDB4MjU2NDsKICB0LlNGNDgwMDAwID0gMHgyNTY1OwogIHQuU0Y0OTAwMDAgPSAweDI1NTk7CiAgdC5TRjUwMDAwMCA9IDB4MjU1ODsKICB0LlNGNTEwMDAwID0gMHgyNTUyOwogIHQuU0Y1MjAwMDAgPSAweDI1NTM7CiAgdC5TRjUzMDAwMCA9IDB4MjU2YjsKICB0LlNGNTQwMDAwID0gMHgyNTZhOwogIHQuU2FjdXRlID0gMHgwMTVhOwogIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0OwogIHQuU2FtcGlncmVlayA9IDB4MDNlMDsKICB0LlNjYXJvbiA9IDB4MDE2MDsKICB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjsKICB0LlNjYXJvbnNtYWxsID0gMHhmNmZkOwogIHQuU2NlZGlsbGEgPSAweDAxNWU7CiAgdC5TY2h3YSA9IDB4MDE4ZjsKICB0LlNjaHdhY3lyaWxsaWMgPSAweDA0ZDg7CiAgdC5TY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGE7CiAgdC5TY2lyY2xlID0gMHgyNGM4OwogIHQuU2NpcmN1bWZsZXggPSAweDAxNWM7CiAgdC5TY29tbWFhY2NlbnQgPSAweDAyMTg7CiAgdC5TZG90YWNjZW50ID0gMHgxZTYwOwogIHQuU2RvdGJlbG93ID0gMHgxZTYyOwogIHQuU2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY4OwogIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7CiAgdC5TZXZlbnJvbWFuID0gMHgyMTY2OwogIHQuU2hhYXJtZW5pYW4gPSAweDA1NDc7CiAgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODsKICB0LlNoY2hhY3lyaWxsaWMgPSAweDA0Mjk7CiAgdC5TaGVpY29wdGljID0gMHgwM2UyOwogIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhOwogIHQuU2hpbWFjb3B0aWMgPSAweDAzZWM7CiAgdC5TaWdtYSA9IDB4MDNhMzsKICB0LlNpeHJvbWFuID0gMHgyMTY1OwogIHQuU21vbm9zcGFjZSA9IDB4ZmYzMzsKICB0LlNvZnRzaWduY3lyaWxsaWMgPSAweDA0MmM7CiAgdC5Tc21hbGwgPSAweGY3NzM7CiAgdC5TdGlnbWFncmVlayA9IDB4MDNkYTsKICB0LlQgPSAweDAwNTQ7CiAgdC5UYXUgPSAweDAzYTQ7CiAgdC5UYmFyID0gMHgwMTY2OwogIHQuVGNhcm9uID0gMHgwMTY0OwogIHQuVGNlZGlsbGEgPSAweDAxNjI7CiAgdC5UY2lyY2xlID0gMHgyNGM5OwogIHQuVGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MDsKICB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjsKICB0LlRkb3RhY2NlbnQgPSAweDFlNmE7CiAgdC5UZG90YmVsb3cgPSAweDFlNmM7CiAgdC5UZWN5cmlsbGljID0gMHgwNDIyOwogIHQuVGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYzsKICB0LlRlbnJvbWFuID0gMHgyMTY5OwogIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDsKICB0LlRoZXRhID0gMHgwMzk4OwogIHQuVGhvb2sgPSAweDAxYWM7CiAgdC5UaG9ybiA9IDB4MDBkZTsKICB0LlRob3Juc21hbGwgPSAweGY3ZmU7CiAgdC5UaHJlZXJvbWFuID0gMHgyMTYyOwogIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTsKICB0LlRpd25hcm1lbmlhbiA9IDB4MDU0ZjsKICB0LlRsaW5lYmVsb3cgPSAweDFlNmU7CiAgdC5UbW9ub3NwYWNlID0gMHhmZjM0OwogIHQuVG9hcm1lbmlhbiA9IDB4MDUzOTsKICB0LlRvbmVmaXZlID0gMHgwMWJjOwogIHQuVG9uZXNpeCA9IDB4MDE4NDsKICB0LlRvbmV0d28gPSAweDAxYTc7CiAgdC5UcmV0cm9mbGV4aG9vayA9IDB4MDFhZTsKICB0LlRzZWN5cmlsbGljID0gMHgwNDI2OwogIHQuVHNoZWN5cmlsbGljID0gMHgwNDBiOwogIHQuVHNtYWxsID0gMHhmNzc0OwogIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7CiAgdC5Ud29yb21hbiA9IDB4MjE2MTsKICB0LlUgPSAweDAwNTU7CiAgdC5VYWN1dGUgPSAweDAwZGE7CiAgdC5VYWN1dGVzbWFsbCA9IDB4ZjdmYTsKICB0LlVicmV2ZSA9IDB4MDE2YzsKICB0LlVjYXJvbiA9IDB4MDFkMzsKICB0LlVjaXJjbGUgPSAweDI0Y2E7CiAgdC5VY2lyY3VtZmxleCA9IDB4MDBkYjsKICB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7CiAgdC5VY2lyY3VtZmxleHNtYWxsID0gMHhmN2ZiOwogIHQuVWN5cmlsbGljID0gMHgwNDIzOwogIHQuVWRibGFjdXRlID0gMHgwMTcwOwogIHQuVWRibGdyYXZlID0gMHgwMjE0OwogIHQuVWRpZXJlc2lzID0gMHgwMGRjOwogIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7CiAgdC5VZGllcmVzaXNiZWxvdyA9IDB4MWU3MjsKICB0LlVkaWVyZXNpc2Nhcm9uID0gMHgwMWQ5OwogIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7CiAgdC5VZGllcmVzaXNncmF2ZSA9IDB4MDFkYjsKICB0LlVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNTsKICB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjOwogIHQuVWRvdGJlbG93ID0gMHgxZWU0OwogIHQuVWdyYXZlID0gMHgwMGQ5OwogIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7CiAgdC5VaG9va2Fib3ZlID0gMHgxZWU2OwogIHQuVWhvcm4gPSAweDAxYWY7CiAgdC5VaG9ybmFjdXRlID0gMHgxZWU4OwogIHQuVWhvcm5kb3RiZWxvdyA9IDB4MWVmMDsKICB0LlVob3JuZ3JhdmUgPSAweDFlZWE7CiAgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYzsKICB0LlVob3JudGlsZGUgPSAweDFlZWU7CiAgdC5VaHVuZ2FydW1sYXV0ID0gMHgwMTcwOwogIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyOwogIHQuVWludmVydGVkYnJldmUgPSAweDAyMTY7CiAgdC5Va2N5cmlsbGljID0gMHgwNDc4OwogIHQuVW1hY3JvbiA9IDB4MDE2YTsKICB0LlVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZTsKICB0LlVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YTsKICB0LlVtb25vc3BhY2UgPSAweGZmMzU7CiAgdC5Vb2dvbmVrID0gMHgwMTcyOwogIHQuVXBzaWxvbiA9IDB4MDNhNTsKICB0LlVwc2lsb24xID0gMHgwM2QyOwogIHQuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrID0gMHgwM2QzOwogIHQuVXBzaWxvbmFmcmljYW4gPSAweDAxYjE7CiAgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7CiAgdC5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWsgPSAweDAzZDQ7CiAgdC5VcHNpbG9uaG9va3N5bWJvbCA9IDB4MDNkMjsKICB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTsKICB0LlVyaW5nID0gMHgwMTZlOwogIHQuVXNob3J0Y3lyaWxsaWMgPSAweDA0MGU7CiAgdC5Vc21hbGwgPSAweGY3NzU7CiAgdC5Vc3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZTsKICB0LlVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIwOwogIHQuVXRpbGRlID0gMHgwMTY4OwogIHQuVXRpbGRlYWN1dGUgPSAweDFlNzg7CiAgdC5VdGlsZGViZWxvdyA9IDB4MWU3NDsKICB0LlYgPSAweDAwNTY7CiAgdC5WY2lyY2xlID0gMHgyNGNiOwogIHQuVmRvdGJlbG93ID0gMHgxZTdlOwogIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjsKICB0LlZld2FybWVuaWFuID0gMHgwNTRlOwogIHQuVmhvb2sgPSAweDAxYjI7CiAgdC5WbW9ub3NwYWNlID0gMHhmZjM2OwogIHQuVm9hcm1lbmlhbiA9IDB4MDU0ODsKICB0LlZzbWFsbCA9IDB4Zjc3NjsKICB0LlZ0aWxkZSA9IDB4MWU3YzsKICB0LlcgPSAweDAwNTc7CiAgdC5XYWN1dGUgPSAweDFlODI7CiAgdC5XY2lyY2xlID0gMHgyNGNjOwogIHQuV2NpcmN1bWZsZXggPSAweDAxNzQ7CiAgdC5XZGllcmVzaXMgPSAweDFlODQ7CiAgdC5XZG90YWNjZW50ID0gMHgxZTg2OwogIHQuV2RvdGJlbG93ID0gMHgxZTg4OwogIHQuV2dyYXZlID0gMHgxZTgwOwogIHQuV21vbm9zcGFjZSA9IDB4ZmYzNzsKICB0LldzbWFsbCA9IDB4Zjc3NzsKICB0LlggPSAweDAwNTg7CiAgdC5YY2lyY2xlID0gMHgyNGNkOwogIHQuWGRpZXJlc2lzID0gMHgxZThjOwogIHQuWGRvdGFjY2VudCA9IDB4MWU4YTsKICB0LlhlaGFybWVuaWFuID0gMHgwNTNkOwogIHQuWGkgPSAweDAzOWU7CiAgdC5YbW9ub3NwYWNlID0gMHhmZjM4OwogIHQuWHNtYWxsID0gMHhmNzc4OwogIHQuWSA9IDB4MDA1OTsKICB0LllhY3V0ZSA9IDB4MDBkZDsKICB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkOwogIHQuWWF0Y3lyaWxsaWMgPSAweDA0NjI7CiAgdC5ZY2lyY2xlID0gMHgyNGNlOwogIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7CiAgdC5ZZGllcmVzaXMgPSAweDAxNzg7CiAgdC5ZZGllcmVzaXNzbWFsbCA9IDB4ZjdmZjsKICB0Lllkb3RhY2NlbnQgPSAweDFlOGU7CiAgdC5ZZG90YmVsb3cgPSAweDFlZjQ7CiAgdC5ZZXJpY3lyaWxsaWMgPSAweDA0MmI7CiAgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODsKICB0LllncmF2ZSA9IDB4MWVmMjsKICB0Lllob29rID0gMHgwMWIzOwogIHQuWWhvb2thYm92ZSA9IDB4MWVmNjsKICB0LllpYXJtZW5pYW4gPSAweDA1NDU7CiAgdC5ZaWN5cmlsbGljID0gMHgwNDA3OwogIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyOwogIHQuWW1vbm9zcGFjZSA9IDB4ZmYzOTsKICB0LllzbWFsbCA9IDB4Zjc3OTsKICB0Lll0aWxkZSA9IDB4MWVmODsKICB0Lll1c2JpZ2N5cmlsbGljID0gMHgwNDZhOwogIHQuWXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2YzsKICB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2OwogIHQuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ODsKICB0LlogPSAweDAwNWE7CiAgdC5aYWFybWVuaWFuID0gMHgwNTM2OwogIHQuWmFjdXRlID0gMHgwMTc5OwogIHQuWmNhcm9uID0gMHgwMTdkOwogIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7CiAgdC5aY2lyY2xlID0gMHgyNGNmOwogIHQuWmNpcmN1bWZsZXggPSAweDFlOTA7CiAgdC5aZG90ID0gMHgwMTdiOwogIHQuWmRvdGFjY2VudCA9IDB4MDE3YjsKICB0Llpkb3RiZWxvdyA9IDB4MWU5MjsKICB0LlplY3lyaWxsaWMgPSAweDA0MTc7CiAgdC5aZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk4OwogIHQuWmVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRlOwogIHQuWmV0YSA9IDB4MDM5NjsKICB0LlpoZWFybWVuaWFuID0gMHgwNTNhOwogIHQuWmhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMTsKICB0LlpoZWN5cmlsbGljID0gMHgwNDE2OwogIHQuWmhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTY7CiAgdC5aaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRjOwogIHQuWmxpbmViZWxvdyA9IDB4MWU5NDsKICB0Llptb25vc3BhY2UgPSAweGZmM2E7CiAgdC5ac21hbGwgPSAweGY3N2E7CiAgdC5ac3Ryb2tlID0gMHgwMWI1OwogIHQuYSA9IDB4MDA2MTsKICB0LmFhYmVuZ2FsaSA9IDB4MDk4NjsKICB0LmFhY3V0ZSA9IDB4MDBlMTsKICB0LmFhZGV2YSA9IDB4MDkwNjsKICB0LmFhZ3VqYXJhdGkgPSAweDBhODY7CiAgdC5hYWd1cm11a2hpID0gMHgwYTA2OwogIHQuYWFtYXRyYWd1cm11a2hpID0gMHgwYTNlOwogIHQuYWFydXNxdWFyZSA9IDB4MzMwMzsKICB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTsKICB0LmFhdm93ZWxzaWduZGV2YSA9IDB4MDkzZTsKICB0LmFhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmU7CiAgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7CiAgdC5hYmJyZXZpYXRpb25zaWduZGV2YSA9IDB4MDk3MDsKICB0LmFiZW5nYWxpID0gMHgwOTg1OwogIHQuYWJvcG9tb2ZvID0gMHgzMTFhOwogIHQuYWJyZXZlID0gMHgwMTAzOwogIHQuYWJyZXZlYWN1dGUgPSAweDFlYWY7CiAgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTsKICB0LmFicmV2ZWRvdGJlbG93ID0gMHgxZWI3OwogIHQuYWJyZXZlZ3JhdmUgPSAweDFlYjE7CiAgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7CiAgdC5hYnJldmV0aWxkZSA9IDB4MWViNTsKICB0LmFjYXJvbiA9IDB4MDFjZTsKICB0LmFjaXJjbGUgPSAweDI0ZDA7CiAgdC5hY2lyY3VtZmxleCA9IDB4MDBlMjsKICB0LmFjaXJjdW1mbGV4YWN1dGUgPSAweDFlYTU7CiAgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkOwogIHQuYWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNzsKICB0LmFjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWE5OwogIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjsKICB0LmFjdXRlID0gMHgwMGI0OwogIHQuYWN1dGViZWxvd2NtYiA9IDB4MDMxNzsKICB0LmFjdXRlY21iID0gMHgwMzAxOwogIHQuYWN1dGVjb21iID0gMHgwMzAxOwogIHQuYWN1dGVkZXZhID0gMHgwOTU0OwogIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7CiAgdC5hY3V0ZXRvbmVjbWIgPSAweDAzNDE7CiAgdC5hY3lyaWxsaWMgPSAweDA0MzA7CiAgdC5hZGJsZ3JhdmUgPSAweDAyMDE7CiAgdC5hZGRha2d1cm11a2hpID0gMHgwYTcxOwogIHQuYWRldmEgPSAweDA5MDU7CiAgdC5hZGllcmVzaXMgPSAweDAwZTQ7CiAgdC5hZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMzsKICB0LmFkaWVyZXNpc21hY3JvbiA9IDB4MDFkZjsKICB0LmFkb3RiZWxvdyA9IDB4MWVhMTsKICB0LmFkb3RtYWNyb24gPSAweDAxZTE7CiAgdC5hZSA9IDB4MDBlNjsKICB0LmFlYWN1dGUgPSAweDAxZmQ7CiAgdC5hZWtvcmVhbiA9IDB4MzE1MDsKICB0LmFlbWFjcm9uID0gMHgwMWUzOwogIHQuYWZpaTAwMjA4ID0gMHgyMDE1OwogIHQuYWZpaTA4OTQxID0gMHgyMGE0OwogIHQuYWZpaTEwMDE3ID0gMHgwNDEwOwogIHQuYWZpaTEwMDE4ID0gMHgwNDExOwogIHQuYWZpaTEwMDE5ID0gMHgwNDEyOwogIHQuYWZpaTEwMDIwID0gMHgwNDEzOwogIHQuYWZpaTEwMDIxID0gMHgwNDE0OwogIHQuYWZpaTEwMDIyID0gMHgwNDE1OwogIHQuYWZpaTEwMDIzID0gMHgwNDAxOwogIHQuYWZpaTEwMDI0ID0gMHgwNDE2OwogIHQuYWZpaTEwMDI1ID0gMHgwNDE3OwogIHQuYWZpaTEwMDI2ID0gMHgwNDE4OwogIHQuYWZpaTEwMDI3ID0gMHgwNDE5OwogIHQuYWZpaTEwMDI4ID0gMHgwNDFhOwogIHQuYWZpaTEwMDI5ID0gMHgwNDFiOwogIHQuYWZpaTEwMDMwID0gMHgwNDFjOwogIHQuYWZpaTEwMDMxID0gMHgwNDFkOwogIHQuYWZpaTEwMDMyID0gMHgwNDFlOwogIHQuYWZpaTEwMDMzID0gMHgwNDFmOwogIHQuYWZpaTEwMDM0ID0gMHgwNDIwOwogIHQuYWZpaTEwMDM1ID0gMHgwNDIxOwogIHQuYWZpaTEwMDM2ID0gMHgwNDIyOwogIHQuYWZpaTEwMDM3ID0gMHgwNDIzOwogIHQuYWZpaTEwMDM4ID0gMHgwNDI0OwogIHQuYWZpaTEwMDM5ID0gMHgwNDI1OwogIHQuYWZpaTEwMDQwID0gMHgwNDI2OwogIHQuYWZpaTEwMDQxID0gMHgwNDI3OwogIHQuYWZpaTEwMDQyID0gMHgwNDI4OwogIHQuYWZpaTEwMDQzID0gMHgwNDI5OwogIHQuYWZpaTEwMDQ0ID0gMHgwNDJhOwogIHQuYWZpaTEwMDQ1ID0gMHgwNDJiOwogIHQuYWZpaTEwMDQ2ID0gMHgwNDJjOwogIHQuYWZpaTEwMDQ3ID0gMHgwNDJkOwogIHQuYWZpaTEwMDQ4ID0gMHgwNDJlOwogIHQuYWZpaTEwMDQ5ID0gMHgwNDJmOwogIHQuYWZpaTEwMDUwID0gMHgwNDkwOwogIHQuYWZpaTEwMDUxID0gMHgwNDAyOwogIHQuYWZpaTEwMDUyID0gMHgwNDAzOwogIHQuYWZpaTEwMDUzID0gMHgwNDA0OwogIHQuYWZpaTEwMDU0ID0gMHgwNDA1OwogIHQuYWZpaTEwMDU1ID0gMHgwNDA2OwogIHQuYWZpaTEwMDU2ID0gMHgwNDA3OwogIHQuYWZpaTEwMDU3ID0gMHgwNDA4OwogIHQuYWZpaTEwMDU4ID0gMHgwNDA5OwogIHQuYWZpaTEwMDU5ID0gMHgwNDBhOwogIHQuYWZpaTEwMDYwID0gMHgwNDBiOwogIHQuYWZpaTEwMDYxID0gMHgwNDBjOwogIHQuYWZpaTEwMDYyID0gMHgwNDBlOwogIHQuYWZpaTEwMDYzID0gMHhmNmM0OwogIHQuYWZpaTEwMDY0ID0gMHhmNmM1OwogIHQuYWZpaTEwMDY1ID0gMHgwNDMwOwogIHQuYWZpaTEwMDY2ID0gMHgwNDMxOwogIHQuYWZpaTEwMDY3ID0gMHgwNDMyOwogIHQuYWZpaTEwMDY4ID0gMHgwNDMzOwogIHQuYWZpaTEwMDY5ID0gMHgwNDM0OwogIHQuYWZpaTEwMDcwID0gMHgwNDM1OwogIHQuYWZpaTEwMDcxID0gMHgwNDUxOwogIHQuYWZpaTEwMDcyID0gMHgwNDM2OwogIHQuYWZpaTEwMDczID0gMHgwNDM3OwogIHQuYWZpaTEwMDc0ID0gMHgwNDM4OwogIHQuYWZpaTEwMDc1ID0gMHgwNDM5OwogIHQuYWZpaTEwMDc2ID0gMHgwNDNhOwogIHQuYWZpaTEwMDc3ID0gMHgwNDNiOwogIHQuYWZpaTEwMDc4ID0gMHgwNDNjOwogIHQuYWZpaTEwMDc5ID0gMHgwNDNkOwogIHQuYWZpaTEwMDgwID0gMHgwNDNlOwogIHQuYWZpaTEwMDgxID0gMHgwNDNmOwogIHQuYWZpaTEwMDgyID0gMHgwNDQwOwogIHQuYWZpaTEwMDgzID0gMHgwNDQxOwogIHQuYWZpaTEwMDg0ID0gMHgwNDQyOwogIHQuYWZpaTEwMDg1ID0gMHgwNDQzOwogIHQuYWZpaTEwMDg2ID0gMHgwNDQ0OwogIHQuYWZpaTEwMDg3ID0gMHgwNDQ1OwogIHQuYWZpaTEwMDg4ID0gMHgwNDQ2OwogIHQuYWZpaTEwMDg5ID0gMHgwNDQ3OwogIHQuYWZpaTEwMDkwID0gMHgwNDQ4OwogIHQuYWZpaTEwMDkxID0gMHgwNDQ5OwogIHQuYWZpaTEwMDkyID0gMHgwNDRhOwogIHQuYWZpaTEwMDkzID0gMHgwNDRiOwogIHQuYWZpaTEwMDk0ID0gMHgwNDRjOwogIHQuYWZpaTEwMDk1ID0gMHgwNDRkOwogIHQuYWZpaTEwMDk2ID0gMHgwNDRlOwogIHQuYWZpaTEwMDk3ID0gMHgwNDRmOwogIHQuYWZpaTEwMDk4ID0gMHgwNDkxOwogIHQuYWZpaTEwMDk5ID0gMHgwNDUyOwogIHQuYWZpaTEwMTAwID0gMHgwNDUzOwogIHQuYWZpaTEwMTAxID0gMHgwNDU0OwogIHQuYWZpaTEwMTAyID0gMHgwNDU1OwogIHQuYWZpaTEwMTAzID0gMHgwNDU2OwogIHQuYWZpaTEwMTA0ID0gMHgwNDU3OwogIHQuYWZpaTEwMTA1ID0gMHgwNDU4OwogIHQuYWZpaTEwMTA2ID0gMHgwNDU5OwogIHQuYWZpaTEwMTA3ID0gMHgwNDVhOwogIHQuYWZpaTEwMTA4ID0gMHgwNDViOwogIHQuYWZpaTEwMTA5ID0gMHgwNDVjOwogIHQuYWZpaTEwMTEwID0gMHgwNDVlOwogIHQuYWZpaTEwMTQ1ID0gMHgwNDBmOwogIHQuYWZpaTEwMTQ2ID0gMHgwNDYyOwogIHQuYWZpaTEwMTQ3ID0gMHgwNDcyOwogIHQuYWZpaTEwMTQ4ID0gMHgwNDc0OwogIHQuYWZpaTEwMTkyID0gMHhmNmM2OwogIHQuYWZpaTEwMTkzID0gMHgwNDVmOwogIHQuYWZpaTEwMTk0ID0gMHgwNDYzOwogIHQuYWZpaTEwMTk1ID0gMHgwNDczOwogIHQuYWZpaTEwMTk2ID0gMHgwNDc1OwogIHQuYWZpaTEwODMxID0gMHhmNmM3OwogIHQuYWZpaTEwODMyID0gMHhmNmM4OwogIHQuYWZpaTEwODQ2ID0gMHgwNGQ5OwogIHQuYWZpaTI5OSA9IDB4MjAwZTsKICB0LmFmaWkzMDAgPSAweDIwMGY7CiAgdC5hZmlpMzAxID0gMHgyMDBkOwogIHQuYWZpaTU3MzgxID0gMHgwNjZhOwogIHQuYWZpaTU3Mzg4ID0gMHgwNjBjOwogIHQuYWZpaTU3MzkyID0gMHgwNjYwOwogIHQuYWZpaTU3MzkzID0gMHgwNjYxOwogIHQuYWZpaTU3Mzk0ID0gMHgwNjYyOwogIHQuYWZpaTU3Mzk1ID0gMHgwNjYzOwogIHQuYWZpaTU3Mzk2ID0gMHgwNjY0OwogIHQuYWZpaTU3Mzk3ID0gMHgwNjY1OwogIHQuYWZpaTU3Mzk4ID0gMHgwNjY2OwogIHQuYWZpaTU3Mzk5ID0gMHgwNjY3OwogIHQuYWZpaTU3NDAwID0gMHgwNjY4OwogIHQuYWZpaTU3NDAxID0gMHgwNjY5OwogIHQuYWZpaTU3NDAzID0gMHgwNjFiOwogIHQuYWZpaTU3NDA3ID0gMHgwNjFmOwogIHQuYWZpaTU3NDA5ID0gMHgwNjIxOwogIHQuYWZpaTU3NDEwID0gMHgwNjIyOwogIHQuYWZpaTU3NDExID0gMHgwNjIzOwogIHQuYWZpaTU3NDEyID0gMHgwNjI0OwogIHQuYWZpaTU3NDEzID0gMHgwNjI1OwogIHQuYWZpaTU3NDE0ID0gMHgwNjI2OwogIHQuYWZpaTU3NDE1ID0gMHgwNjI3OwogIHQuYWZpaTU3NDE2ID0gMHgwNjI4OwogIHQuYWZpaTU3NDE3ID0gMHgwNjI5OwogIHQuYWZpaTU3NDE4ID0gMHgwNjJhOwogIHQuYWZpaTU3NDE5ID0gMHgwNjJiOwogIHQuYWZpaTU3NDIwID0gMHgwNjJjOwogIHQuYWZpaTU3NDIxID0gMHgwNjJkOwogIHQuYWZpaTU3NDIyID0gMHgwNjJlOwogIHQuYWZpaTU3NDIzID0gMHgwNjJmOwogIHQuYWZpaTU3NDI0ID0gMHgwNjMwOwogIHQuYWZpaTU3NDI1ID0gMHgwNjMxOwogIHQuYWZpaTU3NDI2ID0gMHgwNjMyOwogIHQuYWZpaTU3NDI3ID0gMHgwNjMzOwogIHQuYWZpaTU3NDI4ID0gMHgwNjM0OwogIHQuYWZpaTU3NDI5ID0gMHgwNjM1OwogIHQuYWZpaTU3NDMwID0gMHgwNjM2OwogIHQuYWZpaTU3NDMxID0gMHgwNjM3OwogIHQuYWZpaTU3NDMyID0gMHgwNjM4OwogIHQuYWZpaTU3NDMzID0gMHgwNjM5OwogIHQuYWZpaTU3NDM0ID0gMHgwNjNhOwogIHQuYWZpaTU3NDQwID0gMHgwNjQwOwogIHQuYWZpaTU3NDQxID0gMHgwNjQxOwogIHQuYWZpaTU3NDQyID0gMHgwNjQyOwogIHQuYWZpaTU3NDQzID0gMHgwNjQzOwogIHQuYWZpaTU3NDQ0ID0gMHgwNjQ0OwogIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1OwogIHQuYWZpaTU3NDQ2ID0gMHgwNjQ2OwogIHQuYWZpaTU3NDQ4ID0gMHgwNjQ4OwogIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5OwogIHQuYWZpaTU3NDUwID0gMHgwNjRhOwogIHQuYWZpaTU3NDUxID0gMHgwNjRiOwogIHQuYWZpaTU3NDUyID0gMHgwNjRjOwogIHQuYWZpaTU3NDUzID0gMHgwNjRkOwogIHQuYWZpaTU3NDU0ID0gMHgwNjRlOwogIHQuYWZpaTU3NDU1ID0gMHgwNjRmOwogIHQuYWZpaTU3NDU2ID0gMHgwNjUwOwogIHQuYWZpaTU3NDU3ID0gMHgwNjUxOwogIHQuYWZpaTU3NDU4ID0gMHgwNjUyOwogIHQuYWZpaTU3NDcwID0gMHgwNjQ3OwogIHQuYWZpaTU3NTA1ID0gMHgwNmE0OwogIHQuYWZpaTU3NTA2ID0gMHgwNjdlOwogIHQuYWZpaTU3NTA3ID0gMHgwNjg2OwogIHQuYWZpaTU3NTA4ID0gMHgwNjk4OwogIHQuYWZpaTU3NTA5ID0gMHgwNmFmOwogIHQuYWZpaTU3NTExID0gMHgwNjc5OwogIHQuYWZpaTU3NTEyID0gMHgwNjg4OwogIHQuYWZpaTU3NTEzID0gMHgwNjkxOwogIHQuYWZpaTU3NTE0ID0gMHgwNmJhOwogIHQuYWZpaTU3NTE5ID0gMHgwNmQyOwogIHQuYWZpaTU3NTM0ID0gMHgwNmQ1OwogIHQuYWZpaTU3NjM2ID0gMHgyMGFhOwogIHQuYWZpaTU3NjQ1ID0gMHgwNWJlOwogIHQuYWZpaTU3NjU4ID0gMHgwNWMzOwogIHQuYWZpaTU3NjY0ID0gMHgwNWQwOwogIHQuYWZpaTU3NjY1ID0gMHgwNWQxOwogIHQuYWZpaTU3NjY2ID0gMHgwNWQyOwogIHQuYWZpaTU3NjY3ID0gMHgwNWQzOwogIHQuYWZpaTU3NjY4ID0gMHgwNWQ0OwogIHQuYWZpaTU3NjY5ID0gMHgwNWQ1OwogIHQuYWZpaTU3NjcwID0gMHgwNWQ2OwogIHQuYWZpaTU3NjcxID0gMHgwNWQ3OwogIHQuYWZpaTU3NjcyID0gMHgwNWQ4OwogIHQuYWZpaTU3NjczID0gMHgwNWQ5OwogIHQuYWZpaTU3Njc0ID0gMHgwNWRhOwogIHQuYWZpaTU3Njc1ID0gMHgwNWRiOwogIHQuYWZpaTU3Njc2ID0gMHgwNWRjOwogIHQuYWZpaTU3Njc3ID0gMHgwNWRkOwogIHQuYWZpaTU3Njc4ID0gMHgwNWRlOwogIHQuYWZpaTU3Njc5ID0gMHgwNWRmOwogIHQuYWZpaTU3NjgwID0gMHgwNWUwOwogIHQuYWZpaTU3NjgxID0gMHgwNWUxOwogIHQuYWZpaTU3NjgyID0gMHgwNWUyOwogIHQuYWZpaTU3NjgzID0gMHgwNWUzOwogIHQuYWZpaTU3Njg0ID0gMHgwNWU0OwogIHQuYWZpaTU3Njg1ID0gMHgwNWU1OwogIHQuYWZpaTU3Njg2ID0gMHgwNWU2OwogIHQuYWZpaTU3Njg3ID0gMHgwNWU3OwogIHQuYWZpaTU3Njg4ID0gMHgwNWU4OwogIHQuYWZpaTU3Njg5ID0gMHgwNWU5OwogIHQuYWZpaTU3NjkwID0gMHgwNWVhOwogIHQuYWZpaTU3Njk0ID0gMHhmYjJhOwogIHQuYWZpaTU3Njk1ID0gMHhmYjJiOwogIHQuYWZpaTU3NzAwID0gMHhmYjRiOwogIHQuYWZpaTU3NzA1ID0gMHhmYjFmOwogIHQuYWZpaTU3NzE2ID0gMHgwNWYwOwogIHQuYWZpaTU3NzE3ID0gMHgwNWYxOwogIHQuYWZpaTU3NzE4ID0gMHgwNWYyOwogIHQuYWZpaTU3NzIzID0gMHhmYjM1OwogIHQuYWZpaTU3NzkzID0gMHgwNWI0OwogIHQuYWZpaTU3Nzk0ID0gMHgwNWI1OwogIHQuYWZpaTU3Nzk1ID0gMHgwNWI2OwogIHQuYWZpaTU3Nzk2ID0gMHgwNWJiOwogIHQuYWZpaTU3Nzk3ID0gMHgwNWI4OwogIHQuYWZpaTU3Nzk4ID0gMHgwNWI3OwogIHQuYWZpaTU3Nzk5ID0gMHgwNWIwOwogIHQuYWZpaTU3ODAwID0gMHgwNWIyOwogIHQuYWZpaTU3ODAxID0gMHgwNWIxOwogIHQuYWZpaTU3ODAyID0gMHgwNWIzOwogIHQuYWZpaTU3ODAzID0gMHgwNWMyOwogIHQuYWZpaTU3ODA0ID0gMHgwNWMxOwogIHQuYWZpaTU3ODA2ID0gMHgwNWI5OwogIHQuYWZpaTU3ODA3ID0gMHgwNWJjOwogIHQuYWZpaTU3ODM5ID0gMHgwNWJkOwogIHQuYWZpaTU3ODQxID0gMHgwNWJmOwogIHQuYWZpaTU3ODQyID0gMHgwNWMwOwogIHQuYWZpaTU3OTI5ID0gMHgwMmJjOwogIHQuYWZpaTYxMjQ4ID0gMHgyMTA1OwogIHQuYWZpaTYxMjg5ID0gMHgyMTEzOwogIHQuYWZpaTYxMzUyID0gMHgyMTE2OwogIHQuYWZpaTYxNTczID0gMHgyMDJjOwogIHQuYWZpaTYxNTc0ID0gMHgyMDJkOwogIHQuYWZpaTYxNTc1ID0gMHgyMDJlOwogIHQuYWZpaTYxNjY0ID0gMHgyMDBjOwogIHQuYWZpaTYzMTY3ID0gMHgwNjZkOwogIHQuYWZpaTY0OTM3ID0gMHgwMmJkOwogIHQuYWdyYXZlID0gMHgwMGUwOwogIHQuYWd1amFyYXRpID0gMHgwYTg1OwogIHQuYWd1cm11a2hpID0gMHgwYTA1OwogIHQuYWhpcmFnYW5hID0gMHgzMDQyOwogIHQuYWhvb2thYm92ZSA9IDB4MWVhMzsKICB0LmFpYmVuZ2FsaSA9IDB4MDk5MDsKICB0LmFpYm9wb21vZm8gPSAweDMxMWU7CiAgdC5haWRldmEgPSAweDA5MTA7CiAgdC5haWVjeXJpbGxpYyA9IDB4MDRkNTsKICB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7CiAgdC5haWd1cm11a2hpID0gMHgwYTEwOwogIHQuYWltYXRyYWd1cm11a2hpID0gMHgwYTQ4OwogIHQuYWluYXJhYmljID0gMHgwNjM5OwogIHQuYWluZmluYWxhcmFiaWMgPSAweGZlY2E7CiAgdC5haW5pbml0aWFsYXJhYmljID0gMHhmZWNiOwogIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjOwogIHQuYWludmVydGVkYnJldmUgPSAweDAyMDM7CiAgdC5haXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzg7CiAgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7CiAgdC5haXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM4OwogIHQuYWthdGFrYW5hID0gMHgzMGEyOwogIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxOwogIHQuYWtvcmVhbiA9IDB4MzE0ZjsKICB0LmFsZWYgPSAweDA1ZDA7CiAgdC5hbGVmYXJhYmljID0gMHgwNjI3OwogIHQuYWxlZmRhZ2VzaGhlYnJldyA9IDB4ZmIzMDsKICB0LmFsZWZmaW5hbGFyYWJpYyA9IDB4ZmU4ZTsKICB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzOwogIHQuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NDsKICB0LmFsZWZoYW16YWJlbG93YXJhYmljID0gMHgwNjI1OwogIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODsKICB0LmFsZWZoZWJyZXcgPSAweDA1ZDA7CiAgdC5hbGVmbGFtZWRoZWJyZXcgPSAweGZiNGY7CiAgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjsKICB0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODI7CiAgdC5hbGVmbWFrc3VyYWFyYWJpYyA9IDB4MDY0OTsKICB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7CiAgdC5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKICB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTsKICB0LmFsZWZxYW1hdHNoZWJyZXcgPSAweGZiMmY7CiAgdC5hbGVwaCA9IDB4MjEzNTsKICB0LmFsbGVxdWFsID0gMHgyMjRjOwogIHQuYWxwaGEgPSAweDAzYjE7CiAgdC5hbHBoYXRvbm9zID0gMHgwM2FjOwogIHQuYW1hY3JvbiA9IDB4MDEwMTsKICB0LmFtb25vc3BhY2UgPSAweGZmNDE7CiAgdC5hbXBlcnNhbmQgPSAweDAwMjY7CiAgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7CiAgdC5hbXBlcnNhbmRzbWFsbCA9IDB4ZjcyNjsKICB0LmFtc3F1YXJlID0gMHgzM2MyOwogIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjsKICB0LmFuZ2JvcG9tb2ZvID0gMHgzMTI0OwogIHQuYW5nYnJhY2tldGxlZnQgPSAweDMwMDg7CiAgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7CiAgdC5hbmdraGFua2h1dGhhaSA9IDB4MGU1YTsKICB0LmFuZ2xlID0gMHgyMjIwOwogIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODsKICB0LmFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzZjsKICB0LmFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDA5OwogIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDsKICB0LmFuZ2xlbGVmdCA9IDB4MjMyOTsKICB0LmFuZ2xlcmlnaHQgPSAweDIzMmE7CiAgdC5hbmdzdHJvbSA9IDB4MjEyYjsKICB0LmFub3RlbGVpYSA9IDB4MDM4NzsKICB0LmFudWRhdHRhZGV2YSA9IDB4MDk1MjsKICB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjsKICB0LmFudXN2YXJhZGV2YSA9IDB4MDkwMjsKICB0LmFudXN2YXJhZ3VqYXJhdGkgPSAweDBhODI7CiAgdC5hb2dvbmVrID0gMHgwMTA1OwogIHQuYXBhYXRvc3F1YXJlID0gMHgzMzAwOwogIHQuYXBhcmVuID0gMHgyNDljOwogIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhOwogIHQuYXBvc3Ryb3BoZW1vZCA9IDB4MDJiYzsKICB0LmFwcGxlID0gMHhmOGZmOwogIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDsKICB0LmFwcHJveGVxdWFsID0gMHgyMjQ4OwogIHQuYXBwcm94ZXF1YWxvcmltYWdlID0gMHgyMjUyOwogIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1OwogIHQuYXJhZWFla29yZWFuID0gMHgzMThlOwogIHQuYXJhZWFrb3JlYW4gPSAweDMxOGQ7CiAgdC5hcmMgPSAweDIzMTI7CiAgdC5hcmlnaHRoYWxmcmluZyA9IDB4MWU5YTsKICB0LmFyaW5nID0gMHgwMGU1OwogIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjsKICB0LmFyaW5nYmVsb3cgPSAweDFlMDE7CiAgdC5hcnJvd2JvdGggPSAweDIxOTQ7CiAgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzOwogIHQuYXJyb3dkYXNobGVmdCA9IDB4MjFlMDsKICB0LmFycm93ZGFzaHJpZ2h0ID0gMHgyMWUyOwogIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7CiAgdC5hcnJvd2RibGJvdGggPSAweDIxZDQ7CiAgdC5hcnJvd2RibGRvd24gPSAweDIxZDM7CiAgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7CiAgdC5hcnJvd2RibHJpZ2h0ID0gMHgyMWQyOwogIHQuYXJyb3dkYmx1cCA9IDB4MjFkMTsKICB0LmFycm93ZG93biA9IDB4MjE5MzsKICB0LmFycm93ZG93bmxlZnQgPSAweDIxOTk7CiAgdC5hcnJvd2Rvd25yaWdodCA9IDB4MjE5ODsKICB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5OwogIHQuYXJyb3doZWFkZG93bm1vZCA9IDB4MDJjNTsKICB0LmFycm93aGVhZGxlZnRtb2QgPSAweDAyYzI7CiAgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMzsKICB0LmFycm93aGVhZHVwbW9kID0gMHgwMmM0OwogIHQuYXJyb3dob3JpemV4ID0gMHhmOGU3OwogIHQuYXJyb3dsZWZ0ID0gMHgyMTkwOwogIHQuYXJyb3dsZWZ0ZGJsID0gMHgyMWQwOwogIHQuYXJyb3dsZWZ0ZGJsc3Ryb2tlID0gMHgyMWNkOwogIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2OwogIHQuYXJyb3dsZWZ0d2hpdGUgPSAweDIxZTY7CiAgdC5hcnJvd3JpZ2h0ID0gMHgyMTkyOwogIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjsKICB0LmFycm93cmlnaHRoZWF2eSA9IDB4Mjc5ZTsKICB0LmFycm93cmlnaHRvdmVybGVmdCA9IDB4MjFjNDsKICB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODsKICB0LmFycm93dGFibGVmdCA9IDB4MjFlNDsKICB0LmFycm93dGFicmlnaHQgPSAweDIxZTU7CiAgdC5hcnJvd3VwID0gMHgyMTkxOwogIHQuYXJyb3d1cGRuID0gMHgyMTk1OwogIHQuYXJyb3d1cGRuYnNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGxlZnQgPSAweDIxOTY7CiAgdC5hcnJvd3VwbGVmdG9mZG93biA9IDB4MjFjNTsKICB0LmFycm93dXByaWdodCA9IDB4MjE5NzsKICB0LmFycm93dXB3aGl0ZSA9IDB4MjFlNzsKICB0LmFycm93dmVydGV4ID0gMHhmOGU2OwogIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7CiAgdC5hc2NpaWNpcmN1bW1vbm9zcGFjZSA9IDB4ZmYzZTsKICB0LmFzY2lpdGlsZGUgPSAweDAwN2U7CiAgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlOwogIHQuYXNjcmlwdCA9IDB4MDI1MTsKICB0LmFzY3JpcHR0dXJuZWQgPSAweDAyNTI7CiAgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTsKICB0LmFzbWFsbGthdGFrYW5hID0gMHgzMGExOwogIHQuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjc7CiAgdC5hc3RlcmlzayA9IDB4MDAyYTsKICB0LmFzdGVyaXNrYWx0b25lYXJhYmljID0gMHgwNjZkOwogIHQuYXN0ZXJpc2thcmFiaWMgPSAweDA2NmQ7CiAgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7CiAgdC5hc3Rlcmlza21vbm9zcGFjZSA9IDB4ZmYwYTsKICB0LmFzdGVyaXNrc21hbGwgPSAweGZlNjE7CiAgdC5hc3RlcmlzbSA9IDB4MjA0MjsKICB0LmFzdXBlcmlvciA9IDB4ZjZlOTsKICB0LmFzeW1wdG90aWNhbGx5ZXF1YWwgPSAweDIyNDM7CiAgdC5hdCA9IDB4MDA0MDsKICB0LmF0aWxkZSA9IDB4MDBlMzsKICB0LmF0bW9ub3NwYWNlID0gMHhmZjIwOwogIHQuYXRzbWFsbCA9IDB4ZmU2YjsKICB0LmF0dXJuZWQgPSAweDAyNTA7CiAgdC5hdWJlbmdhbGkgPSAweDA5OTQ7CiAgdC5hdWJvcG9tb2ZvID0gMHgzMTIwOwogIHQuYXVkZXZhID0gMHgwOTE0OwogIHQuYXVndWphcmF0aSA9IDB4MGE5NDsKICB0LmF1Z3VybXVraGkgPSAweDBhMTQ7CiAgdC5hdWxlbmd0aG1hcmtiZW5nYWxpID0gMHgwOWQ3OwogIHQuYXVtYXRyYWd1cm11a2hpID0gMHgwYTRjOwogIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjOwogIHQuYXV2b3dlbHNpZ25kZXZhID0gMHgwOTRjOwogIHQuYXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjYzsKICB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDsKICB0LmF5YmFybWVuaWFuID0gMHgwNTYxOwogIHQuYXlpbiA9IDB4MDVlMjsKICB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7CiAgdC5heWluaGVicmV3ID0gMHgwNWUyOwogIHQuYiA9IDB4MDA2MjsKICB0LmJhYmVuZ2FsaSA9IDB4MDlhYzsKICB0LmJhY2tzbGFzaCA9IDB4MDA1YzsKICB0LmJhY2tzbGFzaG1vbm9zcGFjZSA9IDB4ZmYzYzsKICB0LmJhZGV2YSA9IDB4MDkyYzsKICB0LmJhZ3VqYXJhdGkgPSAweDBhYWM7CiAgdC5iYWd1cm11a2hpID0gMHgwYTJjOwogIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDsKICB0LmJhaHR0aGFpID0gMHgwZTNmOwogIHQuYmFrYXRha2FuYSA9IDB4MzBkMDsKICB0LmJhciA9IDB4MDA3YzsKICB0LmJhcm1vbm9zcGFjZSA9IDB4ZmY1YzsKICB0LmJib3BvbW9mbyA9IDB4MzEwNTsKICB0LmJjaXJjbGUgPSAweDI0ZDE7CiAgdC5iZG90YWNjZW50ID0gMHgxZTAzOwogIHQuYmRvdGJlbG93ID0gMHgxZTA1OwogIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7CiAgdC5iZWNhdXNlID0gMHgyMjM1OwogIHQuYmVjeXJpbGxpYyA9IDB4MDQzMTsKICB0LmJlaGFyYWJpYyA9IDB4MDYyODsKICB0LmJlaGZpbmFsYXJhYmljID0gMHhmZTkwOwogIHQuYmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5MTsKICB0LmJlaGlyYWdhbmEgPSAweDMwNzk7CiAgdC5iZWhtZWRpYWxhcmFiaWMgPSAweGZlOTI7CiAgdC5iZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmM5ZjsKICB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODsKICB0LmJlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM2ZDsKICB0LmJla2F0YWthbmEgPSAweDMwZDk7CiAgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjsKICB0LmJldCA9IDB4MDVkMTsKICB0LmJldGEgPSAweDAzYjI7CiAgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7CiAgdC5iZXRkYWdlc2ggPSAweGZiMzE7CiAgdC5iZXRkYWdlc2hoZWJyZXcgPSAweGZiMzE7CiAgdC5iZXRoZWJyZXcgPSAweDA1ZDE7CiAgdC5iZXRyYWZlaGVicmV3ID0gMHhmYjRjOwogIHQuYmhhYmVuZ2FsaSA9IDB4MDlhZDsKICB0LmJoYWRldmEgPSAweDA5MmQ7CiAgdC5iaGFndWphcmF0aSA9IDB4MGFhZDsKICB0LmJoYWd1cm11a2hpID0gMHgwYTJkOwogIHQuYmhvb2sgPSAweDAyNTM7CiAgdC5iaWhpcmFnYW5hID0gMHgzMDczOwogIHQuYmlrYXRha2FuYSA9IDB4MzBkMzsKICB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7CiAgdC5iaW5kaWd1cm11a2hpID0gMHgwYTAyOwogIHQuYmlydXNxdWFyZSA9IDB4MzMzMTsKICB0LmJsYWNrY2lyY2xlID0gMHgyNWNmOwogIHQuYmxhY2tkaWFtb25kID0gMHgyNWM2OwogIHQuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViYzsKICB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDsKICB0LmJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzA7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxMDsKICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTE7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYzsKICB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7CiAgdC5ibGFja2xvd2VycmlnaHR0cmlhbmdsZSA9IDB4MjVlMjsKICB0LmJsYWNrcmVjdGFuZ2xlID0gMHgyNWFjOwogIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTsKICB0LmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI2OwogIHQuYmxhY2tzbWFsbHNxdWFyZSA9IDB4MjVhYTsKICB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7CiAgdC5ibGFja3NxdWFyZSA9IDB4MjVhMDsKICB0LmJsYWNrc3RhciA9IDB4MjYwNTsKICB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7CiAgdC5ibGFja3VwcGVycmlnaHR0cmlhbmdsZSA9IDB4MjVlNTsKICB0LmJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjQ7CiAgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjsKICB0LmJsYW5rID0gMHgyNDIzOwogIHQuYmxpbmViZWxvdyA9IDB4MWUwNzsKICB0LmJsb2NrID0gMHgyNTg4OwogIHQuYm1vbm9zcGFjZSA9IDB4ZmY0MjsKICB0LmJvYmFpbWFpdGhhaSA9IDB4MGUxYTsKICB0LmJvaGlyYWdhbmEgPSAweDMwN2M7CiAgdC5ib2thdGFrYW5hID0gMHgzMGRjOwogIHQuYnBhcmVuID0gMHgyNDlkOwogIHQuYnFzcXVhcmUgPSAweDMzYzM7CiAgdC5icmFjZWV4ID0gMHhmOGY0OwogIHQuYnJhY2VsZWZ0ID0gMHgwMDdiOwogIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7CiAgdC5icmFjZWxlZnRtaWQgPSAweGY4ZjI7CiAgdC5icmFjZWxlZnRtb25vc3BhY2UgPSAweGZmNWI7CiAgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjsKICB0LmJyYWNlbGVmdHRwID0gMHhmOGYxOwogIHQuYnJhY2VsZWZ0dmVydGljYWwgPSAweGZlMzc7CiAgdC5icmFjZXJpZ2h0ID0gMHgwMDdkOwogIHQuYnJhY2VyaWdodGJ0ID0gMHhmOGZlOwogIHQuYnJhY2VyaWdodG1pZCA9IDB4ZjhmZDsKICB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7CiAgdC5icmFjZXJpZ2h0c21hbGwgPSAweGZlNWM7CiAgdC5icmFjZXJpZ2h0dHAgPSAweGY4ZmM7CiAgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7CiAgdC5icmFja2V0bGVmdCA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YnQgPSAweGY4ZjA7CiAgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmOwogIHQuYnJhY2tldGxlZnRtb25vc3BhY2UgPSAweGZmM2I7CiAgdC5icmFja2V0bGVmdHRwID0gMHhmOGVlOwogIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkOwogIHQuYnJhY2tldHJpZ2h0YnQgPSAweGY4ZmI7CiAgdC5icmFja2V0cmlnaHRleCA9IDB4ZjhmYTsKICB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDsKICB0LmJyYWNrZXRyaWdodHRwID0gMHhmOGY5OwogIHQuYnJldmUgPSAweDAyZDg7CiAgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlOwogIHQuYnJldmVjbWIgPSAweDAzMDY7CiAgdC5icmV2ZWludmVydGVkYmVsb3djbWIgPSAweDAzMmY7CiAgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExOwogIHQuYnJldmVpbnZlcnRlZGRvdWJsZWNtYiA9IDB4MDM2MTsKICB0LmJyaWRnZWJlbG93Y21iID0gMHgwMzJhOwogIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTsKICB0LmJyb2tlbmJhciA9IDB4MDBhNjsKICB0LmJzdHJva2UgPSAweDAxODA7CiAgdC5ic3VwZXJpb3IgPSAweGY2ZWE7CiAgdC5idG9wYmFyID0gMHgwMTgzOwogIHQuYnVoaXJhZ2FuYSA9IDB4MzA3NjsKICB0LmJ1a2F0YWthbmEgPSAweDMwZDY7CiAgdC5idWxsZXQgPSAweDIwMjI7CiAgdC5idWxsZXRpbnZlcnNlID0gMHgyNWQ4OwogIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7CiAgdC5idWxsc2V5ZSA9IDB4MjVjZTsKICB0LmMgPSAweDAwNjM7CiAgdC5jYWFybWVuaWFuID0gMHgwNTZlOwogIHQuY2FiZW5nYWxpID0gMHgwOTlhOwogIHQuY2FjdXRlID0gMHgwMTA3OwogIHQuY2FkZXZhID0gMHgwOTFhOwogIHQuY2FndWphcmF0aSA9IDB4MGE5YTsKICB0LmNhZ3VybXVraGkgPSAweDBhMWE7CiAgdC5jYWxzcXVhcmUgPSAweDMzODg7CiAgdC5jYW5kcmFiaW5kdWJlbmdhbGkgPSAweDA5ODE7CiAgdC5jYW5kcmFiaW5kdWNtYiA9IDB4MDMxMDsKICB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTsKICB0LmNhbmRyYWJpbmR1Z3VqYXJhdGkgPSAweDBhODE7CiAgdC5jYXBzbG9jayA9IDB4MjFlYTsKICB0LmNhcmVvZiA9IDB4MjEwNTsKICB0LmNhcm9uID0gMHgwMmM3OwogIHQuY2Fyb25iZWxvd2NtYiA9IDB4MDMyYzsKICB0LmNhcm9uY21iID0gMHgwMzBjOwogIHQuY2FycmlhZ2VyZXR1cm4gPSAweDIxYjU7CiAgdC5jYm9wb21vZm8gPSAweDMxMTg7CiAgdC5jY2Fyb24gPSAweDAxMGQ7CiAgdC5jY2VkaWxsYSA9IDB4MDBlNzsKICB0LmNjZWRpbGxhYWN1dGUgPSAweDFlMDk7CiAgdC5jY2lyY2xlID0gMHgyNGQyOwogIHQuY2NpcmN1bWZsZXggPSAweDAxMDk7CiAgdC5jY3VybCA9IDB4MDI1NTsKICB0LmNkb3QgPSAweDAxMGI7CiAgdC5jZG90YWNjZW50ID0gMHgwMTBiOwogIHQuY2RzcXVhcmUgPSAweDMzYzU7CiAgdC5jZWRpbGxhID0gMHgwMGI4OwogIHQuY2VkaWxsYWNtYiA9IDB4MDMyNzsKICB0LmNlbnQgPSAweDAwYTI7CiAgdC5jZW50aWdyYWRlID0gMHgyMTAzOwogIHQuY2VudGluZmVyaW9yID0gMHhmNmRmOwogIHQuY2VudG1vbm9zcGFjZSA9IDB4ZmZlMDsKICB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjsKICB0LmNlbnRzdXBlcmlvciA9IDB4ZjZlMDsKICB0LmNoYWFybWVuaWFuID0gMHgwNTc5OwogIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjsKICB0LmNoYWRldmEgPSAweDA5MWI7CiAgdC5jaGFndWphcmF0aSA9IDB4MGE5YjsKICB0LmNoYWd1cm11a2hpID0gMHgwYTFiOwogIHQuY2hib3BvbW9mbyA9IDB4MzExNDsKICB0LmNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJkOwogIHQuY2hlY2ttYXJrID0gMHgyNzEzOwogIHQuY2hlY3lyaWxsaWMgPSAweDA0NDc7CiAgdC5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZjsKICB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3OwogIHQuY2hlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmNTsKICB0LmNoZWhhcm1lbmlhbiA9IDB4MDU3MzsKICB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYzsKICB0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0Yjk7CiAgdC5jaGkgPSAweDAzYzc7CiAgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NzsKICB0LmNoaWV1Y2hhcGFyZW5rb3JlYW4gPSAweDMyMTc7CiAgdC5jaGlldWNoY2lyY2xla29yZWFuID0gMHgzMjY5OwogIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTsKICB0LmNoaWV1Y2hwYXJlbmtvcmVhbiA9IDB4MzIwOTsKICB0LmNob2NoYW5ndGhhaSA9IDB4MGUwYTsKICB0LmNob2NoYW50aGFpID0gMHgwZTA4OwogIHQuY2hvY2hpbmd0aGFpID0gMHgwZTA5OwogIHQuY2hvY2hvZXRoYWkgPSAweDBlMGM7CiAgdC5jaG9vayA9IDB4MDE4ODsKICB0LmNpZXVjYWNpcmNsZWtvcmVhbiA9IDB4MzI3NjsKICB0LmNpZXVjYXBhcmVua29yZWFuID0gMHgzMjE2OwogIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7CiAgdC5jaWV1Y2tvcmVhbiA9IDB4MzE0ODsKICB0LmNpZXVjcGFyZW5rb3JlYW4gPSAweDMyMDg7CiAgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYzsKICB0LmNpcmNsZSA9IDB4MjVjYjsKICB0LmNpcmNsZWNvcHlydCA9IDB4MDBhOTsKICB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3OwogIHQuY2lyY2xlb3QgPSAweDIyOTk7CiAgdC5jaXJjbGVwbHVzID0gMHgyMjk1OwogIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjsKICB0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrID0gMHgyNWQwOwogIHQuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrID0gMHgyNWQxOwogIHQuY2lyY3VtZmxleCA9IDB4MDJjNjsKICB0LmNpcmN1bWZsZXhiZWxvd2NtYiA9IDB4MDMyZDsKICB0LmNpcmN1bWZsZXhjbWIgPSAweDAzMDI7CiAgdC5jbGVhciA9IDB4MjMyNzsKICB0LmNsaWNrYWx2ZW9sYXIgPSAweDAxYzI7CiAgdC5jbGlja2RlbnRhbCA9IDB4MDFjMDsKICB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTsKICB0LmNsaWNrcmV0cm9mbGV4ID0gMHgwMWMzOwogIHQuY2x1YiA9IDB4MjY2MzsKICB0LmNsdWJzdWl0YmxhY2sgPSAweDI2NjM7CiAgdC5jbHVic3VpdHdoaXRlID0gMHgyNjY3OwogIHQuY21jdWJlZHNxdWFyZSA9IDB4MzNhNDsKICB0LmNtb25vc3BhY2UgPSAweGZmNDM7CiAgdC5jbXNxdWFyZWRzcXVhcmUgPSAweDMzYTA7CiAgdC5jb2FybWVuaWFuID0gMHgwNTgxOwogIHQuY29sb24gPSAweDAwM2E7CiAgdC5jb2xvbm1vbmV0YXJ5ID0gMHgyMGExOwogIHQuY29sb25tb25vc3BhY2UgPSAweGZmMWE7CiAgdC5jb2xvbnNpZ24gPSAweDIwYTE7CiAgdC5jb2xvbnNtYWxsID0gMHhmZTU1OwogIHQuY29sb250cmlhbmd1bGFyaGFsZm1vZCA9IDB4MDJkMTsKICB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDsKICB0LmNvbW1hID0gMHgwMDJjOwogIHQuY29tbWFhYm92ZWNtYiA9IDB4MDMxMzsKICB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTsKICB0LmNvbW1hYWNjZW50ID0gMHhmNmMzOwogIHQuY29tbWFhcmFiaWMgPSAweDA2MGM7CiAgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkOwogIHQuY29tbWFpbmZlcmlvciA9IDB4ZjZlMTsKICB0LmNvbW1hbW9ub3NwYWNlID0gMHhmZjBjOwogIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0OwogIHQuY29tbWFyZXZlcnNlZG1vZCA9IDB4MDJiZDsKICB0LmNvbW1hc21hbGwgPSAweGZlNTA7CiAgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyOwogIHQuY29tbWF0dXJuZWRhYm92ZWNtYiA9IDB4MDMxMjsKICB0LmNvbW1hdHVybmVkbW9kID0gMHgwMmJiOwogIHQuY29tcGFzcyA9IDB4MjYzYzsKICB0LmNvbmdydWVudCA9IDB4MjI0NTsKICB0LmNvbnRvdXJpbnRlZ3JhbCA9IDB4MjIyZTsKICB0LmNvbnRyb2wgPSAweDIzMDM7CiAgdC5jb250cm9sQUNLID0gMHgwMDA2OwogIHQuY29udHJvbEJFTCA9IDB4MDAwNzsKICB0LmNvbnRyb2xCUyA9IDB4MDAwODsKICB0LmNvbnRyb2xDQU4gPSAweDAwMTg7CiAgdC5jb250cm9sQ1IgPSAweDAwMGQ7CiAgdC5jb250cm9sREMxID0gMHgwMDExOwogIHQuY29udHJvbERDMiA9IDB4MDAxMjsKICB0LmNvbnRyb2xEQzMgPSAweDAwMTM7CiAgdC5jb250cm9sREM0ID0gMHgwMDE0OwogIHQuY29udHJvbERFTCA9IDB4MDA3ZjsKICB0LmNvbnRyb2xETEUgPSAweDAwMTA7CiAgdC5jb250cm9sRU0gPSAweDAwMTk7CiAgdC5jb250cm9sRU5RID0gMHgwMDA1OwogIHQuY29udHJvbEVPVCA9IDB4MDAwNDsKICB0LmNvbnRyb2xFU0MgPSAweDAwMWI7CiAgdC5jb250cm9sRVRCID0gMHgwMDE3OwogIHQuY29udHJvbEVUWCA9IDB4MDAwMzsKICB0LmNvbnRyb2xGRiA9IDB4MDAwYzsKICB0LmNvbnRyb2xGUyA9IDB4MDAxYzsKICB0LmNvbnRyb2xHUyA9IDB4MDAxZDsKICB0LmNvbnRyb2xIVCA9IDB4MDAwOTsKICB0LmNvbnRyb2xMRiA9IDB4MDAwYTsKICB0LmNvbnRyb2xOQUsgPSAweDAwMTU7CiAgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsKICB0LmNvbnRyb2xSUyA9IDB4MDAxZTsKICB0LmNvbnRyb2xTSSA9IDB4MDAwZjsKICB0LmNvbnRyb2xTTyA9IDB4MDAwZTsKICB0LmNvbnRyb2xTT1QgPSAweDAwMDI7CiAgdC5jb250cm9sU1RYID0gMHgwMDAxOwogIHQuY29udHJvbFNVQiA9IDB4MDAxYTsKICB0LmNvbnRyb2xTWU4gPSAweDAwMTY7CiAgdC5jb250cm9sVVMgPSAweDAwMWY7CiAgdC5jb250cm9sVlQgPSAweDAwMGI7CiAgdC5jb3B5cmlnaHQgPSAweDAwYTk7CiAgdC5jb3B5cmlnaHRzYW5zID0gMHhmOGU5OwogIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7CiAgdC5jb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwYzsKICB0LmNvcm5lcmJyYWNrZXRsZWZ0aGFsZndpZHRoID0gMHhmZjYyOwogIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTsKICB0LmNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZDsKICB0LmNvcm5lcmJyYWNrZXRyaWdodGhhbGZ3aWR0aCA9IDB4ZmY2MzsKICB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyOwogIHQuY29ycG9yYXRpb25zcXVhcmUgPSAweDMzN2Y7CiAgdC5jb3NxdWFyZSA9IDB4MzNjNzsKICB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7CiAgdC5jcGFyZW4gPSAweDI0OWU7CiAgdC5jcnV6ZWlybyA9IDB4MjBhMjsKICB0LmNzdHJldGNoZWQgPSAweDAyOTc7CiAgdC5jdXJseWFuZCA9IDB4MjJjZjsKICB0LmN1cmx5b3IgPSAweDIyY2U7CiAgdC5jdXJyZW5jeSA9IDB4MDBhNDsKICB0LmN5ckJyZXZlID0gMHhmNmQxOwogIHQuY3lyRmxleCA9IDB4ZjZkMjsKICB0LmN5cmJyZXZlID0gMHhmNmQ0OwogIHQuY3lyZmxleCA9IDB4ZjZkNTsKICB0LmQgPSAweDAwNjQ7CiAgdC5kYWFybWVuaWFuID0gMHgwNTY0OwogIHQuZGFiZW5nYWxpID0gMHgwOWE2OwogIHQuZGFkYXJhYmljID0gMHgwNjM2OwogIHQuZGFkZXZhID0gMHgwOTI2OwogIHQuZGFkZmluYWxhcmFiaWMgPSAweGZlYmU7CiAgdC5kYWRpbml0aWFsYXJhYmljID0gMHhmZWJmOwogIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwOwogIHQuZGFnZXNoID0gMHgwNWJjOwogIHQuZGFnZXNoaGVicmV3ID0gMHgwNWJjOwogIHQuZGFnZ2VyID0gMHgyMDIwOwogIHQuZGFnZ2VyZGJsID0gMHgyMDIxOwogIHQuZGFndWphcmF0aSA9IDB4MGFhNjsKICB0LmRhZ3VybXVraGkgPSAweDBhMjY7CiAgdC5kYWhpcmFnYW5hID0gMHgzMDYwOwogIHQuZGFrYXRha2FuYSA9IDB4MzBjMDsKICB0LmRhbGFyYWJpYyA9IDB4MDYyZjsKICB0LmRhbGV0ID0gMHgwNWQzOwogIHQuZGFsZXRkYWdlc2ggPSAweGZiMzM7CiAgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMzsKICB0LmRhbGV0aGVicmV3ID0gMHgwNWQzOwogIHQuZGFsZmluYWxhcmFiaWMgPSAweGZlYWE7CiAgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjsKICB0LmRhbW1hbG93YXJhYmljID0gMHgwNjRmOwogIHQuZGFtbWF0YW5hbHRvbmVhcmFiaWMgPSAweDA2NGM7CiAgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YzsKICB0LmRhbmRhID0gMHgwOTY0OwogIHQuZGFyZ2FoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODU7CiAgdC5kYmxHcmF2ZSA9IDB4ZjZkMzsKICB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7CiAgdC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Q7CiAgdC5kYmxhbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwYjsKICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7CiAgdC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyYjsKICB0LmRibGFycm93bGVmdCA9IDB4MjFkNDsKICB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7CiAgdC5kYmxkYW5kYSA9IDB4MDk2NTsKICB0LmRibGdyYXZlID0gMHhmNmQ2OwogIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7CiAgdC5kYmxpbnRlZ3JhbCA9IDB4MjIyYzsKICB0LmRibGxvd2xpbmUgPSAweDIwMTc7CiAgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzOwogIHQuZGJsb3ZlcmxpbmVjbWIgPSAweDAzM2Y7CiAgdC5kYmxwcmltZW1vZCA9IDB4MDJiYTsKICB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2OwogIHQuZGJsdmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGU7CiAgdC5kYm9wb21vZm8gPSAweDMxMDk7CiAgdC5kYnNxdWFyZSA9IDB4MzNjODsKICB0LmRjYXJvbiA9IDB4MDEwZjsKICB0LmRjZWRpbGxhID0gMHgxZTExOwogIHQuZGNpcmNsZSA9IDB4MjRkMzsKICB0LmRjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTM7CiAgdC5kY3JvYXQgPSAweDAxMTE7CiAgdC5kZGFiZW5nYWxpID0gMHgwOWExOwogIHQuZGRhZGV2YSA9IDB4MDkyMTsKICB0LmRkYWd1amFyYXRpID0gMHgwYWExOwogIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7CiAgdC5kZGFsYXJhYmljID0gMHgwNjg4OwogIHQuZGRhbGZpbmFsYXJhYmljID0gMHhmYjg5OwogIHQuZGRkaGFkZXZhID0gMHgwOTVjOwogIHQuZGRoYWJlbmdhbGkgPSAweDA5YTI7CiAgdC5kZGhhZGV2YSA9IDB4MDkyMjsKICB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjsKICB0LmRkaGFndXJtdWtoaSA9IDB4MGEyMjsKICB0LmRkb3RhY2NlbnQgPSAweDFlMGI7CiAgdC5kZG90YmVsb3cgPSAweDFlMGQ7CiAgdC5kZWNpbWFsc2VwYXJhdG9yYXJhYmljID0gMHgwNjZiOwogIHQuZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmI7CiAgdC5kZWN5cmlsbGljID0gMHgwNDM0OwogIHQuZGVncmVlID0gMHgwMGIwOwogIHQuZGVoaWhlYnJldyA9IDB4MDVhZDsKICB0LmRlaGlyYWdhbmEgPSAweDMwNjc7CiAgdC5kZWljb3B0aWMgPSAweDAzZWY7CiAgdC5kZWthdGFrYW5hID0gMHgzMGM3OwogIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjsKICB0LmRlbGV0ZXJpZ2h0ID0gMHgyMzI2OwogIHQuZGVsdGEgPSAweDAzYjQ7CiAgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDsKICB0LmRlbm9taW5hdG9ybWludXNvbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY4OwogIHQuZGV6aCA9IDB4MDJhNDsKICB0LmRoYWJlbmdhbGkgPSAweDA5YTc7CiAgdC5kaGFkZXZhID0gMHgwOTI3OwogIHQuZGhhZ3VqYXJhdGkgPSAweDBhYTc7CiAgdC5kaGFndXJtdWtoaSA9IDB4MGEyNzsKICB0LmRob29rID0gMHgwMjU3OwogIHQuZGlhbHl0aWthdG9ub3MgPSAweDAzODU7CiAgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDsKICB0LmRpYW1vbmQgPSAweDI2NjY7CiAgdC5kaWFtb25kc3VpdHdoaXRlID0gMHgyNjYyOwogIHQuZGllcmVzaXMgPSAweDAwYTg7CiAgdC5kaWVyZXNpc2FjdXRlID0gMHhmNmQ3OwogIHQuZGllcmVzaXNiZWxvd2NtYiA9IDB4MDMyNDsKICB0LmRpZXJlc2lzY21iID0gMHgwMzA4OwogIHQuZGllcmVzaXNncmF2ZSA9IDB4ZjZkODsKICB0LmRpZXJlc2lzdG9ub3MgPSAweDAzODU7CiAgdC5kaWhpcmFnYW5hID0gMHgzMDYyOwogIHQuZGlrYXRha2FuYSA9IDB4MzBjMjsKICB0LmRpdHRvbWFyayA9IDB4MzAwMzsKICB0LmRpdmlkZSA9IDB4MDBmNzsKICB0LmRpdmlkZXMgPSAweDIyMjM7CiAgdC5kaXZpc2lvbnNsYXNoID0gMHgyMjE1OwogIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7CiAgdC5ka3NoYWRlID0gMHgyNTkzOwogIHQuZGxpbmViZWxvdyA9IDB4MWUwZjsKICB0LmRsc3F1YXJlID0gMHgzMzk3OwogIHQuZG1hY3JvbiA9IDB4MDExMTsKICB0LmRtb25vc3BhY2UgPSAweGZmNDQ7CiAgdC5kbmJsb2NrID0gMHgyNTg0OwogIHQuZG9jaGFkYXRoYWkgPSAweDBlMGU7CiAgdC5kb2Rla3RoYWkgPSAweDBlMTQ7CiAgdC5kb2hpcmFnYW5hID0gMHgzMDY5OwogIHQuZG9rYXRha2FuYSA9IDB4MzBjOTsKICB0LmRvbGxhciA9IDB4MDAyNDsKICB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzOwogIHQuZG9sbGFybW9ub3NwYWNlID0gMHhmZjA0OwogIHQuZG9sbGFyb2xkc3R5bGUgPSAweGY3MjQ7CiAgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTsKICB0LmRvbGxhcnN1cGVyaW9yID0gMHhmNmU0OwogIHQuZG9uZyA9IDB4MjBhYjsKICB0LmRvcnVzcXVhcmUgPSAweDMzMjY7CiAgdC5kb3RhY2NlbnQgPSAweDAyZDk7CiAgdC5kb3RhY2NlbnRjbWIgPSAweDAzMDc7CiAgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMzsKICB0LmRvdGJlbG93Y29tYiA9IDB4MDMyMzsKICB0LmRvdGthdGFrYW5hID0gMHgzMGZiOwogIHQuZG90bGVzc2kgPSAweDAxMzE7CiAgdC5kb3RsZXNzaiA9IDB4ZjZiZTsKICB0LmRvdGxlc3Nqc3Ryb2tlaG9vayA9IDB4MDI4NDsKICB0LmRvdG1hdGggPSAweDIyYzU7CiAgdC5kb3R0ZWRjaXJjbGUgPSAweDI1Y2M7CiAgdC5kb3VibGV5b2RwYXRhaCA9IDB4ZmIxZjsKICB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOwogIHQuZG93bnRhY2tiZWxvd2NtYiA9IDB4MDMxZTsKICB0LmRvd250YWNrbW9kID0gMHgwMmQ1OwogIHQuZHBhcmVuID0gMHgyNDlmOwogIHQuZHN1cGVyaW9yID0gMHhmNmViOwogIHQuZHRhaWwgPSAweDAyNTY7CiAgdC5kdG9wYmFyID0gMHgwMThjOwogIHQuZHVoaXJhZ2FuYSA9IDB4MzA2NTsKICB0LmR1a2F0YWthbmEgPSAweDMwYzU7CiAgdC5keiA9IDB4MDFmMzsKICB0LmR6YWx0b25lID0gMHgwMmEzOwogIHQuZHpjYXJvbiA9IDB4MDFjNjsKICB0LmR6Y3VybCA9IDB4MDJhNTsKICB0LmR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUxOwogIHQuZHplY3lyaWxsaWMgPSAweDA0NTU7CiAgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7CiAgdC5lID0gMHgwMDY1OwogIHQuZWFjdXRlID0gMHgwMGU5OwogIHQuZWFydGggPSAweDI2NDE7CiAgdC5lYmVuZ2FsaSA9IDB4MDk4ZjsKICB0LmVib3BvbW9mbyA9IDB4MzExYzsKICB0LmVicmV2ZSA9IDB4MDExNTsKICB0LmVjYW5kcmFkZXZhID0gMHgwOTBkOwogIHQuZWNhbmRyYWd1amFyYXRpID0gMHgwYThkOwogIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7CiAgdC5lY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzU7CiAgdC5lY2Fyb24gPSAweDAxMWI7CiAgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkOwogIHQuZWNoYXJtZW5pYW4gPSAweDA1NjU7CiAgdC5lY2h5aXduYXJtZW5pYW4gPSAweDA1ODc7CiAgdC5lY2lyY2xlID0gMHgyNGQ0OwogIHQuZWNpcmN1bWZsZXggPSAweDAwZWE7CiAgdC5lY2lyY3VtZmxleGFjdXRlID0gMHgxZWJmOwogIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTsKICB0LmVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzc7CiAgdC5lY2lyY3VtZmxleGdyYXZlID0gMHgxZWMxOwogIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7CiAgdC5lY2lyY3VtZmxleHRpbGRlID0gMHgxZWM1OwogIHQuZWN5cmlsbGljID0gMHgwNDU0OwogIHQuZWRibGdyYXZlID0gMHgwMjA1OwogIHQuZWRldmEgPSAweDA5MGY7CiAgdC5lZGllcmVzaXMgPSAweDAwZWI7CiAgdC5lZG90ID0gMHgwMTE3OwogIHQuZWRvdGFjY2VudCA9IDB4MDExNzsKICB0LmVkb3RiZWxvdyA9IDB4MWViOTsKICB0LmVlZ3VybXVraGkgPSAweDBhMGY7CiAgdC5lZW1hdHJhZ3VybXVraGkgPSAweDBhNDc7CiAgdC5lZmN5cmlsbGljID0gMHgwNDQ0OwogIHQuZWdyYXZlID0gMHgwMGU4OwogIHQuZWd1amFyYXRpID0gMHgwYThmOwogIHQuZWhhcm1lbmlhbiA9IDB4MDU2NzsKICB0LmVoYm9wb21vZm8gPSAweDMxMWQ7CiAgdC5laGlyYWdhbmEgPSAweDMwNDg7CiAgdC5laG9va2Fib3ZlID0gMHgxZWJiOwogIHQuZWlib3BvbW9mbyA9IDB4MzExZjsKICB0LmVpZ2h0ID0gMHgwMDM4OwogIHQuZWlnaHRhcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7CiAgdC5laWdodGNpcmNsZSA9IDB4MjQ2NzsKICB0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MTsKICB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTsKICB0LmVpZ2h0ZWVuY2lyY2xlID0gMHgyNDcxOwogIHQuZWlnaHRlZW5wYXJlbiA9IDB4MjQ4NTsKICB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5OwogIHQuZWlnaHRndWphcmF0aSA9IDB4MGFlZTsKICB0LmVpZ2h0Z3VybXVraGkgPSAweDBhNmU7CiAgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGhhbmd6aG91ID0gMHgzMDI4OwogIHQuZWlnaHRobm90ZWJlYW1lZCA9IDB4MjY2YjsKICB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNzsKICB0LmVpZ2h0aW5mZXJpb3IgPSAweDIwODg7CiAgdC5laWdodG1vbm9zcGFjZSA9IDB4ZmYxODsKICB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7CiAgdC5laWdodHBhcmVuID0gMHgyNDdiOwogIHQuZWlnaHRwZXJpb2QgPSAweDI0OGY7CiAgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7CiAgdC5laWdodHJvbWFuID0gMHgyMTc3OwogIHQuZWlnaHRzdXBlcmlvciA9IDB4MjA3ODsKICB0LmVpZ2h0dGhhaSA9IDB4MGU1ODsKICB0LmVpbnZlcnRlZGJyZXZlID0gMHgwMjA3OwogIHQuZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjU7CiAgdC5la2F0YWthbmEgPSAweDMwYTg7CiAgdC5la2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzQ7CiAgdC5la29ua2FyZ3VybXVraGkgPSAweDBhNzQ7CiAgdC5la29yZWFuID0gMHgzMTU0OwogIHQuZWxjeXJpbGxpYyA9IDB4MDQzYjsKICB0LmVsZW1lbnQgPSAweDIyMDg7CiAgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7CiAgdC5lbGV2ZW5wYXJlbiA9IDB4MjQ3ZTsKICB0LmVsZXZlbnBlcmlvZCA9IDB4MjQ5MjsKICB0LmVsZXZlbnJvbWFuID0gMHgyMTdhOwogIHQuZWxsaXBzaXMgPSAweDIwMjY7CiAgdC5lbGxpcHNpc3ZlcnRpY2FsID0gMHgyMmVlOwogIHQuZW1hY3JvbiA9IDB4MDExMzsKICB0LmVtYWNyb25hY3V0ZSA9IDB4MWUxNzsKICB0LmVtYWNyb25ncmF2ZSA9IDB4MWUxNTsKICB0LmVtY3lyaWxsaWMgPSAweDA0M2M7CiAgdC5lbWRhc2ggPSAweDIwMTQ7CiAgdC5lbWRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMTsKICB0LmVtb25vc3BhY2UgPSAweGZmNDU7CiAgdC5lbXBoYXNpc21hcmthcm1lbmlhbiA9IDB4MDU1YjsKICB0LmVtcHR5c2V0ID0gMHgyMjA1OwogIHQuZW5ib3BvbW9mbyA9IDB4MzEyMzsKICB0LmVuY3lyaWxsaWMgPSAweDA0M2Q7CiAgdC5lbmRhc2ggPSAweDIwMTM7CiAgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjsKICB0LmVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTM7CiAgdC5lbmcgPSAweDAxNGI7CiAgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTsKICB0LmVuZ2hlY3lyaWxsaWMgPSAweDA0YTU7CiAgdC5lbmhvb2tjeXJpbGxpYyA9IDB4MDRjODsKICB0LmVuc3BhY2UgPSAweDIwMDI7CiAgdC5lb2dvbmVrID0gMHgwMTE5OwogIHQuZW9rb3JlYW4gPSAweDMxNTM7CiAgdC5lb3BlbiA9IDB4MDI1YjsKICB0LmVvcGVuY2xvc2VkID0gMHgwMjlhOwogIHQuZW9wZW5yZXZlcnNlZCA9IDB4MDI1YzsKICB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7CiAgdC5lb3BlbnJldmVyc2VkaG9vayA9IDB4MDI1ZDsKICB0LmVwYXJlbiA9IDB4MjRhMDsKICB0LmVwc2lsb24gPSAweDAzYjU7CiAgdC5lcHNpbG9udG9ub3MgPSAweDAzYWQ7CiAgdC5lcXVhbCA9IDB4MDAzZDsKICB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkOwogIHQuZXF1YWxzbWFsbCA9IDB4ZmU2NjsKICB0LmVxdWFsc3VwZXJpb3IgPSAweDIwN2M7CiAgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTsKICB0LmVyYm9wb21vZm8gPSAweDMxMjY7CiAgdC5lcmN5cmlsbGljID0gMHgwNDQwOwogIHQuZXJldmVyc2VkID0gMHgwMjU4OwogIHQuZXJldmVyc2VkY3lyaWxsaWMgPSAweDA0NGQ7CiAgdC5lc2N5cmlsbGljID0gMHgwNDQxOwogIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjsKICB0LmVzaCA9IDB4MDI4MzsKICB0LmVzaGN1cmwgPSAweDAyODY7CiAgdC5lc2hvcnRkZXZhID0gMHgwOTBlOwogIHQuZXNob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0NjsKICB0LmVzaHJldmVyc2VkbG9vcCA9IDB4MDFhYTsKICB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7CiAgdC5lc21hbGxoaXJhZ2FuYSA9IDB4MzA0NzsKICB0LmVzbWFsbGthdGFrYW5hID0gMHgzMGE3OwogIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7CiAgdC5lc3RpbWF0ZWQgPSAweDIxMmU7CiAgdC5lc3VwZXJpb3IgPSAweGY2ZWM7CiAgdC5ldGEgPSAweDAzYjc7CiAgdC5ldGFybWVuaWFuID0gMHgwNTY4OwogIHQuZXRhdG9ub3MgPSAweDAzYWU7CiAgdC5ldGggPSAweDAwZjA7CiAgdC5ldGlsZGUgPSAweDFlYmQ7CiAgdC5ldGlsZGViZWxvdyA9IDB4MWUxYjsKICB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTsKICB0LmV0bmFodGFmb3VraGxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ldG5haHRhaGVicmV3ID0gMHgwNTkxOwogIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ldHVybmVkID0gMHgwMWRkOwogIHQuZXVrb3JlYW4gPSAweDMxNjE7CiAgdC5ldXJvID0gMHgyMGFjOwogIHQuZXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzc7CiAgdC5ldm93ZWxzaWduZGV2YSA9IDB4MDk0NzsKICB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNzsKICB0LmV4Y2xhbSA9IDB4MDAyMTsKICB0LmV4Y2xhbWFybWVuaWFuID0gMHgwNTVjOwogIHQuZXhjbGFtZGJsID0gMHgyMDNjOwogIHQuZXhjbGFtZG93biA9IDB4MDBhMTsKICB0LmV4Y2xhbWRvd25zbWFsbCA9IDB4ZjdhMTsKICB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTsKICB0LmV4Y2xhbXNtYWxsID0gMHhmNzIxOwogIHQuZXhpc3RlbnRpYWwgPSAweDIyMDM7CiAgdC5lemggPSAweDAyOTI7CiAgdC5lemhjYXJvbiA9IDB4MDFlZjsKICB0LmV6aGN1cmwgPSAweDAyOTM7CiAgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTsKICB0LmV6aHRhaWwgPSAweDAxYmE7CiAgdC5mID0gMHgwMDY2OwogIHQuZmFkZXZhID0gMHgwOTVlOwogIHQuZmFndXJtdWtoaSA9IDB4MGE1ZTsKICB0LmZhaHJlbmhlaXQgPSAweDIxMDk7CiAgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTsKICB0LmZhdGhhbG93YXJhYmljID0gMHgwNjRlOwogIHQuZmF0aGF0YW5hcmFiaWMgPSAweDA2NGI7CiAgdC5mYm9wb21vZm8gPSAweDMxMDg7CiAgdC5mY2lyY2xlID0gMHgyNGQ1OwogIHQuZmRvdGFjY2VudCA9IDB4MWUxZjsKICB0LmZlaGFyYWJpYyA9IDB4MDY0MTsKICB0LmZlaGFybWVuaWFuID0gMHgwNTg2OwogIHQuZmVoZmluYWxhcmFiaWMgPSAweGZlZDI7CiAgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzOwogIHQuZmVobWVkaWFsYXJhYmljID0gMHhmZWQ0OwogIHQuZmVpY29wdGljID0gMHgwM2U1OwogIHQuZmVtYWxlID0gMHgyNjQwOwogIHQuZmYgPSAweGZiMDA7CiAgdC5mX2YgPSAweGZiMDA7CiAgdC5mZmkgPSAweGZiMDM7CiAgdC5mX2ZfaSA9IDB4ZmIwMzsKICB0LmZmbCA9IDB4ZmIwNDsKICB0LmZfZl9sID0gMHhmYjA0OwogIHQuZmkgPSAweGZiMDE7CiAgdC5mX2kgPSAweGZiMDE7CiAgdC5maWZ0ZWVuY2lyY2xlID0gMHgyNDZlOwogIHQuZmlmdGVlbnBhcmVuID0gMHgyNDgyOwogIHQuZmlmdGVlbnBlcmlvZCA9IDB4MjQ5NjsKICB0LmZpZ3VyZWRhc2ggPSAweDIwMTI7CiAgdC5maWxsZWRib3ggPSAweDI1YTA7CiAgdC5maWxsZWRyZWN0ID0gMHgyNWFjOwogIHQuZmluYWxrYWYgPSAweDA1ZGE7CiAgdC5maW5hbGthZmRhZ2VzaCA9IDB4ZmIzYTsKICB0LmZpbmFsa2FmZGFnZXNoaGVicmV3ID0gMHhmYjNhOwogIHQuZmluYWxrYWZoZWJyZXcgPSAweDA1ZGE7CiAgdC5maW5hbG1lbSA9IDB4MDVkZDsKICB0LmZpbmFsbWVtaGVicmV3ID0gMHgwNWRkOwogIHQuZmluYWxudW4gPSAweDA1ZGY7CiAgdC5maW5hbG51bmhlYnJldyA9IDB4MDVkZjsKICB0LmZpbmFscGUgPSAweDA1ZTM7CiAgdC5maW5hbHBlaGVicmV3ID0gMHgwNWUzOwogIHQuZmluYWx0c2FkaSA9IDB4MDVlNTsKICB0LmZpbmFsdHNhZGloZWJyZXcgPSAweDA1ZTU7CiAgdC5maXJzdHRvbmVjaGluZXNlID0gMHgwMmM5OwogIHQuZmlzaGV5ZSA9IDB4MjVjOTsKICB0LmZpdGFjeXJpbGxpYyA9IDB4MDQ3MzsKICB0LmZpdmUgPSAweDAwMzU7CiAgdC5maXZlYXJhYmljID0gMHgwNjY1OwogIHQuZml2ZWJlbmdhbGkgPSAweDA5ZWI7CiAgdC5maXZlY2lyY2xlID0gMHgyNDY0OwogIHQuZml2ZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGU7CiAgdC5maXZlZGV2YSA9IDB4MDk2YjsKICB0LmZpdmVlaWdodGhzID0gMHgyMTVkOwogIHQuZml2ZWd1amFyYXRpID0gMHgwYWViOwogIHQuZml2ZWd1cm11a2hpID0gMHgwYTZiOwogIHQuZml2ZWhhY2thcmFiaWMgPSAweDA2NjU7CiAgdC5maXZlaGFuZ3pob3UgPSAweDMwMjU7CiAgdC5maXZlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNDsKICB0LmZpdmVpbmZlcmlvciA9IDB4MjA4NTsKICB0LmZpdmVtb25vc3BhY2UgPSAweGZmMTU7CiAgdC5maXZlb2xkc3R5bGUgPSAweGY3MzU7CiAgdC5maXZlcGFyZW4gPSAweDI0Nzg7CiAgdC5maXZlcGVyaW9kID0gMHgyNDhjOwogIHQuZml2ZXBlcnNpYW4gPSAweDA2ZjU7CiAgdC5maXZlcm9tYW4gPSAweDIxNzQ7CiAgdC5maXZlc3VwZXJpb3IgPSAweDIwNzU7CiAgdC5maXZldGhhaSA9IDB4MGU1NTsKICB0LmZsID0gMHhmYjAyOwogIHQuZl9sID0gMHhmYjAyOwogIHQuZmxvcmluID0gMHgwMTkyOwogIHQuZm1vbm9zcGFjZSA9IDB4ZmY0NjsKICB0LmZtc3F1YXJlID0gMHgzMzk5OwogIHQuZm9mYW50aGFpID0gMHgwZTFmOwogIHQuZm9mYXRoYWkgPSAweDBlMWQ7CiAgdC5mb25nbWFudGhhaSA9IDB4MGU0ZjsKICB0LmZvcmFsbCA9IDB4MjIwMDsKICB0LmZvdXIgPSAweDAwMzQ7CiAgdC5mb3VyYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmJlbmdhbGkgPSAweDA5ZWE7CiAgdC5mb3VyY2lyY2xlID0gMHgyNDYzOwogIHQuZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGQ7CiAgdC5mb3VyZGV2YSA9IDB4MDk2YTsKICB0LmZvdXJndWphcmF0aSA9IDB4MGFlYTsKICB0LmZvdXJndXJtdWtoaSA9IDB4MGE2YTsKICB0LmZvdXJoYWNrYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmhhbmd6aG91ID0gMHgzMDI0OwogIHQuZm91cmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjM7CiAgdC5mb3VyaW5mZXJpb3IgPSAweDIwODQ7CiAgdC5mb3VybW9ub3NwYWNlID0gMHhmZjE0OwogIHQuZm91cm51bWVyYXRvcmJlbmdhbGkgPSAweDA5Zjc7CiAgdC5mb3Vyb2xkc3R5bGUgPSAweGY3MzQ7CiAgdC5mb3VycGFyZW4gPSAweDI0Nzc7CiAgdC5mb3VycGVyaW9kID0gMHgyNDhiOwogIHQuZm91cnBlcnNpYW4gPSAweDA2ZjQ7CiAgdC5mb3Vycm9tYW4gPSAweDIxNzM7CiAgdC5mb3Vyc3VwZXJpb3IgPSAweDIwNzQ7CiAgdC5mb3VydGVlbmNpcmNsZSA9IDB4MjQ2ZDsKICB0LmZvdXJ0ZWVucGFyZW4gPSAweDI0ODE7CiAgdC5mb3VydGVlbnBlcmlvZCA9IDB4MjQ5NTsKICB0LmZvdXJ0aGFpID0gMHgwZTU0OwogIHQuZm91cnRodG9uZWNoaW5lc2UgPSAweDAyY2I7CiAgdC5mcGFyZW4gPSAweDI0YTE7CiAgdC5mcmFjdGlvbiA9IDB4MjA0NDsKICB0LmZyYW5jID0gMHgyMGEzOwogIHQuZyA9IDB4MDA2NzsKICB0LmdhYmVuZ2FsaSA9IDB4MDk5NzsKICB0LmdhY3V0ZSA9IDB4MDFmNTsKICB0LmdhZGV2YSA9IDB4MDkxNzsKICB0LmdhZmFyYWJpYyA9IDB4MDZhZjsKICB0LmdhZmZpbmFsYXJhYmljID0gMHhmYjkzOwogIHQuZ2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmI5NDsKICB0LmdhZm1lZGlhbGFyYWJpYyA9IDB4ZmI5NTsKICB0LmdhZ3VqYXJhdGkgPSAweDBhOTc7CiAgdC5nYWd1cm11a2hpID0gMHgwYTE3OwogIHQuZ2FoaXJhZ2FuYSA9IDB4MzA0YzsKICB0Lmdha2F0YWthbmEgPSAweDMwYWM7CiAgdC5nYW1tYSA9IDB4MDNiMzsKICB0LmdhbW1hbGF0aW5zbWFsbCA9IDB4MDI2MzsKICB0LmdhbW1hc3VwZXJpb3IgPSAweDAyZTA7CiAgdC5nYW5naWFjb3B0aWMgPSAweDAzZWI7CiAgdC5nYm9wb21vZm8gPSAweDMxMGQ7CiAgdC5nYnJldmUgPSAweDAxMWY7CiAgdC5nY2Fyb24gPSAweDAxZTc7CiAgdC5nY2VkaWxsYSA9IDB4MDEyMzsKICB0LmdjaXJjbGUgPSAweDI0ZDY7CiAgdC5nY2lyY3VtZmxleCA9IDB4MDExZDsKICB0Lmdjb21tYWFjY2VudCA9IDB4MDEyMzsKICB0Lmdkb3QgPSAweDAxMjE7CiAgdC5nZG90YWNjZW50ID0gMHgwMTIxOwogIHQuZ2VjeXJpbGxpYyA9IDB4MDQzMzsKICB0LmdlaGlyYWdhbmEgPSAweDMwNTI7CiAgdC5nZWthdGFrYW5hID0gMHgzMGIyOwogIHQuZ2VvbWV0cmljYWxseWVxdWFsID0gMHgyMjUxOwogIHQuZ2VyZXNoYWNjZW50aGVicmV3ID0gMHgwNTljOwogIHQuZ2VyZXNoaGVicmV3ID0gMHgwNWYzOwogIHQuZ2VyZXNobXVxZGFtaGVicmV3ID0gMHgwNTlkOwogIHQuZ2VybWFuZGJscyA9IDB4MDBkZjsKICB0LmdlcnNoYXlpbWFjY2VudGhlYnJldyA9IDB4MDU5ZTsKICB0LmdlcnNoYXlpbWhlYnJldyA9IDB4MDVmNDsKICB0LmdldGFtYXJrID0gMHgzMDEzOwogIHQuZ2hhYmVuZ2FsaSA9IDB4MDk5ODsKICB0LmdoYWRhcm1lbmlhbiA9IDB4MDU3MjsKICB0LmdoYWRldmEgPSAweDA5MTg7CiAgdC5naGFndWphcmF0aSA9IDB4MGE5ODsKICB0LmdoYWd1cm11a2hpID0gMHgwYTE4OwogIHQuZ2hhaW5hcmFiaWMgPSAweDA2M2E7CiAgdC5naGFpbmZpbmFsYXJhYmljID0gMHhmZWNlOwogIHQuZ2hhaW5pbml0aWFsYXJhYmljID0gMHhmZWNmOwogIHQuZ2hhaW5tZWRpYWxhcmFiaWMgPSAweGZlZDA7CiAgdC5naGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTU7CiAgdC5naGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MzsKICB0LmdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkxOwogIHQuZ2hoYWRldmEgPSAweDA5NWE7CiAgdC5naGhhZ3VybXVraGkgPSAweDBhNWE7CiAgdC5naG9vayA9IDB4MDI2MDsKICB0LmdoenNxdWFyZSA9IDB4MzM5MzsKICB0LmdpaGlyYWdhbmEgPSAweDMwNGU7CiAgdC5naWthdGFrYW5hID0gMHgzMGFlOwogIHQuZ2ltYXJtZW5pYW4gPSAweDA1NjM7CiAgdC5naW1lbCA9IDB4MDVkMjsKICB0LmdpbWVsZGFnZXNoID0gMHhmYjMyOwogIHQuZ2ltZWxkYWdlc2hoZWJyZXcgPSAweGZiMzI7CiAgdC5naW1lbGhlYnJldyA9IDB4MDVkMjsKICB0LmdqZWN5cmlsbGljID0gMHgwNDUzOwogIHQuZ2xvdHRhbGludmVydGVkc3Ryb2tlID0gMHgwMWJlOwogIHQuZ2xvdHRhbHN0b3AgPSAweDAyOTQ7CiAgdC5nbG90dGFsc3RvcGludmVydGVkID0gMHgwMjk2OwogIHQuZ2xvdHRhbHN0b3Btb2QgPSAweDAyYzA7CiAgdC5nbG90dGFsc3RvcHJldmVyc2VkID0gMHgwMjk1OwogIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZG1vZCA9IDB4MDJjMTsKICB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvciA9IDB4MDJlNDsKICB0Lmdsb3R0YWxzdG9wc3Ryb2tlID0gMHgwMmExOwogIHQuZ2xvdHRhbHN0b3BzdHJva2VyZXZlcnNlZCA9IDB4MDJhMjsKICB0LmdtYWNyb24gPSAweDFlMjE7CiAgdC5nbW9ub3NwYWNlID0gMHhmZjQ3OwogIHQuZ29oaXJhZ2FuYSA9IDB4MzA1NDsKICB0Lmdva2F0YWthbmEgPSAweDMwYjQ7CiAgdC5ncGFyZW4gPSAweDI0YTI7CiAgdC5ncGFzcXVhcmUgPSAweDMzYWM7CiAgdC5ncmFkaWVudCA9IDB4MjIwNzsKICB0LmdyYXZlID0gMHgwMDYwOwogIHQuZ3JhdmViZWxvd2NtYiA9IDB4MDMxNjsKICB0LmdyYXZlY21iID0gMHgwMzAwOwogIHQuZ3JhdmVjb21iID0gMHgwMzAwOwogIHQuZ3JhdmVkZXZhID0gMHgwOTUzOwogIHQuZ3JhdmVsb3dtb2QgPSAweDAyY2U7CiAgdC5ncmF2ZW1vbm9zcGFjZSA9IDB4ZmY0MDsKICB0LmdyYXZldG9uZWNtYiA9IDB4MDM0MDsKICB0LmdyZWF0ZXIgPSAweDAwM2U7CiAgdC5ncmVhdGVyZXF1YWwgPSAweDIyNjU7CiAgdC5ncmVhdGVyZXF1YWxvcmxlc3MgPSAweDIyZGI7CiAgdC5ncmVhdGVybW9ub3NwYWNlID0gMHhmZjFlOwogIHQuZ3JlYXRlcm9yZXF1aXZhbGVudCA9IDB4MjI3MzsKICB0LmdyZWF0ZXJvcmxlc3MgPSAweDIyNzc7CiAgdC5ncmVhdGVyb3ZlcmVxdWFsID0gMHgyMjY3OwogIHQuZ3JlYXRlcnNtYWxsID0gMHhmZTY1OwogIHQuZ3NjcmlwdCA9IDB4MDI2MTsKICB0LmdzdHJva2UgPSAweDAxZTU7CiAgdC5ndWhpcmFnYW5hID0gMHgzMDUwOwogIHQuZ3VpbGxlbW90bGVmdCA9IDB4MDBhYjsKICB0Lmd1aWxsZW1vdHJpZ2h0ID0gMHgwMGJiOwogIHQuZ3VpbHNpbmdsbGVmdCA9IDB4MjAzOTsKICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMHgyMDNhOwogIHQuZ3VrYXRha2FuYSA9IDB4MzBiMDsKICB0Lmd1cmFtdXNxdWFyZSA9IDB4MzMxODsKICB0Lmd5c3F1YXJlID0gMHgzM2M5OwogIHQuaCA9IDB4MDA2ODsKICB0LmhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTk7CiAgdC5oYWFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhhYmVuZ2FsaSA9IDB4MDliOTsKICB0LmhhZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YjM7CiAgdC5oYWRldmEgPSAweDA5Mzk7CiAgdC5oYWd1amFyYXRpID0gMHgwYWI5OwogIHQuaGFndXJtdWtoaSA9IDB4MGEzOTsKICB0LmhhaGFyYWJpYyA9IDB4MDYyZDsKICB0LmhhaGZpbmFsYXJhYmljID0gMHhmZWEyOwogIHQuaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhMzsKICB0LmhhaGlyYWdhbmEgPSAweDMwNmY7CiAgdC5oYWhtZWRpYWxhcmFiaWMgPSAweGZlYTQ7CiAgdC5oYWl0dXNxdWFyZSA9IDB4MzMyYTsKICB0Lmhha2F0YWthbmEgPSAweDMwY2Y7CiAgdC5oYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhhOwogIHQuaGFsYW50Z3VybXVraGkgPSAweDBhNGQ7CiAgdC5oYW16YWFyYWJpYyA9IDB4MDYyMTsKICB0LmhhbXphbG93YXJhYmljID0gMHgwNjIxOwogIHQuaGFuZ3VsZmlsbGVyID0gMHgzMTY0OwogIHQuaGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQ0YTsKICB0LmhhcnBvb25sZWZ0YmFyYnVwID0gMHgyMWJjOwogIHQuaGFycG9vbnJpZ2h0YmFyYnVwID0gMHgyMWMwOwogIHQuaGFzcXVhcmUgPSAweDMzY2E7CiAgdC5oYXRhZnBhdGFoID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDE2ID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDIzID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDJmID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaGhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWhuYXJyb3doZWJyZXcgPSAweDA1YjI7CiAgdC5oYXRhZnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWh3aWRlaGVicmV3ID0gMHgwNWIyOwogIHQuaGF0YWZxYW1hdHMgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0czFiID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHMyOCA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzMzQgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0c2hlYnJldyA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzbmFycm93aGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHNxdWFydGVyaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHN3aWRlaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZzZWdvbCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wxNyA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wyNCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wzMCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2xoZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWIxOwogIHQuaGF0YWZzZWdvbHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sd2lkZWhlYnJldyA9IDB4MDViMTsKICB0LmhiYXIgPSAweDAxMjc7CiAgdC5oYm9wb21vZm8gPSAweDMxMGY7CiAgdC5oYnJldmViZWxvdyA9IDB4MWUyYjsKICB0LmhjZWRpbGxhID0gMHgxZTI5OwogIHQuaGNpcmNsZSA9IDB4MjRkNzsKICB0LmhjaXJjdW1mbGV4ID0gMHgwMTI1OwogIHQuaGRpZXJlc2lzID0gMHgxZTI3OwogIHQuaGRvdGFjY2VudCA9IDB4MWUyMzsKICB0Lmhkb3RiZWxvdyA9IDB4MWUyNTsKICB0LmhlID0gMHgwNWQ0OwogIHQuaGVhcnQgPSAweDI2NjU7CiAgdC5oZWFydHN1aXRibGFjayA9IDB4MjY2NTsKICB0LmhlYXJ0c3VpdHdoaXRlID0gMHgyNjYxOwogIHQuaGVkYWdlc2ggPSAweGZiMzQ7CiAgdC5oZWRhZ2VzaGhlYnJldyA9IDB4ZmIzNDsKICB0LmhlaGFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhlaGFyYWJpYyA9IDB4MDY0NzsKICB0LmhlaGVicmV3ID0gMHgwNWQ0OwogIHQuaGVoZmluYWxhbHRvbmVhcmFiaWMgPSAweGZiYTc7CiAgdC5oZWhmaW5hbGFsdHR3b2FyYWJpYyA9IDB4ZmVlYTsKICB0LmhlaGZpbmFsYXJhYmljID0gMHhmZWVhOwogIHQuaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmYmE1OwogIHQuaGVoaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmYmE0OwogIHQuaGVoaW5pdGlhbGFsdG9uZWFyYWJpYyA9IDB4ZmJhODsKICB0LmhlaGluaXRpYWxhcmFiaWMgPSAweGZlZWI7CiAgdC5oZWhpcmFnYW5hID0gMHgzMDc4OwogIHQuaGVobWVkaWFsYWx0b25lYXJhYmljID0gMHhmYmE5OwogIHQuaGVobWVkaWFsYXJhYmljID0gMHhmZWVjOwogIHQuaGVpc2VpZXJhc3F1YXJlID0gMHgzMzdiOwogIHQuaGVrYXRha2FuYSA9IDB4MzBkODsKICB0Lmhla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGQ7CiAgdC5oZWt1dGFhcnVzcXVhcmUgPSAweDMzMzY7CiAgdC5oZW5naG9vayA9IDB4MDI2NzsKICB0LmhlcnV0dXNxdWFyZSA9IDB4MzMzOTsKICB0LmhldCA9IDB4MDVkNzsKICB0LmhldGhlYnJldyA9IDB4MDVkNzsKICB0Lmhob29rID0gMHgwMjY2OwogIHQuaGhvb2tzdXBlcmlvciA9IDB4MDJiMTsKICB0LmhpZXVoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YjsKICB0LmhpZXVoYXBhcmVua29yZWFuID0gMHgzMjFiOwogIHQuaGlldWhjaXJjbGVrb3JlYW4gPSAweDMyNmQ7CiAgdC5oaWV1aGtvcmVhbiA9IDB4MzE0ZTsKICB0LmhpZXVocGFyZW5rb3JlYW4gPSAweDMyMGQ7CiAgdC5oaWhpcmFnYW5hID0gMHgzMDcyOwogIHQuaGlrYXRha2FuYSA9IDB4MzBkMjsKICB0Lmhpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGI7CiAgdC5oaXJpcSA9IDB4MDViNDsKICB0LmhpcmlxMTQgPSAweDA1YjQ7CiAgdC5oaXJpcTIxID0gMHgwNWI0OwogIHQuaGlyaXEyZCA9IDB4MDViNDsKICB0LmhpcmlxaGVicmV3ID0gMHgwNWI0OwogIHQuaGlyaXFuYXJyb3doZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXdpZGVoZWJyZXcgPSAweDA1YjQ7CiAgdC5obGluZWJlbG93ID0gMHgxZTk2OwogIHQuaG1vbm9zcGFjZSA9IDB4ZmY0ODsKICB0LmhvYXJtZW5pYW4gPSAweDA1NzA7CiAgdC5ob2hpcHRoYWkgPSAweDBlMmI7CiAgdC5ob2hpcmFnYW5hID0gMHgzMDdiOwogIHQuaG9rYXRha2FuYSA9IDB4MzBkYjsKICB0Lmhva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGU7CiAgdC5ob2xhbSA9IDB4MDViOTsKICB0LmhvbGFtMTkgPSAweDA1Yjk7CiAgdC5ob2xhbTI2ID0gMHgwNWI5OwogIHQuaG9sYW0zMiA9IDB4MDViOTsKICB0LmhvbGFtaGVicmV3ID0gMHgwNWI5OwogIHQuaG9sYW1uYXJyb3doZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXdpZGVoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob25va2h1a3RoYWkgPSAweDBlMmU7CiAgdC5ob29rYWJvdmVjb21iID0gMHgwMzA5OwogIHQuaG9va2NtYiA9IDB4MDMwOTsKICB0Lmhvb2twYWxhdGFsaXplZGJlbG93Y21iID0gMHgwMzIxOwogIHQuaG9va3JldHJvZmxleGJlbG93Y21iID0gMHgwMzIyOwogIHQuaG9vbnNxdWFyZSA9IDB4MzM0MjsKICB0Lmhvcmljb3B0aWMgPSAweDAzZTk7CiAgdC5ob3Jpem9udGFsYmFyID0gMHgyMDE1OwogIHQuaG9ybmNtYiA9IDB4MDMxYjsKICB0LmhvdHNwcmluZ3MgPSAweDI2Njg7CiAgdC5ob3VzZSA9IDB4MjMwMjsKICB0LmhwYXJlbiA9IDB4MjRhMzsKICB0LmhzdXBlcmlvciA9IDB4MDJiMDsKICB0Lmh0dXJuZWQgPSAweDAyNjU7CiAgdC5odWhpcmFnYW5hID0gMHgzMDc1OwogIHQuaHVpaXRvc3F1YXJlID0gMHgzMzMzOwogIHQuaHVrYXRha2FuYSA9IDB4MzBkNTsKICB0Lmh1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGM7CiAgdC5odW5nYXJ1bWxhdXQgPSAweDAyZGQ7CiAgdC5odW5nYXJ1bWxhdXRjbWIgPSAweDAzMGI7CiAgdC5odiA9IDB4MDE5NTsKICB0Lmh5cGhlbiA9IDB4MDAyZDsKICB0Lmh5cGhlbmluZmVyaW9yID0gMHhmNmU1OwogIHQuaHlwaGVubW9ub3NwYWNlID0gMHhmZjBkOwogIHQuaHlwaGVuc21hbGwgPSAweGZlNjM7CiAgdC5oeXBoZW5zdXBlcmlvciA9IDB4ZjZlNjsKICB0Lmh5cGhlbnR3byA9IDB4MjAxMDsKICB0LmkgPSAweDAwNjk7CiAgdC5pYWN1dGUgPSAweDAwZWQ7CiAgdC5pYWN5cmlsbGljID0gMHgwNDRmOwogIHQuaWJlbmdhbGkgPSAweDA5ODc7CiAgdC5pYm9wb21vZm8gPSAweDMxMjc7CiAgdC5pYnJldmUgPSAweDAxMmQ7CiAgdC5pY2Fyb24gPSAweDAxZDA7CiAgdC5pY2lyY2xlID0gMHgyNGQ4OwogIHQuaWNpcmN1bWZsZXggPSAweDAwZWU7CiAgdC5pY3lyaWxsaWMgPSAweDA0NTY7CiAgdC5pZGJsZ3JhdmUgPSAweDAyMDk7CiAgdC5pZGVvZ3JhcGhlYXJ0aGNpcmNsZSA9IDB4MzI4ZjsKICB0LmlkZW9ncmFwaGZpcmVjaXJjbGUgPSAweDMyOGI7CiAgdC5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW4gPSAweDMyM2Y7CiAgdC5pZGVvZ3JhcGhpY2NhbGxwYXJlbiA9IDB4MzIzYTsKICB0LmlkZW9ncmFwaGljY2VudHJlY2lyY2xlID0gMHgzMmE1OwogIHQuaWRlb2dyYXBoaWNjbG9zZSA9IDB4MzAwNjsKICB0LmlkZW9ncmFwaGljY29tbWEgPSAweDMwMDE7CiAgdC5pZGVvZ3JhcGhpY2NvbW1hbGVmdCA9IDB4ZmY2NDsKICB0LmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbiA9IDB4MzIzNzsKICB0LmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZSA9IDB4MzJhMzsKICB0LmlkZW9ncmFwaGljZWFydGhwYXJlbiA9IDB4MzIyZjsKICB0LmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuID0gMHgzMjNkOwogIHQuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGUgPSAweDMyOWQ7CiAgdC5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW4gPSAweDMyNDA7CiAgdC5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZSA9IDB4MzI5NjsKICB0LmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW4gPSAweDMyMzY7CiAgdC5pZGVvZ3JhcGhpY2ZpcmVwYXJlbiA9IDB4MzIyYjsKICB0LmlkZW9ncmFwaGljaGF2ZXBhcmVuID0gMHgzMjMyOwogIHQuaWRlb2dyYXBoaWNoaWdoY2lyY2xlID0gMHgzMmE0OwogIHQuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrID0gMHgzMDA1OwogIHQuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZSA9IDB4MzI5ODsKICB0LmlkZW9ncmFwaGljbGFib3JwYXJlbiA9IDB4MzIzODsKICB0LmlkZW9ncmFwaGljbGVmdGNpcmNsZSA9IDB4MzJhNzsKICB0LmlkZW9ncmFwaGljbG93Y2lyY2xlID0gMHgzMmE2OwogIHQuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZSA9IDB4MzJhOTsKICB0LmlkZW9ncmFwaGljbWV0YWxwYXJlbiA9IDB4MzIyZTsKICB0LmlkZW9ncmFwaGljbW9vbnBhcmVuID0gMHgzMjJhOwogIHQuaWRlb2dyYXBoaWNuYW1lcGFyZW4gPSAweDMyMzQ7CiAgdC5pZGVvZ3JhcGhpY3BlcmlvZCA9IDB4MzAwMjsKICB0LmlkZW9ncmFwaGljcHJpbnRjaXJjbGUgPSAweDMyOWU7CiAgdC5pZGVvZ3JhcGhpY3JlYWNocGFyZW4gPSAweDMyNDM7CiAgdC5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuID0gMHgzMjM5OwogIHQuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuID0gMHgzMjNlOwogIHQuaWRlb2dyYXBoaWNyaWdodGNpcmNsZSA9IDB4MzJhODsKICB0LmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlID0gMHgzMjk5OwogIHQuaWRlb2dyYXBoaWNzZWxmcGFyZW4gPSAweDMyNDI7CiAgdC5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbiA9IDB4MzIzMzsKICB0LmlkZW9ncmFwaGljc3BhY2UgPSAweDMwMDA7CiAgdC5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbiA9IDB4MzIzNTsKICB0LmlkZW9ncmFwaGljc3RvY2twYXJlbiA9IDB4MzIzMTsKICB0LmlkZW9ncmFwaGljc3R1ZHlwYXJlbiA9IDB4MzIzYjsKICB0LmlkZW9ncmFwaGljc3VucGFyZW4gPSAweDMyMzA7CiAgdC5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuID0gMHgzMjNjOwogIHQuaWRlb2dyYXBoaWN3YXRlcnBhcmVuID0gMHgzMjJjOwogIHQuaWRlb2dyYXBoaWN3b29kcGFyZW4gPSAweDMyMmQ7CiAgdC5pZGVvZ3JhcGhpY3plcm8gPSAweDMwMDc7CiAgdC5pZGVvZ3JhcGhtZXRhbGNpcmNsZSA9IDB4MzI4ZTsKICB0LmlkZW9ncmFwaG1vb25jaXJjbGUgPSAweDMyOGE7CiAgdC5pZGVvZ3JhcGhuYW1lY2lyY2xlID0gMHgzMjk0OwogIHQuaWRlb2dyYXBoc3VuY2lyY2xlID0gMHgzMjkwOwogIHQuaWRlb2dyYXBod2F0ZXJjaXJjbGUgPSAweDMyOGM7CiAgdC5pZGVvZ3JhcGh3b29kY2lyY2xlID0gMHgzMjhkOwogIHQuaWRldmEgPSAweDA5MDc7CiAgdC5pZGllcmVzaXMgPSAweDAwZWY7CiAgdC5pZGllcmVzaXNhY3V0ZSA9IDB4MWUyZjsKICB0LmlkaWVyZXNpc2N5cmlsbGljID0gMHgwNGU1OwogIHQuaWRvdGJlbG93ID0gMHgxZWNiOwogIHQuaWVicmV2ZWN5cmlsbGljID0gMHgwNGQ3OwogIHQuaWVjeXJpbGxpYyA9IDB4MDQzNTsKICB0LmlldW5nYWNpcmNsZWtvcmVhbiA9IDB4MzI3NTsKICB0LmlldW5nYXBhcmVua29yZWFuID0gMHgzMjE1OwogIHQuaWV1bmdjaXJjbGVrb3JlYW4gPSAweDMyNjc7CiAgdC5pZXVuZ2tvcmVhbiA9IDB4MzE0NzsKICB0LmlldW5ncGFyZW5rb3JlYW4gPSAweDMyMDc7CiAgdC5pZ3JhdmUgPSAweDAwZWM7CiAgdC5pZ3VqYXJhdGkgPSAweDBhODc7CiAgdC5pZ3VybXVraGkgPSAweDBhMDc7CiAgdC5paGlyYWdhbmEgPSAweDMwNDQ7CiAgdC5paG9va2Fib3ZlID0gMHgxZWM5OwogIHQuaWliZW5nYWxpID0gMHgwOTg4OwogIHQuaWljeXJpbGxpYyA9IDB4MDQzODsKICB0LmlpZGV2YSA9IDB4MDkwODsKICB0LmlpZ3VqYXJhdGkgPSAweDBhODg7CiAgdC5paWd1cm11a2hpID0gMHgwYTA4OwogIHQuaWltYXRyYWd1cm11a2hpID0gMHgwYTQwOwogIHQuaWludmVydGVkYnJldmUgPSAweDAyMGI7CiAgdC5paXNob3J0Y3lyaWxsaWMgPSAweDA0Mzk7CiAgdC5paXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzA7CiAgdC5paXZvd2Vsc2lnbmRldmEgPSAweDA5NDA7CiAgdC5paXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMwOwogIHQuaWogPSAweDAxMzM7CiAgdC5pa2F0YWthbmEgPSAweDMwYTQ7CiAgdC5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzI7CiAgdC5pa29yZWFuID0gMHgzMTYzOwogIHQuaWxkZSA9IDB4MDJkYzsKICB0LmlsdXloZWJyZXcgPSAweDA1YWM7CiAgdC5pbWFjcm9uID0gMHgwMTJiOwogIHQuaW1hY3JvbmN5cmlsbGljID0gMHgwNGUzOwogIHQuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbCA9IDB4MjI1MzsKICB0LmltYXRyYWd1cm11a2hpID0gMHgwYTNmOwogIHQuaW1vbm9zcGFjZSA9IDB4ZmY0OTsKICB0LmluY3JlbWVudCA9IDB4MjIwNjsKICB0LmluZmluaXR5ID0gMHgyMjFlOwogIHQuaW5pYXJtZW5pYW4gPSAweDA1NmI7CiAgdC5pbnRlZ3JhbCA9IDB4MjIyYjsKICB0LmludGVncmFsYm90dG9tID0gMHgyMzIxOwogIHQuaW50ZWdyYWxidCA9IDB4MjMyMTsKICB0LmludGVncmFsZXggPSAweGY4ZjU7CiAgdC5pbnRlZ3JhbHRvcCA9IDB4MjMyMDsKICB0LmludGVncmFsdHAgPSAweDIzMjA7CiAgdC5pbnRlcnNlY3Rpb24gPSAweDIyMjk7CiAgdC5pbnRpc3F1YXJlID0gMHgzMzA1OwogIHQuaW52YnVsbGV0ID0gMHgyNWQ4OwogIHQuaW52Y2lyY2xlID0gMHgyNWQ5OwogIHQuaW52c21pbGVmYWNlID0gMHgyNjNiOwogIHQuaW9jeXJpbGxpYyA9IDB4MDQ1MTsKICB0LmlvZ29uZWsgPSAweDAxMmY7CiAgdC5pb3RhID0gMHgwM2I5OwogIHQuaW90YWRpZXJlc2lzID0gMHgwM2NhOwogIHQuaW90YWRpZXJlc2lzdG9ub3MgPSAweDAzOTA7CiAgdC5pb3RhbGF0aW4gPSAweDAyNjk7CiAgdC5pb3RhdG9ub3MgPSAweDAzYWY7CiAgdC5pcGFyZW4gPSAweDI0YTQ7CiAgdC5pcmlndXJtdWtoaSA9IDB4MGE3MjsKICB0LmlzbWFsbGhpcmFnYW5hID0gMHgzMDQzOwogIHQuaXNtYWxsa2F0YWthbmEgPSAweDMwYTM7CiAgdC5pc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ODsKICB0Lmlzc2hhcmJlbmdhbGkgPSAweDA5ZmE7CiAgdC5pc3Ryb2tlID0gMHgwMjY4OwogIHQuaXN1cGVyaW9yID0gMHhmNmVkOwogIHQuaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWQ7CiAgdC5pdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZDsKICB0Lml0aWxkZSA9IDB4MDEyOTsKICB0Lml0aWxkZWJlbG93ID0gMHgxZTJkOwogIHQuaXVib3BvbW9mbyA9IDB4MzEyOTsKICB0Lml1Y3lyaWxsaWMgPSAweDA0NGU7CiAgdC5pdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZjsKICB0Lml2b3dlbHNpZ25kZXZhID0gMHgwOTNmOwogIHQuaXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWJmOwogIHQuaXpoaXRzYWN5cmlsbGljID0gMHgwNDc1OwogIHQuaXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0Nzc7CiAgdC5qID0gMHgwMDZhOwogIHQuamFhcm1lbmlhbiA9IDB4MDU3MTsKICB0LmphYmVuZ2FsaSA9IDB4MDk5YzsKICB0LmphZGV2YSA9IDB4MDkxYzsKICB0LmphZ3VqYXJhdGkgPSAweDBhOWM7CiAgdC5qYWd1cm11a2hpID0gMHgwYTFjOwogIHQuamJvcG9tb2ZvID0gMHgzMTEwOwogIHQuamNhcm9uID0gMHgwMWYwOwogIHQuamNpcmNsZSA9IDB4MjRkOTsKICB0LmpjaXJjdW1mbGV4ID0gMHgwMTM1OwogIHQuamNyb3NzZWR0YWlsID0gMHgwMjlkOwogIHQuamRvdGxlc3NzdHJva2UgPSAweDAyNWY7CiAgdC5qZWN5cmlsbGljID0gMHgwNDU4OwogIHQuamVlbWFyYWJpYyA9IDB4MDYyYzsKICB0LmplZW1maW5hbGFyYWJpYyA9IDB4ZmU5ZTsKICB0LmplZW1pbml0aWFsYXJhYmljID0gMHhmZTlmOwogIHQuamVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVhMDsKICB0LmplaGFyYWJpYyA9IDB4MDY5ODsKICB0LmplaGZpbmFsYXJhYmljID0gMHhmYjhiOwogIHQuamhhYmVuZ2FsaSA9IDB4MDk5ZDsKICB0LmpoYWRldmEgPSAweDA5MWQ7CiAgdC5qaGFndWphcmF0aSA9IDB4MGE5ZDsKICB0LmpoYWd1cm11a2hpID0gMHgwYTFkOwogIHQuamhlaGFybWVuaWFuID0gMHgwNTdiOwogIHQuamlzID0gMHgzMDA0OwogIHQuam1vbm9zcGFjZSA9IDB4ZmY0YTsKICB0LmpwYXJlbiA9IDB4MjRhNTsKICB0LmpzdXBlcmlvciA9IDB4MDJiMjsKICB0LmsgPSAweDAwNmI7CiAgdC5rYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMTsKICB0LmthYmVuZ2FsaSA9IDB4MDk5NTsKICB0LmthY3V0ZSA9IDB4MWUzMTsKICB0LmthY3lyaWxsaWMgPSAweDA0M2E7CiAgdC5rYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDliOwogIHQua2FkZXZhID0gMHgwOTE1OwogIHQua2FmID0gMHgwNWRiOwogIHQua2FmYXJhYmljID0gMHgwNjQzOwogIHQua2FmZGFnZXNoID0gMHhmYjNiOwogIHQua2FmZGFnZXNoaGVicmV3ID0gMHhmYjNiOwogIHQua2FmZmluYWxhcmFiaWMgPSAweGZlZGE7CiAgdC5rYWZoZWJyZXcgPSAweDA1ZGI7CiAgdC5rYWZpbml0aWFsYXJhYmljID0gMHhmZWRiOwogIHQua2FmbWVkaWFsYXJhYmljID0gMHhmZWRjOwogIHQua2FmcmFmZWhlYnJldyA9IDB4ZmI0ZDsKICB0LmthZ3VqYXJhdGkgPSAweDBhOTU7CiAgdC5rYWd1cm11a2hpID0gMHgwYTE1OwogIHQua2FoaXJhZ2FuYSA9IDB4MzA0YjsKICB0LmthaG9va2N5cmlsbGljID0gMHgwNGM0OwogIHQua2FrYXRha2FuYSA9IDB4MzBhYjsKICB0Lmtha2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzY7CiAgdC5rYXBwYSA9IDB4MDNiYTsKICB0LmthcHBhc3ltYm9sZ3JlZWsgPSAweDAzZjA7CiAgdC5rYXB5ZW91bm1pZXVta29yZWFuID0gMHgzMTcxOwogIHQua2FweWVvdW5waGlldXBoa29yZWFuID0gMHgzMTg0OwogIHQua2FweWVvdW5waWV1cGtvcmVhbiA9IDB4MzE3ODsKICB0LmthcHllb3Vuc3NhbmdwaWV1cGtvcmVhbiA9IDB4MzE3OTsKICB0Lmthcm9yaWlzcXVhcmUgPSAweDMzMGQ7CiAgdC5rYXNoaWRhYXV0b2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc2hpZGFhdXRvbm9zaWRlYmVhcmluZ2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc21hbGxrYXRha2FuYSA9IDB4MzBmNTsKICB0Lmthc3F1YXJlID0gMHgzMzg0OwogIHQua2FzcmFhcmFiaWMgPSAweDA2NTA7CiAgdC5rYXNyYXRhbmFyYWJpYyA9IDB4MDY0ZDsKICB0Lmthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWY7CiAgdC5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoID0gMHhmZjcwOwogIHQua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNDlkOwogIHQua2JvcG9tb2ZvID0gMHgzMTBlOwogIHQua2NhbHNxdWFyZSA9IDB4MzM4OTsKICB0LmtjYXJvbiA9IDB4MDFlOTsKICB0LmtjZWRpbGxhID0gMHgwMTM3OwogIHQua2NpcmNsZSA9IDB4MjRkYTsKICB0Lmtjb21tYWFjY2VudCA9IDB4MDEzNzsKICB0Lmtkb3RiZWxvdyA9IDB4MWUzMzsKICB0LmtlaGFybWVuaWFuID0gMHgwNTg0OwogIHQua2VoaXJhZ2FuYSA9IDB4MzA1MTsKICB0Lmtla2F0YWthbmEgPSAweDMwYjE7CiAgdC5rZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc5OwogIHQua2VuYXJtZW5pYW4gPSAweDA1NmY7CiAgdC5rZXNtYWxsa2F0YWthbmEgPSAweDMwZjY7CiAgdC5rZ3JlZW5sYW5kaWMgPSAweDAxMzg7CiAgdC5raGFiZW5nYWxpID0gMHgwOTk2OwogIHQua2hhY3lyaWxsaWMgPSAweDA0NDU7CiAgdC5raGFkZXZhID0gMHgwOTE2OwogIHQua2hhZ3VqYXJhdGkgPSAweDBhOTY7CiAgdC5raGFndXJtdWtoaSA9IDB4MGExNjsKICB0LmtoYWhhcmFiaWMgPSAweDA2MmU7CiAgdC5raGFoZmluYWxhcmFiaWMgPSAweGZlYTY7CiAgdC5raGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhNzsKICB0LmtoYWhtZWRpYWxhcmFiaWMgPSAweGZlYTg7CiAgdC5raGVpY29wdGljID0gMHgwM2U3OwogIHQua2hoYWRldmEgPSAweDA5NTk7CiAgdC5raGhhZ3VybXVraGkgPSAweDBhNTk7CiAgdC5raGlldWtoYWNpcmNsZWtvcmVhbiA9IDB4MzI3ODsKICB0LmtoaWV1a2hhcGFyZW5rb3JlYW4gPSAweDMyMTg7CiAgdC5raGlldWtoY2lyY2xla29yZWFuID0gMHgzMjZhOwogIHQua2hpZXVraGtvcmVhbiA9IDB4MzE0YjsKICB0LmtoaWV1a2hwYXJlbmtvcmVhbiA9IDB4MzIwYTsKICB0Lmtob2toYWl0aGFpID0gMHgwZTAyOwogIHQua2hva2hvbnRoYWkgPSAweDBlMDU7CiAgdC5raG9raHVhdHRoYWkgPSAweDBlMDM7CiAgdC5raG9raHdhaXRoYWkgPSAweDBlMDQ7CiAgdC5raG9tdXR0aGFpID0gMHgwZTViOwogIHQua2hvb2sgPSAweDAxOTk7CiAgdC5raG9yYWtoYW5ndGhhaSA9IDB4MGUwNjsKICB0LmtoenNxdWFyZSA9IDB4MzM5MTsKICB0LmtpaGlyYWdhbmEgPSAweDMwNGQ7CiAgdC5raWthdGFrYW5hID0gMHgzMGFkOwogIHQua2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NzsKICB0Lmtpcm9ndXJhbXVzcXVhcmUgPSAweDMzMTU7CiAgdC5raXJvbWVldG9ydXNxdWFyZSA9IDB4MzMxNjsKICB0Lmtpcm9zcXVhcmUgPSAweDMzMTQ7CiAgdC5raXllb2thY2lyY2xla29yZWFuID0gMHgzMjZlOwogIHQua2l5ZW9rYXBhcmVua29yZWFuID0gMHgzMjBlOwogIHQua2l5ZW9rY2lyY2xla29yZWFuID0gMHgzMjYwOwogIHQua2l5ZW9ra29yZWFuID0gMHgzMTMxOwogIHQua2l5ZW9rcGFyZW5rb3JlYW4gPSAweDMyMDA7CiAgdC5raXllb2tzaW9za29yZWFuID0gMHgzMTMzOwogIHQua2plY3lyaWxsaWMgPSAweDA0NWM7CiAgdC5rbGluZWJlbG93ID0gMHgxZTM1OwogIHQua2xzcXVhcmUgPSAweDMzOTg7CiAgdC5rbWN1YmVkc3F1YXJlID0gMHgzM2E2OwogIHQua21vbm9zcGFjZSA9IDB4ZmY0YjsKICB0Lmttc3F1YXJlZHNxdWFyZSA9IDB4MzNhMjsKICB0LmtvaGlyYWdhbmEgPSAweDMwNTM7CiAgdC5rb2htc3F1YXJlID0gMHgzM2MwOwogIHQua29rYWl0aGFpID0gMHgwZTAxOwogIHQua29rYXRha2FuYSA9IDB4MzBiMzsKICB0Lmtva2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2E7CiAgdC5rb29wb3NxdWFyZSA9IDB4MzMxZTsKICB0LmtvcHBhY3lyaWxsaWMgPSAweDA0ODE7CiAgdC5rb3JlYW5zdGFuZGFyZHN5bWJvbCA9IDB4MzI3ZjsKICB0Lmtvcm9uaXNjbWIgPSAweDAzNDM7CiAgdC5rcGFyZW4gPSAweDI0YTY7CiAgdC5rcGFzcXVhcmUgPSAweDMzYWE7CiAgdC5rc2ljeXJpbGxpYyA9IDB4MDQ2ZjsKICB0Lmt0c3F1YXJlID0gMHgzM2NmOwogIHQua3R1cm5lZCA9IDB4MDI5ZTsKICB0Lmt1aGlyYWdhbmEgPSAweDMwNGY7CiAgdC5rdWthdGFrYW5hID0gMHgzMGFmOwogIHQua3VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ODsKICB0Lmt2c3F1YXJlID0gMHgzM2I4OwogIHQua3dzcXVhcmUgPSAweDMzYmU7CiAgdC5sID0gMHgwMDZjOwogIHQubGFiZW5nYWxpID0gMHgwOWIyOwogIHQubGFjdXRlID0gMHgwMTNhOwogIHQubGFkZXZhID0gMHgwOTMyOwogIHQubGFndWphcmF0aSA9IDB4MGFiMjsKICB0LmxhZ3VybXVraGkgPSAweDBhMzI7CiAgdC5sYWtraGFuZ3lhb3RoYWkgPSAweDBlNDU7CiAgdC5sYW1hbGVmZmluYWxhcmFiaWMgPSAweGZlZmM7CiAgdC5sYW1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZWY4OwogIHQubGFtYWxlZmhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNzsKICB0LmxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWMgPSAweGZlZmE7CiAgdC5sYW1hbGVmaGFtemFiZWxvd2lzb2xhdGVkYXJhYmljID0gMHhmZWY5OwogIHQubGFtYWxlZmlzb2xhdGVkYXJhYmljID0gMHhmZWZiOwogIHQubGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmNjsKICB0LmxhbWFsZWZtYWRkYWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZlZjU7CiAgdC5sYW1hcmFiaWMgPSAweDA2NDQ7CiAgdC5sYW1iZGEgPSAweDAzYmI7CiAgdC5sYW1iZGFzdHJva2UgPSAweDAxOWI7CiAgdC5sYW1lZCA9IDB4MDVkYzsKICB0LmxhbWVkZGFnZXNoID0gMHhmYjNjOwogIHQubGFtZWRkYWdlc2hoZWJyZXcgPSAweGZiM2M7CiAgdC5sYW1lZGhlYnJldyA9IDB4MDVkYzsKICB0LmxhbWZpbmFsYXJhYmljID0gMHhmZWRlOwogIHQubGFtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNjYTsKICB0LmxhbWluaXRpYWxhcmFiaWMgPSAweGZlZGY7CiAgdC5sYW1qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNjOTsKICB0LmxhbWtoYWhpbml0aWFsYXJhYmljID0gMHhmY2NiOwogIHQubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWMgPSAweGZkZjI7CiAgdC5sYW1tZWRpYWxhcmFiaWMgPSAweGZlZTA7CiAgdC5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmQ4ODsKICB0LmxhbW1lZW1pbml0aWFsYXJhYmljID0gMHhmY2NjOwogIHQubGFyZ2VjaXJjbGUgPSAweDI1ZWY7CiAgdC5sYmFyID0gMHgwMTlhOwogIHQubGJlbHQgPSAweDAyNmM7CiAgdC5sYm9wb21vZm8gPSAweDMxMGM7CiAgdC5sY2Fyb24gPSAweDAxM2U7CiAgdC5sY2VkaWxsYSA9IDB4MDEzYzsKICB0LmxjaXJjbGUgPSAweDI0ZGI7CiAgdC5sY2lyY3VtZmxleGJlbG93ID0gMHgxZTNkOwogIHQubGNvbW1hYWNjZW50ID0gMHgwMTNjOwogIHQubGRvdCA9IDB4MDE0MDsKICB0Lmxkb3RhY2NlbnQgPSAweDAxNDA7CiAgdC5sZG90YmVsb3cgPSAweDFlMzc7CiAgdC5sZG90YmVsb3dtYWNyb24gPSAweDFlMzk7CiAgdC5sZWZ0YW5nbGVhYm92ZWNtYiA9IDB4MDMxYTsKICB0LmxlZnR0YWNrYmVsb3djbWIgPSAweDAzMTg7CiAgdC5sZXNzID0gMHgwMDNjOwogIHQubGVzc2VxdWFsID0gMHgyMjY0OwogIHQubGVzc2VxdWFsb3JncmVhdGVyID0gMHgyMmRhOwogIHQubGVzc21vbm9zcGFjZSA9IDB4ZmYxYzsKICB0Lmxlc3NvcmVxdWl2YWxlbnQgPSAweDIyNzI7CiAgdC5sZXNzb3JncmVhdGVyID0gMHgyMjc2OwogIHQubGVzc292ZXJlcXVhbCA9IDB4MjI2NjsKICB0Lmxlc3NzbWFsbCA9IDB4ZmU2NDsKICB0LmxlemggPSAweDAyNmU7CiAgdC5sZmJsb2NrID0gMHgyNThjOwogIHQubGhvb2tyZXRyb2ZsZXggPSAweDAyNmQ7CiAgdC5saXJhID0gMHgyMGE0OwogIHQubGl3bmFybWVuaWFuID0gMHgwNTZjOwogIHQubGogPSAweDAxYzk7CiAgdC5samVjeXJpbGxpYyA9IDB4MDQ1OTsKICB0LmxsID0gMHhmNmMwOwogIHQubGxhZGV2YSA9IDB4MDkzMzsKICB0LmxsYWd1amFyYXRpID0gMHgwYWIzOwogIHQubGxpbmViZWxvdyA9IDB4MWUzYjsKICB0LmxsbGFkZXZhID0gMHgwOTM0OwogIHQubGx2b2NhbGljYmVuZ2FsaSA9IDB4MDllMTsKICB0Lmxsdm9jYWxpY2RldmEgPSAweDA5NjE7CiAgdC5sbHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUzOwogIHQubGx2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk2MzsKICB0LmxtaWRkbGV0aWxkZSA9IDB4MDI2YjsKICB0Lmxtb25vc3BhY2UgPSAweGZmNGM7CiAgdC5sbXNxdWFyZSA9IDB4MzNkMDsKICB0LmxvY2h1bGF0aGFpID0gMHgwZTJjOwogIHQubG9naWNhbGFuZCA9IDB4MjIyNzsKICB0LmxvZ2ljYWxub3QgPSAweDAwYWM7CiAgdC5sb2dpY2Fsbm90cmV2ZXJzZWQgPSAweDIzMTA7CiAgdC5sb2dpY2Fsb3IgPSAweDIyMjg7CiAgdC5sb2xpbmd0aGFpID0gMHgwZTI1OwogIHQubG9uZ3MgPSAweDAxN2Y7CiAgdC5sb3dsaW5lY2VudGVybGluZSA9IDB4ZmU0ZTsKICB0Lmxvd2xpbmVjbWIgPSAweDAzMzI7CiAgdC5sb3dsaW5lZGFzaGVkID0gMHhmZTRkOwogIHQubG96ZW5nZSA9IDB4MjVjYTsKICB0LmxwYXJlbiA9IDB4MjRhNzsKICB0LmxzbGFzaCA9IDB4MDE0MjsKICB0LmxzcXVhcmUgPSAweDIxMTM7CiAgdC5sc3VwZXJpb3IgPSAweGY2ZWU7CiAgdC5sdHNoYWRlID0gMHgyNTkxOwogIHQubHV0aGFpID0gMHgwZTI2OwogIHQubHZvY2FsaWNiZW5nYWxpID0gMHgwOThjOwogIHQubHZvY2FsaWNkZXZhID0gMHgwOTBjOwogIHQubHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUyOwogIHQubHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYyOwogIHQubHhzcXVhcmUgPSAweDMzZDM7CiAgdC5tID0gMHgwMDZkOwogIHQubWFiZW5nYWxpID0gMHgwOWFlOwogIHQubWFjcm9uID0gMHgwMGFmOwogIHQubWFjcm9uYmVsb3djbWIgPSAweDAzMzE7CiAgdC5tYWNyb25jbWIgPSAweDAzMDQ7CiAgdC5tYWNyb25sb3dtb2QgPSAweDAyY2Q7CiAgdC5tYWNyb25tb25vc3BhY2UgPSAweGZmZTM7CiAgdC5tYWN1dGUgPSAweDFlM2Y7CiAgdC5tYWRldmEgPSAweDA5MmU7CiAgdC5tYWd1amFyYXRpID0gMHgwYWFlOwogIHQubWFndXJtdWtoaSA9IDB4MGEyZTsKICB0Lm1haGFwYWtoaGVicmV3ID0gMHgwNWE0OwogIHQubWFoYXBha2hsZWZ0aGVicmV3ID0gMHgwNWE0OwogIHQubWFoaXJhZ2FuYSA9IDB4MzA3ZTsKICB0Lm1haWNoYXR0YXdhbG93bGVmdHRoYWkgPSAweGY4OTU7CiAgdC5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaSA9IDB4Zjg5NDsKICB0Lm1haWNoYXR0YXdhdGhhaSA9IDB4MGU0YjsKICB0Lm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MzsKICB0Lm1haWVrbG93bGVmdHRoYWkgPSAweGY4OGM7CiAgdC5tYWlla2xvd3JpZ2h0dGhhaSA9IDB4Zjg4YjsKICB0Lm1haWVrdGhhaSA9IDB4MGU0ODsKICB0Lm1haWVrdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4YTsKICB0Lm1haWhhbmFrYXRsZWZ0dGhhaSA9IDB4Zjg4NDsKICB0Lm1haWhhbmFrYXR0aGFpID0gMHgwZTMxOwogIHQubWFpdGFpa2h1bGVmdHRoYWkgPSAweGY4ODk7CiAgdC5tYWl0YWlraHV0aGFpID0gMHgwZTQ3OwogIHQubWFpdGhvbG93bGVmdHRoYWkgPSAweGY4OGY7CiAgdC5tYWl0aG9sb3dyaWdodHRoYWkgPSAweGY4OGU7CiAgdC5tYWl0aG90aGFpID0gMHgwZTQ5OwogIHQubWFpdGhvdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4ZDsKICB0Lm1haXRyaWxvd2xlZnR0aGFpID0gMHhmODkyOwogIHQubWFpdHJpbG93cmlnaHR0aGFpID0gMHhmODkxOwogIHQubWFpdHJpdGhhaSA9IDB4MGU0YTsKICB0Lm1haXRyaXVwcGVybGVmdHRoYWkgPSAweGY4OTA7CiAgdC5tYWl5YW1va3RoYWkgPSAweDBlNDY7CiAgdC5tYWthdGFrYW5hID0gMHgzMGRlOwogIHQubWFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZjsKICB0Lm1hbGUgPSAweDI2NDI7CiAgdC5tYW5zeW9uc3F1YXJlID0gMHgzMzQ3OwogIHQubWFxYWZoZWJyZXcgPSAweDA1YmU7CiAgdC5tYXJzID0gMHgyNjQyOwogIHQubWFzb3JhY2lyY2xlaGVicmV3ID0gMHgwNWFmOwogIHQubWFzcXVhcmUgPSAweDMzODM7CiAgdC5tYm9wb21vZm8gPSAweDMxMDc7CiAgdC5tYnNxdWFyZSA9IDB4MzNkNDsKICB0Lm1jaXJjbGUgPSAweDI0ZGM7CiAgdC5tY3ViZWRzcXVhcmUgPSAweDMzYTU7CiAgdC5tZG90YWNjZW50ID0gMHgxZTQxOwogIHQubWRvdGJlbG93ID0gMHgxZTQzOwogIHQubWVlbWFyYWJpYyA9IDB4MDY0NTsKICB0Lm1lZW1maW5hbGFyYWJpYyA9IDB4ZmVlMjsKICB0Lm1lZW1pbml0aWFsYXJhYmljID0gMHhmZWUzOwogIHQubWVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVlNDsKICB0Lm1lZW1tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMTsKICB0Lm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNDg7CiAgdC5tZWV0b3J1c3F1YXJlID0gMHgzMzRkOwogIHQubWVoaXJhZ2FuYSA9IDB4MzA4MTsKICB0Lm1laXppZXJhc3F1YXJlID0gMHgzMzdlOwogIHQubWVrYXRha2FuYSA9IDB4MzBlMTsKICB0Lm1la2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTI7CiAgdC5tZW0gPSAweDA1ZGU7CiAgdC5tZW1kYWdlc2ggPSAweGZiM2U7CiAgdC5tZW1kYWdlc2hoZWJyZXcgPSAweGZiM2U7CiAgdC5tZW1oZWJyZXcgPSAweDA1ZGU7CiAgdC5tZW5hcm1lbmlhbiA9IDB4MDU3NDsKICB0Lm1lcmtoYWhlYnJldyA9IDB4MDVhNTsKICB0Lm1lcmtoYWtlZnVsYWhlYnJldyA9IDB4MDVhNjsKICB0Lm1lcmtoYWtlZnVsYWxlZnRoZWJyZXcgPSAweDA1YTY7CiAgdC5tZXJraGFsZWZ0aGVicmV3ID0gMHgwNWE1OwogIHQubWhvb2sgPSAweDAyNzE7CiAgdC5taHpzcXVhcmUgPSAweDMzOTI7CiAgdC5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NTsKICB0Lm1pZGRvdCA9IDB4MDBiNzsKICB0Lm1pZXVtYWNpcmNsZWtvcmVhbiA9IDB4MzI3MjsKICB0Lm1pZXVtYXBhcmVua29yZWFuID0gMHgzMjEyOwogIHQubWlldW1jaXJjbGVrb3JlYW4gPSAweDMyNjQ7CiAgdC5taWV1bWtvcmVhbiA9IDB4MzE0MTsKICB0Lm1pZXVtcGFuc2lvc2tvcmVhbiA9IDB4MzE3MDsKICB0Lm1pZXVtcGFyZW5rb3JlYW4gPSAweDMyMDQ7CiAgdC5taWV1bXBpZXVwa29yZWFuID0gMHgzMTZlOwogIHQubWlldW1zaW9za29yZWFuID0gMHgzMTZmOwogIHQubWloaXJhZ2FuYSA9IDB4MzA3ZjsKICB0Lm1pa2F0YWthbmEgPSAweDMwZGY7CiAgdC5taWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkwOwogIHQubWludXMgPSAweDIyMTI7CiAgdC5taW51c2JlbG93Y21iID0gMHgwMzIwOwogIHQubWludXNjaXJjbGUgPSAweDIyOTY7CiAgdC5taW51c21vZCA9IDB4MDJkNzsKICB0Lm1pbnVzcGx1cyA9IDB4MjIxMzsKICB0Lm1pbnV0ZSA9IDB4MjAzMjsKICB0Lm1pcmliYWFydXNxdWFyZSA9IDB4MzM0YTsKICB0Lm1pcmlzcXVhcmUgPSAweDMzNDk7CiAgdC5tbG9uZ2xlZ3R1cm5lZCA9IDB4MDI3MDsKICB0Lm1sc3F1YXJlID0gMHgzMzk2OwogIHQubW1jdWJlZHNxdWFyZSA9IDB4MzNhMzsKICB0Lm1tb25vc3BhY2UgPSAweGZmNGQ7CiAgdC5tbXNxdWFyZWRzcXVhcmUgPSAweDMzOWY7CiAgdC5tb2hpcmFnYW5hID0gMHgzMDgyOwogIHQubW9obXNxdWFyZSA9IDB4MzNjMTsKICB0Lm1va2F0YWthbmEgPSAweDMwZTI7CiAgdC5tb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjkzOwogIHQubW9sc3F1YXJlID0gMHgzM2Q2OwogIHQubW9tYXRoYWkgPSAweDBlMjE7CiAgdC5tb3ZlcnNzcXVhcmUgPSAweDMzYTc7CiAgdC5tb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2E4OwogIHQubXBhcmVuID0gMHgyNGE4OwogIHQubXBhc3F1YXJlID0gMHgzM2FiOwogIHQubXNzcXVhcmUgPSAweDMzYjM7CiAgdC5tc3VwZXJpb3IgPSAweGY2ZWY7CiAgdC5tdHVybmVkID0gMHgwMjZmOwogIHQubXUgPSAweDAwYjU7CiAgdC5tdTEgPSAweDAwYjU7CiAgdC5tdWFzcXVhcmUgPSAweDMzODI7CiAgdC5tdWNoZ3JlYXRlciA9IDB4MjI2YjsKICB0Lm11Y2hsZXNzID0gMHgyMjZhOwogIHQubXVmc3F1YXJlID0gMHgzMzhjOwogIHQubXVncmVlayA9IDB4MDNiYzsKICB0Lm11Z3NxdWFyZSA9IDB4MzM4ZDsKICB0Lm11aGlyYWdhbmEgPSAweDMwODA7CiAgdC5tdWthdGFrYW5hID0gMHgzMGUwOwogIHQubXVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MTsKICB0Lm11bHNxdWFyZSA9IDB4MzM5NTsKICB0Lm11bHRpcGx5ID0gMHgwMGQ3OwogIHQubXVtc3F1YXJlID0gMHgzMzliOwogIHQubXVuYWhoZWJyZXcgPSAweDA1YTM7CiAgdC5tdW5haGxlZnRoZWJyZXcgPSAweDA1YTM7CiAgdC5tdXNpY2Fsbm90ZSA9IDB4MjY2YTsKICB0Lm11c2ljYWxub3RlZGJsID0gMHgyNjZiOwogIHQubXVzaWNmbGF0c2lnbiA9IDB4MjY2ZDsKICB0Lm11c2ljc2hhcnBzaWduID0gMHgyNjZmOwogIHQubXVzc3F1YXJlID0gMHgzM2IyOwogIHQubXV2c3F1YXJlID0gMHgzM2I2OwogIHQubXV3c3F1YXJlID0gMHgzM2JjOwogIHQubXZtZWdhc3F1YXJlID0gMHgzM2I5OwogIHQubXZzcXVhcmUgPSAweDMzYjc7CiAgdC5td21lZ2FzcXVhcmUgPSAweDMzYmY7CiAgdC5td3NxdWFyZSA9IDB4MzNiZDsKICB0Lm4gPSAweDAwNmU7CiAgdC5uYWJlbmdhbGkgPSAweDA5YTg7CiAgdC5uYWJsYSA9IDB4MjIwNzsKICB0Lm5hY3V0ZSA9IDB4MDE0NDsKICB0Lm5hZGV2YSA9IDB4MDkyODsKICB0Lm5hZ3VqYXJhdGkgPSAweDBhYTg7CiAgdC5uYWd1cm11a2hpID0gMHgwYTI4OwogIHQubmFoaXJhZ2FuYSA9IDB4MzA2YTsKICB0Lm5ha2F0YWthbmEgPSAweDMwY2E7CiAgdC5uYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg1OwogIHQubmFwb3N0cm9waGUgPSAweDAxNDk7CiAgdC5uYXNxdWFyZSA9IDB4MzM4MTsKICB0Lm5ib3BvbW9mbyA9IDB4MzEwYjsKICB0Lm5ic3BhY2UgPSAweDAwYTA7CiAgdC5uY2Fyb24gPSAweDAxNDg7CiAgdC5uY2VkaWxsYSA9IDB4MDE0NjsKICB0Lm5jaXJjbGUgPSAweDI0ZGQ7CiAgdC5uY2lyY3VtZmxleGJlbG93ID0gMHgxZTRiOwogIHQubmNvbW1hYWNjZW50ID0gMHgwMTQ2OwogIHQubmRvdGFjY2VudCA9IDB4MWU0NTsKICB0Lm5kb3RiZWxvdyA9IDB4MWU0NzsKICB0Lm5laGlyYWdhbmEgPSAweDMwNmQ7CiAgdC5uZWthdGFrYW5hID0gMHgzMGNkOwogIHQubmVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ODsKICB0Lm5ld3NoZXFlbHNpZ24gPSAweDIwYWE7CiAgdC5uZnNxdWFyZSA9IDB4MzM4YjsKICB0Lm5nYWJlbmdhbGkgPSAweDA5OTk7CiAgdC5uZ2FkZXZhID0gMHgwOTE5OwogIHQubmdhZ3VqYXJhdGkgPSAweDBhOTk7CiAgdC5uZ2FndXJtdWtoaSA9IDB4MGExOTsKICB0Lm5nb25ndXRoYWkgPSAweDBlMDc7CiAgdC5uaGlyYWdhbmEgPSAweDMwOTM7CiAgdC5uaG9va2xlZnQgPSAweDAyNzI7CiAgdC5uaG9va3JldHJvZmxleCA9IDB4MDI3MzsKICB0Lm5pZXVuYWNpcmNsZWtvcmVhbiA9IDB4MzI2ZjsKICB0Lm5pZXVuYXBhcmVua29yZWFuID0gMHgzMjBmOwogIHQubmlldW5jaWV1Y2tvcmVhbiA9IDB4MzEzNTsKICB0Lm5pZXVuY2lyY2xla29yZWFuID0gMHgzMjYxOwogIHQubmlldW5oaWV1aGtvcmVhbiA9IDB4MzEzNjsKICB0Lm5pZXVua29yZWFuID0gMHgzMTM0OwogIHQubmlldW5wYW5zaW9za29yZWFuID0gMHgzMTY4OwogIHQubmlldW5wYXJlbmtvcmVhbiA9IDB4MzIwMTsKICB0Lm5pZXVuc2lvc2tvcmVhbiA9IDB4MzE2NzsKICB0Lm5pZXVudGlrZXV0a29yZWFuID0gMHgzMTY2OwogIHQubmloaXJhZ2FuYSA9IDB4MzA2YjsKICB0Lm5pa2F0YWthbmEgPSAweDMwY2I7CiAgdC5uaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg2OwogIHQubmlraGFoaXRsZWZ0dGhhaSA9IDB4Zjg5OTsKICB0Lm5pa2hhaGl0dGhhaSA9IDB4MGU0ZDsKICB0Lm5pbmUgPSAweDAwMzk7CiAgdC5uaW5lYXJhYmljID0gMHgwNjY5OwogIHQubmluZWJlbmdhbGkgPSAweDA5ZWY7CiAgdC5uaW5lY2lyY2xlID0gMHgyNDY4OwogIHQubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTI7CiAgdC5uaW5lZGV2YSA9IDB4MDk2ZjsKICB0Lm5pbmVndWphcmF0aSA9IDB4MGFlZjsKICB0Lm5pbmVndXJtdWtoaSA9IDB4MGE2ZjsKICB0Lm5pbmVoYWNrYXJhYmljID0gMHgwNjY5OwogIHQubmluZWhhbmd6aG91ID0gMHgzMDI5OwogIHQubmluZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjg7CiAgdC5uaW5laW5mZXJpb3IgPSAweDIwODk7CiAgdC5uaW5lbW9ub3NwYWNlID0gMHhmZjE5OwogIHQubmluZW9sZHN0eWxlID0gMHhmNzM5OwogIHQubmluZXBhcmVuID0gMHgyNDdjOwogIHQubmluZXBlcmlvZCA9IDB4MjQ5MDsKICB0Lm5pbmVwZXJzaWFuID0gMHgwNmY5OwogIHQubmluZXJvbWFuID0gMHgyMTc4OwogIHQubmluZXN1cGVyaW9yID0gMHgyMDc5OwogIHQubmluZXRlZW5jaXJjbGUgPSAweDI0NzI7CiAgdC5uaW5ldGVlbnBhcmVuID0gMHgyNDg2OwogIHQubmluZXRlZW5wZXJpb2QgPSAweDI0OWE7CiAgdC5uaW5ldGhhaSA9IDB4MGU1OTsKICB0Lm5qID0gMHgwMWNjOwogIHQubmplY3lyaWxsaWMgPSAweDA0NWE7CiAgdC5ua2F0YWthbmEgPSAweDMwZjM7CiAgdC5ua2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWQ7CiAgdC5ubGVncmlnaHRsb25nID0gMHgwMTllOwogIHQubmxpbmViZWxvdyA9IDB4MWU0OTsKICB0Lm5tb25vc3BhY2UgPSAweGZmNGU7CiAgdC5ubXNxdWFyZSA9IDB4MzM5YTsKICB0Lm5uYWJlbmdhbGkgPSAweDA5YTM7CiAgdC5ubmFkZXZhID0gMHgwOTIzOwogIHQubm5hZ3VqYXJhdGkgPSAweDBhYTM7CiAgdC5ubmFndXJtdWtoaSA9IDB4MGEyMzsKICB0Lm5ubmFkZXZhID0gMHgwOTI5OwogIHQubm9oaXJhZ2FuYSA9IDB4MzA2ZTsKICB0Lm5va2F0YWthbmEgPSAweDMwY2U7CiAgdC5ub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjg5OwogIHQubm9uYnJlYWtpbmdzcGFjZSA9IDB4MDBhMDsKICB0Lm5vbmVudGhhaSA9IDB4MGUxMzsKICB0Lm5vbnV0aGFpID0gMHgwZTE5OwogIHQubm9vbmFyYWJpYyA9IDB4MDY0NjsKICB0Lm5vb25maW5hbGFyYWJpYyA9IDB4ZmVlNjsKICB0Lm5vb25naHVubmFhcmFiaWMgPSAweDA2YmE7CiAgdC5ub29uZ2h1bm5hZmluYWxhcmFiaWMgPSAweGZiOWY7CiAgdC5ub29uaW5pdGlhbGFyYWJpYyA9IDB4ZmVlNzsKICB0Lm5vb25qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMjsKICB0Lm5vb25qZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNGI7CiAgdC5ub29ubWVkaWFsYXJhYmljID0gMHhmZWU4OwogIHQubm9vbm1lZW1pbml0aWFsYXJhYmljID0gMHhmY2Q1OwogIHQubm9vbm1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ZTsKICB0Lm5vb25ub29uZmluYWxhcmFiaWMgPSAweGZjOGQ7CiAgdC5ub3Rjb250YWlucyA9IDB4MjIwYzsKICB0Lm5vdGVsZW1lbnQgPSAweDIyMDk7CiAgdC5ub3RlbGVtZW50b2YgPSAweDIyMDk7CiAgdC5ub3RlcXVhbCA9IDB4MjI2MDsKICB0Lm5vdGdyZWF0ZXIgPSAweDIyNmY7CiAgdC5ub3RncmVhdGVybm9yZXF1YWwgPSAweDIyNzE7CiAgdC5ub3RncmVhdGVybm9ybGVzcyA9IDB4MjI3OTsKICB0Lm5vdGlkZW50aWNhbCA9IDB4MjI2MjsKICB0Lm5vdGxlc3MgPSAweDIyNmU7CiAgdC5ub3RsZXNzbm9yZXF1YWwgPSAweDIyNzA7CiAgdC5ub3RwYXJhbGxlbCA9IDB4MjIyNjsKICB0Lm5vdHByZWNlZGVzID0gMHgyMjgwOwogIHQubm90c3Vic2V0ID0gMHgyMjg0OwogIHQubm90c3VjY2VlZHMgPSAweDIyODE7CiAgdC5ub3RzdXBlcnNldCA9IDB4MjI4NTsKICB0Lm5vd2FybWVuaWFuID0gMHgwNTc2OwogIHQubnBhcmVuID0gMHgyNGE5OwogIHQubnNzcXVhcmUgPSAweDMzYjE7CiAgdC5uc3VwZXJpb3IgPSAweDIwN2Y7CiAgdC5udGlsZGUgPSAweDAwZjE7CiAgdC5udSA9IDB4MDNiZDsKICB0Lm51aGlyYWdhbmEgPSAweDMwNmM7CiAgdC5udWthdGFrYW5hID0gMHgzMGNjOwogIHQubnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NzsKICB0Lm51a3RhYmVuZ2FsaSA9IDB4MDliYzsKICB0Lm51a3RhZGV2YSA9IDB4MDkzYzsKICB0Lm51a3RhZ3VqYXJhdGkgPSAweDBhYmM7CiAgdC5udWt0YWd1cm11a2hpID0gMHgwYTNjOwogIHQubnVtYmVyc2lnbiA9IDB4MDAyMzsKICB0Lm51bWJlcnNpZ25tb25vc3BhY2UgPSAweGZmMDM7CiAgdC5udW1iZXJzaWduc21hbGwgPSAweGZlNWY7CiAgdC5udW1lcmFsc2lnbmdyZWVrID0gMHgwMzc0OwogIHQubnVtZXJhbHNpZ25sb3dlcmdyZWVrID0gMHgwMzc1OwogIHQubnVtZXJvID0gMHgyMTE2OwogIHQubnVuID0gMHgwNWUwOwogIHQubnVuZGFnZXNoID0gMHhmYjQwOwogIHQubnVuZGFnZXNoaGVicmV3ID0gMHhmYjQwOwogIHQubnVuaGVicmV3ID0gMHgwNWUwOwogIHQubnZzcXVhcmUgPSAweDMzYjU7CiAgdC5ud3NxdWFyZSA9IDB4MzNiYjsKICB0Lm55YWJlbmdhbGkgPSAweDA5OWU7CiAgdC5ueWFkZXZhID0gMHgwOTFlOwogIHQubnlhZ3VqYXJhdGkgPSAweDBhOWU7CiAgdC5ueWFndXJtdWtoaSA9IDB4MGExZTsKICB0Lm8gPSAweDAwNmY7CiAgdC5vYWN1dGUgPSAweDAwZjM7CiAgdC5vYW5ndGhhaSA9IDB4MGUyZDsKICB0Lm9iYXJyZWQgPSAweDAyNzU7CiAgdC5vYmFycmVkY3lyaWxsaWMgPSAweDA0ZTk7CiAgdC5vYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYjsKICB0Lm9iZW5nYWxpID0gMHgwOTkzOwogIHQub2JvcG9tb2ZvID0gMHgzMTFiOwogIHQub2JyZXZlID0gMHgwMTRmOwogIHQub2NhbmRyYWRldmEgPSAweDA5MTE7CiAgdC5vY2FuZHJhZ3VqYXJhdGkgPSAweDBhOTE7CiAgdC5vY2FuZHJhdm93ZWxzaWduZGV2YSA9IDB4MDk0OTsKICB0Lm9jYW5kcmF2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjOTsKICB0Lm9jYXJvbiA9IDB4MDFkMjsKICB0Lm9jaXJjbGUgPSAweDI0ZGU7CiAgdC5vY2lyY3VtZmxleCA9IDB4MDBmNDsKICB0Lm9jaXJjdW1mbGV4YWN1dGUgPSAweDFlZDE7CiAgdC5vY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWQ5OwogIHQub2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMzsKICB0Lm9jaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWQ1OwogIHQub2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNzsKICB0Lm9jeXJpbGxpYyA9IDB4MDQzZTsKICB0Lm9kYmxhY3V0ZSA9IDB4MDE1MTsKICB0Lm9kYmxncmF2ZSA9IDB4MDIwZDsKICB0Lm9kZXZhID0gMHgwOTEzOwogIHQub2RpZXJlc2lzID0gMHgwMGY2OwogIHQub2RpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTc7CiAgdC5vZG90YmVsb3cgPSAweDFlY2Q7CiAgdC5vZSA9IDB4MDE1MzsKICB0Lm9la29yZWFuID0gMHgzMTVhOwogIHQub2dvbmVrID0gMHgwMmRiOwogIHQub2dvbmVrY21iID0gMHgwMzI4OwogIHQub2dyYXZlID0gMHgwMGYyOwogIHQub2d1amFyYXRpID0gMHgwYTkzOwogIHQub2hhcm1lbmlhbiA9IDB4MDU4NTsKICB0Lm9oaXJhZ2FuYSA9IDB4MzA0YTsKICB0Lm9ob29rYWJvdmUgPSAweDFlY2Y7CiAgdC5vaG9ybiA9IDB4MDFhMTsKICB0Lm9ob3JuYWN1dGUgPSAweDFlZGI7CiAgdC5vaG9ybmRvdGJlbG93ID0gMHgxZWUzOwogIHQub2hvcm5ncmF2ZSA9IDB4MWVkZDsKICB0Lm9ob3JuaG9va2Fib3ZlID0gMHgxZWRmOwogIHQub2hvcm50aWxkZSA9IDB4MWVlMTsKICB0Lm9odW5nYXJ1bWxhdXQgPSAweDAxNTE7CiAgdC5vaSA9IDB4MDFhMzsKICB0Lm9pbnZlcnRlZGJyZXZlID0gMHgwMjBmOwogIHQub2thdGFrYW5hID0gMHgzMGFhOwogIHQub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjc1OwogIHQub2tvcmVhbiA9IDB4MzE1NzsKICB0Lm9sZWhlYnJldyA9IDB4MDVhYjsKICB0Lm9tYWNyb24gPSAweDAxNGQ7CiAgdC5vbWFjcm9uYWN1dGUgPSAweDFlNTM7CiAgdC5vbWFjcm9uZ3JhdmUgPSAweDFlNTE7CiAgdC5vbWRldmEgPSAweDA5NTA7CiAgdC5vbWVnYSA9IDB4MDNjOTsKICB0Lm9tZWdhMSA9IDB4MDNkNjsKICB0Lm9tZWdhY3lyaWxsaWMgPSAweDA0NjE7CiAgdC5vbWVnYWxhdGluY2xvc2VkID0gMHgwMjc3OwogIHQub21lZ2Fyb3VuZGN5cmlsbGljID0gMHgwNDdiOwogIHQub21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdkOwogIHQub21lZ2F0b25vcyA9IDB4MDNjZTsKICB0Lm9tZ3VqYXJhdGkgPSAweDBhZDA7CiAgdC5vbWljcm9uID0gMHgwM2JmOwogIHQub21pY3JvbnRvbm9zID0gMHgwM2NjOwogIHQub21vbm9zcGFjZSA9IDB4ZmY0ZjsKICB0Lm9uZSA9IDB4MDAzMTsKICB0Lm9uZWFyYWJpYyA9IDB4MDY2MTsKICB0Lm9uZWJlbmdhbGkgPSAweDA5ZTc7CiAgdC5vbmVjaXJjbGUgPSAweDI0NjA7CiAgdC5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhhOwogIHQub25lZGV2YSA9IDB4MDk2NzsKICB0Lm9uZWRvdGVubGVhZGVyID0gMHgyMDI0OwogIHQub25lZWlnaHRoID0gMHgyMTViOwogIHQub25lZml0dGVkID0gMHhmNmRjOwogIHQub25lZ3VqYXJhdGkgPSAweDBhZTc7CiAgdC5vbmVndXJtdWtoaSA9IDB4MGE2NzsKICB0Lm9uZWhhY2thcmFiaWMgPSAweDA2NjE7CiAgdC5vbmVoYWxmID0gMHgwMGJkOwogIHQub25laGFuZ3pob3UgPSAweDMwMjE7CiAgdC5vbmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIwOwogIHQub25laW5mZXJpb3IgPSAweDIwODE7CiAgdC5vbmVtb25vc3BhY2UgPSAweGZmMTE7CiAgdC5vbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY0OwogIHQub25lb2xkc3R5bGUgPSAweGY3MzE7CiAgdC5vbmVwYXJlbiA9IDB4MjQ3NDsKICB0Lm9uZXBlcmlvZCA9IDB4MjQ4ODsKICB0Lm9uZXBlcnNpYW4gPSAweDA2ZjE7CiAgdC5vbmVxdWFydGVyID0gMHgwMGJjOwogIHQub25lcm9tYW4gPSAweDIxNzA7CiAgdC5vbmVzdXBlcmlvciA9IDB4MDBiOTsKICB0Lm9uZXRoYWkgPSAweDBlNTE7CiAgdC5vbmV0aGlyZCA9IDB4MjE1MzsKICB0Lm9vZ29uZWsgPSAweDAxZWI7CiAgdC5vb2dvbmVrbWFjcm9uID0gMHgwMWVkOwogIHQub29ndXJtdWtoaSA9IDB4MGExMzsKICB0Lm9vbWF0cmFndXJtdWtoaSA9IDB4MGE0YjsKICB0Lm9vcGVuID0gMHgwMjU0OwogIHQub3BhcmVuID0gMHgyNGFhOwogIHQub3BlbmJ1bGxldCA9IDB4MjVlNjsKICB0Lm9wdGlvbiA9IDB4MjMyNTsKICB0Lm9yZGZlbWluaW5lID0gMHgwMGFhOwogIHQub3JkbWFzY3VsaW5lID0gMHgwMGJhOwogIHQub3J0aG9nb25hbCA9IDB4MjIxZjsKICB0Lm9zaG9ydGRldmEgPSAweDA5MTI7CiAgdC5vc2hvcnR2b3dlbHNpZ25kZXZhID0gMHgwOTRhOwogIHQub3NsYXNoID0gMHgwMGY4OwogIHQub3NsYXNoYWN1dGUgPSAweDAxZmY7CiAgdC5vc21hbGxoaXJhZ2FuYSA9IDB4MzA0OTsKICB0Lm9zbWFsbGthdGFrYW5hID0gMHgzMGE5OwogIHQub3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmI7CiAgdC5vc3Ryb2tlYWN1dGUgPSAweDAxZmY7CiAgdC5vc3VwZXJpb3IgPSAweGY2ZjA7CiAgdC5vdGN5cmlsbGljID0gMHgwNDdmOwogIHQub3RpbGRlID0gMHgwMGY1OwogIHQub3RpbGRlYWN1dGUgPSAweDFlNGQ7CiAgdC5vdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZjsKICB0Lm91Ym9wb21vZm8gPSAweDMxMjE7CiAgdC5vdmVybGluZSA9IDB4MjAzZTsKICB0Lm92ZXJsaW5lY2VudGVybGluZSA9IDB4ZmU0YTsKICB0Lm92ZXJsaW5lY21iID0gMHgwMzA1OwogIHQub3ZlcmxpbmVkYXNoZWQgPSAweGZlNDk7CiAgdC5vdmVybGluZWRibHdhdnkgPSAweGZlNGM7CiAgdC5vdmVybGluZXdhdnkgPSAweGZlNGI7CiAgdC5vdmVyc2NvcmUgPSAweDAwYWY7CiAgdC5vdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljYjsKICB0Lm92b3dlbHNpZ25kZXZhID0gMHgwOTRiOwogIHQub3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWNiOwogIHQucCA9IDB4MDA3MDsKICB0LnBhYW1wc3NxdWFyZSA9IDB4MzM4MDsKICB0LnBhYXNlbnRvc3F1YXJlID0gMHgzMzJiOwogIHQucGFiZW5nYWxpID0gMHgwOWFhOwogIHQucGFjdXRlID0gMHgxZTU1OwogIHQucGFkZXZhID0gMHgwOTJhOwogIHQucGFnZWRvd24gPSAweDIxZGY7CiAgdC5wYWdldXAgPSAweDIxZGU7CiAgdC5wYWd1amFyYXRpID0gMHgwYWFhOwogIHQucGFndXJtdWtoaSA9IDB4MGEyYTsKICB0LnBhaGlyYWdhbmEgPSAweDMwNzE7CiAgdC5wYWl5YW5ub2l0aGFpID0gMHgwZTJmOwogIHQucGFrYXRha2FuYSA9IDB4MzBkMTsKICB0LnBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWIgPSAweDA0ODQ7CiAgdC5wYWxvY2hrYWN5cmlsbGljID0gMHgwNGMwOwogIHQucGFuc2lvc2tvcmVhbiA9IDB4MzE3ZjsKICB0LnBhcmFncmFwaCA9IDB4MDBiNjsKICB0LnBhcmFsbGVsID0gMHgyMjI1OwogIHQucGFyZW5sZWZ0ID0gMHgwMDI4OwogIHQucGFyZW5sZWZ0YWx0b25lYXJhYmljID0gMHhmZDNlOwogIHQucGFyZW5sZWZ0YnQgPSAweGY4ZWQ7CiAgdC5wYXJlbmxlZnRleCA9IDB4ZjhlYzsKICB0LnBhcmVubGVmdGluZmVyaW9yID0gMHgyMDhkOwogIHQucGFyZW5sZWZ0bW9ub3NwYWNlID0gMHhmZjA4OwogIHQucGFyZW5sZWZ0c21hbGwgPSAweGZlNTk7CiAgdC5wYXJlbmxlZnRzdXBlcmlvciA9IDB4MjA3ZDsKICB0LnBhcmVubGVmdHRwID0gMHhmOGViOwogIHQucGFyZW5sZWZ0dmVydGljYWwgPSAweGZlMzU7CiAgdC5wYXJlbnJpZ2h0ID0gMHgwMDI5OwogIHQucGFyZW5yaWdodGFsdG9uZWFyYWJpYyA9IDB4ZmQzZjsKICB0LnBhcmVucmlnaHRidCA9IDB4ZjhmODsKICB0LnBhcmVucmlnaHRleCA9IDB4ZjhmNzsKICB0LnBhcmVucmlnaHRpbmZlcmlvciA9IDB4MjA4ZTsKICB0LnBhcmVucmlnaHRtb25vc3BhY2UgPSAweGZmMDk7CiAgdC5wYXJlbnJpZ2h0c21hbGwgPSAweGZlNWE7CiAgdC5wYXJlbnJpZ2h0c3VwZXJpb3IgPSAweDIwN2U7CiAgdC5wYXJlbnJpZ2h0dHAgPSAweGY4ZjY7CiAgdC5wYXJlbnJpZ2h0dmVydGljYWwgPSAweGZlMzY7CiAgdC5wYXJ0aWFsZGlmZiA9IDB4MjIwMjsKICB0LnBhc2VxaGVicmV3ID0gMHgwNWMwOwogIHQucGFzaHRhaGVicmV3ID0gMHgwNTk5OwogIHQucGFzcXVhcmUgPSAweDMzYTk7CiAgdC5wYXRhaCA9IDB4MDViNzsKICB0LnBhdGFoMTEgPSAweDA1Yjc7CiAgdC5wYXRhaDFkID0gMHgwNWI3OwogIHQucGF0YWgyYSA9IDB4MDViNzsKICB0LnBhdGFoaGVicmV3ID0gMHgwNWI3OwogIHQucGF0YWhuYXJyb3doZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHdpZGVoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXplcmhlYnJldyA9IDB4MDVhMTsKICB0LnBib3BvbW9mbyA9IDB4MzEwNjsKICB0LnBjaXJjbGUgPSAweDI0ZGY7CiAgdC5wZG90YWNjZW50ID0gMHgxZTU3OwogIHQucGUgPSAweDA1ZTQ7CiAgdC5wZWN5cmlsbGljID0gMHgwNDNmOwogIHQucGVkYWdlc2ggPSAweGZiNDQ7CiAgdC5wZWRhZ2VzaGhlYnJldyA9IDB4ZmI0NDsKICB0LnBlZXppc3F1YXJlID0gMHgzMzNiOwogIHQucGVmaW5hbGRhZ2VzaGhlYnJldyA9IDB4ZmI0MzsKICB0LnBlaGFyYWJpYyA9IDB4MDY3ZTsKICB0LnBlaGFybWVuaWFuID0gMHgwNTdhOwogIHQucGVoZWJyZXcgPSAweDA1ZTQ7CiAgdC5wZWhmaW5hbGFyYWJpYyA9IDB4ZmI1NzsKICB0LnBlaGluaXRpYWxhcmFiaWMgPSAweGZiNTg7CiAgdC5wZWhpcmFnYW5hID0gMHgzMDdhOwogIHQucGVobWVkaWFsYXJhYmljID0gMHhmYjU5OwogIHQucGVrYXRha2FuYSA9IDB4MzBkYTsKICB0LnBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE3OwogIHQucGVyYWZlaGVicmV3ID0gMHhmYjRlOwogIHQucGVyY2VudCA9IDB4MDAyNTsKICB0LnBlcmNlbnRhcmFiaWMgPSAweDA2NmE7CiAgdC5wZXJjZW50bW9ub3NwYWNlID0gMHhmZjA1OwogIHQucGVyY2VudHNtYWxsID0gMHhmZTZhOwogIHQucGVyaW9kID0gMHgwMDJlOwogIHQucGVyaW9kYXJtZW5pYW4gPSAweDA1ODk7CiAgdC5wZXJpb2RjZW50ZXJlZCA9IDB4MDBiNzsKICB0LnBlcmlvZGhhbGZ3aWR0aCA9IDB4ZmY2MTsKICB0LnBlcmlvZGluZmVyaW9yID0gMHhmNmU3OwogIHQucGVyaW9kbW9ub3NwYWNlID0gMHhmZjBlOwogIHQucGVyaW9kc21hbGwgPSAweGZlNTI7CiAgdC5wZXJpb2RzdXBlcmlvciA9IDB4ZjZlODsKICB0LnBlcmlzcG9tZW5pZ3JlZWtjbWIgPSAweDAzNDI7CiAgdC5wZXJwZW5kaWN1bGFyID0gMHgyMmE1OwogIHQucGVydGhvdXNhbmQgPSAweDIwMzA7CiAgdC5wZXNldGEgPSAweDIwYTc7CiAgdC5wZnNxdWFyZSA9IDB4MzM4YTsKICB0LnBoYWJlbmdhbGkgPSAweDA5YWI7CiAgdC5waGFkZXZhID0gMHgwOTJiOwogIHQucGhhZ3VqYXJhdGkgPSAweDBhYWI7CiAgdC5waGFndXJtdWtoaSA9IDB4MGEyYjsKICB0LnBoaSA9IDB4MDNjNjsKICB0LnBoaTEgPSAweDAzZDU7CiAgdC5waGlldXBoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YTsKICB0LnBoaWV1cGhhcGFyZW5rb3JlYW4gPSAweDMyMWE7CiAgdC5waGlldXBoY2lyY2xla29yZWFuID0gMHgzMjZjOwogIHQucGhpZXVwaGtvcmVhbiA9IDB4MzE0ZDsKICB0LnBoaWV1cGhwYXJlbmtvcmVhbiA9IDB4MzIwYzsKICB0LnBoaWxhdGluID0gMHgwMjc4OwogIHQucGhpbnRodXRoYWkgPSAweDBlM2E7CiAgdC5waGlzeW1ib2xncmVlayA9IDB4MDNkNTsKICB0LnBob29rID0gMHgwMWE1OwogIHQucGhvcGhhbnRoYWkgPSAweDBlMWU7CiAgdC5waG9waHVuZ3RoYWkgPSAweDBlMWM7CiAgdC5waG9zYW1waGFvdGhhaSA9IDB4MGUyMDsKICB0LnBpID0gMHgwM2MwOwogIHQucGlldXBhY2lyY2xla29yZWFuID0gMHgzMjczOwogIHQucGlldXBhcGFyZW5rb3JlYW4gPSAweDMyMTM7CiAgdC5waWV1cGNpZXVja29yZWFuID0gMHgzMTc2OwogIHQucGlldXBjaXJjbGVrb3JlYW4gPSAweDMyNjU7CiAgdC5waWV1cGtpeWVva2tvcmVhbiA9IDB4MzE3MjsKICB0LnBpZXVwa29yZWFuID0gMHgzMTQyOwogIHQucGlldXBwYXJlbmtvcmVhbiA9IDB4MzIwNTsKICB0LnBpZXVwc2lvc2tpeWVva2tvcmVhbiA9IDB4MzE3NDsKICB0LnBpZXVwc2lvc2tvcmVhbiA9IDB4MzE0NDsKICB0LnBpZXVwc2lvc3Rpa2V1dGtvcmVhbiA9IDB4MzE3NTsKICB0LnBpZXVwdGhpZXV0aGtvcmVhbiA9IDB4MzE3NzsKICB0LnBpZXVwdGlrZXV0a29yZWFuID0gMHgzMTczOwogIHQucGloaXJhZ2FuYSA9IDB4MzA3NDsKICB0LnBpa2F0YWthbmEgPSAweDMwZDQ7CiAgdC5waXN5bWJvbGdyZWVrID0gMHgwM2Q2OwogIHQucGl3cmFybWVuaWFuID0gMHgwNTgzOwogIHQucGxhbmNrb3ZlcjJwaSA9IDB4MjEwZjsKICB0LnBsYW5ja292ZXIycGkxID0gMHgyMTBmOwogIHQucGx1cyA9IDB4MDAyYjsKICB0LnBsdXNiZWxvd2NtYiA9IDB4MDMxZjsKICB0LnBsdXNjaXJjbGUgPSAweDIyOTU7CiAgdC5wbHVzbWludXMgPSAweDAwYjE7CiAgdC5wbHVzbW9kID0gMHgwMmQ2OwogIHQucGx1c21vbm9zcGFjZSA9IDB4ZmYwYjsKICB0LnBsdXNzbWFsbCA9IDB4ZmU2MjsKICB0LnBsdXNzdXBlcmlvciA9IDB4MjA3YTsKICB0LnBtb25vc3BhY2UgPSAweGZmNTA7CiAgdC5wbXNxdWFyZSA9IDB4MzNkODsKICB0LnBvaGlyYWdhbmEgPSAweDMwN2Q7CiAgdC5wb2ludGluZ2luZGV4ZG93bndoaXRlID0gMHgyNjFmOwogIHQucG9pbnRpbmdpbmRleGxlZnR3aGl0ZSA9IDB4MjYxYzsKICB0LnBvaW50aW5naW5kZXhyaWdodHdoaXRlID0gMHgyNjFlOwogIHQucG9pbnRpbmdpbmRleHVwd2hpdGUgPSAweDI2MWQ7CiAgdC5wb2thdGFrYW5hID0gMHgzMGRkOwogIHQucG9wbGF0aGFpID0gMHgwZTFiOwogIHQucG9zdGFsbWFyayA9IDB4MzAxMjsKICB0LnBvc3RhbG1hcmtmYWNlID0gMHgzMDIwOwogIHQucHBhcmVuID0gMHgyNGFiOwogIHQucHJlY2VkZXMgPSAweDIyN2E7CiAgdC5wcmVzY3JpcHRpb24gPSAweDIxMWU7CiAgdC5wcmltZW1vZCA9IDB4MDJiOTsKICB0LnByaW1lcmV2ZXJzZWQgPSAweDIwMzU7CiAgdC5wcm9kdWN0ID0gMHgyMjBmOwogIHQucHJvamVjdGl2ZSA9IDB4MjMwNTsKICB0LnByb2xvbmdlZGthbmEgPSAweDMwZmM7CiAgdC5wcm9wZWxsb3IgPSAweDIzMTg7CiAgdC5wcm9wZXJzdWJzZXQgPSAweDIyODI7CiAgdC5wcm9wZXJzdXBlcnNldCA9IDB4MjI4MzsKICB0LnByb3BvcnRpb24gPSAweDIyMzc7CiAgdC5wcm9wb3J0aW9uYWwgPSAweDIyMWQ7CiAgdC5wc2kgPSAweDAzYzg7CiAgdC5wc2ljeXJpbGxpYyA9IDB4MDQ3MTsKICB0LnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYiA9IDB4MDQ4NjsKICB0LnBzc3F1YXJlID0gMHgzM2IwOwogIHQucHVoaXJhZ2FuYSA9IDB4MzA3NzsKICB0LnB1a2F0YWthbmEgPSAweDMwZDc7CiAgdC5wdnNxdWFyZSA9IDB4MzNiNDsKICB0LnB3c3F1YXJlID0gMHgzM2JhOwogIHQucSA9IDB4MDA3MTsKICB0LnFhZGV2YSA9IDB4MDk1ODsKICB0LnFhZG1haGVicmV3ID0gMHgwNWE4OwogIHQucWFmYXJhYmljID0gMHgwNjQyOwogIHQucWFmZmluYWxhcmFiaWMgPSAweGZlZDY7CiAgdC5xYWZpbml0aWFsYXJhYmljID0gMHhmZWQ3OwogIHQucWFmbWVkaWFsYXJhYmljID0gMHhmZWQ4OwogIHQucWFtYXRzID0gMHgwNWI4OwogIHQucWFtYXRzMTAgPSAweDA1Yjg7CiAgdC5xYW1hdHMxYSA9IDB4MDViODsKICB0LnFhbWF0czFjID0gMHgwNWI4OwogIHQucWFtYXRzMjcgPSAweDA1Yjg7CiAgdC5xYW1hdHMyOSA9IDB4MDViODsKICB0LnFhbWF0czMzID0gMHgwNWI4OwogIHQucWFtYXRzZGUgPSAweDA1Yjg7CiAgdC5xYW1hdHNoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNxYXRhbmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3FhdGFubmFycm93aGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW5xdWFydGVyaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW53aWRlaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcXVhcnRlcmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3dpZGVoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYXJuZXlwYXJhaGVicmV3ID0gMHgwNTlmOwogIHQucWJvcG9tb2ZvID0gMHgzMTExOwogIHQucWNpcmNsZSA9IDB4MjRlMDsKICB0LnFob29rID0gMHgwMmEwOwogIHQucW1vbm9zcGFjZSA9IDB4ZmY1MTsKICB0LnFvZiA9IDB4MDVlNzsKICB0LnFvZmRhZ2VzaCA9IDB4ZmI0NzsKICB0LnFvZmRhZ2VzaGhlYnJldyA9IDB4ZmI0NzsKICB0LnFvZmhlYnJldyA9IDB4MDVlNzsKICB0LnFwYXJlbiA9IDB4MjRhYzsKICB0LnF1YXJ0ZXJub3RlID0gMHgyNjY5OwogIHQucXVidXRzID0gMHgwNWJiOwogIHQucXVidXRzMTggPSAweDA1YmI7CiAgdC5xdWJ1dHMyNSA9IDB4MDViYjsKICB0LnF1YnV0czMxID0gMHgwNWJiOwogIHQucXVidXRzaGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzbmFycm93aGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzcXVhcnRlcmhlYnJldyA9IDB4MDViYjsKICB0LnF1YnV0c3dpZGVoZWJyZXcgPSAweDA1YmI7CiAgdC5xdWVzdGlvbiA9IDB4MDAzZjsKICB0LnF1ZXN0aW9uYXJhYmljID0gMHgwNjFmOwogIHQucXVlc3Rpb25hcm1lbmlhbiA9IDB4MDU1ZTsKICB0LnF1ZXN0aW9uZG93biA9IDB4MDBiZjsKICB0LnF1ZXN0aW9uZG93bnNtYWxsID0gMHhmN2JmOwogIHQucXVlc3Rpb25ncmVlayA9IDB4MDM3ZTsKICB0LnF1ZXN0aW9ubW9ub3NwYWNlID0gMHhmZjFmOwogIHQucXVlc3Rpb25zbWFsbCA9IDB4ZjczZjsKICB0LnF1b3RlZGJsID0gMHgwMDIyOwogIHQucXVvdGVkYmxiYXNlID0gMHgyMDFlOwogIHQucXVvdGVkYmxsZWZ0ID0gMHgyMDFjOwogIHQucXVvdGVkYmxtb25vc3BhY2UgPSAweGZmMDI7CiAgdC5xdW90ZWRibHByaW1lID0gMHgzMDFlOwogIHQucXVvdGVkYmxwcmltZXJldmVyc2VkID0gMHgzMDFkOwogIHQucXVvdGVkYmxyaWdodCA9IDB4MjAxZDsKICB0LnF1b3RlbGVmdCA9IDB4MjAxODsKICB0LnF1b3RlbGVmdHJldmVyc2VkID0gMHgyMDFiOwogIHQucXVvdGVyZXZlcnNlZCA9IDB4MjAxYjsKICB0LnF1b3RlcmlnaHQgPSAweDIwMTk7CiAgdC5xdW90ZXJpZ2h0biA9IDB4MDE0OTsKICB0LnF1b3Rlc2luZ2xiYXNlID0gMHgyMDFhOwogIHQucXVvdGVzaW5nbGUgPSAweDAwMjc7CiAgdC5xdW90ZXNpbmdsZW1vbm9zcGFjZSA9IDB4ZmYwNzsKICB0LnIgPSAweDAwNzI7CiAgdC5yYWFybWVuaWFuID0gMHgwNTdjOwogIHQucmFiZW5nYWxpID0gMHgwOWIwOwogIHQucmFjdXRlID0gMHgwMTU1OwogIHQucmFkZXZhID0gMHgwOTMwOwogIHQucmFkaWNhbCA9IDB4MjIxYTsKICB0LnJhZGljYWxleCA9IDB4ZjhlNTsKICB0LnJhZG92ZXJzc3F1YXJlID0gMHgzM2FlOwogIHQucmFkb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2FmOwogIHQucmFkc3F1YXJlID0gMHgzM2FkOwogIHQucmFmZSA9IDB4MDViZjsKICB0LnJhZmVoZWJyZXcgPSAweDA1YmY7CiAgdC5yYWd1amFyYXRpID0gMHgwYWIwOwogIHQucmFndXJtdWtoaSA9IDB4MGEzMDsKICB0LnJhaGlyYWdhbmEgPSAweDMwODk7CiAgdC5yYWthdGFrYW5hID0gMHgzMGU5OwogIHQucmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NzsKICB0LnJhbG93ZXJkaWFnb25hbGJlbmdhbGkgPSAweDA5ZjE7CiAgdC5yYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMDsKICB0LnJhbXNob3JuID0gMHgwMjY0OwogIHQucmF0aW8gPSAweDIyMzY7CiAgdC5yYm9wb21vZm8gPSAweDMxMTY7CiAgdC5yY2Fyb24gPSAweDAxNTk7CiAgdC5yY2VkaWxsYSA9IDB4MDE1NzsKICB0LnJjaXJjbGUgPSAweDI0ZTE7CiAgdC5yY29tbWFhY2NlbnQgPSAweDAxNTc7CiAgdC5yZGJsZ3JhdmUgPSAweDAyMTE7CiAgdC5yZG90YWNjZW50ID0gMHgxZTU5OwogIHQucmRvdGJlbG93ID0gMHgxZTViOwogIHQucmRvdGJlbG93bWFjcm9uID0gMHgxZTVkOwogIHQucmVmZXJlbmNlbWFyayA9IDB4MjAzYjsKICB0LnJlZmxleHN1YnNldCA9IDB4MjI4NjsKICB0LnJlZmxleHN1cGVyc2V0ID0gMHgyMjg3OwogIHQucmVnaXN0ZXJlZCA9IDB4MDBhZTsKICB0LnJlZ2lzdGVyc2FucyA9IDB4ZjhlODsKICB0LnJlZ2lzdGVyc2VyaWYgPSAweGY2ZGE7CiAgdC5yZWhhcmFiaWMgPSAweDA2MzE7CiAgdC5yZWhhcm1lbmlhbiA9IDB4MDU4MDsKICB0LnJlaGZpbmFsYXJhYmljID0gMHhmZWFlOwogIHQucmVoaXJhZ2FuYSA9IDB4MzA4YzsKICB0LnJla2F0YWthbmEgPSAweDMwZWM7CiAgdC5yZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjlhOwogIHQucmVzaCA9IDB4MDVlODsKICB0LnJlc2hkYWdlc2hoZWJyZXcgPSAweGZiNDg7CiAgdC5yZXNoaGVicmV3ID0gMHgwNWU4OwogIHQucmV2ZXJzZWR0aWxkZSA9IDB4MjIzZDsKICB0LnJldmlhaGVicmV3ID0gMHgwNTk3OwogIHQucmV2aWFtdWdyYXNoaGVicmV3ID0gMHgwNTk3OwogIHQucmV2bG9naWNhbG5vdCA9IDB4MjMxMDsKICB0LnJmaXNoaG9vayA9IDB4MDI3ZTsKICB0LnJmaXNoaG9va3JldmVyc2VkID0gMHgwMjdmOwogIHQucmhhYmVuZ2FsaSA9IDB4MDlkZDsKICB0LnJoYWRldmEgPSAweDA5NWQ7CiAgdC5yaG8gPSAweDAzYzE7CiAgdC5yaG9vayA9IDB4MDI3ZDsKICB0LnJob29rdHVybmVkID0gMHgwMjdiOwogIHQucmhvb2t0dXJuZWRzdXBlcmlvciA9IDB4MDJiNTsKICB0LnJob3N5bWJvbGdyZWVrID0gMHgwM2YxOwogIHQucmhvdGljaG9va21vZCA9IDB4MDJkZTsKICB0LnJpZXVsYWNpcmNsZWtvcmVhbiA9IDB4MzI3MTsKICB0LnJpZXVsYXBhcmVua29yZWFuID0gMHgzMjExOwogIHQucmlldWxjaXJjbGVrb3JlYW4gPSAweDMyNjM7CiAgdC5yaWV1bGhpZXVoa29yZWFuID0gMHgzMTQwOwogIHQucmlldWxraXllb2trb3JlYW4gPSAweDMxM2E7CiAgdC5yaWV1bGtpeWVva3Npb3Nrb3JlYW4gPSAweDMxNjk7CiAgdC5yaWV1bGtvcmVhbiA9IDB4MzEzOTsKICB0LnJpZXVsbWlldW1rb3JlYW4gPSAweDMxM2I7CiAgdC5yaWV1bHBhbnNpb3Nrb3JlYW4gPSAweDMxNmM7CiAgdC5yaWV1bHBhcmVua29yZWFuID0gMHgzMjAzOwogIHQucmlldWxwaGlldXBoa29yZWFuID0gMHgzMTNmOwogIHQucmlldWxwaWV1cGtvcmVhbiA9IDB4MzEzYzsKICB0LnJpZXVscGlldXBzaW9za29yZWFuID0gMHgzMTZiOwogIHQucmlldWxzaW9za29yZWFuID0gMHgzMTNkOwogIHQucmlldWx0aGlldXRoa29yZWFuID0gMHgzMTNlOwogIHQucmlldWx0aWtldXRrb3JlYW4gPSAweDMxNmE7CiAgdC5yaWV1bHllb3JpbmhpZXVoa29yZWFuID0gMHgzMTZkOwogIHQucmlnaHRhbmdsZSA9IDB4MjIxZjsKICB0LnJpZ2h0dGFja2JlbG93Y21iID0gMHgwMzE5OwogIHQucmlnaHR0cmlhbmdsZSA9IDB4MjJiZjsKICB0LnJpaGlyYWdhbmEgPSAweDMwOGE7CiAgdC5yaWthdGFrYW5hID0gMHgzMGVhOwogIHQucmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ODsKICB0LnJpbmcgPSAweDAyZGE7CiAgdC5yaW5nYmVsb3djbWIgPSAweDAzMjU7CiAgdC5yaW5nY21iID0gMHgwMzBhOwogIHQucmluZ2hhbGZsZWZ0ID0gMHgwMmJmOwogIHQucmluZ2hhbGZsZWZ0YXJtZW5pYW4gPSAweDA1NTk7CiAgdC5yaW5naGFsZmxlZnRiZWxvd2NtYiA9IDB4MDMxYzsKICB0LnJpbmdoYWxmbGVmdGNlbnRlcmVkID0gMHgwMmQzOwogIHQucmluZ2hhbGZyaWdodCA9IDB4MDJiZTsKICB0LnJpbmdoYWxmcmlnaHRiZWxvd2NtYiA9IDB4MDMzOTsKICB0LnJpbmdoYWxmcmlnaHRjZW50ZXJlZCA9IDB4MDJkMjsKICB0LnJpbnZlcnRlZGJyZXZlID0gMHgwMjEzOwogIHQucml0dG9ydXNxdWFyZSA9IDB4MzM1MTsKICB0LnJsaW5lYmVsb3cgPSAweDFlNWY7CiAgdC5ybG9uZ2xlZyA9IDB4MDI3YzsKICB0LnJsb25nbGVndHVybmVkID0gMHgwMjdhOwogIHQucm1vbm9zcGFjZSA9IDB4ZmY1MjsKICB0LnJvaGlyYWdhbmEgPSAweDMwOGQ7CiAgdC5yb2thdGFrYW5hID0gMHgzMGVkOwogIHQucm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YjsKICB0LnJvcnVhdGhhaSA9IDB4MGUyMzsKICB0LnJwYXJlbiA9IDB4MjRhZDsKICB0LnJyYWJlbmdhbGkgPSAweDA5ZGM7CiAgdC5ycmFkZXZhID0gMHgwOTMxOwogIHQucnJhZ3VybXVraGkgPSAweDBhNWM7CiAgdC5ycmVoYXJhYmljID0gMHgwNjkxOwogIHQucnJlaGZpbmFsYXJhYmljID0gMHhmYjhkOwogIHQucnJ2b2NhbGljYmVuZ2FsaSA9IDB4MDllMDsKICB0LnJydm9jYWxpY2RldmEgPSAweDA5NjA7CiAgdC5ycnZvY2FsaWNndWphcmF0aSA9IDB4MGFlMDsKICB0LnJydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzQ7CiAgdC5ycnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQ0OwogIHQucnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzQ7CiAgdC5yc3VwZXJpb3IgPSAweGY2ZjE7CiAgdC5ydGJsb2NrID0gMHgyNTkwOwogIHQucnR1cm5lZCA9IDB4MDI3OTsKICB0LnJ0dXJuZWRzdXBlcmlvciA9IDB4MDJiNDsKICB0LnJ1aGlyYWdhbmEgPSAweDMwOGI7CiAgdC5ydWthdGFrYW5hID0gMHgzMGViOwogIHQucnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5OTsKICB0LnJ1cGVlbWFya2JlbmdhbGkgPSAweDA5ZjI7CiAgdC5ydXBlZXNpZ25iZW5nYWxpID0gMHgwOWYzOwogIHQucnVwaWFoID0gMHhmNmRkOwogIHQucnV0aGFpID0gMHgwZTI0OwogIHQucnZvY2FsaWNiZW5nYWxpID0gMHgwOThiOwogIHQucnZvY2FsaWNkZXZhID0gMHgwOTBiOwogIHQucnZvY2FsaWNndWphcmF0aSA9IDB4MGE4YjsKICB0LnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk0MzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzM7CiAgdC5zID0gMHgwMDczOwogIHQuc2FiZW5nYWxpID0gMHgwOWI4OwogIHQuc2FjdXRlID0gMHgwMTViOwogIHQuc2FjdXRlZG90YWNjZW50ID0gMHgxZTY1OwogIHQuc2FkYXJhYmljID0gMHgwNjM1OwogIHQuc2FkZXZhID0gMHgwOTM4OwogIHQuc2FkZmluYWxhcmFiaWMgPSAweGZlYmE7CiAgdC5zYWRpbml0aWFsYXJhYmljID0gMHhmZWJiOwogIHQuc2FkbWVkaWFsYXJhYmljID0gMHhmZWJjOwogIHQuc2FndWphcmF0aSA9IDB4MGFiODsKICB0LnNhZ3VybXVraGkgPSAweDBhMzg7CiAgdC5zYWhpcmFnYW5hID0gMHgzMDU1OwogIHQuc2FrYXRha2FuYSA9IDB4MzBiNTsKICB0LnNha2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2I7CiAgdC5zYWxsYWxsYWhvdWFsYXloZXdhc2FsbGFtYXJhYmljID0gMHhmZGZhOwogIHQuc2FtZWtoID0gMHgwNWUxOwogIHQuc2FtZWtoZGFnZXNoID0gMHhmYjQxOwogIHQuc2FtZWtoZGFnZXNoaGVicmV3ID0gMHhmYjQxOwogIHQuc2FtZWtoaGVicmV3ID0gMHgwNWUxOwogIHQuc2FyYWFhdGhhaSA9IDB4MGUzMjsKICB0LnNhcmFhZXRoYWkgPSAweDBlNDE7CiAgdC5zYXJhYWltYWltYWxhaXRoYWkgPSAweDBlNDQ7CiAgdC5zYXJhYWltYWltdWFudGhhaSA9IDB4MGU0MzsKICB0LnNhcmFhbXRoYWkgPSAweDBlMzM7CiAgdC5zYXJhYXRoYWkgPSAweDBlMzA7CiAgdC5zYXJhZXRoYWkgPSAweDBlNDA7CiAgdC5zYXJhaWlsZWZ0dGhhaSA9IDB4Zjg4NjsKICB0LnNhcmFpaXRoYWkgPSAweDBlMzU7CiAgdC5zYXJhaWxlZnR0aGFpID0gMHhmODg1OwogIHQuc2FyYWl0aGFpID0gMHgwZTM0OwogIHQuc2FyYW90aGFpID0gMHgwZTQyOwogIHQuc2FyYXVlZWxlZnR0aGFpID0gMHhmODg4OwogIHQuc2FyYXVlZXRoYWkgPSAweDBlMzc7CiAgdC5zYXJhdWVsZWZ0dGhhaSA9IDB4Zjg4NzsKICB0LnNhcmF1ZXRoYWkgPSAweDBlMzY7CiAgdC5zYXJhdXRoYWkgPSAweDBlMzg7CiAgdC5zYXJhdXV0aGFpID0gMHgwZTM5OwogIHQuc2JvcG9tb2ZvID0gMHgzMTE5OwogIHQuc2Nhcm9uID0gMHgwMTYxOwogIHQuc2Nhcm9uZG90YWNjZW50ID0gMHgxZTY3OwogIHQuc2NlZGlsbGEgPSAweDAxNWY7CiAgdC5zY2h3YSA9IDB4MDI1OTsKICB0LnNjaHdhY3lyaWxsaWMgPSAweDA0ZDk7CiAgdC5zY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGI7CiAgdC5zY2h3YWhvb2sgPSAweDAyNWE7CiAgdC5zY2lyY2xlID0gMHgyNGUyOwogIHQuc2NpcmN1bWZsZXggPSAweDAxNWQ7CiAgdC5zY29tbWFhY2NlbnQgPSAweDAyMTk7CiAgdC5zZG90YWNjZW50ID0gMHgxZTYxOwogIHQuc2RvdGJlbG93ID0gMHgxZTYzOwogIHQuc2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY5OwogIHQuc2VhZ3VsbGJlbG93Y21iID0gMHgwMzNjOwogIHQuc2Vjb25kID0gMHgyMDMzOwogIHQuc2Vjb25kdG9uZWNoaW5lc2UgPSAweDAyY2E7CiAgdC5zZWN0aW9uID0gMHgwMGE3OwogIHQuc2VlbmFyYWJpYyA9IDB4MDYzMzsKICB0LnNlZW5maW5hbGFyYWJpYyA9IDB4ZmViMjsKICB0LnNlZW5pbml0aWFsYXJhYmljID0gMHhmZWIzOwogIHQuc2Vlbm1lZGlhbGFyYWJpYyA9IDB4ZmViNDsKICB0LnNlZ29sID0gMHgwNWI2OwogIHQuc2Vnb2wxMyA9IDB4MDViNjsKICB0LnNlZ29sMWYgPSAweDA1YjY7CiAgdC5zZWdvbDJjID0gMHgwNWI2OwogIHQuc2Vnb2xoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWdvbG5hcnJvd2hlYnJldyA9IDB4MDViNjsKICB0LnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViNjsKICB0LnNlZ29sdGFoZWJyZXcgPSAweDA1OTI7CiAgdC5zZWdvbHdpZGVoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWhhcm1lbmlhbiA9IDB4MDU3ZDsKICB0LnNlaGlyYWdhbmEgPSAweDMwNWI7CiAgdC5zZWthdGFrYW5hID0gMHgzMGJiOwogIHQuc2VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZTsKICB0LnNlbWljb2xvbiA9IDB4MDAzYjsKICB0LnNlbWljb2xvbmFyYWJpYyA9IDB4MDYxYjsKICB0LnNlbWljb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYjsKICB0LnNlbWljb2xvbnNtYWxsID0gMHhmZTU0OwogIHQuc2VtaXZvaWNlZG1hcmtrYW5hID0gMHgzMDljOwogIHQuc2VtaXZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjlmOwogIHQuc2VudGlzcXVhcmUgPSAweDMzMjI7CiAgdC5zZW50b3NxdWFyZSA9IDB4MzMyMzsKICB0LnNldmVuID0gMHgwMDM3OwogIHQuc2V2ZW5hcmFiaWMgPSAweDA2Njc7CiAgdC5zZXZlbmJlbmdhbGkgPSAweDA5ZWQ7CiAgdC5zZXZlbmNpcmNsZSA9IDB4MjQ2NjsKICB0LnNldmVuY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MDsKICB0LnNldmVuZGV2YSA9IDB4MDk2ZDsKICB0LnNldmVuZWlnaHRocyA9IDB4MjE1ZTsKICB0LnNldmVuZ3VqYXJhdGkgPSAweDBhZWQ7CiAgdC5zZXZlbmd1cm11a2hpID0gMHgwYTZkOwogIHQuc2V2ZW5oYWNrYXJhYmljID0gMHgwNjY3OwogIHQuc2V2ZW5oYW5nemhvdSA9IDB4MzAyNzsKICB0LnNldmVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNjsKICB0LnNldmVuaW5mZXJpb3IgPSAweDIwODc7CiAgdC5zZXZlbm1vbm9zcGFjZSA9IDB4ZmYxNzsKICB0LnNldmVub2xkc3R5bGUgPSAweGY3Mzc7CiAgdC5zZXZlbnBhcmVuID0gMHgyNDdhOwogIHQuc2V2ZW5wZXJpb2QgPSAweDI0OGU7CiAgdC5zZXZlbnBlcnNpYW4gPSAweDA2Zjc7CiAgdC5zZXZlbnJvbWFuID0gMHgyMTc2OwogIHQuc2V2ZW5zdXBlcmlvciA9IDB4MjA3NzsKICB0LnNldmVudGVlbmNpcmNsZSA9IDB4MjQ3MDsKICB0LnNldmVudGVlbnBhcmVuID0gMHgyNDg0OwogIHQuc2V2ZW50ZWVucGVyaW9kID0gMHgyNDk4OwogIHQuc2V2ZW50aGFpID0gMHgwZTU3OwogIHQuc2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc2hhYXJtZW5pYW4gPSAweDA1Nzc7CiAgdC5zaGFiZW5nYWxpID0gMHgwOWI2OwogIHQuc2hhY3lyaWxsaWMgPSAweDA0NDg7CiAgdC5zaGFkZGFhcmFiaWMgPSAweDA2NTE7CiAgdC5zaGFkZGFkYW1tYWFyYWJpYyA9IDB4ZmM2MTsKICB0LnNoYWRkYWRhbW1hdGFuYXJhYmljID0gMHhmYzVlOwogIHQuc2hhZGRhZmF0aGFhcmFiaWMgPSAweGZjNjA7CiAgdC5zaGFkZGFrYXNyYWFyYWJpYyA9IDB4ZmM2MjsKICB0LnNoYWRkYWthc3JhdGFuYXJhYmljID0gMHhmYzVmOwogIHQuc2hhZGUgPSAweDI1OTI7CiAgdC5zaGFkZWRhcmsgPSAweDI1OTM7CiAgdC5zaGFkZWxpZ2h0ID0gMHgyNTkxOwogIHQuc2hhZGVtZWRpdW0gPSAweDI1OTI7CiAgdC5zaGFkZXZhID0gMHgwOTM2OwogIHQuc2hhZ3VqYXJhdGkgPSAweDBhYjY7CiAgdC5zaGFndXJtdWtoaSA9IDB4MGEzNjsKICB0LnNoYWxzaGVsZXRoZWJyZXcgPSAweDA1OTM7CiAgdC5zaGJvcG9tb2ZvID0gMHgzMTE1OwogIHQuc2hjaGFjeXJpbGxpYyA9IDB4MDQ0OTsKICB0LnNoZWVuYXJhYmljID0gMHgwNjM0OwogIHQuc2hlZW5maW5hbGFyYWJpYyA9IDB4ZmViNjsKICB0LnNoZWVuaW5pdGlhbGFyYWJpYyA9IDB4ZmViNzsKICB0LnNoZWVubWVkaWFsYXJhYmljID0gMHhmZWI4OwogIHQuc2hlaWNvcHRpYyA9IDB4MDNlMzsKICB0LnNoZXFlbCA9IDB4MjBhYTsKICB0LnNoZXFlbGhlYnJldyA9IDB4MjBhYTsKICB0LnNoZXZhID0gMHgwNWIwOwogIHQuc2hldmExMTUgPSAweDA1YjA7CiAgdC5zaGV2YTE1ID0gMHgwNWIwOwogIHQuc2hldmEyMiA9IDB4MDViMDsKICB0LnNoZXZhMmUgPSAweDA1YjA7CiAgdC5zaGV2YWhlYnJldyA9IDB4MDViMDsKICB0LnNoZXZhbmFycm93aGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmFxdWFydGVyaGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmF3aWRlaGVicmV3ID0gMHgwNWIwOwogIHQuc2hoYWN5cmlsbGljID0gMHgwNGJiOwogIHQuc2hpbWFjb3B0aWMgPSAweDAzZWQ7CiAgdC5zaGluID0gMHgwNWU5OwogIHQuc2hpbmRhZ2VzaCA9IDB4ZmI0OTsKICB0LnNoaW5kYWdlc2hoZWJyZXcgPSAweGZiNDk7CiAgdC5zaGluZGFnZXNoc2hpbmRvdCA9IDB4ZmIyYzsKICB0LnNoaW5kYWdlc2hzaGluZG90aGVicmV3ID0gMHhmYjJjOwogIHQuc2hpbmRhZ2VzaHNpbmRvdCA9IDB4ZmIyZDsKICB0LnNoaW5kYWdlc2hzaW5kb3RoZWJyZXcgPSAweGZiMmQ7CiAgdC5zaGluZG90aGVicmV3ID0gMHgwNWMxOwogIHQuc2hpbmhlYnJldyA9IDB4MDVlOTsKICB0LnNoaW5zaGluZG90ID0gMHhmYjJhOwogIHQuc2hpbnNoaW5kb3RoZWJyZXcgPSAweGZiMmE7CiAgdC5zaGluc2luZG90ID0gMHhmYjJiOwogIHQuc2hpbnNpbmRvdGhlYnJldyA9IDB4ZmIyYjsKICB0LnNob29rID0gMHgwMjgyOwogIHQuc2lnbWEgPSAweDAzYzM7CiAgdC5zaWdtYTEgPSAweDAzYzI7CiAgdC5zaWdtYWZpbmFsID0gMHgwM2MyOwogIHQuc2lnbWFsdW5hdGVzeW1ib2xncmVlayA9IDB4MDNmMjsKICB0LnNpaGlyYWdhbmEgPSAweDMwNTc7CiAgdC5zaWthdGFrYW5hID0gMHgzMGI3OwogIHQuc2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YzsKICB0LnNpbHVxaGVicmV3ID0gMHgwNWJkOwogIHQuc2lsdXFsZWZ0aGVicmV3ID0gMHgwNWJkOwogIHQuc2ltaWxhciA9IDB4MjIzYzsKICB0LnNpbmRvdGhlYnJldyA9IDB4MDVjMjsKICB0LnNpb3NhY2lyY2xla29yZWFuID0gMHgzMjc0OwogIHQuc2lvc2FwYXJlbmtvcmVhbiA9IDB4MzIxNDsKICB0LnNpb3NjaWV1Y2tvcmVhbiA9IDB4MzE3ZTsKICB0LnNpb3NjaXJjbGVrb3JlYW4gPSAweDMyNjY7CiAgdC5zaW9za2l5ZW9ra29yZWFuID0gMHgzMTdhOwogIHQuc2lvc2tvcmVhbiA9IDB4MzE0NTsKICB0LnNpb3NuaWV1bmtvcmVhbiA9IDB4MzE3YjsKICB0LnNpb3NwYXJlbmtvcmVhbiA9IDB4MzIwNjsKICB0LnNpb3NwaWV1cGtvcmVhbiA9IDB4MzE3ZDsKICB0LnNpb3N0aWtldXRrb3JlYW4gPSAweDMxN2M7CiAgdC5zaXggPSAweDAwMzY7CiAgdC5zaXhhcmFiaWMgPSAweDA2NjY7CiAgdC5zaXhiZW5nYWxpID0gMHgwOWVjOwogIHQuc2l4Y2lyY2xlID0gMHgyNDY1OwogIHQuc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZjsKICB0LnNpeGRldmEgPSAweDA5NmM7CiAgdC5zaXhndWphcmF0aSA9IDB4MGFlYzsKICB0LnNpeGd1cm11a2hpID0gMHgwYTZjOwogIHQuc2l4aGFja2FyYWJpYyA9IDB4MDY2NjsKICB0LnNpeGhhbmd6aG91ID0gMHgzMDI2OwogIHQuc2l4aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNTsKICB0LnNpeGluZmVyaW9yID0gMHgyMDg2OwogIHQuc2l4bW9ub3NwYWNlID0gMHhmZjE2OwogIHQuc2l4b2xkc3R5bGUgPSAweGY3MzY7CiAgdC5zaXhwYXJlbiA9IDB4MjQ3OTsKICB0LnNpeHBlcmlvZCA9IDB4MjQ4ZDsKICB0LnNpeHBlcnNpYW4gPSAweDA2ZjY7CiAgdC5zaXhyb21hbiA9IDB4MjE3NTsKICB0LnNpeHN1cGVyaW9yID0gMHgyMDc2OwogIHQuc2l4dGVlbmNpcmNsZSA9IDB4MjQ2ZjsKICB0LnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaSA9IDB4MDlmOTsKICB0LnNpeHRlZW5wYXJlbiA9IDB4MjQ4MzsKICB0LnNpeHRlZW5wZXJpb2QgPSAweDI0OTc7CiAgdC5zaXh0aGFpID0gMHgwZTU2OwogIHQuc2xhc2ggPSAweDAwMmY7CiAgdC5zbGFzaG1vbm9zcGFjZSA9IDB4ZmYwZjsKICB0LnNsb25nID0gMHgwMTdmOwogIHQuc2xvbmdkb3RhY2NlbnQgPSAweDFlOWI7CiAgdC5zbWlsZWZhY2UgPSAweDI2M2E7CiAgdC5zbW9ub3NwYWNlID0gMHhmZjUzOwogIHQuc29mcGFzdXFoZWJyZXcgPSAweDA1YzM7CiAgdC5zb2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc29mdHNpZ25jeXJpbGxpYyA9IDB4MDQ0YzsKICB0LnNvaGlyYWdhbmEgPSAweDMwNWQ7CiAgdC5zb2thdGFrYW5hID0gMHgzMGJkOwogIHQuc29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZjsKICB0LnNvbGlkdXNsb25nb3ZlcmxheWNtYiA9IDB4MDMzODsKICB0LnNvbGlkdXNzaG9ydG92ZXJsYXljbWIgPSAweDAzMzc7CiAgdC5zb3J1c2l0aGFpID0gMHgwZTI5OwogIHQuc29zYWxhdGhhaSA9IDB4MGUyODsKICB0LnNvc290aGFpID0gMHgwZTBiOwogIHQuc29zdWF0aGFpID0gMHgwZTJhOwogIHQuc3BhY2UgPSAweDAwMjA7CiAgdC5zcGFjZWhhY2thcmFiaWMgPSAweDAwMjA7CiAgdC5zcGFkZSA9IDB4MjY2MDsKICB0LnNwYWRlc3VpdGJsYWNrID0gMHgyNjYwOwogIHQuc3BhZGVzdWl0d2hpdGUgPSAweDI2NjQ7CiAgdC5zcGFyZW4gPSAweDI0YWU7CiAgdC5zcXVhcmViZWxvd2NtYiA9IDB4MDMzYjsKICB0LnNxdWFyZWNjID0gMHgzM2M0OwogIHQuc3F1YXJlY20gPSAweDMzOWQ7CiAgdC5zcXVhcmVkaWFnb25hbGNyb3NzaGF0Y2hmaWxsID0gMHgyNWE5OwogIHQuc3F1YXJlaG9yaXpvbnRhbGZpbGwgPSAweDI1YTQ7CiAgdC5zcXVhcmVrZyA9IDB4MzM4ZjsKICB0LnNxdWFyZWttID0gMHgzMzllOwogIHQuc3F1YXJla21jYXBpdGFsID0gMHgzM2NlOwogIHQuc3F1YXJlbG4gPSAweDMzZDE7CiAgdC5zcXVhcmVsb2cgPSAweDMzZDI7CiAgdC5zcXVhcmVtZyA9IDB4MzM4ZTsKICB0LnNxdWFyZW1pbCA9IDB4MzNkNTsKICB0LnNxdWFyZW1tID0gMHgzMzljOwogIHQuc3F1YXJlbXNxdWFyZWQgPSAweDMzYTE7CiAgdC5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTY7CiAgdC5zcXVhcmV1cHBlcmxlZnR0b2xvd2VycmlnaHRmaWxsID0gMHgyNWE3OwogIHQuc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbCA9IDB4MjVhODsKICB0LnNxdWFyZXZlcnRpY2FsZmlsbCA9IDB4MjVhNTsKICB0LnNxdWFyZXdoaXRld2l0aHNtYWxsYmxhY2sgPSAweDI1YTM7CiAgdC5zcnNxdWFyZSA9IDB4MzNkYjsKICB0LnNzYWJlbmdhbGkgPSAweDA5Yjc7CiAgdC5zc2FkZXZhID0gMHgwOTM3OwogIHQuc3NhZ3VqYXJhdGkgPSAweDBhYjc7CiAgdC5zc2FuZ2NpZXVja29yZWFuID0gMHgzMTQ5OwogIHQuc3NhbmdoaWV1aGtvcmVhbiA9IDB4MzE4NTsKICB0LnNzYW5naWV1bmdrb3JlYW4gPSAweDMxODA7CiAgdC5zc2FuZ2tpeWVva2tvcmVhbiA9IDB4MzEzMjsKICB0LnNzYW5nbmlldW5rb3JlYW4gPSAweDMxNjU7CiAgdC5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTQzOwogIHQuc3NhbmdzaW9za29yZWFuID0gMHgzMTQ2OwogIHQuc3Nhbmd0aWtldXRrb3JlYW4gPSAweDMxMzg7CiAgdC5zc3VwZXJpb3IgPSAweGY2ZjI7CiAgdC5zdGVybGluZyA9IDB4MDBhMzsKICB0LnN0ZXJsaW5nbW9ub3NwYWNlID0gMHhmZmUxOwogIHQuc3Ryb2tlbG9uZ292ZXJsYXljbWIgPSAweDAzMzY7CiAgdC5zdHJva2VzaG9ydG92ZXJsYXljbWIgPSAweDAzMzU7CiAgdC5zdWJzZXQgPSAweDIyODI7CiAgdC5zdWJzZXRub3RlcXVhbCA9IDB4MjI4YTsKICB0LnN1YnNldG9yZXF1YWwgPSAweDIyODY7CiAgdC5zdWNjZWVkcyA9IDB4MjI3YjsKICB0LnN1Y2h0aGF0ID0gMHgyMjBiOwogIHQuc3VoaXJhZ2FuYSA9IDB4MzA1OTsKICB0LnN1a2F0YWthbmEgPSAweDMwYjk7CiAgdC5zdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdkOwogIHQuc3VrdW5hcmFiaWMgPSAweDA2NTI7CiAgdC5zdW1tYXRpb24gPSAweDIyMTE7CiAgdC5zdW4gPSAweDI2M2M7CiAgdC5zdXBlcnNldCA9IDB4MjI4MzsKICB0LnN1cGVyc2V0bm90ZXF1YWwgPSAweDIyOGI7CiAgdC5zdXBlcnNldG9yZXF1YWwgPSAweDIyODc7CiAgdC5zdnNxdWFyZSA9IDB4MzNkYzsKICB0LnN5b3V3YWVyYXNxdWFyZSA9IDB4MzM3YzsKICB0LnQgPSAweDAwNzQ7CiAgdC50YWJlbmdhbGkgPSAweDA5YTQ7CiAgdC50YWNrZG93biA9IDB4MjJhNDsKICB0LnRhY2tsZWZ0ID0gMHgyMmEzOwogIHQudGFkZXZhID0gMHgwOTI0OwogIHQudGFndWphcmF0aSA9IDB4MGFhNDsKICB0LnRhZ3VybXVraGkgPSAweDBhMjQ7CiAgdC50YWhhcmFiaWMgPSAweDA2Mzc7CiAgdC50YWhmaW5hbGFyYWJpYyA9IDB4ZmVjMjsKICB0LnRhaGluaXRpYWxhcmFiaWMgPSAweGZlYzM7CiAgdC50YWhpcmFnYW5hID0gMHgzMDVmOwogIHQudGFobWVkaWFsYXJhYmljID0gMHhmZWM0OwogIHQudGFpc3lvdWVyYXNxdWFyZSA9IDB4MzM3ZDsKICB0LnRha2F0YWthbmEgPSAweDMwYmY7CiAgdC50YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgwOwogIHQudGF0d2VlbGFyYWJpYyA9IDB4MDY0MDsKICB0LnRhdSA9IDB4MDNjNDsKICB0LnRhdiA9IDB4MDVlYTsKICB0LnRhdmRhZ2VzID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoaGVicmV3ID0gMHhmYjRhOwogIHQudGF2aGVicmV3ID0gMHgwNWVhOwogIHQudGJhciA9IDB4MDE2NzsKICB0LnRib3BvbW9mbyA9IDB4MzEwYTsKICB0LnRjYXJvbiA9IDB4MDE2NTsKICB0LnRjY3VybCA9IDB4MDJhODsKICB0LnRjZWRpbGxhID0gMHgwMTYzOwogIHQudGNoZWhhcmFiaWMgPSAweDA2ODY7CiAgdC50Y2hlaGZpbmFsYXJhYmljID0gMHhmYjdiOwogIHQudGNoZWhpbml0aWFsYXJhYmljID0gMHhmYjdjOwogIHQudGNoZWhtZWRpYWxhcmFiaWMgPSAweGZiN2Q7CiAgdC50Y2lyY2xlID0gMHgyNGUzOwogIHQudGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MTsKICB0LnRjb21tYWFjY2VudCA9IDB4MDE2MzsKICB0LnRkaWVyZXNpcyA9IDB4MWU5NzsKICB0LnRkb3RhY2NlbnQgPSAweDFlNmI7CiAgdC50ZG90YmVsb3cgPSAweDFlNmQ7CiAgdC50ZWN5cmlsbGljID0gMHgwNDQyOwogIHQudGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhZDsKICB0LnRlaGFyYWJpYyA9IDB4MDYyYTsKICB0LnRlaGZpbmFsYXJhYmljID0gMHhmZTk2OwogIHQudGVoaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMjsKICB0LnRlaGhhaGlzb2xhdGVkYXJhYmljID0gMHhmYzBjOwogIHQudGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5NzsKICB0LnRlaGlyYWdhbmEgPSAweDMwNjY7CiAgdC50ZWhqZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMTsKICB0LnRlaGplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwYjsKICB0LnRlaG1hcmJ1dGFhcmFiaWMgPSAweDA2Mjk7CiAgdC50ZWhtYXJidXRhZmluYWxhcmFiaWMgPSAweGZlOTQ7CiAgdC50ZWhtZWRpYWxhcmFiaWMgPSAweGZlOTg7CiAgdC50ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhNDsKICB0LnRlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwZTsKICB0LnRlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM3MzsKICB0LnRla2F0YWthbmEgPSAweDMwYzY7CiAgdC50ZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgzOwogIHQudGVsZXBob25lID0gMHgyMTIxOwogIHQudGVsZXBob25lYmxhY2sgPSAweDI2MGU7CiAgdC50ZWxpc2hhZ2Vkb2xhaGVicmV3ID0gMHgwNWEwOwogIHQudGVsaXNoYXFldGFuYWhlYnJldyA9IDB4MDVhOTsKICB0LnRlbmNpcmNsZSA9IDB4MjQ2OTsKICB0LnRlbmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjk7CiAgdC50ZW5wYXJlbiA9IDB4MjQ3ZDsKICB0LnRlbnBlcmlvZCA9IDB4MjQ5MTsKICB0LnRlbnJvbWFuID0gMHgyMTc5OwogIHQudGVzaCA9IDB4MDJhNzsKICB0LnRldCA9IDB4MDVkODsKICB0LnRldGRhZ2VzaCA9IDB4ZmIzODsKICB0LnRldGRhZ2VzaGhlYnJldyA9IDB4ZmIzODsKICB0LnRldGhlYnJldyA9IDB4MDVkODsKICB0LnRldHNlY3lyaWxsaWMgPSAweDA0YjU7CiAgdC50ZXZpcmhlYnJldyA9IDB4MDU5YjsKICB0LnRldmlybGVmdGhlYnJldyA9IDB4MDU5YjsKICB0LnRoYWJlbmdhbGkgPSAweDA5YTU7CiAgdC50aGFkZXZhID0gMHgwOTI1OwogIHQudGhhZ3VqYXJhdGkgPSAweDBhYTU7CiAgdC50aGFndXJtdWtoaSA9IDB4MGEyNTsKICB0LnRoYWxhcmFiaWMgPSAweDA2MzA7CiAgdC50aGFsZmluYWxhcmFiaWMgPSAweGZlYWM7CiAgdC50aGFudGhha2hhdGxvd2xlZnR0aGFpID0gMHhmODk4OwogIHQudGhhbnRoYWtoYXRsb3dyaWdodHRoYWkgPSAweGY4OTc7CiAgdC50aGFudGhha2hhdHRoYWkgPSAweDBlNGM7CiAgdC50aGFudGhha2hhdHVwcGVybGVmdHRoYWkgPSAweGY4OTY7CiAgdC50aGVoYXJhYmljID0gMHgwNjJiOwogIHQudGhlaGZpbmFsYXJhYmljID0gMHhmZTlhOwogIHQudGhlaGluaXRpYWxhcmFiaWMgPSAweGZlOWI7CiAgdC50aGVobWVkaWFsYXJhYmljID0gMHhmZTljOwogIHQudGhlcmVleGlzdHMgPSAweDIyMDM7CiAgdC50aGVyZWZvcmUgPSAweDIyMzQ7CiAgdC50aGV0YSA9IDB4MDNiODsKICB0LnRoZXRhMSA9IDB4MDNkMTsKICB0LnRoZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDE7CiAgdC50aGlldXRoYWNpcmNsZWtvcmVhbiA9IDB4MzI3OTsKICB0LnRoaWV1dGhhcGFyZW5rb3JlYW4gPSAweDMyMTk7CiAgdC50aGlldXRoY2lyY2xla29yZWFuID0gMHgzMjZiOwogIHQudGhpZXV0aGtvcmVhbiA9IDB4MzE0YzsKICB0LnRoaWV1dGhwYXJlbmtvcmVhbiA9IDB4MzIwYjsKICB0LnRoaXJ0ZWVuY2lyY2xlID0gMHgyNDZjOwogIHQudGhpcnRlZW5wYXJlbiA9IDB4MjQ4MDsKICB0LnRoaXJ0ZWVucGVyaW9kID0gMHgyNDk0OwogIHQudGhvbmFuZ21vbnRob3RoYWkgPSAweDBlMTE7CiAgdC50aG9vayA9IDB4MDFhZDsKICB0LnRob3BodXRoYW90aGFpID0gMHgwZTEyOwogIHQudGhvcm4gPSAweDAwZmU7CiAgdC50aG90aGFoYW50aGFpID0gMHgwZTE3OwogIHQudGhvdGhhbnRoYWkgPSAweDBlMTA7CiAgdC50aG90aG9uZ3RoYWkgPSAweDBlMTg7CiAgdC50aG90aHVuZ3RoYWkgPSAweDBlMTY7CiAgdC50aG91c2FuZGN5cmlsbGljID0gMHgwNDgyOwogIHQudGhvdXNhbmRzc2VwYXJhdG9yYXJhYmljID0gMHgwNjZjOwogIHQudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YzsKICB0LnRocmVlID0gMHgwMDMzOwogIHQudGhyZWVhcmFiaWMgPSAweDA2NjM7CiAgdC50aHJlZWJlbmdhbGkgPSAweDA5ZTk7CiAgdC50aHJlZWNpcmNsZSA9IDB4MjQ2MjsKICB0LnRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4YzsKICB0LnRocmVlZGV2YSA9IDB4MDk2OTsKICB0LnRocmVlZWlnaHRocyA9IDB4MjE1YzsKICB0LnRocmVlZ3VqYXJhdGkgPSAweDBhZTk7CiAgdC50aHJlZWd1cm11a2hpID0gMHgwYTY5OwogIHQudGhyZWVoYWNrYXJhYmljID0gMHgwNjYzOwogIHQudGhyZWVoYW5nemhvdSA9IDB4MzAyMzsKICB0LnRocmVlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMjsKICB0LnRocmVlaW5mZXJpb3IgPSAweDIwODM7CiAgdC50aHJlZW1vbm9zcGFjZSA9IDB4ZmYxMzsKICB0LnRocmVlbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNjsKICB0LnRocmVlb2xkc3R5bGUgPSAweGY3MzM7CiAgdC50aHJlZXBhcmVuID0gMHgyNDc2OwogIHQudGhyZWVwZXJpb2QgPSAweDI0OGE7CiAgdC50aHJlZXBlcnNpYW4gPSAweDA2ZjM7CiAgdC50aHJlZXF1YXJ0ZXJzID0gMHgwMGJlOwogIHQudGhyZWVxdWFydGVyc2VtZGFzaCA9IDB4ZjZkZTsKICB0LnRocmVlcm9tYW4gPSAweDIxNzI7CiAgdC50aHJlZXN1cGVyaW9yID0gMHgwMGIzOwogIHQudGhyZWV0aGFpID0gMHgwZTUzOwogIHQudGh6c3F1YXJlID0gMHgzMzk0OwogIHQudGloaXJhZ2FuYSA9IDB4MzA2MTsKICB0LnRpa2F0YWthbmEgPSAweDMwYzE7CiAgdC50aWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgxOwogIHQudGlrZXV0YWNpcmNsZWtvcmVhbiA9IDB4MzI3MDsKICB0LnRpa2V1dGFwYXJlbmtvcmVhbiA9IDB4MzIxMDsKICB0LnRpa2V1dGNpcmNsZWtvcmVhbiA9IDB4MzI2MjsKICB0LnRpa2V1dGtvcmVhbiA9IDB4MzEzNzsKICB0LnRpa2V1dHBhcmVua29yZWFuID0gMHgzMjAyOwogIHQudGlsZGUgPSAweDAyZGM7CiAgdC50aWxkZWJlbG93Y21iID0gMHgwMzMwOwogIHQudGlsZGVjbWIgPSAweDAzMDM7CiAgdC50aWxkZWNvbWIgPSAweDAzMDM7CiAgdC50aWxkZWRvdWJsZWNtYiA9IDB4MDM2MDsKICB0LnRpbGRlb3BlcmF0b3IgPSAweDIyM2M7CiAgdC50aWxkZW92ZXJsYXljbWIgPSAweDAzMzQ7CiAgdC50aWxkZXZlcnRpY2FsY21iID0gMHgwMzNlOwogIHQudGltZXNjaXJjbGUgPSAweDIyOTc7CiAgdC50aXBlaGFoZWJyZXcgPSAweDA1OTY7CiAgdC50aXBlaGFsZWZ0aGVicmV3ID0gMHgwNTk2OwogIHQudGlwcGlndXJtdWtoaSA9IDB4MGE3MDsKICB0LnRpdGxvY3lyaWxsaWNjbWIgPSAweDA0ODM7CiAgdC50aXduYXJtZW5pYW4gPSAweDA1N2Y7CiAgdC50bGluZWJlbG93ID0gMHgxZTZmOwogIHQudG1vbm9zcGFjZSA9IDB4ZmY1NDsKICB0LnRvYXJtZW5pYW4gPSAweDA1Njk7CiAgdC50b2hpcmFnYW5hID0gMHgzMDY4OwogIHQudG9rYXRha2FuYSA9IDB4MzBjODsKICB0LnRva2F0YWthbmFoYWxmd2lkdGggPSAweGZmODQ7CiAgdC50b25lYmFyZXh0cmFoaWdobW9kID0gMHgwMmU1OwogIHQudG9uZWJhcmV4dHJhbG93bW9kID0gMHgwMmU5OwogIHQudG9uZWJhcmhpZ2htb2QgPSAweDAyZTY7CiAgdC50b25lYmFybG93bW9kID0gMHgwMmU4OwogIHQudG9uZWJhcm1pZG1vZCA9IDB4MDJlNzsKICB0LnRvbmVmaXZlID0gMHgwMWJkOwogIHQudG9uZXNpeCA9IDB4MDE4NTsKICB0LnRvbmV0d28gPSAweDAxYTg7CiAgdC50b25vcyA9IDB4MDM4NDsKICB0LnRvbnNxdWFyZSA9IDB4MzMyNzsKICB0LnRvcGF0YWt0aGFpID0gMHgwZTBmOwogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0ID0gMHgzMDE0OwogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGwgPSAweGZlNWQ7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzOTsKICB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQgPSAweDMwMTU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGwgPSAweGZlNWU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2E7CiAgdC50b3Rhb3RoYWkgPSAweDBlMTU7CiAgdC50cGFsYXRhbGhvb2sgPSAweDAxYWI7CiAgdC50cGFyZW4gPSAweDI0YWY7CiAgdC50cmFkZW1hcmsgPSAweDIxMjI7CiAgdC50cmFkZW1hcmtzYW5zID0gMHhmOGVhOwogIHQudHJhZGVtYXJrc2VyaWYgPSAweGY2ZGI7CiAgdC50cmV0cm9mbGV4aG9vayA9IDB4MDI4ODsKICB0LnRyaWFnZG4gPSAweDI1YmM7CiAgdC50cmlhZ2xmID0gMHgyNWM0OwogIHQudHJpYWdydCA9IDB4MjViYTsKICB0LnRyaWFndXAgPSAweDI1YjI7CiAgdC50cyA9IDB4MDJhNjsKICB0LnRzYWRpID0gMHgwNWU2OwogIHQudHNhZGlkYWdlc2ggPSAweGZiNDY7CiAgdC50c2FkaWRhZ2VzaGhlYnJldyA9IDB4ZmI0NjsKICB0LnRzYWRpaGVicmV3ID0gMHgwNWU2OwogIHQudHNlY3lyaWxsaWMgPSAweDA0NDY7CiAgdC50c2VyZSA9IDB4MDViNTsKICB0LnRzZXJlMTIgPSAweDA1YjU7CiAgdC50c2VyZTFlID0gMHgwNWI1OwogIHQudHNlcmUyYiA9IDB4MDViNTsKICB0LnRzZXJlaGVicmV3ID0gMHgwNWI1OwogIHQudHNlcmVuYXJyb3doZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXdpZGVoZWJyZXcgPSAweDA1YjU7CiAgdC50c2hlY3lyaWxsaWMgPSAweDA0NWI7CiAgdC50c3VwZXJpb3IgPSAweGY2ZjM7CiAgdC50dGFiZW5nYWxpID0gMHgwOTlmOwogIHQudHRhZGV2YSA9IDB4MDkxZjsKICB0LnR0YWd1amFyYXRpID0gMHgwYTlmOwogIHQudHRhZ3VybXVraGkgPSAweDBhMWY7CiAgdC50dGVoYXJhYmljID0gMHgwNjc5OwogIHQudHRlaGZpbmFsYXJhYmljID0gMHhmYjY3OwogIHQudHRlaGluaXRpYWxhcmFiaWMgPSAweGZiNjg7CiAgdC50dGVobWVkaWFsYXJhYmljID0gMHhmYjY5OwogIHQudHRoYWJlbmdhbGkgPSAweDA5YTA7CiAgdC50dGhhZGV2YSA9IDB4MDkyMDsKICB0LnR0aGFndWphcmF0aSA9IDB4MGFhMDsKICB0LnR0aGFndXJtdWtoaSA9IDB4MGEyMDsKICB0LnR0dXJuZWQgPSAweDAyODc7CiAgdC50dWhpcmFnYW5hID0gMHgzMDY0OwogIHQudHVrYXRha2FuYSA9IDB4MzBjNDsKICB0LnR1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmODI7CiAgdC50dXNtYWxsaGlyYWdhbmEgPSAweDMwNjM7CiAgdC50dXNtYWxsa2F0YWthbmEgPSAweDMwYzM7CiAgdC50dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmY7CiAgdC50d2VsdmVjaXJjbGUgPSAweDI0NmI7CiAgdC50d2VsdmVwYXJlbiA9IDB4MjQ3ZjsKICB0LnR3ZWx2ZXBlcmlvZCA9IDB4MjQ5MzsKICB0LnR3ZWx2ZXJvbWFuID0gMHgyMTdiOwogIHQudHdlbnR5Y2lyY2xlID0gMHgyNDczOwogIHQudHdlbnR5aGFuZ3pob3UgPSAweDUzNDQ7CiAgdC50d2VudHlwYXJlbiA9IDB4MjQ4NzsKICB0LnR3ZW50eXBlcmlvZCA9IDB4MjQ5YjsKICB0LnR3byA9IDB4MDAzMjsKICB0LnR3b2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2JlbmdhbGkgPSAweDA5ZTg7CiAgdC50d29jaXJjbGUgPSAweDI0NjE7CiAgdC50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhiOwogIHQudHdvZGV2YSA9IDB4MDk2ODsKICB0LnR3b2RvdGVubGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVydmVydGljYWwgPSAweGZlMzA7CiAgdC50d29ndWphcmF0aSA9IDB4MGFlODsKICB0LnR3b2d1cm11a2hpID0gMHgwYTY4OwogIHQudHdvaGFja2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2hhbmd6aG91ID0gMHgzMDIyOwogIHQudHdvaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMTsKICB0LnR3b2luZmVyaW9yID0gMHgyMDgyOwogIHQudHdvbW9ub3NwYWNlID0gMHhmZjEyOwogIHQudHdvbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNTsKICB0LnR3b29sZHN0eWxlID0gMHhmNzMyOwogIHQudHdvcGFyZW4gPSAweDI0NzU7CiAgdC50d29wZXJpb2QgPSAweDI0ODk7CiAgdC50d29wZXJzaWFuID0gMHgwNmYyOwogIHQudHdvcm9tYW4gPSAweDIxNzE7CiAgdC50d29zdHJva2UgPSAweDAxYmI7CiAgdC50d29zdXBlcmlvciA9IDB4MDBiMjsKICB0LnR3b3RoYWkgPSAweDBlNTI7CiAgdC50d290aGlyZHMgPSAweDIxNTQ7CiAgdC51ID0gMHgwMDc1OwogIHQudWFjdXRlID0gMHgwMGZhOwogIHQudWJhciA9IDB4MDI4OTsKICB0LnViZW5nYWxpID0gMHgwOTg5OwogIHQudWJvcG9tb2ZvID0gMHgzMTI4OwogIHQudWJyZXZlID0gMHgwMTZkOwogIHQudWNhcm9uID0gMHgwMWQ0OwogIHQudWNpcmNsZSA9IDB4MjRlNDsKICB0LnVjaXJjdW1mbGV4ID0gMHgwMGZiOwogIHQudWNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3NzsKICB0LnVjeXJpbGxpYyA9IDB4MDQ0MzsKICB0LnVkYXR0YWRldmEgPSAweDA5NTE7CiAgdC51ZGJsYWN1dGUgPSAweDAxNzE7CiAgdC51ZGJsZ3JhdmUgPSAweDAyMTU7CiAgdC51ZGV2YSA9IDB4MDkwOTsKICB0LnVkaWVyZXNpcyA9IDB4MDBmYzsKICB0LnVkaWVyZXNpc2FjdXRlID0gMHgwMWQ4OwogIHQudWRpZXJlc2lzYmVsb3cgPSAweDFlNzM7CiAgdC51ZGllcmVzaXNjYXJvbiA9IDB4MDFkYTsKICB0LnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGYxOwogIHQudWRpZXJlc2lzZ3JhdmUgPSAweDAxZGM7CiAgdC51ZGllcmVzaXNtYWNyb24gPSAweDAxZDY7CiAgdC51ZG90YmVsb3cgPSAweDFlZTU7CiAgdC51Z3JhdmUgPSAweDAwZjk7CiAgdC51Z3VqYXJhdGkgPSAweDBhODk7CiAgdC51Z3VybXVraGkgPSAweDBhMDk7CiAgdC51aGlyYWdhbmEgPSAweDMwNDY7CiAgdC51aG9va2Fib3ZlID0gMHgxZWU3OwogIHQudWhvcm4gPSAweDAxYjA7CiAgdC51aG9ybmFjdXRlID0gMHgxZWU5OwogIHQudWhvcm5kb3RiZWxvdyA9IDB4MWVmMTsKICB0LnVob3JuZ3JhdmUgPSAweDFlZWI7CiAgdC51aG9ybmhvb2thYm92ZSA9IDB4MWVlZDsKICB0LnVob3JudGlsZGUgPSAweDFlZWY7CiAgdC51aHVuZ2FydW1sYXV0ID0gMHgwMTcxOwogIHQudWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYzOwogIHQudWludmVydGVkYnJldmUgPSAweDAyMTc7CiAgdC51a2F0YWthbmEgPSAweDMwYTY7CiAgdC51a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzM7CiAgdC51a2N5cmlsbGljID0gMHgwNDc5OwogIHQudWtvcmVhbiA9IDB4MzE1YzsKICB0LnVtYWNyb24gPSAweDAxNmI7CiAgdC51bWFjcm9uY3lyaWxsaWMgPSAweDA0ZWY7CiAgdC51bWFjcm9uZGllcmVzaXMgPSAweDFlN2I7CiAgdC51bWF0cmFndXJtdWtoaSA9IDB4MGE0MTsKICB0LnVtb25vc3BhY2UgPSAweGZmNTU7CiAgdC51bmRlcnNjb3JlID0gMHgwMDVmOwogIHQudW5kZXJzY29yZWRibCA9IDB4MjAxNzsKICB0LnVuZGVyc2NvcmVtb25vc3BhY2UgPSAweGZmM2Y7CiAgdC51bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzM7CiAgdC51bmRlcnNjb3Jld2F2eSA9IDB4ZmU0ZjsKICB0LnVuaW9uID0gMHgyMjJhOwogIHQudW5pdmVyc2FsID0gMHgyMjAwOwogIHQudW9nb25layA9IDB4MDE3MzsKICB0LnVwYXJlbiA9IDB4MjRiMDsKICB0LnVwYmxvY2sgPSAweDI1ODA7CiAgdC51cHBlcmRvdGhlYnJldyA9IDB4MDVjNDsKICB0LnVwc2lsb24gPSAweDAzYzU7CiAgdC51cHNpbG9uZGllcmVzaXMgPSAweDAzY2I7CiAgdC51cHNpbG9uZGllcmVzaXN0b25vcyA9IDB4MDNiMDsKICB0LnVwc2lsb25sYXRpbiA9IDB4MDI4YTsKICB0LnVwc2lsb250b25vcyA9IDB4MDNjZDsKICB0LnVwdGFja2JlbG93Y21iID0gMHgwMzFkOwogIHQudXB0YWNrbW9kID0gMHgwMmQ0OwogIHQudXJhZ3VybXVraGkgPSAweDBhNzM7CiAgdC51cmluZyA9IDB4MDE2ZjsKICB0LnVzaG9ydGN5cmlsbGljID0gMHgwNDVlOwogIHQudXNtYWxsaGlyYWdhbmEgPSAweDMwNDU7CiAgdC51c21hbGxrYXRha2FuYSA9IDB4MzBhNTsKICB0LnVzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY5OwogIHQudXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWY7CiAgdC51c3RyYWlnaHRzdHJva2VjeXJpbGxpYyA9IDB4MDRiMTsKICB0LnV0aWxkZSA9IDB4MDE2OTsKICB0LnV0aWxkZWFjdXRlID0gMHgxZTc5OwogIHQudXRpbGRlYmVsb3cgPSAweDFlNzU7CiAgdC51dWJlbmdhbGkgPSAweDA5OGE7CiAgdC51dWRldmEgPSAweDA5MGE7CiAgdC51dWd1amFyYXRpID0gMHgwYThhOwogIHQudXVndXJtdWtoaSA9IDB4MGEwYTsKICB0LnV1bWF0cmFndXJtdWtoaSA9IDB4MGE0MjsKICB0LnV1dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMjsKICB0LnV1dm93ZWxzaWduZGV2YSA9IDB4MDk0MjsKICB0LnV1dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzI7CiAgdC51dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMTsKICB0LnV2b3dlbHNpZ25kZXZhID0gMHgwOTQxOwogIHQudXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMxOwogIHQudiA9IDB4MDA3NjsKICB0LnZhZGV2YSA9IDB4MDkzNTsKICB0LnZhZ3VqYXJhdGkgPSAweDBhYjU7CiAgdC52YWd1cm11a2hpID0gMHgwYTM1OwogIHQudmFrYXRha2FuYSA9IDB4MzBmNzsKICB0LnZhdiA9IDB4MDVkNTsKICB0LnZhdmRhZ2VzaCA9IDB4ZmIzNTsKICB0LnZhdmRhZ2VzaDY1ID0gMHhmYjM1OwogIHQudmF2ZGFnZXNoaGVicmV3ID0gMHhmYjM1OwogIHQudmF2aGVicmV3ID0gMHgwNWQ1OwogIHQudmF2aG9sYW0gPSAweGZiNGI7CiAgdC52YXZob2xhbWhlYnJldyA9IDB4ZmI0YjsKICB0LnZhdnZhdmhlYnJldyA9IDB4MDVmMDsKICB0LnZhdnlvZGhlYnJldyA9IDB4MDVmMTsKICB0LnZjaXJjbGUgPSAweDI0ZTU7CiAgdC52ZG90YmVsb3cgPSAweDFlN2Y7CiAgdC52ZWN5cmlsbGljID0gMHgwNDMyOwogIHQudmVoYXJhYmljID0gMHgwNmE0OwogIHQudmVoZmluYWxhcmFiaWMgPSAweGZiNmI7CiAgdC52ZWhpbml0aWFsYXJhYmljID0gMHhmYjZjOwogIHQudmVobWVkaWFsYXJhYmljID0gMHhmYjZkOwogIHQudmVrYXRha2FuYSA9IDB4MzBmOTsKICB0LnZlbnVzID0gMHgyNjQwOwogIHQudmVydGljYWxiYXIgPSAweDAwN2M7CiAgdC52ZXJ0aWNhbGxpbmVhYm92ZWNtYiA9IDB4MDMwZDsKICB0LnZlcnRpY2FsbGluZWJlbG93Y21iID0gMHgwMzI5OwogIHQudmVydGljYWxsaW5lbG93bW9kID0gMHgwMmNjOwogIHQudmVydGljYWxsaW5lbW9kID0gMHgwMmM4OwogIHQudmV3YXJtZW5pYW4gPSAweDA1N2U7CiAgdC52aG9vayA9IDB4MDI4YjsKICB0LnZpa2F0YWthbmEgPSAweDMwZjg7CiAgdC52aXJhbWFiZW5nYWxpID0gMHgwOWNkOwogIHQudmlyYW1hZGV2YSA9IDB4MDk0ZDsKICB0LnZpcmFtYWd1amFyYXRpID0gMHgwYWNkOwogIHQudmlzYXJnYWJlbmdhbGkgPSAweDA5ODM7CiAgdC52aXNhcmdhZGV2YSA9IDB4MDkwMzsKICB0LnZpc2FyZ2FndWphcmF0aSA9IDB4MGE4MzsKICB0LnZtb25vc3BhY2UgPSAweGZmNTY7CiAgdC52b2FybWVuaWFuID0gMHgwNTc4OwogIHQudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWU7CiAgdC52b2ljZWRpdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZTsKICB0LnZvaWNlZG1hcmtrYW5hID0gMHgzMDliOwogIHQudm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWU7CiAgdC52b2thdGFrYW5hID0gMHgzMGZhOwogIHQudnBhcmVuID0gMHgyNGIxOwogIHQudnRpbGRlID0gMHgxZTdkOwogIHQudnR1cm5lZCA9IDB4MDI4YzsKICB0LnZ1aGlyYWdhbmEgPSAweDMwOTQ7CiAgdC52dWthdGFrYW5hID0gMHgzMGY0OwogIHQudyA9IDB4MDA3NzsKICB0LndhY3V0ZSA9IDB4MWU4MzsKICB0LndhZWtvcmVhbiA9IDB4MzE1OTsKICB0LndhaGlyYWdhbmEgPSAweDMwOGY7CiAgdC53YWthdGFrYW5hID0gMHgzMGVmOwogIHQud2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YzsKICB0Lndha29yZWFuID0gMHgzMTU4OwogIHQud2FzbWFsbGhpcmFnYW5hID0gMHgzMDhlOwogIHQud2FzbWFsbGthdGFrYW5hID0gMHgzMGVlOwogIHQud2F0dG9zcXVhcmUgPSAweDMzNTc7CiAgdC53YXZlZGFzaCA9IDB4MzAxYzsKICB0Lndhdnl1bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzQ7CiAgdC53YXdhcmFiaWMgPSAweDA2NDg7CiAgdC53YXdmaW5hbGFyYWJpYyA9IDB4ZmVlZTsKICB0Lndhd2hhbXphYWJvdmVhcmFiaWMgPSAweDA2MjQ7CiAgdC53YXdoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODY7CiAgdC53YnNxdWFyZSA9IDB4MzNkZDsKICB0LndjaXJjbGUgPSAweDI0ZTY7CiAgdC53Y2lyY3VtZmxleCA9IDB4MDE3NTsKICB0LndkaWVyZXNpcyA9IDB4MWU4NTsKICB0Lndkb3RhY2NlbnQgPSAweDFlODc7CiAgdC53ZG90YmVsb3cgPSAweDFlODk7CiAgdC53ZWhpcmFnYW5hID0gMHgzMDkxOwogIHQud2VpZXJzdHJhc3MgPSAweDIxMTg7CiAgdC53ZWthdGFrYW5hID0gMHgzMGYxOwogIHQud2Vrb3JlYW4gPSAweDMxNWU7CiAgdC53ZW9rb3JlYW4gPSAweDMxNWQ7CiAgdC53Z3JhdmUgPSAweDFlODE7CiAgdC53aGl0ZWJ1bGxldCA9IDB4MjVlNjsKICB0LndoaXRlY2lyY2xlID0gMHgyNWNiOwogIHQud2hpdGVjaXJjbGVpbnZlcnNlID0gMHgyNWQ5OwogIHQud2hpdGVjb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwZTsKICB0LndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MzsKICB0LndoaXRlY29ybmVyYnJhY2tldHJpZ2h0ID0gMHgzMDBmOwogIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0NDsKICB0LndoaXRlZGlhbW9uZCA9IDB4MjVjNzsKICB0LndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZCA9IDB4MjVjODsKICB0LndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViZjsKICB0LndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGUgPSAweDI1YmQ7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YzM7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMxOwogIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQgPSAweDMwMTY7CiAgdC53aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTc7CiAgdC53aGl0ZXJpZ2h0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWI5OwogIHQud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGUgPSAweDI1Yjc7CiAgdC53aGl0ZXNtYWxsc3F1YXJlID0gMHgyNWFiOwogIHQud2hpdGVzbWlsaW5nZmFjZSA9IDB4MjYzYTsKICB0LndoaXRlc3F1YXJlID0gMHgyNWExOwogIHQud2hpdGVzdGFyID0gMHgyNjA2OwogIHQud2hpdGV0ZWxlcGhvbmUgPSAweDI2MGY7CiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCA9IDB4MzAxODsKICB0LndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxOTsKICB0LndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjU7CiAgdC53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMzsKICB0LndpaGlyYWdhbmEgPSAweDMwOTA7CiAgdC53aWthdGFrYW5hID0gMHgzMGYwOwogIHQud2lrb3JlYW4gPSAweDMxNWY7CiAgdC53bW9ub3NwYWNlID0gMHhmZjU3OwogIHQud29oaXJhZ2FuYSA9IDB4MzA5MjsKICB0Lndva2F0YWthbmEgPSAweDMwZjI7CiAgdC53b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjY2OwogIHQud29uID0gMHgyMGE5OwogIHQud29ubW9ub3NwYWNlID0gMHhmZmU2OwogIHQud293YWVudGhhaSA9IDB4MGUyNzsKICB0LndwYXJlbiA9IDB4MjRiMjsKICB0LndyaW5nID0gMHgxZTk4OwogIHQud3N1cGVyaW9yID0gMHgwMmI3OwogIHQud3R1cm5lZCA9IDB4MDI4ZDsKICB0Lnd5bm4gPSAweDAxYmY7CiAgdC54ID0gMHgwMDc4OwogIHQueGFib3ZlY21iID0gMHgwMzNkOwogIHQueGJvcG9tb2ZvID0gMHgzMTEyOwogIHQueGNpcmNsZSA9IDB4MjRlNzsKICB0LnhkaWVyZXNpcyA9IDB4MWU4ZDsKICB0Lnhkb3RhY2NlbnQgPSAweDFlOGI7CiAgdC54ZWhhcm1lbmlhbiA9IDB4MDU2ZDsKICB0LnhpID0gMHgwM2JlOwogIHQueG1vbm9zcGFjZSA9IDB4ZmY1ODsKICB0LnhwYXJlbiA9IDB4MjRiMzsKICB0LnhzdXBlcmlvciA9IDB4MDJlMzsKICB0LnkgPSAweDAwNzk7CiAgdC55YWFkb3NxdWFyZSA9IDB4MzM0ZTsKICB0LnlhYmVuZ2FsaSA9IDB4MDlhZjsKICB0LnlhY3V0ZSA9IDB4MDBmZDsKICB0LnlhZGV2YSA9IDB4MDkyZjsKICB0LnlhZWtvcmVhbiA9IDB4MzE1MjsKICB0LnlhZ3VqYXJhdGkgPSAweDBhYWY7CiAgdC55YWd1cm11a2hpID0gMHgwYTJmOwogIHQueWFoaXJhZ2FuYSA9IDB4MzA4NDsKICB0Lnlha2F0YWthbmEgPSAweDMwZTQ7CiAgdC55YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk0OwogIHQueWFrb3JlYW4gPSAweDMxNTE7CiAgdC55YW1ha2thbnRoYWkgPSAweDBlNGU7CiAgdC55YXNtYWxsaGlyYWdhbmEgPSAweDMwODM7CiAgdC55YXNtYWxsa2F0YWthbmEgPSAweDMwZTM7CiAgdC55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmM7CiAgdC55YXRjeXJpbGxpYyA9IDB4MDQ2MzsKICB0LnljaXJjbGUgPSAweDI0ZTg7CiAgdC55Y2lyY3VtZmxleCA9IDB4MDE3NzsKICB0LnlkaWVyZXNpcyA9IDB4MDBmZjsKICB0Lnlkb3RhY2NlbnQgPSAweDFlOGY7CiAgdC55ZG90YmVsb3cgPSAweDFlZjU7CiAgdC55ZWhhcmFiaWMgPSAweDA2NGE7CiAgdC55ZWhiYXJyZWVhcmFiaWMgPSAweDA2ZDI7CiAgdC55ZWhiYXJyZWVmaW5hbGFyYWJpYyA9IDB4ZmJhZjsKICB0LnllaGZpbmFsYXJhYmljID0gMHhmZWYyOwogIHQueWVoaGFtemFhYm92ZWFyYWJpYyA9IDB4MDYyNjsKICB0LnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4YTsKICB0LnllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljID0gMHhmZThiOwogIHQueWVoaGFtemFhYm92ZW1lZGlhbGFyYWJpYyA9IDB4ZmU4YzsKICB0LnllaGluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC55ZWhtZWRpYWxhcmFiaWMgPSAweGZlZjQ7CiAgdC55ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkZDsKICB0LnllaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM1ODsKICB0LnllaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM5NDsKICB0LnllaHRocmVlZG90c2JlbG93YXJhYmljID0gMHgwNmQxOwogIHQueWVrb3JlYW4gPSAweDMxNTY7CiAgdC55ZW4gPSAweDAwYTU7CiAgdC55ZW5tb25vc3BhY2UgPSAweGZmZTU7CiAgdC55ZW9rb3JlYW4gPSAweDMxNTU7CiAgdC55ZW9yaW5oaWV1aGtvcmVhbiA9IDB4MzE4NjsKICB0LnllcmFoYmVueW9tb2hlYnJldyA9IDB4MDVhYTsKICB0LnllcmFoYmVueW9tb2xlZnRoZWJyZXcgPSAweDA1YWE7CiAgdC55ZXJpY3lyaWxsaWMgPSAweDA0NGI7CiAgdC55ZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmOTsKICB0Lnllc2lldW5na29yZWFuID0gMHgzMTgxOwogIHQueWVzaWV1bmdwYW5zaW9za29yZWFuID0gMHgzMTgzOwogIHQueWVzaWV1bmdzaW9za29yZWFuID0gMHgzMTgyOwogIHQueWV0aXZoZWJyZXcgPSAweDA1OWE7CiAgdC55Z3JhdmUgPSAweDFlZjM7CiAgdC55aG9vayA9IDB4MDFiNDsKICB0Lnlob29rYWJvdmUgPSAweDFlZjc7CiAgdC55aWFybWVuaWFuID0gMHgwNTc1OwogIHQueWljeXJpbGxpYyA9IDB4MDQ1NzsKICB0Lnlpa29yZWFuID0gMHgzMTYyOwogIHQueWlueWFuZyA9IDB4MjYyZjsKICB0Lnlpd25hcm1lbmlhbiA9IDB4MDU4MjsKICB0Lnltb25vc3BhY2UgPSAweGZmNTk7CiAgdC55b2QgPSAweDA1ZDk7CiAgdC55b2RkYWdlc2ggPSAweGZiMzk7CiAgdC55b2RkYWdlc2hoZWJyZXcgPSAweGZiMzk7CiAgdC55b2RoZWJyZXcgPSAweDA1ZDk7CiAgdC55b2R5b2RoZWJyZXcgPSAweDA1ZjI7CiAgdC55b2R5b2RwYXRhaGhlYnJldyA9IDB4ZmIxZjsKICB0LnlvaGlyYWdhbmEgPSAweDMwODg7CiAgdC55b2lrb3JlYW4gPSAweDMxODk7CiAgdC55b2thdGFrYW5hID0gMHgzMGU4OwogIHQueW9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NjsKICB0Lnlva29yZWFuID0gMHgzMTViOwogIHQueW9zbWFsbGhpcmFnYW5hID0gMHgzMDg3OwogIHQueW9zbWFsbGthdGFrYW5hID0gMHgzMGU3OwogIHQueW9zbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZlOwogIHQueW90Z3JlZWsgPSAweDAzZjM7CiAgdC55b3lhZWtvcmVhbiA9IDB4MzE4ODsKICB0LnlveWFrb3JlYW4gPSAweDMxODc7CiAgdC55b3lha3RoYWkgPSAweDBlMjI7CiAgdC55b3lpbmd0aGFpID0gMHgwZTBkOwogIHQueXBhcmVuID0gMHgyNGI0OwogIHQueXBvZ2VncmFtbWVuaSA9IDB4MDM3YTsKICB0Lnlwb2dlZ3JhbW1lbmlncmVla2NtYiA9IDB4MDM0NTsKICB0LnlyID0gMHgwMWE2OwogIHQueXJpbmcgPSAweDFlOTk7CiAgdC55c3VwZXJpb3IgPSAweDAyYjg7CiAgdC55dGlsZGUgPSAweDFlZjk7CiAgdC55dHVybmVkID0gMHgwMjhlOwogIHQueXVoaXJhZ2FuYSA9IDB4MzA4NjsKICB0Lnl1aWtvcmVhbiA9IDB4MzE4YzsKICB0Lnl1a2F0YWthbmEgPSAweDMwZTY7CiAgdC55dWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk1OwogIHQueXVrb3JlYW4gPSAweDMxNjA7CiAgdC55dXNiaWdjeXJpbGxpYyA9IDB4MDQ2YjsKICB0Lnl1c2JpZ2lvdGlmaWVkY3lyaWxsaWMgPSAweDA0NmQ7CiAgdC55dXNsaXR0bGVjeXJpbGxpYyA9IDB4MDQ2NzsKICB0Lnl1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njk7CiAgdC55dXNtYWxsaGlyYWdhbmEgPSAweDMwODU7CiAgdC55dXNtYWxsa2F0YWthbmEgPSAweDMwZTU7CiAgdC55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmQ7CiAgdC55dXlla29yZWFuID0gMHgzMThiOwogIHQueXV5ZW9rb3JlYW4gPSAweDMxOGE7CiAgdC55eWFiZW5nYWxpID0gMHgwOWRmOwogIHQueXlhZGV2YSA9IDB4MDk1ZjsKICB0LnogPSAweDAwN2E7CiAgdC56YWFybWVuaWFuID0gMHgwNTY2OwogIHQuemFjdXRlID0gMHgwMTdhOwogIHQuemFkZXZhID0gMHgwOTViOwogIHQuemFndXJtdWtoaSA9IDB4MGE1YjsKICB0LnphaGFyYWJpYyA9IDB4MDYzODsKICB0LnphaGZpbmFsYXJhYmljID0gMHhmZWM2OwogIHQuemFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjNzsKICB0LnphaGlyYWdhbmEgPSAweDMwNTY7CiAgdC56YWhtZWRpYWxhcmFiaWMgPSAweGZlYzg7CiAgdC56YWluYXJhYmljID0gMHgwNjMyOwogIHQuemFpbmZpbmFsYXJhYmljID0gMHhmZWIwOwogIHQuemFrYXRha2FuYSA9IDB4MzBiNjsKICB0LnphcWVmZ2Fkb2xoZWJyZXcgPSAweDA1OTU7CiAgdC56YXFlZnFhdGFuaGVicmV3ID0gMHgwNTk0OwogIHQuemFycWFoZWJyZXcgPSAweDA1OTg7CiAgdC56YXlpbiA9IDB4MDVkNjsKICB0LnpheWluZGFnZXNoID0gMHhmYjM2OwogIHQuemF5aW5kYWdlc2hoZWJyZXcgPSAweGZiMzY7CiAgdC56YXlpbmhlYnJldyA9IDB4MDVkNjsKICB0Lnpib3BvbW9mbyA9IDB4MzExNzsKICB0LnpjYXJvbiA9IDB4MDE3ZTsKICB0LnpjaXJjbGUgPSAweDI0ZTk7CiAgdC56Y2lyY3VtZmxleCA9IDB4MWU5MTsKICB0LnpjdXJsID0gMHgwMjkxOwogIHQuemRvdCA9IDB4MDE3YzsKICB0Lnpkb3RhY2NlbnQgPSAweDAxN2M7CiAgdC56ZG90YmVsb3cgPSAweDFlOTM7CiAgdC56ZWN5cmlsbGljID0gMHgwNDM3OwogIHQuemVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5OTsKICB0LnplZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZjsKICB0LnplaGlyYWdhbmEgPSAweDMwNWM7CiAgdC56ZWthdGFrYW5hID0gMHgzMGJjOwogIHQuemVybyA9IDB4MDAzMDsKICB0Lnplcm9hcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvYmVuZ2FsaSA9IDB4MDllNjsKICB0Lnplcm9kZXZhID0gMHgwOTY2OwogIHQuemVyb2d1amFyYXRpID0gMHgwYWU2OwogIHQuemVyb2d1cm11a2hpID0gMHgwYTY2OwogIHQuemVyb2hhY2thcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvaW5mZXJpb3IgPSAweDIwODA7CiAgdC56ZXJvbW9ub3NwYWNlID0gMHhmZjEwOwogIHQuemVyb29sZHN0eWxlID0gMHhmNzMwOwogIHQuemVyb3BlcnNpYW4gPSAweDA2ZjA7CiAgdC56ZXJvc3VwZXJpb3IgPSAweDIwNzA7CiAgdC56ZXJvdGhhaSA9IDB4MGU1MDsKICB0Lnplcm93aWR0aGpvaW5lciA9IDB4ZmVmZjsKICB0Lnplcm93aWR0aG5vbmpvaW5lciA9IDB4MjAwYzsKICB0Lnplcm93aWR0aHNwYWNlID0gMHgyMDBiOwogIHQuemV0YSA9IDB4MDNiNjsKICB0LnpoYm9wb21vZm8gPSAweDMxMTM7CiAgdC56aGVhcm1lbmlhbiA9IDB4MDU2YTsKICB0LnpoZWJyZXZlY3lyaWxsaWMgPSAweDA0YzI7CiAgdC56aGVjeXJpbGxpYyA9IDB4MDQzNjsKICB0LnpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk3OwogIHQuemhlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZDsKICB0LnppaGlyYWdhbmEgPSAweDMwNTg7CiAgdC56aWthdGFrYW5hID0gMHgzMGI4OwogIHQuemlub3JoZWJyZXcgPSAweDA1YWU7CiAgdC56bGluZWJlbG93ID0gMHgxZTk1OwogIHQuem1vbm9zcGFjZSA9IDB4ZmY1YTsKICB0LnpvaGlyYWdhbmEgPSAweDMwNWU7CiAgdC56b2thdGFrYW5hID0gMHgzMGJlOwogIHQuenBhcmVuID0gMHgyNGI1OwogIHQuenJldHJvZmxleGhvb2sgPSAweDAyOTA7CiAgdC56c3Ryb2tlID0gMHgwMWI2OwogIHQuenVoaXJhZ2FuYSA9IDB4MzA1YTsKICB0Lnp1a2F0YWthbmEgPSAweDMwYmE7CiAgdFsiLm5vdGRlZiJdID0gMHgwMDAwOwogIHQuYW5nYnJhY2tldGxlZnRiaWcgPSAweDIzMjk7CiAgdC5hbmdicmFja2V0bGVmdEJpZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0YmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0QmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodGJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZ2cgPSAweDIzMmE7CiAgdC5hbmdicmFja2V0cmlnaHRiaWdnID0gMHgyMzJhOwogIHQuYXJyb3dob29rbGVmdCA9IDB4MjFhYTsKICB0LmFycm93aG9va3JpZ2h0ID0gMHgyMWE5OwogIHQuYXJyb3dsZWZ0dG9waGFsZiA9IDB4MjFiYzsKICB0LmFycm93bGVmdGJvdGhhbGYgPSAweDIxYmQ7CiAgdC5hcnJvd25vcnRoZWFzdCA9IDB4MjE5NzsKICB0LmFycm93bm9ydGh3ZXN0ID0gMHgyMTk2OwogIHQuYXJyb3dyaWdodHRvcGhhbGYgPSAweDIxYzA7CiAgdC5hcnJvd3JpZ2h0Ym90aGFsZiA9IDB4MjFjMTsKICB0LmFycm93c291dGhlYXN0ID0gMHgyMTk4OwogIHQuYXJyb3dzb3V0aHdlc3QgPSAweDIxOTk7CiAgdC5iYWNrc2xhc2hiaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWdnID0gMHgyMjE2OwogIHQuYmFja3NsYXNoYmlnZyA9IDB4MjIxNjsKICB0LmJhcmRibCA9IDB4MjAxNjsKICB0LmJyYWNlaHRpcGRvd25sZWZ0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwZG93bnJpZ2h0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwdXBsZWZ0ID0gMHhmZTM4OwogIHQuYnJhY2VodGlwdXByaWdodCA9IDB4ZmUzODsKICB0LmJyYWNlbGVmdEJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZ2cgPSAweDAwN2I7CiAgdC5icmFjZWxlZnRCaWdnID0gMHgwMDdiOwogIHQuYnJhY2VyaWdodEJpZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRiaWcgPSAweDAwN2Q7CiAgdC5icmFjZXJpZ2h0YmlnZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRCaWdnID0gMHgwMDdkOwogIHQuYnJhY2tldGxlZnRiaWcgPSAweDAwNWI7CiAgdC5icmFja2V0bGVmdEJpZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0QmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRyaWdodEJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZ2cgPSAweDAwNWQ7CiAgdC5icmFja2V0cmlnaHRCaWdnID0gMHgwMDVkOwogIHQuY2VpbGluZ2xlZnRiaWcgPSAweDIzMDg7CiAgdC5jZWlsaW5nbGVmdEJpZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0QmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0YmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdyaWdodGJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodEJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodGJpZ2cgPSAweDIzMDk7CiAgdC5jZWlsaW5ncmlnaHRCaWdnID0gMHgyMzA5OwogIHQuY2lyY2xlZG90ZGlzcGxheSA9IDB4MjI5OTsKICB0LmNpcmNsZWRvdHRleHQgPSAweDIyOTk7CiAgdC5jaXJjbGVtdWx0aXBseWRpc3BsYXkgPSAweDIyOTc7CiAgdC5jaXJjbGVtdWx0aXBseXRleHQgPSAweDIyOTc7CiAgdC5jaXJjbGVwbHVzZGlzcGxheSA9IDB4MjI5NTsKICB0LmNpcmNsZXBsdXN0ZXh0ID0gMHgyMjk1OwogIHQuY29udGludGVncmFsZGlzcGxheSA9IDB4MjIyZTsKICB0LmNvbnRpbnRlZ3JhbHRleHQgPSAweDIyMmU7CiAgdC5jb3Byb2R1Y3RkaXNwbGF5ID0gMHgyMjEwOwogIHQuY29wcm9kdWN0dGV4dCA9IDB4MjIxMDsKICB0LmZsb29ybGVmdEJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZ2cgPSAweDIzMGE7CiAgdC5mbG9vcmxlZnRCaWdnID0gMHgyMzBhOwogIHQuZmxvb3JyaWdodGJpZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRCaWcgPSAweDIzMGI7CiAgdC5mbG9vcnJpZ2h0QmlnZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRiaWdnID0gMHgyMzBiOwogIHQuaGF0d2lkZSA9IDB4MDMwMjsKICB0LmhhdHdpZGVyID0gMHgwMzAyOwogIHQuaGF0d2lkZXN0ID0gMHgwMzAyOwogIHQuaW50ZXJjYWwgPSAweDFkNDA7CiAgdC5pbnRlZ3JhbGRpc3BsYXkgPSAweDIyMmI7CiAgdC5pbnRlZ3JhbHRleHQgPSAweDIyMmI7CiAgdC5pbnRlcnNlY3Rpb25kaXNwbGF5ID0gMHgyMmMyOwogIHQuaW50ZXJzZWN0aW9udGV4dCA9IDB4MjJjMjsKICB0LmxvZ2ljYWxhbmRkaXNwbGF5ID0gMHgyMjI3OwogIHQubG9naWNhbGFuZHRleHQgPSAweDIyMjc7CiAgdC5sb2dpY2Fsb3JkaXNwbGF5ID0gMHgyMjI4OwogIHQubG9naWNhbG9ydGV4dCA9IDB4MjIyODsKICB0LnBhcmVubGVmdEJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdGJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdEJpZ2cgPSAweDAwMjg7CiAgdC5wYXJlbmxlZnRiaWdnID0gMHgwMDI4OwogIHQucGFyZW5yaWdodEJpZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWcgPSAweDAwMjk7CiAgdC5wYXJlbnJpZ2h0QmlnZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWdnID0gMHgwMDI5OwogIHQucHJpbWUgPSAweDIwMzI7CiAgdC5wcm9kdWN0ZGlzcGxheSA9IDB4MjIwZjsKICB0LnByb2R1Y3R0ZXh0ID0gMHgyMjBmOwogIHQucmFkaWNhbGJpZyA9IDB4MjIxYTsKICB0LnJhZGljYWxCaWcgPSAweDIyMWE7CiAgdC5yYWRpY2FsQmlnZyA9IDB4MjIxYTsKICB0LnJhZGljYWxiaWdnID0gMHgyMjFhOwogIHQucmFkaWNhbGJ0ID0gMHgyMjFhOwogIHQucmFkaWNhbHRwID0gMHgyMjFhOwogIHQucmFkaWNhbHZlcnRleCA9IDB4MjIxYTsKICB0LnNsYXNoYmlnID0gMHgwMDJmOwogIHQuc2xhc2hCaWcgPSAweDAwMmY7CiAgdC5zbGFzaEJpZ2cgPSAweDAwMmY7CiAgdC5zbGFzaGJpZ2cgPSAweDAwMmY7CiAgdC5zdW1tYXRpb25kaXNwbGF5ID0gMHgyMjExOwogIHQuc3VtbWF0aW9udGV4dCA9IDB4MjIxMTsKICB0LnRpbGRld2lkZSA9IDB4MDJkYzsKICB0LnRpbGRld2lkZXIgPSAweDAyZGM7CiAgdC50aWxkZXdpZGVzdCA9IDB4MDJkYzsKICB0LnVuaW9uZGlzcGxheSA9IDB4MjJjMzsKICB0LnVuaW9ubXVsdGlkaXNwbGF5ID0gMHgyMjhlOwogIHQudW5pb25tdWx0aXRleHQgPSAweDIyOGU7CiAgdC51bmlvbnNxZGlzcGxheSA9IDB4MjI5NDsKICB0LnVuaW9uc3F0ZXh0ID0gMHgyMjk0OwogIHQudW5pb250ZXh0ID0gMHgyMmMzOwogIHQudmV4dGVuZGRvdWJsZSA9IDB4MjIyNTsKICB0LnZleHRlbmRzaW5nbGUgPSAweDIyMjM7Cn0pOwpjb25zdCBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LnNwYWNlID0gMHgwMDIwOwogIHQuYTEgPSAweDI3MDE7CiAgdC5hMiA9IDB4MjcwMjsKICB0LmEyMDIgPSAweDI3MDM7CiAgdC5hMyA9IDB4MjcwNDsKICB0LmE0ID0gMHgyNjBlOwogIHQuYTUgPSAweDI3MDY7CiAgdC5hMTE5ID0gMHgyNzA3OwogIHQuYTExOCA9IDB4MjcwODsKICB0LmExMTcgPSAweDI3MDk7CiAgdC5hMTEgPSAweDI2MWI7CiAgdC5hMTIgPSAweDI2MWU7CiAgdC5hMTMgPSAweDI3MGM7CiAgdC5hMTQgPSAweDI3MGQ7CiAgdC5hMTUgPSAweDI3MGU7CiAgdC5hMTYgPSAweDI3MGY7CiAgdC5hMTA1ID0gMHgyNzEwOwogIHQuYTE3ID0gMHgyNzExOwogIHQuYTE4ID0gMHgyNzEyOwogIHQuYTE5ID0gMHgyNzEzOwogIHQuYTIwID0gMHgyNzE0OwogIHQuYTIxID0gMHgyNzE1OwogIHQuYTIyID0gMHgyNzE2OwogIHQuYTIzID0gMHgyNzE3OwogIHQuYTI0ID0gMHgyNzE4OwogIHQuYTI1ID0gMHgyNzE5OwogIHQuYTI2ID0gMHgyNzFhOwogIHQuYTI3ID0gMHgyNzFiOwogIHQuYTI4ID0gMHgyNzFjOwogIHQuYTYgPSAweDI3MWQ7CiAgdC5hNyA9IDB4MjcxZTsKICB0LmE4ID0gMHgyNzFmOwogIHQuYTkgPSAweDI3MjA7CiAgdC5hMTAgPSAweDI3MjE7CiAgdC5hMjkgPSAweDI3MjI7CiAgdC5hMzAgPSAweDI3MjM7CiAgdC5hMzEgPSAweDI3MjQ7CiAgdC5hMzIgPSAweDI3MjU7CiAgdC5hMzMgPSAweDI3MjY7CiAgdC5hMzQgPSAweDI3Mjc7CiAgdC5hMzUgPSAweDI2MDU7CiAgdC5hMzYgPSAweDI3Mjk7CiAgdC5hMzcgPSAweDI3MmE7CiAgdC5hMzggPSAweDI3MmI7CiAgdC5hMzkgPSAweDI3MmM7CiAgdC5hNDAgPSAweDI3MmQ7CiAgdC5hNDEgPSAweDI3MmU7CiAgdC5hNDIgPSAweDI3MmY7CiAgdC5hNDMgPSAweDI3MzA7CiAgdC5hNDQgPSAweDI3MzE7CiAgdC5hNDUgPSAweDI3MzI7CiAgdC5hNDYgPSAweDI3MzM7CiAgdC5hNDcgPSAweDI3MzQ7CiAgdC5hNDggPSAweDI3MzU7CiAgdC5hNDkgPSAweDI3MzY7CiAgdC5hNTAgPSAweDI3Mzc7CiAgdC5hNTEgPSAweDI3Mzg7CiAgdC5hNTIgPSAweDI3Mzk7CiAgdC5hNTMgPSAweDI3M2E7CiAgdC5hNTQgPSAweDI3M2I7CiAgdC5hNTUgPSAweDI3M2M7CiAgdC5hNTYgPSAweDI3M2Q7CiAgdC5hNTcgPSAweDI3M2U7CiAgdC5hNTggPSAweDI3M2Y7CiAgdC5hNTkgPSAweDI3NDA7CiAgdC5hNjAgPSAweDI3NDE7CiAgdC5hNjEgPSAweDI3NDI7CiAgdC5hNjIgPSAweDI3NDM7CiAgdC5hNjMgPSAweDI3NDQ7CiAgdC5hNjQgPSAweDI3NDU7CiAgdC5hNjUgPSAweDI3NDY7CiAgdC5hNjYgPSAweDI3NDc7CiAgdC5hNjcgPSAweDI3NDg7CiAgdC5hNjggPSAweDI3NDk7CiAgdC5hNjkgPSAweDI3NGE7CiAgdC5hNzAgPSAweDI3NGI7CiAgdC5hNzEgPSAweDI1Y2Y7CiAgdC5hNzIgPSAweDI3NGQ7CiAgdC5hNzMgPSAweDI1YTA7CiAgdC5hNzQgPSAweDI3NGY7CiAgdC5hMjAzID0gMHgyNzUwOwogIHQuYTc1ID0gMHgyNzUxOwogIHQuYTIwNCA9IDB4Mjc1MjsKICB0LmE3NiA9IDB4MjViMjsKICB0LmE3NyA9IDB4MjViYzsKICB0LmE3OCA9IDB4MjVjNjsKICB0LmE3OSA9IDB4Mjc1NjsKICB0LmE4MSA9IDB4MjVkNzsKICB0LmE4MiA9IDB4Mjc1ODsKICB0LmE4MyA9IDB4Mjc1OTsKICB0LmE4NCA9IDB4Mjc1YTsKICB0LmE5NyA9IDB4Mjc1YjsKICB0LmE5OCA9IDB4Mjc1YzsKICB0LmE5OSA9IDB4Mjc1ZDsKICB0LmExMDAgPSAweDI3NWU7CiAgdC5hMTAxID0gMHgyNzYxOwogIHQuYTEwMiA9IDB4Mjc2MjsKICB0LmExMDMgPSAweDI3NjM7CiAgdC5hMTA0ID0gMHgyNzY0OwogIHQuYTEwNiA9IDB4Mjc2NTsKICB0LmExMDcgPSAweDI3NjY7CiAgdC5hMTA4ID0gMHgyNzY3OwogIHQuYTExMiA9IDB4MjY2MzsKICB0LmExMTEgPSAweDI2NjY7CiAgdC5hMTEwID0gMHgyNjY1OwogIHQuYTEwOSA9IDB4MjY2MDsKICB0LmExMjAgPSAweDI0NjA7CiAgdC5hMTIxID0gMHgyNDYxOwogIHQuYTEyMiA9IDB4MjQ2MjsKICB0LmExMjMgPSAweDI0NjM7CiAgdC5hMTI0ID0gMHgyNDY0OwogIHQuYTEyNSA9IDB4MjQ2NTsKICB0LmExMjYgPSAweDI0NjY7CiAgdC5hMTI3ID0gMHgyNDY3OwogIHQuYTEyOCA9IDB4MjQ2ODsKICB0LmExMjkgPSAweDI0Njk7CiAgdC5hMTMwID0gMHgyNzc2OwogIHQuYTEzMSA9IDB4Mjc3NzsKICB0LmExMzIgPSAweDI3Nzg7CiAgdC5hMTMzID0gMHgyNzc5OwogIHQuYTEzNCA9IDB4Mjc3YTsKICB0LmExMzUgPSAweDI3N2I7CiAgdC5hMTM2ID0gMHgyNzdjOwogIHQuYTEzNyA9IDB4Mjc3ZDsKICB0LmExMzggPSAweDI3N2U7CiAgdC5hMTM5ID0gMHgyNzdmOwogIHQuYTE0MCA9IDB4Mjc4MDsKICB0LmExNDEgPSAweDI3ODE7CiAgdC5hMTQyID0gMHgyNzgyOwogIHQuYTE0MyA9IDB4Mjc4MzsKICB0LmExNDQgPSAweDI3ODQ7CiAgdC5hMTQ1ID0gMHgyNzg1OwogIHQuYTE0NiA9IDB4Mjc4NjsKICB0LmExNDcgPSAweDI3ODc7CiAgdC5hMTQ4ID0gMHgyNzg4OwogIHQuYTE0OSA9IDB4Mjc4OTsKICB0LmExNTAgPSAweDI3OGE7CiAgdC5hMTUxID0gMHgyNzhiOwogIHQuYTE1MiA9IDB4Mjc4YzsKICB0LmExNTMgPSAweDI3OGQ7CiAgdC5hMTU0ID0gMHgyNzhlOwogIHQuYTE1NSA9IDB4Mjc4ZjsKICB0LmExNTYgPSAweDI3OTA7CiAgdC5hMTU3ID0gMHgyNzkxOwogIHQuYTE1OCA9IDB4Mjc5MjsKICB0LmExNTkgPSAweDI3OTM7CiAgdC5hMTYwID0gMHgyNzk0OwogIHQuYTE2MSA9IDB4MjE5MjsKICB0LmExNjMgPSAweDIxOTQ7CiAgdC5hMTY0ID0gMHgyMTk1OwogIHQuYTE5NiA9IDB4Mjc5ODsKICB0LmExNjUgPSAweDI3OTk7CiAgdC5hMTkyID0gMHgyNzlhOwogIHQuYTE2NiA9IDB4Mjc5YjsKICB0LmExNjcgPSAweDI3OWM7CiAgdC5hMTY4ID0gMHgyNzlkOwogIHQuYTE2OSA9IDB4Mjc5ZTsKICB0LmExNzAgPSAweDI3OWY7CiAgdC5hMTcxID0gMHgyN2EwOwogIHQuYTE3MiA9IDB4MjdhMTsKICB0LmExNzMgPSAweDI3YTI7CiAgdC5hMTYyID0gMHgyN2EzOwogIHQuYTE3NCA9IDB4MjdhNDsKICB0LmExNzUgPSAweDI3YTU7CiAgdC5hMTc2ID0gMHgyN2E2OwogIHQuYTE3NyA9IDB4MjdhNzsKICB0LmExNzggPSAweDI3YTg7CiAgdC5hMTc5ID0gMHgyN2E5OwogIHQuYTE5MyA9IDB4MjdhYTsKICB0LmExODAgPSAweDI3YWI7CiAgdC5hMTk5ID0gMHgyN2FjOwogIHQuYTE4MSA9IDB4MjdhZDsKICB0LmEyMDAgPSAweDI3YWU7CiAgdC5hMTgyID0gMHgyN2FmOwogIHQuYTIwMSA9IDB4MjdiMTsKICB0LmExODMgPSAweDI3YjI7CiAgdC5hMTg0ID0gMHgyN2IzOwogIHQuYTE5NyA9IDB4MjdiNDsKICB0LmExODUgPSAweDI3YjU7CiAgdC5hMTk0ID0gMHgyN2I2OwogIHQuYTE5OCA9IDB4MjdiNzsKICB0LmExODYgPSAweDI3Yjg7CiAgdC5hMTk1ID0gMHgyN2I5OwogIHQuYTE4NyA9IDB4MjdiYTsKICB0LmExODggPSAweDI3YmI7CiAgdC5hMTg5ID0gMHgyN2JjOwogIHQuYTE5MCA9IDB4MjdiZDsKICB0LmExOTEgPSAweDI3YmU7CiAgdC5hODkgPSAweDI3Njg7CiAgdC5hOTAgPSAweDI3Njk7CiAgdC5hOTMgPSAweDI3NmE7CiAgdC5hOTQgPSAweDI3NmI7CiAgdC5hOTEgPSAweDI3NmM7CiAgdC5hOTIgPSAweDI3NmQ7CiAgdC5hMjA1ID0gMHgyNzZlOwogIHQuYTg1ID0gMHgyNzZmOwogIHQuYTIwNiA9IDB4Mjc3MDsKICB0LmE4NiA9IDB4Mjc3MTsKICB0LmE4NyA9IDB4Mjc3MjsKICB0LmE4OCA9IDB4Mjc3MzsKICB0LmE5NSA9IDB4Mjc3NDsKICB0LmE5NiA9IDB4Mjc3NTsKICB0WyIubm90ZGVmIl0gPSAweDAwMDA7Cn0pOwoKOy8vIC4vc3JjL2NvcmUvdW5pY29kZS5qcwoKY29uc3QgZ2V0U3BlY2lhbFBVQVN5bWJvbHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WzYzNzIxXSA9IDB4MDBhOTsKICB0WzYzMTkzXSA9IDB4MDBhOTsKICB0WzYzNzIwXSA9IDB4MDBhZTsKICB0WzYzMTk0XSA9IDB4MDBhZTsKICB0WzYzNzIyXSA9IDB4MjEyMjsKICB0WzYzMTk1XSA9IDB4MjEyMjsKICB0WzYzNzI5XSA9IDB4MjNhNzsKICB0WzYzNzMwXSA9IDB4MjNhODsKICB0WzYzNzMxXSA9IDB4MjNhOTsKICB0WzYzNzQwXSA9IDB4MjNhYjsKICB0WzYzNzQxXSA9IDB4MjNhYzsKICB0WzYzNzQyXSA9IDB4MjNhZDsKICB0WzYzNzI2XSA9IDB4MjNhMTsKICB0WzYzNzI3XSA9IDB4MjNhMjsKICB0WzYzNzI4XSA9IDB4MjNhMzsKICB0WzYzNzM3XSA9IDB4MjNhNDsKICB0WzYzNzM4XSA9IDB4MjNhNTsKICB0WzYzNzM5XSA9IDB4MjNhNjsKICB0WzYzNzIzXSA9IDB4MjM5YjsKICB0WzYzNzI0XSA9IDB4MjM5YzsKICB0WzYzNzI1XSA9IDB4MjM5ZDsKICB0WzYzNzM0XSA9IDB4MjM5ZTsKICB0WzYzNzM1XSA9IDB4MjM5ZjsKICB0WzYzNzM2XSA9IDB4MjNhMDsKfSk7CmZ1bmN0aW9uIG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKGNvZGUpIHsKICBpZiAoY29kZSA+PSAweGZmZjAgJiYgY29kZSA8PSAweGZmZmYpIHsKICAgIHJldHVybiAwOwogIH0gZWxzZSBpZiAoY29kZSA+PSAweGY2MDAgJiYgY29kZSA8PSAweGY4ZmYpIHsKICAgIHJldHVybiBnZXRTcGVjaWFsUFVBU3ltYm9scygpW2NvZGVdIHx8IGNvZGU7CiAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwYWQpIHsKICAgIHJldHVybiAweDAwMmQ7CiAgfQogIHJldHVybiBjb2RlOwp9CmZ1bmN0aW9uIGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CiAgbGV0IHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW25hbWVdOwogIGlmICh1bmljb2RlICE9PSB1bmRlZmluZWQpIHsKICAgIHJldHVybiB1bmljb2RlOwogIH0KICBpZiAoIW5hbWUpIHsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKG5hbWVbMF0gPT09ICJ1IikgewogICAgY29uc3QgbmFtZUxlbiA9IG5hbWUubGVuZ3RoOwogICAgbGV0IGhleFN0cjsKICAgIGlmIChuYW1lTGVuID09PSA3ICYmIG5hbWVbMV0gPT09ICJuIiAmJiBuYW1lWzJdID09PSAiaSIpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMyk7CiAgICB9IGVsc2UgaWYgKG5hbWVMZW4gPj0gNSAmJiBuYW1lTGVuIDw9IDcpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkgewogICAgICB1bmljb2RlID0gcGFyc2VJbnQoaGV4U3RyLCAxNik7CiAgICAgIGlmICh1bmljb2RlID49IDApIHsKICAgICAgICByZXR1cm4gdW5pY29kZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gLTE7Cn0KY29uc3QgVW5pY29kZVJhbmdlcyA9IFtbMHgwMDAwLCAweDAwN2ZdLCBbMHgwMDgwLCAweDAwZmZdLCBbMHgwMTAwLCAweDAxN2ZdLCBbMHgwMTgwLCAweDAyNGZdLCBbMHgwMjUwLCAweDAyYWYsIDB4MWQwMCwgMHgxZDdmLCAweDFkODAsIDB4MWRiZl0sIFsweDAyYjAsIDB4MDJmZiwgMHhhNzAwLCAweGE3MWZdLCBbMHgwMzAwLCAweDAzNmYsIDB4MWRjMCwgMHgxZGZmXSwgWzB4MDM3MCwgMHgwM2ZmXSwgWzB4MmM4MCwgMHgyY2ZmXSwgWzB4MDQwMCwgMHgwNGZmLCAweDA1MDAsIDB4MDUyZiwgMHgyZGUwLCAweDJkZmYsIDB4YTY0MCwgMHhhNjlmXSwgWzB4MDUzMCwgMHgwNThmXSwgWzB4MDU5MCwgMHgwNWZmXSwgWzB4YTUwMCwgMHhhNjNmXSwgWzB4MDYwMCwgMHgwNmZmLCAweDA3NTAsIDB4MDc3Zl0sIFsweDA3YzAsIDB4MDdmZl0sIFsweDA5MDAsIDB4MDk3Zl0sIFsweDA5ODAsIDB4MDlmZl0sIFsweDBhMDAsIDB4MGE3Zl0sIFsweDBhODAsIDB4MGFmZl0sIFsweDBiMDAsIDB4MGI3Zl0sIFsweDBiODAsIDB4MGJmZl0sIFsweDBjMDAsIDB4MGM3Zl0sIFsweDBjODAsIDB4MGNmZl0sIFsweDBkMDAsIDB4MGQ3Zl0sIFsweDBlMDAsIDB4MGU3Zl0sIFsweDBlODAsIDB4MGVmZl0sIFsweDEwYTAsIDB4MTBmZiwgMHgyZDAwLCAweDJkMmZdLCBbMHgxYjAwLCAweDFiN2ZdLCBbMHgxMTAwLCAweDExZmZdLCBbMHgxZTAwLCAweDFlZmYsIDB4MmM2MCwgMHgyYzdmLCAweGE3MjAsIDB4YTdmZl0sIFsweDFmMDAsIDB4MWZmZl0sIFsweDIwMDAsIDB4MjA2ZiwgMHgyZTAwLCAweDJlN2ZdLCBbMHgyMDcwLCAweDIwOWZdLCBbMHgyMGEwLCAweDIwY2ZdLCBbMHgyMGQwLCAweDIwZmZdLCBbMHgyMTAwLCAweDIxNGZdLCBbMHgyMTUwLCAweDIxOGZdLCBbMHgyMTkwLCAweDIxZmYsIDB4MjdmMCwgMHgyN2ZmLCAweDI5MDAsIDB4Mjk3ZiwgMHgyYjAwLCAweDJiZmZdLCBbMHgyMjAwLCAweDIyZmYsIDB4MmEwMCwgMHgyYWZmLCAweDI3YzAsIDB4MjdlZiwgMHgyOTgwLCAweDI5ZmZdLCBbMHgyMzAwLCAweDIzZmZdLCBbMHgyNDAwLCAweDI0M2ZdLCBbMHgyNDQwLCAweDI0NWZdLCBbMHgyNDYwLCAweDI0ZmZdLCBbMHgyNTAwLCAweDI1N2ZdLCBbMHgyNTgwLCAweDI1OWZdLCBbMHgyNWEwLCAweDI1ZmZdLCBbMHgyNjAwLCAweDI2ZmZdLCBbMHgyNzAwLCAweDI3YmZdLCBbMHgzMDAwLCAweDMwM2ZdLCBbMHgzMDQwLCAweDMwOWZdLCBbMHgzMGEwLCAweDMwZmYsIDB4MzFmMCwgMHgzMWZmXSwgWzB4MzEwMCwgMHgzMTJmLCAweDMxYTAsIDB4MzFiZl0sIFsweDMxMzAsIDB4MzE4Zl0sIFsweGE4NDAsIDB4YTg3Zl0sIFsweDMyMDAsIDB4MzJmZl0sIFsweDMzMDAsIDB4MzNmZl0sIFsweGFjMDAsIDB4ZDdhZl0sIFsweGQ4MDAsIDB4ZGZmZl0sIFsweDEwOTAwLCAweDEwOTFmXSwgWzB4NGUwMCwgMHg5ZmZmLCAweDJlODAsIDB4MmVmZiwgMHgyZjAwLCAweDJmZGYsIDB4MmZmMCwgMHgyZmZmLCAweDM0MDAsIDB4NGRiZiwgMHgyMDAwMCwgMHgyYTZkZiwgMHgzMTkwLCAweDMxOWZdLCBbMHhlMDAwLCAweGY4ZmZdLCBbMHgzMWMwLCAweDMxZWYsIDB4ZjkwMCwgMHhmYWZmLCAweDJmODAwLCAweDJmYTFmXSwgWzB4ZmIwMCwgMHhmYjRmXSwgWzB4ZmI1MCwgMHhmZGZmXSwgWzB4ZmUyMCwgMHhmZTJmXSwgWzB4ZmUxMCwgMHhmZTFmXSwgWzB4ZmU1MCwgMHhmZTZmXSwgWzB4ZmU3MCwgMHhmZWZmXSwgWzB4ZmYwMCwgMHhmZmVmXSwgWzB4ZmZmMCwgMHhmZmZmXSwgWzB4MGYwMCwgMHgwZmZmXSwgWzB4MDcwMCwgMHgwNzRmXSwgWzB4MDc4MCwgMHgwN2JmXSwgWzB4MGQ4MCwgMHgwZGZmXSwgWzB4MTAwMCwgMHgxMDlmXSwgWzB4MTIwMCwgMHgxMzdmLCAweDEzODAsIDB4MTM5ZiwgMHgyZDgwLCAweDJkZGZdLCBbMHgxM2EwLCAweDEzZmZdLCBbMHgxNDAwLCAweDE2N2ZdLCBbMHgxNjgwLCAweDE2OWZdLCBbMHgxNmEwLCAweDE2ZmZdLCBbMHgxNzgwLCAweDE3ZmZdLCBbMHgxODAwLCAweDE4YWZdLCBbMHgyODAwLCAweDI4ZmZdLCBbMHhhMDAwLCAweGE0OGZdLCBbMHgxNzAwLCAweDE3MWYsIDB4MTcyMCwgMHgxNzNmLCAweDE3NDAsIDB4MTc1ZiwgMHgxNzYwLCAweDE3N2ZdLCBbMHgxMDMwMCwgMHgxMDMyZl0sIFsweDEwMzMwLCAweDEwMzRmXSwgWzB4MTA0MDAsIDB4MTA0NGZdLCBbMHgxZDAwMCwgMHgxZDBmZiwgMHgxZDEwMCwgMHgxZDFmZiwgMHgxZDIwMCwgMHgxZDI0Zl0sIFsweDFkNDAwLCAweDFkN2ZmXSwgWzB4ZmYwMDAsIDB4ZmZmZmRdLCBbMHhmZTAwLCAweGZlMGYsIDB4ZTAxMDAsIDB4ZTAxZWZdLCBbMHhlMDAwMCwgMHhlMDA3Zl0sIFsweDE5MDAsIDB4MTk0Zl0sIFsweDE5NTAsIDB4MTk3Zl0sIFsweDE5ODAsIDB4MTlkZl0sIFsweDFhMDAsIDB4MWExZl0sIFsweDJjMDAsIDB4MmM1Zl0sIFsweDJkMzAsIDB4MmQ3Zl0sIFsweDRkYzAsIDB4NGRmZl0sIFsweGE4MDAsIDB4YTgyZl0sIFsweDEwMDAwLCAweDEwMDdmLCAweDEwMDgwLCAweDEwMGZmLCAweDEwMTAwLCAweDEwMTNmXSwgWzB4MTAxNDAsIDB4MTAxOGZdLCBbMHgxMDM4MCwgMHgxMDM5Zl0sIFsweDEwM2EwLCAweDEwM2RmXSwgWzB4MTA0NTAsIDB4MTA0N2ZdLCBbMHgxMDQ4MCwgMHgxMDRhZl0sIFsweDEwODAwLCAweDEwODNmXSwgWzB4MTBhMDAsIDB4MTBhNWZdLCBbMHgxZDMwMCwgMHgxZDM1Zl0sIFsweDEyMDAwLCAweDEyM2ZmLCAweDEyNDAwLCAweDEyNDdmXSwgWzB4MWQzNjAsIDB4MWQzN2ZdLCBbMHgxYjgwLCAweDFiYmZdLCBbMHgxYzAwLCAweDFjNGZdLCBbMHgxYzUwLCAweDFjN2ZdLCBbMHhhODgwLCAweGE4ZGZdLCBbMHhhOTAwLCAweGE5MmZdLCBbMHhhOTMwLCAweGE5NWZdLCBbMHhhYTAwLCAweGFhNWZdLCBbMHgxMDE5MCwgMHgxMDFjZl0sIFsweDEwMWQwLCAweDEwMWZmXSwgWzB4MTAyYTAsIDB4MTAyZGYsIDB4MTAyODAsIDB4MTAyOWYsIDB4MTA5MjAsIDB4MTA5M2ZdLCBbMHgxZjAzMCwgMHgxZjA5ZiwgMHgxZjAwMCwgMHgxZjAyZl1dOwpmdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUsIGxhc3RQb3NpdGlvbiA9IC0xKSB7CiAgaWYgKGxhc3RQb3NpdGlvbiAhPT0gLTEpIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tsYXN0UG9zaXRpb25dOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmFuZ2UubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBpZiAodmFsdWUgPj0gcmFuZ2VbaV0gJiYgdmFsdWUgPD0gcmFuZ2VbaSArIDFdKSB7CiAgICAgICAgcmV0dXJuIGxhc3RQb3NpdGlvbjsKICAgICAgfQogICAgfQogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBVbmljb2RlUmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTsKICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhbmdlLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgaWYgKHZhbHVlID49IHJhbmdlW2pdICYmIHZhbHVlIDw9IHJhbmdlW2ogKyAxXSkgewogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiAtMTsKfQpjb25zdCBTcGVjaWFsQ2hhclJlZ0V4cCA9IG5ldyBSZWdFeHAoIl4oXFxzKXwoXFxwe01ufSl8KFxccHtDZn0pJCIsICJ1Iik7CmNvbnN0IENhdGVnb3J5Q2FjaGUgPSBuZXcgTWFwKCk7CmZ1bmN0aW9uIGdldENoYXJVbmljb2RlQ2F0ZWdvcnkoY2hhcikgewogIGNvbnN0IGNhY2hlZENhdGVnb3J5ID0gQ2F0ZWdvcnlDYWNoZS5nZXQoY2hhcik7CiAgaWYgKGNhY2hlZENhdGVnb3J5KSB7CiAgICByZXR1cm4gY2FjaGVkQ2F0ZWdvcnk7CiAgfQogIGNvbnN0IGdyb3VwcyA9IGNoYXIubWF0Y2goU3BlY2lhbENoYXJSZWdFeHApOwogIGNvbnN0IGNhdGVnb3J5ID0gewogICAgaXNXaGl0ZXNwYWNlOiAhIWdyb3Vwcz8uWzFdLAogICAgaXNaZXJvV2lkdGhEaWFjcml0aWM6ICEhZ3JvdXBzPy5bMl0sCiAgICBpc0ludmlzaWJsZUZvcm1hdE1hcms6ICEhZ3JvdXBzPy5bM10KICB9OwogIENhdGVnb3J5Q2FjaGUuc2V0KGNoYXIsIGNhdGVnb3J5KTsKICByZXR1cm4gY2F0ZWdvcnk7Cn0KZnVuY3Rpb24gY2xlYXJVbmljb2RlQ2FjaGVzKCkgewogIENhdGVnb3J5Q2FjaGUuY2xlYXIoKTsKfQoKOy8vIC4vc3JjL2NvcmUvZm9udHNfdXRpbHMuanMKCgoKCgpjb25zdCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlOwpjb25zdCBGb250RmxhZ3MgPSB7CiAgRml4ZWRQaXRjaDogMSwKICBTZXJpZjogMiwKICBTeW1ib2xpYzogNCwKICBTY3JpcHQ6IDgsCiAgTm9uc3ltYm9saWM6IDMyLAogIEl0YWxpYzogNjQsCiAgQWxsQ2FwOiA2NTUzNiwKICBTbWFsbENhcDogMTMxMDcyLAogIEZvcmNlQm9sZDogMjYyMTQ0Cn07CmNvbnN0IE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZyA9IFsiLm5vdGRlZiIsICIubnVsbCIsICJub25tYXJraW5ncmV0dXJuIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgIm5vbmJyZWFraW5nc3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgIkxzbGFzaCIsICJsc2xhc2giLCAiU2Nhcm9uIiwgInNjYXJvbiIsICJaY2Fyb24iLCAiemNhcm9uIiwgImJyb2tlbmJhciIsICJFdGgiLCAiZXRoIiwgIllhY3V0ZSIsICJ5YWN1dGUiLCAiVGhvcm4iLCAidGhvcm4iLCAibWludXMiLCAibXVsdGlwbHkiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJvbmVoYWxmIiwgIm9uZXF1YXJ0ZXIiLCAidGhyZWVxdWFydGVycyIsICJmcmFuYyIsICJHYnJldmUiLCAiZ2JyZXZlIiwgIklkb3RhY2NlbnQiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsICJDY2Fyb24iLCAiY2Nhcm9uIiwgImRjcm9hdCJdOwpmdW5jdGlvbiByZWNvdmVyR2x5cGhOYW1lKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHsKICBpZiAoZ2x5cGhzVW5pY29kZU1hcFtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gbmFtZTsKICB9CiAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgIGZvciAoY29uc3Qga2V5IGluIGdseXBoc1VuaWNvZGVNYXApIHsKICAgICAgaWYgKGdseXBoc1VuaWNvZGVNYXBba2V5XSA9PT0gdW5pY29kZSkgewogICAgICAgIHJldHVybiBrZXk7CiAgICAgIH0KICAgIH0KICB9CiAgaW5mbygiVW5hYmxlIHRvIHJlY292ZXIgYSBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvcjogIiArIG5hbWUpOwogIHJldHVybiBuYW1lOwp9CmZ1bmN0aW9uIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpIHsKICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgbGV0IGdseXBoSWQsIGNoYXJDb2RlLCBiYXNlRW5jb2Rpbmc7CiAgY29uc3QgaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgYmFzZUVuY29kaW5nID0gYnVpbHRJbkVuY29kaW5nOwogICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgewogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkID49IDAgPyBnbHlwaElkIDogMDsKICAgIH0KICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSkgewogICAgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTsKICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCkgewogICAgZm9yIChjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKICAgIH0KICB9IGVsc2UgewogICAgYmFzZUVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfQogIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICBsZXQgZ2x5cGhzVW5pY29kZU1hcDsKICBpZiAoZGlmZmVyZW5jZXMpIHsKICAgIGZvciAoY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhckNvZGVdOwogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGdseXBoTmFtZSk7CiAgICAgIGlmIChnbHlwaElkID09PSAtMSkgewogICAgICAgIGlmICghZ2x5cGhzVW5pY29kZU1hcCkgewogICAgICAgICAgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhbmRhcmRHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICAgICAgaWYgKHN0YW5kYXJkR2x5cGhOYW1lICE9PSBnbHlwaE5hbWUpIHsKICAgICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkID49IDAgPyBnbHlwaElkIDogMDsKICAgIH0KICB9CiAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bLF9dL2csICItIikucmVwbGFjZUFsbCgvXHMvZywgIiIpOwp9CmNvbnN0IGdldFZlcnRpY2FsUHJlc2VudGF0aW9uRm9ybSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeSh0ID0+IHsKICB0WzB4MjAxM10gPSAweGZlMzI7CiAgdFsweDIwMTRdID0gMHhmZTMxOwogIHRbMHgyMDI1XSA9IDB4ZmUzMDsKICB0WzB4MjAyNl0gPSAweGZlMTk7CiAgdFsweDMwMDFdID0gMHhmZTExOwogIHRbMHgzMDAyXSA9IDB4ZmUxMjsKICB0WzB4MzAwOF0gPSAweGZlM2Y7CiAgdFsweDMwMDldID0gMHhmZTQwOwogIHRbMHgzMDBhXSA9IDB4ZmUzZDsKICB0WzB4MzAwYl0gPSAweGZlM2U7CiAgdFsweDMwMGNdID0gMHhmZTQxOwogIHRbMHgzMDBkXSA9IDB4ZmU0MjsKICB0WzB4MzAwZV0gPSAweGZlNDM7CiAgdFsweDMwMGZdID0gMHhmZTQ0OwogIHRbMHgzMDEwXSA9IDB4ZmUzYjsKICB0WzB4MzAxMV0gPSAweGZlM2M7CiAgdFsweDMwMTRdID0gMHhmZTM5OwogIHRbMHgzMDE1XSA9IDB4ZmUzYTsKICB0WzB4MzAxNl0gPSAweGZlMTc7CiAgdFsweDMwMTddID0gMHhmZTE4OwogIHRbMHhmZTRmXSA9IDB4ZmUzNDsKICB0WzB4ZmYwMV0gPSAweGZlMTU7CiAgdFsweGZmMDhdID0gMHhmZTM1OwogIHRbMHhmZjA5XSA9IDB4ZmUzNjsKICB0WzB4ZmYwY10gPSAweGZlMTA7CiAgdFsweGZmMWFdID0gMHhmZTEzOwogIHRbMHhmZjFiXSA9IDB4ZmUxNDsKICB0WzB4ZmYxZl0gPSAweGZlMTY7CiAgdFsweGZmM2JdID0gMHhmZTQ3OwogIHRbMHhmZjNkXSA9IDB4ZmU0ODsKICB0WzB4ZmYzZl0gPSAweGZlMzM7CiAgdFsweGZmNWJdID0gMHhmZTM3OwogIHRbMHhmZjVkXSA9IDB4ZmUzODsKfSk7Cgo7Ly8gLi9zcmMvY29yZS9zdGFuZGFyZF9mb250cy5qcwoKCmNvbnN0IGdldFN0ZEZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJUaW1lcy1Sb21hbiJdID0gIlRpbWVzLVJvbWFuIjsKICB0LkhlbHZldGljYSA9ICJIZWx2ZXRpY2EiOwogIHQuQ291cmllciA9ICJDb3VyaWVyIjsKICB0LlN5bWJvbCA9ICJTeW1ib2wiOwogIHRbIlRpbWVzLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHQuWmFwZkRpbmdiYXRzID0gIlphcGZEaW5nYmF0cyI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0LkFyaWFsTmFycm93ID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxOYXJyb3ctQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbE5hcnJvdy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJBcmlhbE5hcnJvdy1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdC5BcmlhbEJsYWNrID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxCbGFjay1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWxCbGFjay1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2siXSA9ICJIZWx2ZXRpY2EiOwogIHRbIkFyaWFsLUJsYWNrLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2stSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWwgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkFyaWFsTVQgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUJvbGRNVCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQtQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQm9sZE1ULUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtSXRhbGljTVQtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWxVbmljb2RlTVMgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbFVuaWNvZGVNUy1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsVW5pY29kZU1TLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsVW5pY29kZU1TLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyLUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CiAgdC5Db3VyaWVyTmV3ID0gIkNvdXJpZXIiOwogIHRbIkNvdXJpZXJOZXctQm9sZCJdID0gIkNvdXJpZXItQm9sZCI7CiAgdFsiQ291cmllck5ldy1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CiAgdFsiQ291cmllck5ldy1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIkNvdXJpZXJOZXdQUy1Cb2xkSXRhbGljTVQiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyTmV3UFMtQm9sZE1UIl0gPSAiQ291cmllci1Cb2xkIjsKICB0WyJDb3VyaWVyTmV3UFMtSXRhbGljTVQiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHQuQ291cmllck5ld1BTTVQgPSAiQ291cmllciI7CiAgdFsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkhlbHZldGljYS1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiSGVsdmV0aWNhTFRTdGQtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJTeW1ib2wtQm9sZCJdID0gIlN5bWJvbCI7CiAgdFsiU3ltYm9sLUJvbGRJdGFsaWMiXSA9ICJTeW1ib2wiOwogIHRbIlN5bWJvbC1JdGFsaWMiXSA9ICJTeW1ib2wiOwogIHQuVGltZXNOZXdSb21hbiA9ICJUaW1lcy1Sb21hbiI7CiAgdFsiVGltZXNOZXdSb21hbi1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiVGltZXNOZXdSb21hbi1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hbi1JdGFsaWMiXSA9ICJUaW1lcy1JdGFsaWMiOwogIHQuVGltZXNOZXdSb21hblBTID0gIlRpbWVzLVJvbWFuIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZCJdID0gIlRpbWVzLUJvbGQiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTLUJvbGRJdGFsaWNNVCJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkTVQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljTVQiXSA9ICJUaW1lcy1JdGFsaWMiOwogIHQuVGltZXNOZXdSb21hblBTTVQgPSAiVGltZXMtUm9tYW4iOwogIHRbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTTVQtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKfSk7CmNvbnN0IGdldEZvbnROYW1lVG9GaWxlTWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gIkZveGl0Rml4ZWQucGZiIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJGb3hpdEZpeGVkQm9sZC5wZmIiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJGb3hpdEZpeGVkQm9sZEl0YWxpYy5wZmIiOwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gIkZveGl0Rml4ZWRJdGFsaWMucGZiIjsKICB0LkhlbHZldGljYSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtSXRhbGljLnR0ZiI7CiAgdFsiVGltZXMtUm9tYW4iXSA9ICJGb3hpdFNlcmlmLnBmYiI7CiAgdFsiVGltZXMtQm9sZCJdID0gIkZveGl0U2VyaWZCb2xkLnBmYiI7CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gIkZveGl0U2VyaWZCb2xkSXRhbGljLnBmYiI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiRm94aXRTZXJpZkl0YWxpYy5wZmIiOwogIHQuU3ltYm9sID0gIkZveGl0U3ltYm9sLnBmYiI7CiAgdC5aYXBmRGluZ2JhdHMgPSAiRm94aXREaW5nYmF0cy5wZmIiOwogIHRbIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiXSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiTGliZXJhdGlvblNhbnMtQm9sZCJdID0gIkxpYmVyYXRpb25TYW5zLUJvbGQudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiXSA9ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwp9KTsKY29uc3QgZ2V0Tm9uU3RkRm9udE1hcCA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHQuQ2FsaWJyaSA9ICJIZWx2ZXRpY2EiOwogIHRbIkNhbGlicmktQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDYWxpYnJpLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNhbGlicmktSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQ2VudHVyeUdvdGhpYyA9ICJIZWx2ZXRpY2EiOwogIHRbIkNlbnR1cnlHb3RoaWMtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDZW50dXJ5R290aGljLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNlbnR1cnlHb3RoaWMtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQ29taWNTYW5zTVMgPSAiQ29taWMgU2FucyBNUyI7CiAgdFsiQ29taWNTYW5zTVMtQm9sZCJdID0gIkNvbWljIFNhbnMgTVMtQm9sZCI7CiAgdFsiQ29taWNTYW5zTVMtQm9sZEl0YWxpYyJdID0gIkNvbWljIFNhbnMgTVMtQm9sZEl0YWxpYyI7CiAgdFsiQ29taWNTYW5zTVMtSXRhbGljIl0gPSAiQ29taWMgU2FucyBNUy1JdGFsaWMiOwogIHQuR2lsbFNhbnNNVCA9ICJIZWx2ZXRpY2EiOwogIHRbIkdpbGxTYW5zTVQtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJHaWxsU2Fuc01ULUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkdpbGxTYW5zTVQtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuSW1wYWN0ID0gIkhlbHZldGljYSI7CiAgdFsiSXRjU3ltYm9sLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiSXRjU3ltYm9sLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkl0Y1N5bWJvbC1Cb29rIl0gPSAiSGVsdmV0aWNhIjsKICB0WyJJdGNTeW1ib2wtQm9va0l0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJJdGNTeW1ib2wtTWVkaXVtIl0gPSAiSGVsdmV0aWNhIjsKICB0WyJJdGNTeW1ib2wtTWVkaXVtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuTHVjaWRhQ29uc29sZSA9ICJDb3VyaWVyIjsKICB0WyJMdWNpZGFDb25zb2xlLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHRbIkx1Y2lkYUNvbnNvbGUtQm9sZEl0YWxpYyJdID0gIkNvdXJpZXItQm9sZE9ibGlxdWUiOwogIHRbIkx1Y2lkYUNvbnNvbGUtSXRhbGljIl0gPSAiQ291cmllci1PYmxpcXVlIjsKICB0WyJMdWNpZGFTYW5zLURlbWkiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiTVMtR290aGljIl0gPSAiTVMgR290aGljIjsKICB0WyJNUy1Hb3RoaWMtQm9sZCJdID0gIk1TIEdvdGhpYy1Cb2xkIjsKICB0WyJNUy1Hb3RoaWMtQm9sZEl0YWxpYyJdID0gIk1TIEdvdGhpYy1Cb2xkSXRhbGljIjsKICB0WyJNUy1Hb3RoaWMtSXRhbGljIl0gPSAiTVMgR290aGljLUl0YWxpYyI7CiAgdFsiTVMtTWluY2hvIl0gPSAiTVMgTWluY2hvIjsKICB0WyJNUy1NaW5jaG8tQm9sZCJdID0gIk1TIE1pbmNoby1Cb2xkIjsKICB0WyJNUy1NaW5jaG8tQm9sZEl0YWxpYyJdID0gIk1TIE1pbmNoby1Cb2xkSXRhbGljIjsKICB0WyJNUy1NaW5jaG8tSXRhbGljIl0gPSAiTVMgTWluY2hvLUl0YWxpYyI7CiAgdFsiTVMtUEdvdGhpYyJdID0gIk1TIFBHb3RoaWMiOwogIHRbIk1TLVBHb3RoaWMtQm9sZCJdID0gIk1TIFBHb3RoaWMtQm9sZCI7CiAgdFsiTVMtUEdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiTVMgUEdvdGhpYy1Cb2xkSXRhbGljIjsKICB0WyJNUy1QR290aGljLUl0YWxpYyJdID0gIk1TIFBHb3RoaWMtSXRhbGljIjsKICB0WyJNUy1QTWluY2hvIl0gPSAiTVMgUE1pbmNobyI7CiAgdFsiTVMtUE1pbmNoby1Cb2xkIl0gPSAiTVMgUE1pbmNoby1Cb2xkIjsKICB0WyJNUy1QTWluY2hvLUJvbGRJdGFsaWMiXSA9ICJNUyBQTWluY2hvLUJvbGRJdGFsaWMiOwogIHRbIk1TLVBNaW5jaG8tSXRhbGljIl0gPSAiTVMgUE1pbmNoby1JdGFsaWMiOwogIHQuTnVwdGlhbFNjcmlwdCA9ICJUaW1lcy1JdGFsaWMiOwogIHQuU2Vnb2VVSVN5bWJvbCA9ICJIZWx2ZXRpY2EiOwp9KTsKY29uc3QgZ2V0U2VyaWZGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbIkFkb2JlIEplbnNvbiJdID0gdHJ1ZTsKICB0WyJBZG9iZSBUZXh0Il0gPSB0cnVlOwogIHQuQWxiZXJ0dXMgPSB0cnVlOwogIHQuQWxkdXMgPSB0cnVlOwogIHQuQWxleGFuZHJpYSA9IHRydWU7CiAgdC5BbGdlcmlhbiA9IHRydWU7CiAgdFsiQW1lcmljYW4gVHlwZXdyaXRlciJdID0gdHJ1ZTsKICB0LkFudGlxdWEgPSB0cnVlOwogIHQuQXBleCA9IHRydWU7CiAgdC5Bcm5vID0gdHJ1ZTsKICB0LkFzdGVyID0gdHJ1ZTsKICB0LkF1cm9yYSA9IHRydWU7CiAgdC5CYXNrZXJ2aWxsZSA9IHRydWU7CiAgdC5CZWxsID0gdHJ1ZTsKICB0LkJlbWJvID0gdHJ1ZTsKICB0WyJCZW1ibyBTY2hvb2xib29rIl0gPSB0cnVlOwogIHQuQmVuZ3VpYXQgPSB0cnVlOwogIHRbIkJlcmtlbGV5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKICB0WyJCZXJuaGFyZCBNb2Rlcm4iXSA9IHRydWU7CiAgdFsiQmVydGhvbGQgQ2l0eSJdID0gdHJ1ZTsKICB0LkJvZG9uaSA9IHRydWU7CiAgdFsiQmF1ZXIgQm9kb25pIl0gPSB0cnVlOwogIHRbIkJvb2sgQW50aXF1YSJdID0gdHJ1ZTsKICB0LkJvb2ttYW4gPSB0cnVlOwogIHRbIkJvcmRlYXV4IFJvbWFuIl0gPSB0cnVlOwogIHRbIkNhbGlmb3JuaWFuIEZCIl0gPSB0cnVlOwogIHQuQ2FsaXN0byA9IHRydWU7CiAgdC5DYWx2ZXJ0ID0gdHJ1ZTsKICB0LkNhcGl0YWxzID0gdHJ1ZTsKICB0LkNhbWJyaWEgPSB0cnVlOwogIHQuQ2FydGllciA9IHRydWU7CiAgdC5DYXNsb24gPSB0cnVlOwogIHQuQ2F0dWxsID0gdHJ1ZTsKICB0LkNlbnRhdXIgPSB0cnVlOwogIHRbIkNlbnR1cnkgT2xkIFN0eWxlIl0gPSB0cnVlOwogIHRbIkNlbnR1cnkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LkNoYXBhcnJhbCA9IHRydWU7CiAgdFsiQ2hhcmlzIFNJTCJdID0gdHJ1ZTsKICB0LkNoZWx0ZW5oYW0gPSB0cnVlOwogIHRbIkNob2xsYSBTbGFiIl0gPSB0cnVlOwogIHQuQ2xhcmVuZG9uID0gdHJ1ZTsKICB0LkNsZWFyZmFjZSA9IHRydWU7CiAgdC5Db2NoaW4gPSB0cnVlOwogIHQuQ29sb25uYSA9IHRydWU7CiAgdFsiQ29tcHV0ZXIgTW9kZXJuIl0gPSB0cnVlOwogIHRbIkNvbmNyZXRlIFJvbWFuIl0gPSB0cnVlOwogIHQuQ29uc3RhbnRpYSA9IHRydWU7CiAgdFsiQ29vcGVyIEJsYWNrIl0gPSB0cnVlOwogIHQuQ29yb25hID0gdHJ1ZTsKICB0LkVjb3R5cGUgPSB0cnVlOwogIHQuRWd5cHRpZW5uZSA9IHRydWU7CiAgdC5FbGVwaGFudCA9IHRydWU7CiAgdC5FeGNlbHNpb3IgPSB0cnVlOwogIHQuRmFpcmZpZWxkID0gdHJ1ZTsKICB0WyJGRiBTY2FsYSJdID0gdHJ1ZTsKICB0LkZvbGthcmQgPSB0cnVlOwogIHQuRm9vdGxpZ2h0ID0gdHJ1ZTsKICB0LkZyZWVTZXJpZiA9IHRydWU7CiAgdFsiRnJpeiBRdWFkcmF0YSJdID0gdHJ1ZTsKICB0LkdhcmFtb25kID0gdHJ1ZTsKICB0LkdlbnRpdW0gPSB0cnVlOwogIHQuR2VvcmdpYSA9IHRydWU7CiAgdC5HbG91Y2VzdGVyID0gdHJ1ZTsKICB0WyJHb3VkeSBPbGQgU3R5bGUiXSA9IHRydWU7CiAgdFsiR291ZHkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0WyJHb3VkeSBQcm8gRm9udCJdID0gdHJ1ZTsKICB0LkdyYW5qb24gPSB0cnVlOwogIHRbIkd1YXJkaWFuIEVneXB0aWFuIl0gPSB0cnVlOwogIHQuSGVhdGhlciA9IHRydWU7CiAgdC5IZXJjdWxlcyA9IHRydWU7CiAgdFsiSGlnaCBUb3dlciBUZXh0Il0gPSB0cnVlOwogIHQuSGlyb3NoaWdlID0gdHJ1ZTsKICB0WyJIb2VmbGVyIFRleHQiXSA9IHRydWU7CiAgdFsiSHVtYW5hIFNlcmlmIl0gPSB0cnVlOwogIHQuSW1wcmludCA9IHRydWU7CiAgdFsiSW9uaWMgTm8uIDUiXSA9IHRydWU7CiAgdC5KYW5zb24gPSB0cnVlOwogIHQuSm9hbm5hID0gdHJ1ZTsKICB0LktvcmlubmEgPSB0cnVlOwogIHQuTGV4aWNvbiA9IHRydWU7CiAgdC5MaWJlcmF0aW9uU2VyaWYgPSB0cnVlOwogIHRbIkxpYmVyYXRpb24gU2VyaWYiXSA9IHRydWU7CiAgdFsiTGludXggTGliZXJ0aW5lIl0gPSB0cnVlOwogIHQuTGl0ZXJhdHVybmF5YSA9IHRydWU7CiAgdC5MdWNpZGEgPSB0cnVlOwogIHRbIkx1Y2lkYSBCcmlnaHQiXSA9IHRydWU7CiAgdC5NZWxpb3IgPSB0cnVlOwogIHQuTWVtcGhpcyA9IHRydWU7CiAgdC5NaWxsZXIgPSB0cnVlOwogIHQuTWluaW9uID0gdHJ1ZTsKICB0Lk1vZGVybiA9IHRydWU7CiAgdFsiTW9uYSBMaXNhIl0gPSB0cnVlOwogIHRbIk1ycyBFYXZlcyJdID0gdHJ1ZTsKICB0WyJNUyBTZXJpZiJdID0gdHJ1ZTsKICB0WyJNdXNlbyBTbGFiIl0gPSB0cnVlOwogIHRbIk5ldyBZb3JrIl0gPSB0cnVlOwogIHRbIk5pbWJ1cyBSb21hbiJdID0gdHJ1ZTsKICB0WyJOUFMgUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5OdXB0aWFsU2NyaXB0ID0gdHJ1ZTsKICB0LlBhbGF0aW5vID0gdHJ1ZTsKICB0LlBlcnBldHVhID0gdHJ1ZTsKICB0LlBsYW50aW4gPSB0cnVlOwogIHRbIlBsYW50aW4gU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LlBsYXliaWxsID0gdHJ1ZTsKICB0WyJQb29yIFJpY2hhcmQiXSA9IHRydWU7CiAgdFsiUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5SZW5hdWx0ID0gdHJ1ZTsKICB0LlJlcXVpZW0gPSB0cnVlOwogIHQuUm9ja3dlbGwgPSB0cnVlOwogIHQuUm9tYW4gPSB0cnVlOwogIHRbIlJvdGlzIFNlcmlmIl0gPSB0cnVlOwogIHQuU2Fib24gPSB0cnVlOwogIHQuU2NhbGEgPSB0cnVlOwogIHQuU2VhZ3VsbCA9IHRydWU7CiAgdC5TaXN0aW5hID0gdHJ1ZTsKICB0LlNvdXZlbmlyID0gdHJ1ZTsKICB0LlNUSVggPSB0cnVlOwogIHRbIlN0b25lIEluZm9ybWFsIl0gPSB0cnVlOwogIHRbIlN0b25lIFNlcmlmIl0gPSB0cnVlOwogIHQuU3lsZmFlbiA9IHRydWU7CiAgdC5UaW1lcyA9IHRydWU7CiAgdC5UcmFqYW4gPSB0cnVlOwogIHRbIlRyaW5pdMOpIl0gPSB0cnVlOwogIHRbIlRydW1wIE1lZGlhZXZhbCJdID0gdHJ1ZTsKICB0LlV0b3BpYSA9IHRydWU7CiAgdFsiVmFsZSBUeXBlIl0gPSB0cnVlOwogIHRbIkJpdHN0cmVhbSBWZXJhIl0gPSB0cnVlOwogIHRbIlZlcmEgU2VyaWYiXSA9IHRydWU7CiAgdC5WZXJzYWlsbGVzID0gdHJ1ZTsKICB0LldhbnRlZCA9IHRydWU7CiAgdC5XZWlzcyA9IHRydWU7CiAgdFsiV2lkZSBMYXRpbiJdID0gdHJ1ZTsKICB0LldpbmRzb3IgPSB0cnVlOwogIHQuWElUUyA9IHRydWU7Cn0pOwpjb25zdCBnZXRTeW1ib2xzRm9udHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkRpbmdiYXRzID0gdHJ1ZTsKICB0LlN5bWJvbCA9IHRydWU7CiAgdC5aYXBmRGluZ2JhdHMgPSB0cnVlOwogIHQuV2luZ2RpbmdzID0gdHJ1ZTsKICB0WyJXaW5nZGluZ3MtQm9sZCJdID0gdHJ1ZTsKICB0WyJXaW5nZGluZ3MtUmVndWxhciJdID0gdHJ1ZTsKfSk7CmNvbnN0IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbMl0gPSAxMDsKICB0WzNdID0gMzI7CiAgdFs0XSA9IDMzOwogIHRbNV0gPSAzNDsKICB0WzZdID0gMzU7CiAgdFs3XSA9IDM2OwogIHRbOF0gPSAzNzsKICB0WzldID0gMzg7CiAgdFsxMF0gPSAzOTsKICB0WzExXSA9IDQwOwogIHRbMTJdID0gNDE7CiAgdFsxM10gPSA0MjsKICB0WzE0XSA9IDQzOwogIHRbMTVdID0gNDQ7CiAgdFsxNl0gPSA0NTsKICB0WzE3XSA9IDQ2OwogIHRbMThdID0gNDc7CiAgdFsxOV0gPSA0ODsKICB0WzIwXSA9IDQ5OwogIHRbMjFdID0gNTA7CiAgdFsyMl0gPSA1MTsKICB0WzIzXSA9IDUyOwogIHRbMjRdID0gNTM7CiAgdFsyNV0gPSA1NDsKICB0WzI2XSA9IDU1OwogIHRbMjddID0gNTY7CiAgdFsyOF0gPSA1NzsKICB0WzI5XSA9IDU4OwogIHRbMzBdID0gODk0OwogIHRbMzFdID0gNjA7CiAgdFszMl0gPSA2MTsKICB0WzMzXSA9IDYyOwogIHRbMzRdID0gNjM7CiAgdFszNV0gPSA2NDsKICB0WzM2XSA9IDY1OwogIHRbMzddID0gNjY7CiAgdFszOF0gPSA2NzsKICB0WzM5XSA9IDY4OwogIHRbNDBdID0gNjk7CiAgdFs0MV0gPSA3MDsKICB0WzQyXSA9IDcxOwogIHRbNDNdID0gNzI7CiAgdFs0NF0gPSA3MzsKICB0WzQ1XSA9IDc0OwogIHRbNDZdID0gNzU7CiAgdFs0N10gPSA3NjsKICB0WzQ4XSA9IDc3OwogIHRbNDldID0gNzg7CiAgdFs1MF0gPSA3OTsKICB0WzUxXSA9IDgwOwogIHRbNTJdID0gODE7CiAgdFs1M10gPSA4MjsKICB0WzU0XSA9IDgzOwogIHRbNTVdID0gODQ7CiAgdFs1Nl0gPSA4NTsKICB0WzU3XSA9IDg2OwogIHRbNThdID0gODc7CiAgdFs1OV0gPSA4ODsKICB0WzYwXSA9IDg5OwogIHRbNjFdID0gOTA7CiAgdFs2Ml0gPSA5MTsKICB0WzYzXSA9IDkyOwogIHRbNjRdID0gOTM7CiAgdFs2NV0gPSA5NDsKICB0WzY2XSA9IDk1OwogIHRbNjddID0gOTY7CiAgdFs2OF0gPSA5NzsKICB0WzY5XSA9IDk4OwogIHRbNzBdID0gOTk7CiAgdFs3MV0gPSAxMDA7CiAgdFs3Ml0gPSAxMDE7CiAgdFs3M10gPSAxMDI7CiAgdFs3NF0gPSAxMDM7CiAgdFs3NV0gPSAxMDQ7CiAgdFs3Nl0gPSAxMDU7CiAgdFs3N10gPSAxMDY7CiAgdFs3OF0gPSAxMDc7CiAgdFs3OV0gPSAxMDg7CiAgdFs4MF0gPSAxMDk7CiAgdFs4MV0gPSAxMTA7CiAgdFs4Ml0gPSAxMTE7CiAgdFs4M10gPSAxMTI7CiAgdFs4NF0gPSAxMTM7CiAgdFs4NV0gPSAxMTQ7CiAgdFs4Nl0gPSAxMTU7CiAgdFs4N10gPSAxMTY7CiAgdFs4OF0gPSAxMTc7CiAgdFs4OV0gPSAxMTg7CiAgdFs5MF0gPSAxMTk7CiAgdFs5MV0gPSAxMjA7CiAgdFs5Ml0gPSAxMjE7CiAgdFs5M10gPSAxMjI7CiAgdFs5NF0gPSAxMjM7CiAgdFs5NV0gPSAxMjQ7CiAgdFs5Nl0gPSAxMjU7CiAgdFs5N10gPSAxMjY7CiAgdFs5OF0gPSAxOTY7CiAgdFs5OV0gPSAxOTc7CiAgdFsxMDBdID0gMTk5OwogIHRbMTAxXSA9IDIwMTsKICB0WzEwMl0gPSAyMDk7CiAgdFsxMDNdID0gMjE0OwogIHRbMTA0XSA9IDIyMDsKICB0WzEwNV0gPSAyMjU7CiAgdFsxMDZdID0gMjI0OwogIHRbMTA3XSA9IDIyNjsKICB0WzEwOF0gPSAyMjg7CiAgdFsxMDldID0gMjI3OwogIHRbMTEwXSA9IDIyOTsKICB0WzExMV0gPSAyMzE7CiAgdFsxMTJdID0gMjMzOwogIHRbMTEzXSA9IDIzMjsKICB0WzExNF0gPSAyMzQ7CiAgdFsxMTVdID0gMjM1OwogIHRbMTE2XSA9IDIzNzsKICB0WzExN10gPSAyMzY7CiAgdFsxMThdID0gMjM4OwogIHRbMTE5XSA9IDIzOTsKICB0WzEyMF0gPSAyNDE7CiAgdFsxMjFdID0gMjQzOwogIHRbMTIyXSA9IDI0MjsKICB0WzEyM10gPSAyNDQ7CiAgdFsxMjRdID0gMjQ2OwogIHRbMTI1XSA9IDI0NTsKICB0WzEyNl0gPSAyNTA7CiAgdFsxMjddID0gMjQ5OwogIHRbMTI4XSA9IDI1MTsKICB0WzEyOV0gPSAyNTI7CiAgdFsxMzBdID0gODIyNDsKICB0WzEzMV0gPSAxNzY7CiAgdFsxMzJdID0gMTYyOwogIHRbMTMzXSA9IDE2MzsKICB0WzEzNF0gPSAxNjc7CiAgdFsxMzVdID0gODIyNjsKICB0WzEzNl0gPSAxODI7CiAgdFsxMzddID0gMjIzOwogIHRbMTM4XSA9IDE3NDsKICB0WzEzOV0gPSAxNjk7CiAgdFsxNDBdID0gODQ4MjsKICB0WzE0MV0gPSAxODA7CiAgdFsxNDJdID0gMTY4OwogIHRbMTQzXSA9IDg4MDA7CiAgdFsxNDRdID0gMTk4OwogIHRbMTQ1XSA9IDIxNjsKICB0WzE0Nl0gPSA4NzM0OwogIHRbMTQ3XSA9IDE3NzsKICB0WzE0OF0gPSA4ODA0OwogIHRbMTQ5XSA9IDg4MDU7CiAgdFsxNTBdID0gMTY1OwogIHRbMTUxXSA9IDE4MTsKICB0WzE1Ml0gPSA4NzA2OwogIHRbMTUzXSA9IDg3MjE7CiAgdFsxNTRdID0gODcxOTsKICB0WzE1Nl0gPSA4NzQ3OwogIHRbMTU3XSA9IDE3MDsKICB0WzE1OF0gPSAxODY7CiAgdFsxNTldID0gODQ4NjsKICB0WzE2MF0gPSAyMzA7CiAgdFsxNjFdID0gMjQ4OwogIHRbMTYyXSA9IDE5MTsKICB0WzE2M10gPSAxNjE7CiAgdFsxNjRdID0gMTcyOwogIHRbMTY1XSA9IDg3MzA7CiAgdFsxNjZdID0gNDAyOwogIHRbMTY3XSA9IDg3NzY7CiAgdFsxNjhdID0gODcxMDsKICB0WzE2OV0gPSAxNzE7CiAgdFsxNzBdID0gMTg3OwogIHRbMTcxXSA9IDgyMzA7CiAgdFsxNzldID0gODIyMDsKICB0WzE4MF0gPSA4MjIxOwogIHRbMTgxXSA9IDgyMTY7CiAgdFsxODJdID0gODIxNzsKICB0WzIwMF0gPSAxOTM7CiAgdFsyMDNdID0gMjA1OwogIHRbMjA3XSA9IDIxMTsKICB0WzIxMF0gPSAyMTg7CiAgdFsyMjNdID0gNzExOwogIHRbMjI0XSA9IDMyMTsKICB0WzIyNV0gPSAzMjI7CiAgdFsyMjZdID0gMzUyOwogIHRbMjI3XSA9IDM1MzsKICB0WzIyOF0gPSAzODE7CiAgdFsyMjldID0gMzgyOwogIHRbMjMzXSA9IDIyMTsKICB0WzIzNF0gPSAyNTM7CiAgdFsyNTJdID0gMjYzOwogIHRbMjUzXSA9IDI2ODsKICB0WzI1NF0gPSAyNjk7CiAgdFsyNThdID0gMjU4OwogIHRbMjYwXSA9IDI2MDsKICB0WzI2MV0gPSAyNjE7CiAgdFsyNjVdID0gMjgwOwogIHRbMjY2XSA9IDI4MTsKICB0WzI2N10gPSAyODI7CiAgdFsyNjhdID0gMjgzOwogIHRbMjY5XSA9IDMxMzsKICB0WzI3NV0gPSAzMjM7CiAgdFsyNzZdID0gMzI0OwogIHRbMjc4XSA9IDMyODsKICB0WzI4M10gPSAzNDQ7CiAgdFsyODRdID0gMzQ1OwogIHRbMjg1XSA9IDM0NjsKICB0WzI4Nl0gPSAzNDc7CiAgdFsyOTJdID0gMzY3OwogIHRbMjk1XSA9IDM3NzsKICB0WzI5Nl0gPSAzNzg7CiAgdFsyOThdID0gMzgwOwogIHRbMzA1XSA9IDk2MzsKICB0WzMwNl0gPSA5NjQ7CiAgdFszMDddID0gOTY2OwogIHRbMzA4XSA9IDgyMTU7CiAgdFszMDldID0gODI1MjsKICB0WzMxMF0gPSA4MzE5OwogIHRbMzExXSA9IDgzNTk7CiAgdFszMTJdID0gODU5MjsKICB0WzMxM10gPSA4NTkzOwogIHRbMzM3XSA9IDk1NTI7CiAgdFs0OTNdID0gMTAzOTsKICB0WzQ5NF0gPSAxMDQwOwogIHRbNTcwXSA9IDEwNDA7CiAgdFs1NzFdID0gMTA0MTsKICB0WzU3Ml0gPSAxMDQyOwogIHRbNTczXSA9IDEwNDM7CiAgdFs1NzRdID0gMTA0NDsKICB0WzU3NV0gPSAxMDQ1OwogIHRbNTc2XSA9IDEwNDY7CiAgdFs1NzddID0gMTA0NzsKICB0WzU3OF0gPSAxMDQ4OwogIHRbNTc5XSA9IDEwNDk7CiAgdFs1ODBdID0gMTA1MDsKICB0WzU4MV0gPSAxMDUxOwogIHRbNTgyXSA9IDEwNTI7CiAgdFs1ODNdID0gMTA1MzsKICB0WzU4NF0gPSAxMDU0OwogIHRbNTg1XSA9IDEwNTU7CiAgdFs1ODZdID0gMTA1NjsKICB0WzU4N10gPSAxMDU3OwogIHRbNTg4XSA9IDEwNTg7CiAgdFs1ODldID0gMTA1OTsKICB0WzU5MF0gPSAxMDYwOwogIHRbNTkxXSA9IDEwNjE7CiAgdFs1OTJdID0gMTA2MjsKICB0WzU5M10gPSAxMDYzOwogIHRbNTk0XSA9IDEwNjQ7CiAgdFs1OTVdID0gMTA2NTsKICB0WzU5Nl0gPSAxMDY2OwogIHRbNTk3XSA9IDEwNjc7CiAgdFs1OThdID0gMTA2ODsKICB0WzU5OV0gPSAxMDY5OwogIHRbNjAwXSA9IDEwNzA7CiAgdFs2NzJdID0gMTQ4ODsKICB0WzY3M10gPSAxNDg5OwogIHRbNjc0XSA9IDE0OTA7CiAgdFs2NzVdID0gMTQ5MTsKICB0WzY3Nl0gPSAxNDkyOwogIHRbNjc3XSA9IDE0OTM7CiAgdFs2NzhdID0gMTQ5NDsKICB0WzY3OV0gPSAxNDk1OwogIHRbNjgwXSA9IDE0OTY7CiAgdFs2ODFdID0gMTQ5NzsKICB0WzY4Ml0gPSAxNDk4OwogIHRbNjgzXSA9IDE0OTk7CiAgdFs2ODRdID0gMTUwMDsKICB0WzY4NV0gPSAxNTAxOwogIHRbNjg2XSA9IDE1MDI7CiAgdFs2ODddID0gMTUwMzsKICB0WzY4OF0gPSAxNTA0OwogIHRbNjg5XSA9IDE1MDU7CiAgdFs2OTBdID0gMTUwNjsKICB0WzY5MV0gPSAxNTA3OwogIHRbNjkyXSA9IDE1MDg7CiAgdFs2OTNdID0gMTUwOTsKICB0WzY5NF0gPSAxNTEwOwogIHRbNjk1XSA9IDE1MTE7CiAgdFs2OTZdID0gMTUxMjsKICB0WzY5N10gPSAxNTEzOwogIHRbNjk4XSA9IDE1MTQ7CiAgdFs3MDVdID0gMTUyNDsKICB0WzcwNl0gPSA4MzYyOwogIHRbNzEwXSA9IDY0Mjg4OwogIHRbNzExXSA9IDY0Mjk4OwogIHRbNzU5XSA9IDE2MTc7CiAgdFs3NjFdID0gMTc3NjsKICB0Wzc2M10gPSAxNzc4OwogIHRbNzc1XSA9IDE2NTI7CiAgdFs3NzddID0gMTc2NDsKICB0Wzc3OF0gPSAxNzgwOwogIHRbNzc5XSA9IDE3ODE7CiAgdFs3ODBdID0gMTc4MjsKICB0Wzc4Ml0gPSA3NzE7CiAgdFs3ODNdID0gNjQ3MjY7CiAgdFs3ODZdID0gODM2MzsKICB0Wzc4OF0gPSA4NTMyOwogIHRbNzkwXSA9IDc2ODsKICB0Wzc5MV0gPSA3Njk7CiAgdFs3OTJdID0gNzY4OwogIHRbNzk1XSA9IDgwMzsKICB0Wzc5N10gPSA2NDMzNjsKICB0Wzc5OF0gPSA2NDMzNzsKICB0Wzc5OV0gPSA2NDM0MjsKICB0WzgwMF0gPSA2NDM0MzsKICB0WzgwMV0gPSA2NDM0NDsKICB0WzgwMl0gPSA2NDM0NTsKICB0WzgwM10gPSA2NDM2MjsKICB0WzgwNF0gPSA2NDM2MzsKICB0WzgwNV0gPSA2NDM2NDsKICB0WzI0MjRdID0gNzgyMTsKICB0WzI0MjVdID0gNzgyMjsKICB0WzI0MjZdID0gNzgyMzsKICB0WzI0MjddID0gNzgyNDsKICB0WzI0MjhdID0gNzgyNTsKICB0WzI0MjldID0gNzgyNjsKICB0WzI0MzBdID0gNzgyNzsKICB0WzI0MzNdID0gNzY4MjsKICB0WzI2NzhdID0gODA0NTsKICB0WzI2NzldID0gODA0NjsKICB0WzI4MzBdID0gMTU1MjsKICB0WzI4MzhdID0gNjg2OwogIHRbMjg0MF0gPSA3NTE7CiAgdFsyODQyXSA9IDc1MzsKICB0WzI4NDNdID0gNzU0OwogIHRbMjg0NF0gPSA3NTU7CiAgdFsyODQ2XSA9IDc1NzsKICB0WzI4NTZdID0gNzY3OwogIHRbMjg1N10gPSA4NDg7CiAgdFsyODU4XSA9IDg0OTsKICB0WzI4NjJdID0gODUzOwogIHRbMjg2M10gPSA4NTQ7CiAgdFsyODY0XSA9IDg1NTsKICB0WzI4NjVdID0gODYxOwogIHRbMjg2Nl0gPSA4NjI7CiAgdFsyOTA2XSA9IDc0NjA7CiAgdFsyOTA4XSA9IDc0NjI7CiAgdFsyOTA5XSA9IDc0NjM7CiAgdFsyOTEwXSA9IDc0NjQ7CiAgdFsyOTEyXSA9IDc0NjY7CiAgdFsyOTEzXSA9IDc0Njc7CiAgdFsyOTE0XSA9IDc0Njg7CiAgdFsyOTE2XSA9IDc0NzA7CiAgdFsyOTE3XSA9IDc0NzE7CiAgdFsyOTE4XSA9IDc0NzI7CiAgdFsyOTIwXSA9IDc0NzQ7CiAgdFsyOTIxXSA9IDc0NzU7CiAgdFsyOTIyXSA9IDc0NzY7CiAgdFsyOTI0XSA9IDc0Nzg7CiAgdFsyOTI1XSA9IDc0Nzk7CiAgdFsyOTI2XSA9IDc0ODA7CiAgdFsyOTI4XSA9IDc0ODI7CiAgdFsyOTI5XSA9IDc0ODM7CiAgdFsyOTMwXSA9IDc0ODQ7CiAgdFsyOTMyXSA9IDc0ODY7CiAgdFsyOTMzXSA9IDc0ODc7CiAgdFsyOTM0XSA9IDc0ODg7CiAgdFsyOTM2XSA9IDc0OTA7CiAgdFsyOTM3XSA9IDc0OTE7CiAgdFsyOTM4XSA9IDc0OTI7CiAgdFsyOTQwXSA9IDc0OTQ7CiAgdFsyOTQxXSA9IDc0OTU7CiAgdFsyOTQyXSA9IDc0OTY7CiAgdFsyOTQ0XSA9IDc0OTg7CiAgdFsyOTQ2XSA9IDc1MDA7CiAgdFsyOTQ4XSA9IDc1MDI7CiAgdFsyOTUwXSA9IDc1MDQ7CiAgdFsyOTUxXSA9IDc1MDU7CiAgdFsyOTUyXSA9IDc1MDY7CiAgdFsyOTU0XSA9IDc1MDg7CiAgdFsyOTU1XSA9IDc1MDk7CiAgdFsyOTU2XSA9IDc1MTA7CiAgdFsyOTU4XSA9IDc1MTI7CiAgdFsyOTU5XSA9IDc1MTM7CiAgdFsyOTYwXSA9IDc1MTQ7CiAgdFsyOTYyXSA9IDc1MTY7CiAgdFsyOTYzXSA9IDc1MTc7CiAgdFsyOTY0XSA9IDc1MTg7CiAgdFsyOTY2XSA9IDc1MjA7CiAgdFsyOTY3XSA9IDc1MjE7CiAgdFsyOTY4XSA9IDc1MjI7CiAgdFsyOTcwXSA9IDc1MjQ7CiAgdFsyOTcxXSA9IDc1MjU7CiAgdFsyOTcyXSA9IDc1MjY7CiAgdFsyOTc0XSA9IDc1Mjg7CiAgdFsyOTc1XSA9IDc1Mjk7CiAgdFsyOTc2XSA9IDc1MzA7CiAgdFsyOTc4XSA9IDE1Mzc7CiAgdFsyOTc5XSA9IDE1Mzg7CiAgdFsyOTgwXSA9IDE1Mzk7CiAgdFsyOTgyXSA9IDE1NDk7CiAgdFsyOTgzXSA9IDE1NTE7CiAgdFsyOTg0XSA9IDE1NTI7CiAgdFsyOTg2XSA9IDE1NTQ7CiAgdFsyOTg3XSA9IDE1NTU7CiAgdFsyOTg4XSA9IDE1NTY7CiAgdFsyOTkwXSA9IDE2MjM7CiAgdFsyOTkxXSA9IDE2MjQ7CiAgdFsyOTk1XSA9IDE3NzU7CiAgdFsyOTk5XSA9IDE3OTE7CiAgdFszMDAyXSA9IDY0MjkwOwogIHRbMzAwM10gPSA2NDI5MTsKICB0WzMwMDRdID0gNjQyOTI7CiAgdFszMDA2XSA9IDY0Mjk0OwogIHRbMzAwN10gPSA2NDI5NTsKICB0WzMwMDhdID0gNjQyOTY7CiAgdFszMDExXSA9IDE5MDA7CiAgdFszMDE0XSA9IDgyMjM7CiAgdFszMDE1XSA9IDgyNDQ7CiAgdFszMDE3XSA9IDc1MzI7CiAgdFszMDE4XSA9IDc1MzM7CiAgdFszMDE5XSA9IDc1MzQ7CiAgdFszMDc1XSA9IDc1OTA7CiAgdFszMDc2XSA9IDc1OTE7CiAgdFszMDc5XSA9IDc1OTQ7CiAgdFszMDgwXSA9IDc1OTU7CiAgdFszMDgzXSA9IDc1OTg7CiAgdFszMDg0XSA9IDc1OTk7CiAgdFszMDg3XSA9IDc2MDI7CiAgdFszMDg4XSA9IDc2MDM7CiAgdFszMDkxXSA9IDc2MDY7CiAgdFszMDkyXSA9IDc2MDc7CiAgdFszMDk1XSA9IDc2MTA7CiAgdFszMDk2XSA9IDc2MTE7CiAgdFszMDk5XSA9IDc2MTQ7CiAgdFszMTAwXSA9IDc2MTU7CiAgdFszMTAzXSA9IDc2MTg7CiAgdFszMTA0XSA9IDc2MTk7CiAgdFszMTA3XSA9IDgzMzc7CiAgdFszMTA4XSA9IDgzMzg7CiAgdFszMTE2XSA9IDE4ODQ7CiAgdFszMTE5XSA9IDE4ODU7CiAgdFszMTIwXSA9IDE4ODU7CiAgdFszMTIzXSA9IDE4ODY7CiAgdFszMTI0XSA9IDE4ODY7CiAgdFszMTI3XSA9IDE4ODc7CiAgdFszMTI4XSA9IDE4ODc7CiAgdFszMTMxXSA9IDE4ODg7CiAgdFszMTMyXSA9IDE4ODg7CiAgdFszMTM1XSA9IDE4ODk7CiAgdFszMTM2XSA9IDE4ODk7CiAgdFszMTM5XSA9IDE4OTA7CiAgdFszMTQwXSA9IDE4OTA7CiAgdFszMTQzXSA9IDE4OTE7CiAgdFszMTQ0XSA9IDE4OTE7CiAgdFszMTQ3XSA9IDE4OTI7CiAgdFszMTQ4XSA9IDE4OTI7CiAgdFszMTUzXSA9IDU4MDsKICB0WzMxNTRdID0gNTgxOwogIHRbMzE1N10gPSA1ODQ7CiAgdFszMTU4XSA9IDU4NTsKICB0WzMxNjFdID0gNTg4OwogIHRbMzE2Ml0gPSA1ODk7CiAgdFszMTY1XSA9IDg5MTsKICB0WzMxNjZdID0gODkyOwogIHRbMzE2OV0gPSAxMjc0OwogIHRbMzE3MF0gPSAxMjc1OwogIHRbMzE3M10gPSAxMjc4OwogIHRbMzE3NF0gPSAxMjc5OwogIHRbMzE4MV0gPSA3NjIyOwogIHRbMzE4Ml0gPSA3NjIzOwogIHRbMzI4Ml0gPSAxMTc5OTsKICB0WzMzMTZdID0gNTc4OwogIHRbMzM3OV0gPSA0Mjc4NTsKICB0WzMzOTNdID0gMTE1OTsKICB0WzM0MTZdID0gODM3NzsKfSk7CmNvbnN0IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbMjI3XSA9IDMyMjsKICB0WzI2NF0gPSAyNjE7CiAgdFsyOTFdID0gMzQ2Owp9KTsKY29uc3QgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdFsxXSA9IDMyOwogIHRbNF0gPSA2NTsKICB0WzVdID0gMTkyOwogIHRbNl0gPSAxOTM7CiAgdFs5XSA9IDE5NjsKICB0WzE3XSA9IDY2OwogIHRbMThdID0gNjc7CiAgdFsyMV0gPSAyNjg7CiAgdFsyNF0gPSA2ODsKICB0WzI4XSA9IDY5OwogIHRbMjldID0gMjAwOwogIHRbMzBdID0gMjAxOwogIHRbMzJdID0gMjgyOwogIHRbMzhdID0gNzA7CiAgdFszOV0gPSA3MTsKICB0WzQ0XSA9IDcyOwogIHRbNDddID0gNzM7CiAgdFs0OF0gPSAyMDQ7CiAgdFs0OV0gPSAyMDU7CiAgdFs1OF0gPSA3NDsKICB0WzYwXSA9IDc1OwogIHRbNjJdID0gNzY7CiAgdFs2OF0gPSA3NzsKICB0WzY5XSA9IDc4OwogIHRbNzVdID0gNzk7CiAgdFs3Nl0gPSAyMTA7CiAgdFs4MF0gPSAyMTQ7CiAgdFs4N10gPSA4MDsKICB0Wzg5XSA9IDgxOwogIHRbOTBdID0gODI7CiAgdFs5Ml0gPSAzNDQ7CiAgdFs5NF0gPSA4MzsKICB0Wzk3XSA9IDM1MjsKICB0WzEwMF0gPSA4NDsKICB0WzEwNF0gPSA4NTsKICB0WzEwOV0gPSAyMjA7CiAgdFsxMTVdID0gODY7CiAgdFsxMTZdID0gODc7CiAgdFsxMjFdID0gODg7CiAgdFsxMjJdID0gODk7CiAgdFsxMjRdID0gMjIxOwogIHRbMTI3XSA9IDkwOwogIHRbMTI5XSA9IDM4MTsKICB0WzI1OF0gPSA5NzsKICB0WzI1OV0gPSAyMjQ7CiAgdFsyNjBdID0gMjI1OwogIHRbMjYzXSA9IDIyODsKICB0WzI2OF0gPSAyNjE7CiAgdFsyNzFdID0gOTg7CiAgdFsyNzJdID0gOTk7CiAgdFsyNzNdID0gMjYzOwogIHRbMjc1XSA9IDI2OTsKICB0WzI4Ml0gPSAxMDA7CiAgdFsyODZdID0gMTAxOwogIHRbMjg3XSA9IDIzMjsKICB0WzI4OF0gPSAyMzM7CiAgdFsyOTBdID0gMjgzOwogIHRbMjk1XSA9IDI4MTsKICB0WzI5Nl0gPSAxMDI7CiAgdFszMzZdID0gMTAzOwogIHRbMzQ2XSA9IDEwNDsKICB0WzM0OV0gPSAxMDU7CiAgdFszNTBdID0gMjM2OwogIHRbMzUxXSA9IDIzNzsKICB0WzM2MV0gPSAxMDY7CiAgdFszNjRdID0gMTA3OwogIHRbMzY3XSA9IDEwODsKICB0WzM3MV0gPSAzMjI7CiAgdFszNzNdID0gMTA5OwogIHRbMzc0XSA9IDExMDsKICB0WzM4MV0gPSAxMTE7CiAgdFszODJdID0gMjQyOwogIHRbMzgzXSA9IDI0MzsKICB0WzM4Nl0gPSAyNDY7CiAgdFszOTNdID0gMTEyOwogIHRbMzk1XSA9IDExMzsKICB0WzM5Nl0gPSAxMTQ7CiAgdFszOThdID0gMzQ1OwogIHRbNDAwXSA9IDExNTsKICB0WzQwMV0gPSAzNDc7CiAgdFs0MDNdID0gMzUzOwogIHRbNDEwXSA9IDExNjsKICB0WzQzN10gPSAxMTc7CiAgdFs0NDJdID0gMjUyOwogIHRbNDQ4XSA9IDExODsKICB0WzQ0OV0gPSAxMTk7CiAgdFs0NTRdID0gMTIwOwogIHRbNDU1XSA9IDEyMTsKICB0WzQ1N10gPSAyNTM7CiAgdFs0NjBdID0gMTIyOwogIHRbNDYyXSA9IDM4MjsKICB0WzQ2M10gPSAzODA7CiAgdFs4NTNdID0gNDQ7CiAgdFs4NTVdID0gNTg7CiAgdFs4NTZdID0gNDY7CiAgdFs4NzZdID0gNDc7CiAgdFs4NzhdID0gNDU7CiAgdFs4ODJdID0gNDU7CiAgdFs4OTRdID0gNDA7CiAgdFs4OTVdID0gNDE7CiAgdFs4OTZdID0gOTE7CiAgdFs4OTddID0gOTM7CiAgdFs5MjNdID0gNjQ7CiAgdFs5NDBdID0gMTYzOwogIHRbMTAwNF0gPSA0ODsKICB0WzEwMDVdID0gNDk7CiAgdFsxMDA2XSA9IDUwOwogIHRbMTAwN10gPSA1MTsKICB0WzEwMDhdID0gNTI7CiAgdFsxMDA5XSA9IDUzOwogIHRbMTAxMF0gPSA1NDsKICB0WzEwMTFdID0gNTU7CiAgdFsxMDEyXSA9IDU2OwogIHRbMTAxM10gPSA1NzsKICB0WzEwODFdID0gMzc7CiAgdFsxMDg1XSA9IDQzOwogIHRbMTA4Nl0gPSA0NTsKfSk7CmZ1bmN0aW9uIGdldFN0YW5kYXJkRm9udE5hbWUobmFtZSkgewogIGNvbnN0IGZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUobmFtZSk7CiAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTsKICByZXR1cm4gc3RkRm9udE1hcFtmb250TmFtZV07Cn0KZnVuY3Rpb24gaXNLbm93bkZvbnROYW1lKG5hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIHJldHVybiAhIShnZXRTdGRGb250TWFwKClbZm9udE5hbWVdIHx8IGdldE5vblN0ZEZvbnRNYXAoKVtmb250TmFtZV0gfHwgZ2V0U2VyaWZGb250cygpW2ZvbnROYW1lXSB8fCBnZXRTeW1ib2xzRm9udHMoKVtmb250TmFtZV0pOwp9Cgo7Ly8gLi9zcmMvY29yZS90b191bmljb2RlX21hcC5qcwoKY2xhc3MgVG9Vbmljb2RlTWFwIHsKICBjb25zdHJ1Y3RvcihjbWFwID0gW10pIHsKICAgIHRoaXMuX21hcCA9IGNtYXA7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiB0aGlzLl9tYXApIHsKICAgICAgY2FsbGJhY2soY2hhckNvZGUsIHRoaXMuX21hcFtjaGFyQ29kZV0uY29kZVBvaW50QXQoMCkpOwogICAgfQogIH0KICBoYXMoaSkgewogICAgcmV0dXJuIHRoaXMuX21hcFtpXSAhPT0gdW5kZWZpbmVkOwogIH0KICBnZXQoaSkgewogICAgcmV0dXJuIHRoaXMuX21hcFtpXTsKICB9CiAgY2hhckNvZGVPZih2YWx1ZSkgewogICAgY29uc3QgbWFwID0gdGhpcy5fbWFwOwogICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkgewogICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpOwogICAgfQogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHsKICAgICAgaWYgKG1hcFtjaGFyQ29kZV0gPT09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0KICBhbWVuZChtYXApIHsKICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIHRoaXMuX21hcFtjaGFyQ29kZV0gPSBtYXBbY2hhckNvZGVdOwogICAgfQogIH0KfQpjbGFzcyBJZGVudGl0eVRvVW5pY29kZU1hcCB7CiAgY29uc3RydWN0b3IoZmlyc3RDaGFyLCBsYXN0Q2hhcikgewogICAgdGhpcy5maXJzdENoYXIgPSBmaXJzdENoYXI7CiAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhciArIDEgLSB0aGlzLmZpcnN0Q2hhcjsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChsZXQgaSA9IHRoaXMuZmlyc3RDaGFyLCBpaSA9IHRoaXMubGFzdENoYXI7IGkgPD0gaWk7IGkrKykgewogICAgICBjYWxsYmFjayhpLCBpKTsKICAgIH0KICB9CiAgaGFzKGkpIHsKICAgIHJldHVybiB0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcjsKICB9CiAgZ2V0KGkpIHsKICAgIGlmICh0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcikgewogICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShpKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIGNoYXJDb2RlT2YodikgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodikgJiYgdiA+PSB0aGlzLmZpcnN0Q2hhciAmJiB2IDw9IHRoaXMubGFzdENoYXIgPyB2IDogLTE7CiAgfQogIGFtZW5kKG1hcCkgewogICAgdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jZmZfZm9udC5qcwoKCgpjbGFzcyBDRkZGb250IHsKICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzKSB7CiAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwogICAgY29uc3QgcGFyc2VyID0gbmV3IENGRlBhcnNlcihmaWxlLCBwcm9wZXJ0aWVzLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTsKICAgIHRoaXMuY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTsKICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKHRoaXMuY2ZmKTsKICAgIHRoaXMuc2VhY3MgPSB0aGlzLmNmZi5zZWFjczsKICAgIHRyeSB7CiAgICAgIHRoaXMuZGF0YSA9IGNvbXBpbGVyLmNvbXBpbGUoKTsKICAgIH0gY2F0Y2ggewogICAgICB3YXJuKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOwogICAgICB0aGlzLmRhdGEgPSBmaWxlOwogICAgfQogICAgdGhpcy5fY3JlYXRlQnVpbHRJbkVuY29kaW5nKCk7CiAgfQogIGdldCBudW1HbHlwaHMoKSB7CiAgICByZXR1cm4gdGhpcy5jZmYuY2hhclN0cmluZ3MuY291bnQ7CiAgfQogIGdldENoYXJzZXQoKSB7CiAgICByZXR1cm4gdGhpcy5jZmYuY2hhcnNldC5jaGFyc2V0OwogIH0KICBnZXRHbHlwaE1hcHBpbmcoKSB7CiAgICBjb25zdCBjZmYgPSB0aGlzLmNmZjsKICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7CiAgICBjb25zdCB7CiAgICAgIGNpZFRvR2lkTWFwLAogICAgICBjTWFwCiAgICB9ID0gcHJvcGVydGllczsKICAgIGNvbnN0IGNoYXJzZXRzID0gY2ZmLmNoYXJzZXQuY2hhcnNldDsKICAgIGxldCBjaGFyQ29kZVRvR2x5cGhJZDsKICAgIGxldCBnbHlwaElkOwogICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgIGxldCBpbnZDaWRUb0dpZE1hcDsKICAgICAgaWYgKGNpZFRvR2lkTWFwPy5sZW5ndGggPiAwKSB7CiAgICAgICAgaW52Q2lkVG9HaWRNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNpZFRvR2lkTWFwLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGdpZCA9IGNpZFRvR2lkTWFwW2ldOwogICAgICAgICAgaWYgKGdpZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGludkNpZFRvR2lkTWFwW2dpZF0gPSBpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGxldCBjaGFyQ29kZTsKICAgICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2hhcnNldHMubGVuZ3RoOyBnbHlwaElkKyspIHsKICAgICAgICAgIGNvbnN0IGNpZCA9IGNoYXJzZXRzW2dseXBoSWRdOwogICAgICAgICAgY2hhckNvZGUgPSBjTWFwLmNoYXJDb2RlT2YoY2lkKTsKICAgICAgICAgIGlmIChpbnZDaWRUb0dpZE1hcD8uW2NoYXJDb2RlXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNoYXJDb2RlID0gaW52Q2lkVG9HaWRNYXBbY2hhckNvZGVdOwogICAgICAgICAgfQogICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNmZi5jaGFyU3RyaW5ncy5jb3VudDsgZ2x5cGhJZCsrKSB7CiAgICAgICAgICBjaGFyQ29kZSA9IGNNYXAuY2hhckNvZGVPZihnbHlwaElkKTsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKICAgIH0KICAgIGxldCBlbmNvZGluZyA9IGNmZi5lbmNvZGluZyA/IGNmZi5lbmNvZGluZy5lbmNvZGluZyA6IG51bGw7CiAgICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgICBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nOwogICAgfQogICAgY2hhckNvZGVUb0dseXBoSWQgPSB0eXBlMUZvbnRHbHlwaE1hcHBpbmcocHJvcGVydGllcywgZW5jb2RpbmcsIGNoYXJzZXRzKTsKICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgcmV0dXJuIHRoaXMuY2ZmLmhhc0dseXBoSWQoaWQpOwogIH0KICBfY3JlYXRlQnVpbHRJbkVuY29kaW5nKCkgewogICAgY29uc3QgewogICAgICBjaGFyc2V0LAogICAgICBlbmNvZGluZwogICAgfSA9IHRoaXMuY2ZmOwogICAgaWYgKCFjaGFyc2V0IHx8ICFlbmNvZGluZykgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldCwKICAgICAgZW5jb2RpbmdzID0gZW5jb2RpbmcuZW5jb2Rpbmc7CiAgICBjb25zdCBtYXAgPSBbXTsKICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZW5jb2RpbmdzKSB7CiAgICAgIGNvbnN0IGdseXBoSWQgPSBlbmNvZGluZ3NbY2hhckNvZGVdOwogICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gY2hhcnNldHNbZ2x5cGhJZF07CiAgICAgICAgaWYgKGdseXBoTmFtZSkgewogICAgICAgICAgbWFwW2NoYXJDb2RlXSA9IGdseXBoTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXAubGVuZ3RoID4gMCkgewogICAgICB0aGlzLnByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nID0gbWFwOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZm9udF9yZW5kZXJlci5qcwoKCgoKCgpmdW5jdGlvbiBnZXRGbG9hdDIxNChkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gcmVhZEludDE2KGRhdGEsIG9mZnNldCkgLyAxNjM4NDsKfQpmdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycykgewogIGNvbnN0IG51bVN1YnJzID0gc3VicnMubGVuZ3RoOwogIGxldCBiaWFzID0gMzI3Njg7CiAgaWYgKG51bVN1YnJzIDwgMTI0MCkgewogICAgYmlhcyA9IDEwNzsKICB9IGVsc2UgaWYgKG51bVN1YnJzIDwgMzM5MDApIHsKICAgIGJpYXMgPSAxMTMxOwogIH0KICByZXR1cm4gYmlhczsKfQpmdW5jdGlvbiBwYXJzZUNtYXAoZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IG9mZnNldCA9IHJlYWRVaW50MTYoZGF0YSwgc3RhcnQgKyAyKSA9PT0gMSA/IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA4KSA6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxNik7CiAgY29uc3QgZm9ybWF0ID0gcmVhZFVpbnQxNihkYXRhLCBzdGFydCArIG9mZnNldCk7CiAgbGV0IHJhbmdlcywgcCwgaTsKICBpZiAoZm9ybWF0ID09PSA0KSB7CiAgICByZWFkVWludDE2KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgMik7CiAgICBjb25zdCBzZWdDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA2KSA+PiAxOwogICAgcCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTQ7CiAgICByYW5nZXMgPSBbXTsKICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKICAgICAgcmFuZ2VzW2ldID0gewogICAgICAgIGVuZDogcmVhZFVpbnQxNihkYXRhLCBwKQogICAgICB9OwogICAgfQogICAgcCArPSAyOwogICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgewogICAgICByYW5nZXNbaV0uc3RhcnQgPSByZWFkVWludDE2KGRhdGEsIHApOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgewogICAgICByYW5nZXNbaV0uaWREZWx0YSA9IHJlYWRVaW50MTYoZGF0YSwgcCk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CiAgICAgIGxldCBpZE9mZnNldCA9IHJlYWRVaW50MTYoZGF0YSwgcCk7CiAgICAgIGlmIChpZE9mZnNldCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJhbmdlc1tpXS5pZHMgPSBbXTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gcmFuZ2VzW2ldLmVuZCAtIHJhbmdlc1tpXS5zdGFydCArIDE7IGogPCBqajsgaisrKSB7CiAgICAgICAgcmFuZ2VzW2ldLmlkc1tqXSA9IHJlYWRVaW50MTYoZGF0YSwgcCArIGlkT2Zmc2V0KTsKICAgICAgICBpZE9mZnNldCArPSAyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmFuZ2VzOwogIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAxMikgewogICAgY29uc3QgZ3JvdXBzID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTsKICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2OwogICAgcmFuZ2VzID0gW107CiAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHsKICAgICAgc3RhcnQgPSByZWFkVWludDMyKGRhdGEsIHApOwogICAgICByYW5nZXMucHVzaCh7CiAgICAgICAgc3RhcnQsCiAgICAgICAgZW5kOiByZWFkVWludDMyKGRhdGEsIHAgKyA0KSwKICAgICAgICBpZERlbHRhOiByZWFkVWludDMyKGRhdGEsIHAgKyA4KSAtIHN0YXJ0CiAgICAgIH0pOwogICAgICBwICs9IDEyOwogICAgfQogICAgcmV0dXJuIHJhbmdlczsKICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGB1bnN1cHBvcnRlZCBjbWFwOiAke2Zvcm1hdH1gKTsKfQpmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogIGNvbnN0IHBhcnNlciA9IG5ldyBDRkZQYXJzZXIobmV3IFN0cmVhbShkYXRhLCBzdGFydCwgZW5kIC0gc3RhcnQpLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICBjb25zdCBjZmYgPSBwYXJzZXIucGFyc2UoKTsKICByZXR1cm4gewogICAgZ2x5cGhzOiBjZmYuY2hhclN0cmluZ3Mub2JqZWN0cywKICAgIHN1YnJzOiBjZmYudG9wRGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleD8ub2JqZWN0cywKICAgIGdzdWJyczogY2ZmLmdsb2JhbFN1YnJJbmRleD8ub2JqZWN0cywKICAgIGlzQ0ZGQ0lERm9udDogY2ZmLmlzQ0lERm9udCwKICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCiAgICBmZEFycmF5OiBjZmYuZmRBcnJheQogIH07Cn0KZnVuY3Rpb24gcGFyc2VHbHlmVGFibGUoZ2x5ZiwgbG9jYSwgaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICBsZXQgaXRlbVNpemUsIGl0ZW1EZWNvZGU7CiAgaWYgKGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CiAgICBpdGVtU2l6ZSA9IDQ7CiAgICBpdGVtRGVjb2RlID0gcmVhZFVpbnQzMjsKICB9IGVsc2UgewogICAgaXRlbVNpemUgPSAyOwogICAgaXRlbURlY29kZSA9IChkYXRhLCBvZmZzZXQpID0+IDIgKiByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgfQogIGNvbnN0IGdseXBocyA9IFtdOwogIGxldCBzdGFydE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgMCk7CiAgZm9yIChsZXQgaiA9IGl0ZW1TaXplOyBqIDwgbG9jYS5sZW5ndGg7IGogKz0gaXRlbVNpemUpIHsKICAgIGNvbnN0IGVuZE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgaik7CiAgICBnbHlwaHMucHVzaChnbHlmLnN1YmFycmF5KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpKTsKICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OwogIH0KICByZXR1cm4gZ2x5cGhzOwp9CmZ1bmN0aW9uIGxvb2t1cENtYXAocmFuZ2VzLCB1bmljb2RlKSB7CiAgY29uc3QgY29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgbGV0IGdpZCA9IDAsCiAgICBsID0gMCwKICAgIHIgPSByYW5nZXMubGVuZ3RoIC0gMTsKICB3aGlsZSAobCA8IHIpIHsKICAgIGNvbnN0IGMgPSBsICsgciArIDEgPj4gMTsKICAgIGlmIChjb2RlIDwgcmFuZ2VzW2NdLnN0YXJ0KSB7CiAgICAgIHIgPSBjIC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGwgPSBjOwogICAgfQogIH0KICBpZiAocmFuZ2VzW2xdLnN0YXJ0IDw9IGNvZGUgJiYgY29kZSA8PSByYW5nZXNbbF0uZW5kKSB7CiAgICBnaWQgPSByYW5nZXNbbF0uaWREZWx0YSArIChyYW5nZXNbbF0uaWRzID8gcmFuZ2VzW2xdLmlkc1tjb2RlIC0gcmFuZ2VzW2xdLnN0YXJ0XSA6IGNvZGUpICYgMHhmZmZmOwogIH0KICByZXR1cm4gewogICAgY2hhckNvZGU6IGNvZGUsCiAgICBnbHlwaElkOiBnaWQKICB9Owp9CmZ1bmN0aW9uIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIGZvbnQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgaWYgKGZpcnN0UG9pbnQpIHsKICAgICAgY21kcy5hZGQoIkwiLCBmaXJzdFBvaW50KTsKICAgIH0KICAgIGZpcnN0UG9pbnQgPSBbeCwgeV07CiAgICBjbWRzLmFkZCgiTSIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CiAgICBjbWRzLmFkZCgiTCIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIHF1YWRyYXRpY0N1cnZlVG8oeGEsIHlhLCB4LCB5KSB7CiAgICBjbWRzLmFkZCgiUSIsIFt4YSwgeWEsIHgsIHldKTsKICB9CiAgbGV0IGkgPSAwOwogIGNvbnN0IG51bWJlck9mQ29udG91cnMgPSByZWFkSW50MTYoY29kZSwgaSk7CiAgbGV0IGZsYWdzOwogIGxldCBmaXJzdFBvaW50ID0gbnVsbDsKICBsZXQgeCA9IDAsCiAgICB5ID0gMDsKICBpICs9IDEwOwogIGlmIChudW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgZG8gewogICAgICBmbGFncyA9IHJlYWRVaW50MTYoY29kZSwgaSk7CiAgICAgIGNvbnN0IGdseXBoSW5kZXggPSByZWFkVWludDE2KGNvZGUsIGkgKyAyKTsKICAgICAgaSArPSA0OwogICAgICBsZXQgYXJnMSwgYXJnMjsKICAgICAgaWYgKGZsYWdzICYgMHgwMSkgewogICAgICAgIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICAgIGFyZzEgPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gcmVhZEludDE2KGNvZGUsIGkgKyAyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXJnMSA9IHJlYWRVaW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gcmVhZFVpbnQxNihjb2RlLCBpICsgMik7CiAgICAgICAgfQogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICBhcmcxID0gcmVhZEludDgoY29kZSwgaSsrKTsKICAgICAgICBhcmcyID0gcmVhZEludDgoY29kZSwgaSsrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmcxID0gY29kZVtpKytdOwogICAgICAgIGFyZzIgPSBjb2RlW2krK107CiAgICAgIH0KICAgICAgaWYgKGZsYWdzICYgMHgwMikgewogICAgICAgIHggPSBhcmcxOwogICAgICAgIHkgPSBhcmcyOwogICAgICB9IGVsc2UgewogICAgICAgIHggPSAwOwogICAgICAgIHkgPSAwOwogICAgICB9CiAgICAgIGxldCBzY2FsZVggPSAxLAogICAgICAgIHNjYWxlWSA9IDEsCiAgICAgICAgc2NhbGUwMSA9IDAsCiAgICAgICAgc2NhbGUxMCA9IDA7CiAgICAgIGlmIChmbGFncyAmIDB4MDgpIHsKICAgICAgICBzY2FsZVggPSBzY2FsZVkgPSBnZXRGbG9hdDIxNChjb2RlLCBpKTsKICAgICAgICBpICs9IDI7CiAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDQwKSB7CiAgICAgICAgc2NhbGVYID0gZ2V0RmxvYXQyMTQoY29kZSwgaSk7CiAgICAgICAgc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDIpOwogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4ODApIHsKICAgICAgICBzY2FsZVggPSBnZXRGbG9hdDIxNChjb2RlLCBpKTsKICAgICAgICBzY2FsZTAxID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDIpOwogICAgICAgIHNjYWxlMTAgPSBnZXRGbG9hdDIxNChjb2RlLCBpICsgNCk7CiAgICAgICAgc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDYpOwogICAgICAgIGkgKz0gODsKICAgICAgfQogICAgICBjb25zdCBzdWJnbHlwaCA9IGZvbnQuZ2x5cGhzW2dseXBoSW5kZXhdOwogICAgICBpZiAoc3ViZ2x5cGgpIHsKICAgICAgICBjbWRzLnNhdmUoKTsKICAgICAgICBjbWRzLnRyYW5zZm9ybShbc2NhbGVYLCBzY2FsZTAxLCBzY2FsZTEwLCBzY2FsZVksIHgsIHldKTsKICAgICAgICBpZiAoIShmbGFncyAmIDB4MDIpKSB7fQogICAgICAgIGNvbXBpbGVHbHlmKHN1YmdseXBoLCBjbWRzLCBmb250KTsKICAgICAgICBjbWRzLnJlc3RvcmUoKTsKICAgICAgfQogICAgfSB3aGlsZSAoZmxhZ3MgJiAweDIwKTsKICB9IGVsc2UgewogICAgY29uc3QgZW5kUHRzT2ZDb250b3VycyA9IFtdOwogICAgbGV0IGosIGpqOwogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mQ29udG91cnM7IGorKykgewogICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2gocmVhZFVpbnQxNihjb2RlLCBpKSk7CiAgICAgIGkgKz0gMjsKICAgIH0KICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gcmVhZFVpbnQxNihjb2RlLCBpKTsKICAgIGkgKz0gMiArIGluc3RydWN0aW9uTGVuZ3RoOwogICAgY29uc3QgbnVtYmVyT2ZQb2ludHMgPSBlbmRQdHNPZkNvbnRvdXJzLmF0KC0xKSArIDE7CiAgICBjb25zdCBwb2ludHMgPSBbXTsKICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgbnVtYmVyT2ZQb2ludHMpIHsKICAgICAgZmxhZ3MgPSBjb2RlW2krK107CiAgICAgIGxldCByZXBlYXQgPSAxOwogICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CiAgICAgICAgcmVwZWF0ICs9IGNvZGVbaSsrXTsKICAgICAgfQogICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSB7CiAgICAgICAgcG9pbnRzLnB1c2goewogICAgICAgICAgZmxhZ3MKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDEyKSB7CiAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgeCArPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDI6CiAgICAgICAgICB4IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMjoKICAgICAgICAgIHggKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnggPSB4OwogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7CiAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgeSArPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDQ6CiAgICAgICAgICB5IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyNDoKICAgICAgICAgIHkgKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnkgPSB5OwogICAgfQogICAgbGV0IHN0YXJ0UG9pbnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgewogICAgICBjb25zdCBlbmRQb2ludCA9IGVuZFB0c09mQ29udG91cnNbaV07CiAgICAgIGNvbnN0IGNvbnRvdXIgPSBwb2ludHMuc2xpY2Uoc3RhcnRQb2ludCwgZW5kUG9pbnQgKyAxKTsKICAgICAgaWYgKGNvbnRvdXJbMF0uZmxhZ3MgJiAxKSB7CiAgICAgICAgY29udG91ci5wdXNoKGNvbnRvdXJbMF0pOwogICAgICB9IGVsc2UgaWYgKGNvbnRvdXIuYXQoLTEpLmZsYWdzICYgMSkgewogICAgICAgIGNvbnRvdXIudW5zaGlmdChjb250b3VyLmF0KC0xKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgcCA9IHsKICAgICAgICAgIGZsYWdzOiAxLAogICAgICAgICAgeDogKGNvbnRvdXJbMF0ueCArIGNvbnRvdXIuYXQoLTEpLngpIC8gMiwKICAgICAgICAgIHk6IChjb250b3VyWzBdLnkgKyBjb250b3VyLmF0KC0xKS55KSAvIDIKICAgICAgICB9OwogICAgICAgIGNvbnRvdXIudW5zaGlmdChwKTsKICAgICAgICBjb250b3VyLnB1c2gocCk7CiAgICAgIH0KICAgICAgbW92ZVRvKGNvbnRvdXJbMF0ueCwgY29udG91clswXS55KTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb250b3VyLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBpZiAoY29udG91cltqXS5mbGFncyAmIDEpIHsKICAgICAgICAgIGxpbmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSk7CiAgICAgICAgfSBlbHNlIGlmIChjb250b3VyW2ogKyAxXS5mbGFncyAmIDEpIHsKICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnksIGNvbnRvdXJbaiArIDFdLngsIGNvbnRvdXJbaiArIDFdLnkpOwogICAgICAgICAgaisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBxdWFkcmF0aWNDdXJ2ZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55LCAoY29udG91cltqXS54ICsgY29udG91cltqICsgMV0ueCkgLyAyLCAoY29udG91cltqXS55ICsgY29udG91cltqICsgMV0ueSkgLyAyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhcnRQb2ludCA9IGVuZFBvaW50ICsgMTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gY29tcGlsZUNoYXJTdHJpbmcoY2hhclN0cmluZ0NvZGUsIGNtZHMsIGZvbnQsIGdseXBoSWQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgaWYgKGZpcnN0UG9pbnQpIHsKICAgICAgY21kcy5hZGQoIkwiLCBmaXJzdFBvaW50KTsKICAgIH0KICAgIGZpcnN0UG9pbnQgPSBbeCwgeV07CiAgICBjbWRzLmFkZCgiTSIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CiAgICBjbWRzLmFkZCgiTCIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKICAgIGNtZHMuYWRkKCJDIiwgW3gxLCB5MSwgeDIsIHkyLCB4LCB5XSk7CiAgfQogIGNvbnN0IHN0YWNrID0gW107CiAgbGV0IHggPSAwLAogICAgeSA9IDA7CiAgbGV0IHN0ZW1zID0gMDsKICBsZXQgZmlyc3RQb2ludCA9IG51bGw7CiAgZnVuY3Rpb24gcGFyc2UoY29kZSkgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBjb2RlLmxlbmd0aCkgewogICAgICBsZXQgc3RhY2tDbGVhbiA9IGZhbHNlOwogICAgICBsZXQgdiA9IGNvZGVbaSsrXTsKICAgICAgbGV0IHhhLCB4YiwgeWEsIHliLCB5MSwgeTIsIHkzLCBuLCBzdWJyQ29kZTsKICAgICAgc3dpdGNoICh2KSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN1YnJDb2RlID0gbnVsbDsKICAgICAgICAgIGlmIChmb250LmlzQ0ZGQ0lERm9udCkgewogICAgICAgICAgICBjb25zdCBmZEluZGV4ID0gZm9udC5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOwogICAgICAgICAgICBpZiAoZmRJbmRleCA+PSAwICYmIGZkSW5kZXggPCBmb250LmZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgY29uc3QgZm9udERpY3QgPSBmb250LmZkQXJyYXlbZmRJbmRleF07CiAgICAgICAgICAgICAgbGV0IHN1YnJzOwogICAgICAgICAgICAgIGlmIChmb250RGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleCkgewogICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdWJycykgewogICAgICAgICAgICAgICAgbiArPSBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycyk7CiAgICAgICAgICAgICAgICBzdWJyQ29kZSA9IHN1YnJzW25dOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3VickNvZGUgPSBmb250LnN1YnJzW24gKyBmb250LnN1YnJzQmlhc107CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VickNvZGUpIHsKICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMToKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIDEyOgogICAgICAgICAgdiA9IGNvZGVbaSsrXTsKICAgICAgICAgIHN3aXRjaCAodikgewogICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHksIHhiLCB5MSwgeCwgeTEpOwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHksIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTIgPSB5MSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHkyLCB4LCB5Mik7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5MyA9IHkyICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkyLCB4YiwgeTMsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgIGNvbnN0IHgwID0geCwKICAgICAgICAgICAgICAgIHkwID0geTsKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGI7CiAgICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICAgIGlmIChNYXRoLmFicyh4IC0geDApID4gTWF0aC5hYnMoeSAtIHkwKSkgewogICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogMTIgJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPj0gNCkgewogICAgICAgICAgICBjb25zdCBhY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBjb25zdCBiY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICB5ID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHggPSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgY21kcy5zYXZlKCk7CiAgICAgICAgICAgIGNtZHMudHJhbnNsYXRlKHgsIHkpOwogICAgICAgICAgICBsZXQgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgICBjbWRzLnJlc3RvcmUoKTsKICAgICAgICAgICAgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYmNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgMTg6CiAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOToKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMDoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMToKICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7CiAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDIyOgogICAgICAgICAgeCArPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG1vdmVUbyh4LCB5KTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI0OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gNikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjY6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHg7CiAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjc6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjg6CiAgICAgICAgICBzdGFjay5wdXNoKHJlYWRJbnQxNihjb2RlLCBpKSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI5OgogICAgICAgICAgbiA9IHN0YWNrLnBvcCgpICsgZm9udC5nc3VicnNCaWFzOwogICAgICAgICAgc3VickNvZGUgPSBmb250LmdzdWJyc1tuXTsKICAgICAgICAgIGlmIChzdWJyQ29kZSkgewogICAgICAgICAgICBwYXJzZShzdWJyQ29kZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMwOgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeGEgPSB4OwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5OwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzMToKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHlhID0geTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhhID0geDsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAodiA8IDMyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHYgPCAyNDcpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh2IC0gMTM5KTsKICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1MSkgewogICAgICAgICAgICBzdGFjay5wdXNoKCh2IC0gMjQ3KSAqIDI1NiArIGNvZGVbaSsrXSArIDEwOCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHYgPCAyNTUpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCgtKHYgLSAyNTEpICogMjU2IC0gY29kZVtpKytdIC0gMTA4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNiB8IGNvZGVbaSArIDJdIDw8IDggfCBjb2RlW2kgKyAzXSkgLyA2NTUzNik7CiAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChzdGFja0NsZWFuKSB7CiAgICAgICAgc3RhY2subGVuZ3RoID0gMDsKICAgICAgfQogICAgfQogIH0KICBwYXJzZShjaGFyU3RyaW5nQ29kZSk7Cn0KY29uc3QgTk9PUCA9ICIiOwpjbGFzcyBDb21tYW5kcyB7CiAgY21kcyA9IFtdOwogIHRyYW5zZm9ybVN0YWNrID0gW107CiAgY3VycmVudFRyYW5zZm9ybSA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKICBhZGQoY21kLCBhcmdzKSB7CiAgICBpZiAoYXJncykgewogICAgICBjb25zdCBbYSwgYiwgYywgZCwgZSwgZl0gPSB0aGlzLmN1cnJlbnRUcmFuc2Zvcm07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIGNvbnN0IHggPSBhcmdzW2ldOwogICAgICAgIGNvbnN0IHkgPSBhcmdzW2kgKyAxXTsKICAgICAgICBhcmdzW2ldID0gYSAqIHggKyBjICogeSArIGU7CiAgICAgICAgYXJnc1tpICsgMV0gPSBiICogeCArIGQgKiB5ICsgZjsKICAgICAgfQogICAgICB0aGlzLmNtZHMucHVzaChgJHtjbWR9JHthcmdzLmpvaW4oIiAiKX1gKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuY21kcy5wdXNoKGNtZCk7CiAgICB9CiAgfQogIHRyYW5zZm9ybSh0cmFuc2YpIHsKICAgIHRoaXMuY3VycmVudFRyYW5zZm9ybSA9IFV0aWwudHJhbnNmb3JtKHRoaXMuY3VycmVudFRyYW5zZm9ybSwgdHJhbnNmKTsKICB9CiAgdHJhbnNsYXRlKHgsIHkpIHsKICAgIHRoaXMudHJhbnNmb3JtKFsxLCAwLCAwLCAxLCB4LCB5XSk7CiAgfQogIHNhdmUoKSB7CiAgICB0aGlzLnRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5jdXJyZW50VHJhbnNmb3JtLnNsaWNlKCkpOwogIH0KICByZXN0b3JlKCkgewogICAgdGhpcy5jdXJyZW50VHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1TdGFjay5wb3AoKSB8fCBbMSwgMCwgMCwgMSwgMCwgMF07CiAgfQogIGdldFNWRygpIHsKICAgIHJldHVybiB0aGlzLmNtZHMuam9pbigiIik7CiAgfQp9CmNsYXNzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoZm9udE1hdHJpeCkgewogICAgdGhpcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgZ2V0UGF0aEpzKHVuaWNvZGUpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhckNvZGUsCiAgICAgIGdseXBoSWQKICAgIH0gPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CiAgICBsZXQgZm4gPSB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdLAogICAgICBjb21waWxlRXg7CiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCkgewogICAgICB0cnkgewogICAgICAgIGZuID0gdGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbZ2x5cGhJZF0sIGdseXBoSWQpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGZuID0gTk9PUDsKICAgICAgICBjb21waWxlRXggPSBleDsKICAgICAgfQogICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdID0gZm47CiAgICB9CiAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID8/PSBnbHlwaElkOwogICAgaWYgKGNvbXBpbGVFeCkgewogICAgICB0aHJvdyBjb21waWxlRXg7CiAgICB9CiAgICByZXR1cm4gZm47CiAgfQogIGNvbXBpbGVHbHlwaChjb2RlLCBnbHlwaElkKSB7CiAgICBpZiAoIWNvZGU/Lmxlbmd0aCB8fCBjb2RlWzBdID09PSAxNCkgewogICAgICByZXR1cm4gTk9PUDsKICAgIH0KICAgIGxldCBmb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4OwogICAgaWYgKHRoaXMuaXNDRkZDSURGb250KSB7CiAgICAgIGNvbnN0IGZkSW5kZXggPSB0aGlzLmZkU2VsZWN0LmdldEZESW5kZXgoZ2x5cGhJZCk7CiAgICAgIGlmIChmZEluZGV4ID49IDAgJiYgZmRJbmRleCA8IHRoaXMuZmRBcnJheS5sZW5ndGgpIHsKICAgICAgICBjb25zdCBmb250RGljdCA9IHRoaXMuZmRBcnJheVtmZEluZGV4XTsKICAgICAgICBmb250TWF0cml4ID0gZm9udERpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4IikgfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChpc051bWJlckFycmF5KGZvbnRNYXRyaXgsIDYpLCAiRXhwZWN0ZWQgYSB2YWxpZCBmb250TWF0cml4LiIpOwogICAgY29uc3QgY21kcyA9IG5ldyBDb21tYW5kcygpOwogICAgY21kcy50cmFuc2Zvcm0oZm9udE1hdHJpeC5zbGljZSgpKTsKICAgIHRoaXMuY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKTsKICAgIGNtZHMuYWRkKCJaIik7CiAgICByZXR1cm4gY21kcy5nZXRTVkcoKTsKICB9CiAgY29tcGlsZUdseXBoSW1wbCgpIHsKICAgIHVucmVhY2hhYmxlKCJDaGlsZHJlbiBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcy4iKTsKICB9CiAgaGFzQnVpbHRQYXRoKHVuaWNvZGUpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhckNvZGUsCiAgICAgIGdseXBoSWQKICAgIH0gPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CiAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tnbHlwaElkXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gIT09IHVuZGVmaW5lZDsKICB9Cn0KY2xhc3MgVHJ1ZVR5cGVDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoZ2x5cGhzLCBjbWFwLCBmb250TWF0cml4KSB7CiAgICBzdXBlcihmb250TWF0cml4IHx8IFswLjAwMDQ4OCwgMCwgMCwgMC4wMDA0ODgsIDAsIDBdKTsKICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzOwogICAgdGhpcy5jbWFwID0gY21hcDsKICB9CiAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzKSB7CiAgICBjb21waWxlR2x5Zihjb2RlLCBjbWRzLCB0aGlzKTsKICB9Cn0KY2xhc3MgVHlwZTJDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoY2ZmSW5mbywgY21hcCwgZm9udE1hdHJpeCkgewogICAgc3VwZXIoZm9udE1hdHJpeCB8fCBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXSk7CiAgICB0aGlzLmdseXBocyA9IGNmZkluZm8uZ2x5cGhzOwogICAgdGhpcy5nc3VicnMgPSBjZmZJbmZvLmdzdWJycyB8fCBbXTsKICAgIHRoaXMuc3VicnMgPSBjZmZJbmZvLnN1YnJzIHx8IFtdOwogICAgdGhpcy5jbWFwID0gY21hcDsKICAgIHRoaXMuZ2x5cGhOYW1lTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogICAgdGhpcy5nc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5nc3VicnMpOwogICAgdGhpcy5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLnN1YnJzKTsKICAgIHRoaXMuaXNDRkZDSURGb250ID0gY2ZmSW5mby5pc0NGRkNJREZvbnQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gY2ZmSW5mby5mZFNlbGVjdDsKICAgIHRoaXMuZmRBcnJheSA9IGNmZkluZm8uZmRBcnJheTsKICB9CiAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKSB7CiAgICBjb21waWxlQ2hhclN0cmluZyhjb2RlLCBjbWRzLCB0aGlzLCBnbHlwaElkKTsKICB9Cn0KY2xhc3MgRm9udFJlbmRlcmVyRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZShmb250LCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZm9udC5kYXRhKTsKICAgIGxldCBjbWFwLCBnbHlmLCBsb2NhLCBjZmYsIGluZGV4VG9Mb2NGb3JtYXQsIHVuaXRzUGVyRW07CiAgICBjb25zdCBudW1UYWJsZXMgPSByZWFkVWludDE2KGRhdGEsIDQpOwogICAgZm9yIChsZXQgaSA9IDAsIHAgPSAxMjsgaSA8IG51bVRhYmxlczsgaSsrLCBwICs9IDE2KSB7CiAgICAgIGNvbnN0IHRhZyA9IGJ5dGVzVG9TdHJpbmcoZGF0YS5zdWJhcnJheShwLCBwICsgNCkpOwogICAgICBjb25zdCBvZmZzZXQgPSByZWFkVWludDMyKGRhdGEsIHAgKyA4KTsKICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQzMihkYXRhLCBwICsgMTIpOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgImNtYXAiOgogICAgICAgICAgY21hcCA9IHBhcnNlQ21hcChkYXRhLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnbHlmIjoKICAgICAgICAgIGdseWYgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvY2EiOgogICAgICAgICAgbG9jYSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaGVhZCI6CiAgICAgICAgICB1bml0c1BlckVtID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQgKyAxOCk7CiAgICAgICAgICBpbmRleFRvTG9jRm9ybWF0ID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQgKyA1MCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDRkYgIjoKICAgICAgICAgIGNmZiA9IHBhcnNlQ2ZmKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoZ2x5ZikgewogICAgICBjb25zdCBmb250TWF0cml4ID0gIXVuaXRzUGVyRW0gPyBmb250LmZvbnRNYXRyaXggOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTsKICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLCBjbWFwLCBmb250TWF0cml4KTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZTJDb21waWxlZChjZmYsIGNtYXAsIGZvbnQuZm9udE1hdHJpeCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9tZXRyaWNzLmpzCgpjb25zdCBnZXRNZXRyaWNzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZCJdID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IDYwMDsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IDYwMDsKICB0LkhlbHZldGljYSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogICAgdC5zcGFjZSA9IDI3ODsKICAgIHQuZXhjbGFtID0gMjc4OwogICAgdC5xdW90ZWRibCA9IDM1NTsKICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKICAgIHQuZG9sbGFyID0gNTU2OwogICAgdC5wZXJjZW50ID0gODg5OwogICAgdC5hbXBlcnNhbmQgPSA2Njc7CiAgICB0LnF1b3RlcmlnaHQgPSAyMjI7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSAzODk7CiAgICB0LnBsdXMgPSA1ODQ7CiAgICB0LmNvbW1hID0gMjc4OwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI3ODsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1NTY7CiAgICB0Lm9uZSA9IDU1NjsKICAgIHQudHdvID0gNTU2OwogICAgdC50aHJlZSA9IDU1NjsKICAgIHQuZm91ciA9IDU1NjsKICAgIHQuZml2ZSA9IDU1NjsKICAgIHQuc2l4ID0gNTU2OwogICAgdC5zZXZlbiA9IDU1NjsKICAgIHQuZWlnaHQgPSA1NTY7CiAgICB0Lm5pbmUgPSA1NTY7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1ODQ7CiAgICB0LmVxdWFsID0gNTg0OwogICAgdC5ncmVhdGVyID0gNTg0OwogICAgdC5xdWVzdGlvbiA9IDU1NjsKICAgIHQuYXQgPSAxMDE1OwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDI3ODsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAyNzg7CiAgICB0LmFzY2lpY2lyY3VtID0gNDY5OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyMjI7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA1MDA7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1NTY7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyMjI7CiAgICB0LmogPSAyMjI7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyMjI7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1NTY7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSAzMzM7CiAgICB0LnMgPSA1MDA7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDMzNDsKICAgIHQuYmFyID0gMjYwOwogICAgdC5icmFjZXJpZ2h0ID0gMzM0OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAxOTE7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDUzNzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDIyMjsKICAgIHQucXVvdGVkYmxiYXNlID0gMzMzOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjIyOwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDUwMDsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjIyOwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDUwMDsKICAgIHQuc2NlZGlsbGEgPSA1MDA7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ3MTsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDY2NzsKICAgIHQucmNhcm9uID0gMzMzOwogICAgdC5jY2VkaWxsYSA9IDUwMDsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA2NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDY2NzsKICAgIHQuQWJyZXZlID0gNjY3OwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDc2OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTAwOwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI2MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzMzOwogICAgdC5vbWFjcm9uID0gNTU2OwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7CiAgICB0LnRjYXJvbiA9IDMxNzsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNjY3OwogICAgdC5BZGllcmVzaXMgPSA2Njc7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjIyOwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDU1NjsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTAwOwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gMjk5OwogICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkxhY3V0ZSA9IDU1NjsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA1NTY7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1NTY7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA1NTY7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDU1NjsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgPSA0NTM7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDU1NjsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LkF0aWxkZSA9IDY2NzsKICAgIHQuQW9nb25layA9IDY2NzsKICAgIHQuQXJpbmcgPSA2Njc7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDU1NjsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5ldGggPSA1NTY7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDc0OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDcyMjsKICAgIHQucXVvdGVyaWdodCA9IDI3ODsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAzMzM7CiAgICB0LnNlbWljb2xvbiA9IDMzMzsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNjExOwogICAgdC5hdCA9IDk3NTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDcyMjsKICAgIHQuQyA9IDcyMjsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDY2NzsKICAgIHQuRiA9IDYxMTsKICAgIHQuRyA9IDc3ODsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDI3ODsKICAgIHQuSiA9IDU1NjsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDgzMzsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDc3ODsKICAgIHQuUCA9IDY2NzsKICAgIHQuUSA9IDc3ODsKICAgIHQuUiA9IDcyMjsKICAgIHQuUyA9IDY2NzsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDY2NzsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDY2NzsKICAgIHQuWSA9IDY2NzsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDU4NDsKICAgIHQudW5kZXJzY29yZSA9IDU1NjsKICAgIHQucXVvdGVsZWZ0ID0gMjc4OwogICAgdC5hID0gNTU2OwogICAgdC5iID0gNjExOwogICAgdC5jID0gNTU2OwogICAgdC5kID0gNjExOwogICAgdC5lID0gNTU2OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNjExOwogICAgdC5oID0gNjExOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTU2OwogICAgdC5sID0gMjc4OwogICAgdC5tID0gODg5OwogICAgdC5uID0gNjExOwogICAgdC5vID0gNjExOwogICAgdC5wID0gNjExOwogICAgdC5xID0gNjExOwogICAgdC5yID0gMzg5OwogICAgdC5zID0gNTU2OwogICAgdC50ID0gMzMzOwogICAgdC51ID0gNjExOwogICAgdC52ID0gNTU2OwogICAgdC53ID0gNzc4OwogICAgdC54ID0gNTU2OwogICAgdC55ID0gNTU2OwogICAgdC56ID0gNTAwOwogICAgdC5icmFjZWxlZnQgPSAzODk7CiAgICB0LmJhciA9IDI4MDsKICAgIHQuYnJhY2VyaWdodCA9IDM4OTsKICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDU1NjsKICAgIHQuc3RlcmxpbmcgPSA1NTY7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1NTY7CiAgICB0LmZsb3JpbiA9IDU1NjsKICAgIHQuc2VjdGlvbiA9IDU1NjsKICAgIHQuY3VycmVuY3kgPSA1NTY7CiAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OwogICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDYxMTsKICAgIHQuZmwgPSA2MTE7CiAgICB0LmVuZGFzaCA9IDU1NjsKICAgIHQuZGFnZ2VyID0gNTU2OwogICAgdC5kYWdnZXJkYmwgPSA1NTY7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OwogICAgdC5wYXJhZ3JhcGggPSA1NTY7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyNzg7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSAxMDAwOwogICAgdC5vcmRmZW1pbmluZSA9IDM3MDsKICAgIHQuTHNsYXNoID0gNjExOwogICAgdC5Pc2xhc2ggPSA3Nzg7CiAgICB0Lk9FID0gMTAwMDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OwogICAgdC5hZSA9IDg4OTsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNjExOwogICAgdC5vZSA9IDk0NDsKICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKICAgIHQuSWRpZXJlc2lzID0gMjc4OwogICAgdC5lYWN1dGUgPSA1NTY7CiAgICB0LmFicmV2ZSA9IDU1NjsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuZWNhcm9uID0gNTU2OwogICAgdC5ZZGllcmVzaXMgPSA2Njc7CiAgICB0LmRpdmlkZSA9IDU4NDsKICAgIHQuWWFjdXRlID0gNjY3OwogICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuYWFjdXRlID0gNTU2OwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNTU2OwogICAgdC5zY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTU2OwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA2MTE7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzM3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA1NTY7CiAgICB0LmFyaW5nID0gNTU2OwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTU2OwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDcyMjsKICAgIHQuYXRpbGRlID0gNTU2OwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSA1NTY7CiAgICB0LnNjZWRpbGxhID0gNTU2OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDcyMjsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OwogICAgdC51Y2lyY3VtZmxleCA9IDYxMTsKICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LkFtYWNyb24gPSA3MjI7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA1NTY7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjY3OwogICAgdC5PbWFjcm9uID0gNzc4OwogICAgdC5SYWN1dGUgPSA3MjI7CiAgICB0LlNhY3V0ZSA9IDY2NzsKICAgIHQuZGNhcm9uID0gNzQzOwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDYxMTsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMzsKICAgIHQuT2dyYXZlID0gNzc4OwogICAgdC5BZ3JhdmUgPSA3MjI7CiAgICB0LkFicmV2ZSA9IDcyMjsKICAgIHQubXVsdGlwbHkgPSA1ODQ7CiAgICB0LnVhY3V0ZSA9IDYxMTsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNTU2OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTU2OwogICAgdC5lZGllcmVzaXMgPSA1NTY7CiAgICB0LmNhY3V0ZSA9IDU1NjsKICAgIHQubmFjdXRlID0gNjExOwogICAgdC51bWFjcm9uID0gNjExOwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDI3ODsKICAgIHQucGx1c21pbnVzID0gNTg0OwogICAgdC5icm9rZW5iYXIgPSAyODA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7CiAgICB0LkdicmV2ZSA9IDc3ODsKICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDYxMTsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDcyMjsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzODk7CiAgICB0LmVvZ29uZWsgPSA1NTY7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDcyMjsKICAgIHQuQWRpZXJlc2lzID0gNzIyOwogICAgdC5lZ3JhdmUgPSA1NTY7CiAgICB0LnphY3V0ZSA9IDUwMDsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzc4OwogICAgdC5vYWN1dGUgPSA2MTE7CiAgICB0LmFtYWNyb24gPSA1NTY7CiAgICB0LnNhY3V0ZSA9IDU1NjsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA2MTE7CiAgICB0LnR3b3N1cGVyaW9yID0gMzMzOwogICAgdC5PZGllcmVzaXMgPSA3Nzg7CiAgICB0Lm11ID0gNjExOwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDYxMTsKICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKICAgIHQuU2NlZGlsbGEgPSA2Njc7CiAgICB0LmxjYXJvbiA9IDQwMDsKICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CiAgICB0LklncmF2ZSA9IDI3ODsKICAgIHQuSW1hY3JvbiA9IDI3ODsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gODM0OwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOwogICAgdC5udGlsZGUgPSA2MTE7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDU1NjsKICAgIHQuZ2JyZXZlID0gNjExOwogICAgdC5vbmVxdWFydGVyID0gODM0OwogICAgdC5TY2Fyb24gPSA2Njc7CiAgICB0LlNjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA2MTE7CiAgICB0LkNjYXJvbiA9IDcyMjsKICAgIHQudWdyYXZlID0gNjExOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA2MTE7CiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3Nzg7CiAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDI3ODsKICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5taW51cyA9IDU4NDsKICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CiAgICB0Lm5jYXJvbiA9IDYxMTsKICAgIHQudGNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5sb2dpY2Fsbm90ID0gNTg0OwogICAgdC5vZGllcmVzaXMgPSA2MTE7CiAgICB0LnVkaWVyZXNpcyA9IDYxMTsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuZXRoID0gNjExOwogICAgdC56Y2Fyb24gPSA1MDA7CiAgICB0Lm5jb21tYWFjY2VudCA9IDYxMTsKICAgIHQub25lc3VwZXJpb3IgPSAzMzM7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1NTY7CiAgfSk7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0NzQ7CiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CiAgICB0LmRvbGxhciA9IDU1NjsKICAgIHQucGVyY2VudCA9IDg4OTsKICAgIHQuYW1wZXJzYW5kID0gNzIyOwogICAgdC5xdW90ZXJpZ2h0ID0gMjc4OwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gMzg5OwogICAgdC5wbHVzID0gNTg0OwogICAgdC5jb21tYSA9IDI3ODsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNzg7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTU2OwogICAgdC5vbmUgPSA1NTY7CiAgICB0LnR3byA9IDU1NjsKICAgIHQudGhyZWUgPSA1NTY7CiAgICB0LmZvdXIgPSA1NTY7CiAgICB0LmZpdmUgPSA1NTY7CiAgICB0LnNpeCA9IDU1NjsKICAgIHQuc2V2ZW4gPSA1NTY7CiAgICB0LmVpZ2h0ID0gNTU2OwogICAgdC5uaW5lID0gNTU2OwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTg0OwogICAgdC5lcXVhbCA9IDU4NDsKICAgIHQuZ3JlYXRlciA9IDU4NDsKICAgIHQucXVlc3Rpb24gPSA2MTE7CiAgICB0LmF0ID0gOTc1OwogICAgdC5BID0gNzIyOwogICAgdC5CID0gNzIyOwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTU2OwogICAgdC5LID0gNzIyOwogICAgdC5MID0gNjExOwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTg0OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyNzg7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA2MTE7CiAgICB0LmMgPSA1NTY7CiAgICB0LmQgPSA2MTE7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA2MTE7CiAgICB0LmggPSA2MTE7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4ODk7CiAgICB0Lm4gPSA2MTE7CiAgICB0Lm8gPSA2MTE7CiAgICB0LnAgPSA2MTE7CiAgICB0LnEgPSA2MTE7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSA1NTY7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA2MTE7CiAgICB0LnYgPSA1NTY7CiAgICB0LncgPSA3Nzg7CiAgICB0LnggPSA1NTY7CiAgICB0LnkgPSA1NTY7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDM4OTsKICAgIHQuYmFyID0gMjgwOwogICAgdC5icmFjZXJpZ2h0ID0gMzg5OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAyMzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNjExOwogICAgdC5mbCA9IDYxMTsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDU1NjsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDI3ODsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNjExOwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1NTY7CiAgICB0LnNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDYxMTsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDU1NjsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDU1NjsKICAgIHQuc2NlZGlsbGEgPSA1NTY7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNjExOwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gMzg5OwogICAgdC5jY2VkaWxsYSA9IDU1NjsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA3NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNjExOwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNjExOwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1NTY7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTU2OwogICAgdC5uYWN1dGUgPSA2MTE7CiAgICB0LnVtYWNyb24gPSA2MTE7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI4MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzg5OwogICAgdC5vbWFjcm9uID0gNjExOwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDM4OTsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDYxMTsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTU2OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDYxMTsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA2MTE7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNjExOwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gNDAwOwogICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LkxhY3V0ZSA9IDYxMTsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA2MTE7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA2MTE7CiAgICB0Lm50aWxkZSA9IDYxMTsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA2MTE7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDYxMTsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA2MTE7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDYxMTsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNjExOwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDYxMTsKICAgIHQudWRpZXJlc2lzID0gNjExOwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNjExOwogICAgdC5ldGggPSA2MTE7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNjExOwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAyNzg7CiAgICB0LnF1b3RlZGJsID0gMzU1OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDY2NzsKICAgIHQucXVvdGVyaWdodCA9IDIyMjsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNTU2OwogICAgdC5hdCA9IDEwMTU7CiAgICB0LkEgPSA2Njc7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3MjI7CiAgICB0LkkgPSAyNzg7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA2Njc7CiAgICB0LkwgPSA1NTY7CiAgICB0Lk0gPSA4MzM7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2Njc7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA2Njc7CiAgICB0LlQgPSA2MTE7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA2Njc7CiAgICB0LlcgPSA5NDQ7CiAgICB0LlggPSA2Njc7CiAgICB0LlkgPSA2Njc7CiAgICB0LlogPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OwogICAgdC5iYWNrc2xhc2ggPSAyNzg7CiAgICB0LmJyYWNrZXRyaWdodCA9IDI3ODsKICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CiAgICB0LnF1b3RlbGVmdCA9IDIyMjsKICAgIHQuYSA9IDU1NjsKICAgIHQuYiA9IDU1NjsKICAgIHQuYyA9IDUwMDsKICAgIHQuZCA9IDU1NjsKICAgIHQuZSA9IDU1NjsKICAgIHQuZiA9IDI3ODsKICAgIHQuZyA9IDU1NjsKICAgIHQuaCA9IDU1NjsKICAgIHQuaSA9IDIyMjsKICAgIHQuaiA9IDIyMjsKICAgIHQuayA9IDUwMDsKICAgIHQubCA9IDIyMjsKICAgIHQubSA9IDgzMzsKICAgIHQubiA9IDU1NjsKICAgIHQubyA9IDU1NjsKICAgIHQucCA9IDU1NjsKICAgIHQucSA9IDU1NjsKICAgIHQuciA9IDMzMzsKICAgIHQucyA9IDUwMDsKICAgIHQudCA9IDI3ODsKICAgIHQudSA9IDU1NjsKICAgIHQudiA9IDUwMDsKICAgIHQudyA9IDcyMjsKICAgIHQueCA9IDUwMDsKICAgIHQueSA9IDUwMDsKICAgIHQueiA9IDUwMDsKICAgIHQuYnJhY2VsZWZ0ID0gMzM0OwogICAgdC5iYXIgPSAyNjA7CiAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7CiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CiAgICB0LmNlbnQgPSA1NTY7CiAgICB0LnN0ZXJsaW5nID0gNTU2OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQueWVuID0gNTU2OwogICAgdC5mbG9yaW4gPSA1NTY7CiAgICB0LnNlY3Rpb24gPSA1NTY7CiAgICB0LmN1cnJlbmN5ID0gNTU2OwogICAgdC5xdW90ZXNpbmdsZSA9IDE5MTsKICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OwogICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOwogICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKICAgIHQuZmkgPSA1MDA7CiAgICB0LmZsID0gNTAwOwogICAgdC5lbmRhc2ggPSA1NTY7CiAgICB0LmRhZ2dlciA9IDU1NjsKICAgIHQuZGFnZ2VyZGJsID0gNTU2OwogICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKICAgIHQucGFyYWdyYXBoID0gNTM3OwogICAgdC5idWxsZXQgPSAzNTA7CiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOwogICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJscmlnaHQgPSAzMzM7CiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNjExOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDEwMDA7CiAgICB0LkFFID0gMTAwMDsKICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CiAgICB0LkxzbGFzaCA9IDU1NjsKICAgIHQuT3NsYXNoID0gNzc4OwogICAgdC5PRSA9IDEwMDA7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKICAgIHQuYWUgPSA4ODk7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyMjI7CiAgICB0Lm9zbGFzaCA9IDYxMTsKICAgIHQub2UgPSA5NDQ7CiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CiAgICB0LklkaWVyZXNpcyA9IDI3ODsKICAgIHQuZWFjdXRlID0gNTU2OwogICAgdC5hYnJldmUgPSA1NTY7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LmVjYXJvbiA9IDU1NjsKICAgIHQuWWRpZXJlc2lzID0gNjY3OwogICAgdC5kaXZpZGUgPSA1ODQ7CiAgICB0LllhY3V0ZSA9IDY2NzsKICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFhY3V0ZSA9IDU1NjsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDU1NjsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTU2OwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDczNzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNTAwOwogICAgdC5hcmluZyA9IDU1NjsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyMjI7CiAgICB0LmFncmF2ZSA9IDU1NjsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA3MjI7CiAgICB0LmF0aWxkZSA9IDU1NjsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gNTAwOwogICAgdC5zY2VkaWxsYSA9IDUwMDsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA3MjI7CiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5BbWFjcm9uID0gNjY3OwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNTAwOwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDY2NzsKICAgIHQuT21hY3JvbiA9IDc3ODsKICAgIHQuUmFjdXRlID0gNzIyOwogICAgdC5TYWN1dGUgPSA2Njc7CiAgICB0LmRjYXJvbiA9IDY0MzsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1NTY7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9ncmF2ZSA9IDc3ODsKICAgIHQuQWdyYXZlID0gNjY3OwogICAgdC5BYnJldmUgPSA2Njc7CiAgICB0Lm11bHRpcGx5ID0gNTg0OwogICAgdC51YWN1dGUgPSA1NTY7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDU1NjsKICAgIHQuZWRpZXJlc2lzID0gNTU2OwogICAgdC5jYWN1dGUgPSA1MDA7CiAgICB0Lm5hY3V0ZSA9IDU1NjsKICAgIHQudW1hY3JvbiA9IDU1NjsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAyNzg7CiAgICB0LnBsdXNtaW51cyA9IDU4NDsKICAgIHQuYnJva2VuYmFyID0gMjYwOwogICAgdC5yZWdpc3RlcmVkID0gNzM3OwogICAgdC5HYnJldmUgPSA3Nzg7CiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1NTY7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA3MjI7CiAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjsKICAgIHQudGNhcm9uID0gMzE3OwogICAgdC5lb2dvbmVrID0gNTU2OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2Njc7CiAgICB0LkFkaWVyZXNpcyA9IDY2NzsKICAgIHQuZWdyYXZlID0gNTU2OwogICAgdC56YWN1dGUgPSA1MDA7CiAgICB0LmlvZ29uZWsgPSAyMjI7CiAgICB0Lk9hY3V0ZSA9IDc3ODsKICAgIHQub2FjdXRlID0gNTU2OwogICAgdC5hbWFjcm9uID0gNTU2OwogICAgdC5zYWN1dGUgPSA1MDA7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTU2OwogICAgdC50d29zdXBlcmlvciA9IDMzMzsKICAgIHQuT2RpZXJlc2lzID0gNzc4OwogICAgdC5tdSA9IDU1NjsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA1NTY7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CiAgICB0LlNjZWRpbGxhID0gNjY3OwogICAgdC5sY2Fyb24gPSAyOTk7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNTU2OwogICAgdC5JZ3JhdmUgPSAyNzg7CiAgICB0LkltYWNyb24gPSAyNzg7CiAgICB0LkxjYXJvbiA9IDU1NjsKICAgIHQub25laGFsZiA9IDgzNDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDU1NjsKICAgIHQubnRpbGRlID0gNTU2OwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA1NTY7CiAgICB0LmdicmV2ZSA9IDU1NjsKICAgIHQub25lcXVhcnRlciA9IDgzNDsKICAgIHQuU2Nhcm9uID0gNjY3OwogICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNTU2OwogICAgdC5DY2Fyb24gPSA3MjI7CiAgICB0LnVncmF2ZSA9IDU1NjsKICAgIHQucmFkaWNhbCA9IDQ1MzsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNTU2OwogICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuQXRpbGRlID0gNjY3OwogICAgdC5Bb2dvbmVrID0gNjY3OwogICAgdC5BcmluZyA9IDY2NzsKICAgIHQuT3RpbGRlID0gNzc4OwogICAgdC56ZG90YWNjZW50ID0gNTAwOwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAyNzg7CiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKICAgIHQubWludXMgPSA1ODQ7CiAgICB0LkljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5uY2Fyb24gPSA1NTY7CiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKICAgIHQubG9naWNhbG5vdCA9IDU4NDsKICAgIHQub2RpZXJlc2lzID0gNTU2OwogICAgdC51ZGllcmVzaXMgPSA1NTY7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmV0aCA9IDU1NjsKICAgIHQuemNhcm9uID0gNTAwOwogICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTU2OwogIH0pOwogIHQuU3ltYm9sID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnVuaXZlcnNhbCA9IDcxMzsKICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKICAgIHQuZXhpc3RlbnRpYWwgPSA1NDk7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQuc3VjaHRoYXQgPSA0Mzk7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2ttYXRoID0gNTAwOwogICAgdC5wbHVzID0gNTQ5OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQubWludXMgPSA1NDk7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwMDsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1NDk7CiAgICB0LmVxdWFsID0gNTQ5OwogICAgdC5ncmVhdGVyID0gNTQ5OwogICAgdC5xdWVzdGlvbiA9IDQ0NDsKICAgIHQuY29uZ3J1ZW50ID0gNTQ5OwogICAgdC5BbHBoYSA9IDcyMjsKICAgIHQuQmV0YSA9IDY2NzsKICAgIHQuQ2hpID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQuRXBzaWxvbiA9IDYxMTsKICAgIHQuUGhpID0gNzYzOwogICAgdC5HYW1tYSA9IDYwMzsKICAgIHQuRXRhID0gNzIyOwogICAgdC5Jb3RhID0gMzMzOwogICAgdC50aGV0YTEgPSA2MzE7CiAgICB0LkthcHBhID0gNzIyOwogICAgdC5MYW1iZGEgPSA2ODY7CiAgICB0Lk11ID0gODg5OwogICAgdC5OdSA9IDcyMjsKICAgIHQuT21pY3JvbiA9IDcyMjsKICAgIHQuUGkgPSA3Njg7CiAgICB0LlRoZXRhID0gNzQxOwogICAgdC5SaG8gPSA1NTY7CiAgICB0LlNpZ21hID0gNTkyOwogICAgdC5UYXUgPSA2MTE7CiAgICB0LlVwc2lsb24gPSA2OTA7CiAgICB0LnNpZ21hMSA9IDQzOTsKICAgIHQuT21lZ2EgPSA3Njg7CiAgICB0LlhpID0gNjQ1OwogICAgdC5Qc2kgPSA3OTU7CiAgICB0LlpldGEgPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOwogICAgdC50aGVyZWZvcmUgPSA4NjM7CiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKICAgIHQucGVycGVuZGljdWxhciA9IDY1ODsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucmFkaWNhbGV4ID0gNTAwOwogICAgdC5hbHBoYSA9IDYzMTsKICAgIHQuYmV0YSA9IDU0OTsKICAgIHQuY2hpID0gNTQ5OwogICAgdC5kZWx0YSA9IDQ5NDsKICAgIHQuZXBzaWxvbiA9IDQzOTsKICAgIHQucGhpID0gNTIxOwogICAgdC5nYW1tYSA9IDQxMTsKICAgIHQuZXRhID0gNjAzOwogICAgdC5pb3RhID0gMzI5OwogICAgdC5waGkxID0gNjAzOwogICAgdC5rYXBwYSA9IDU0OTsKICAgIHQubGFtYmRhID0gNTQ5OwogICAgdC5tdSA9IDU3NjsKICAgIHQubnUgPSA1MjE7CiAgICB0Lm9taWNyb24gPSA1NDk7CiAgICB0LnBpID0gNTQ5OwogICAgdC50aGV0YSA9IDUyMTsKICAgIHQucmhvID0gNTQ5OwogICAgdC5zaWdtYSA9IDYwMzsKICAgIHQudGF1ID0gNDM5OwogICAgdC51cHNpbG9uID0gNTc2OwogICAgdC5vbWVnYTEgPSA3MTM7CiAgICB0Lm9tZWdhID0gNjg2OwogICAgdC54aSA9IDQ5MzsKICAgIHQucHNpID0gNjg2OwogICAgdC56ZXRhID0gNDk0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuc2ltaWxhciA9IDU0OTsKICAgIHQuRXVybyA9IDc1MDsKICAgIHQuVXBzaWxvbjEgPSA2MjA7CiAgICB0Lm1pbnV0ZSA9IDI0NzsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQuaW5maW5pdHkgPSA3MTM7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuY2x1YiA9IDc1MzsKICAgIHQuZGlhbW9uZCA9IDc1MzsKICAgIHQuaGVhcnQgPSA3NTM7CiAgICB0LnNwYWRlID0gNzUzOwogICAgdC5hcnJvd2JvdGggPSAxMDQyOwogICAgdC5hcnJvd2xlZnQgPSA5ODc7CiAgICB0LmFycm93dXAgPSA2MDM7CiAgICB0LmFycm93cmlnaHQgPSA5ODc7CiAgICB0LmFycm93ZG93biA9IDYwMzsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5wbHVzbWludXMgPSA1NDk7CiAgICB0LnNlY29uZCA9IDQxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5tdWx0aXBseSA9IDU0OTsKICAgIHQucHJvcG9ydGlvbmFsID0gNzEzOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQuYnVsbGV0ID0gNDYwOwogICAgdC5kaXZpZGUgPSA1NDk7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5lcXVpdmFsZW5jZSA9IDU0OTsKICAgIHQuYXBwcm94ZXF1YWwgPSA1NDk7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQuYXJyb3d2ZXJ0ZXggPSA2MDM7CiAgICB0LmFycm93aG9yaXpleCA9IDEwMDA7CiAgICB0LmNhcnJpYWdlcmV0dXJuID0gNjU4OwogICAgdC5hbGVwaCA9IDgyMzsKICAgIHQuSWZyYWt0dXIgPSA2ODY7CiAgICB0LlJmcmFrdHVyID0gNzk1OwogICAgdC53ZWllcnN0cmFzcyA9IDk4NzsKICAgIHQuY2lyY2xlbXVsdGlwbHkgPSA3Njg7CiAgICB0LmNpcmNsZXBsdXMgPSA3Njg7CiAgICB0LmVtcHR5c2V0ID0gODIzOwogICAgdC5pbnRlcnNlY3Rpb24gPSA3Njg7CiAgICB0LnVuaW9uID0gNzY4OwogICAgdC5wcm9wZXJzdXBlcnNldCA9IDcxMzsKICAgIHQucmVmbGV4c3VwZXJzZXQgPSA3MTM7CiAgICB0Lm5vdHN1YnNldCA9IDcxMzsKICAgIHQucHJvcGVyc3Vic2V0ID0gNzEzOwogICAgdC5yZWZsZXhzdWJzZXQgPSA3MTM7CiAgICB0LmVsZW1lbnQgPSA3MTM7CiAgICB0Lm5vdGVsZW1lbnQgPSA3MTM7CiAgICB0LmFuZ2xlID0gNzY4OwogICAgdC5ncmFkaWVudCA9IDcxMzsKICAgIHQucmVnaXN0ZXJzZXJpZiA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2VyaWYgPSA3OTA7CiAgICB0LnRyYWRlbWFya3NlcmlmID0gODkwOwogICAgdC5wcm9kdWN0ID0gODIzOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5kb3RtYXRoID0gMjUwOwogICAgdC5sb2dpY2Fsbm90ID0gNzEzOwogICAgdC5sb2dpY2FsYW5kID0gNjAzOwogICAgdC5sb2dpY2Fsb3IgPSA2MDM7CiAgICB0LmFycm93ZGJsYm90aCA9IDEwNDI7CiAgICB0LmFycm93ZGJsbGVmdCA9IDk4NzsKICAgIHQuYXJyb3dkYmx1cCA9IDYwMzsKICAgIHQuYXJyb3dkYmxyaWdodCA9IDk4NzsKICAgIHQuYXJyb3dkYmxkb3duID0gNjAzOwogICAgdC5sb3plbmdlID0gNDk0OwogICAgdC5hbmdsZWxlZnQgPSAzMjk7CiAgICB0LnJlZ2lzdGVyc2FucyA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2FucyA9IDc5MDsKICAgIHQudHJhZGVtYXJrc2FucyA9IDc4NjsKICAgIHQuc3VtbWF0aW9uID0gNzEzOwogICAgdC5wYXJlbmxlZnR0cCA9IDM4NDsKICAgIHQucGFyZW5sZWZ0ZXggPSAzODQ7CiAgICB0LnBhcmVubGVmdGJ0ID0gMzg0OwogICAgdC5icmFja2V0bGVmdHRwID0gMzg0OwogICAgdC5icmFja2V0bGVmdGV4ID0gMzg0OwogICAgdC5icmFja2V0bGVmdGJ0ID0gMzg0OwogICAgdC5icmFjZWxlZnR0cCA9IDQ5NDsKICAgIHQuYnJhY2VsZWZ0bWlkID0gNDk0OwogICAgdC5icmFjZWxlZnRidCA9IDQ5NDsKICAgIHQuYnJhY2VleCA9IDQ5NDsKICAgIHQuYW5nbGVyaWdodCA9IDMyOTsKICAgIHQuaW50ZWdyYWwgPSAyNzQ7CiAgICB0LmludGVncmFsdHAgPSA2ODY7CiAgICB0LmludGVncmFsZXggPSA2ODY7CiAgICB0LmludGVncmFsYnQgPSA2ODY7CiAgICB0LnBhcmVucmlnaHR0cCA9IDM4NDsKICAgIHQucGFyZW5yaWdodGV4ID0gMzg0OwogICAgdC5wYXJlbnJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNrZXRyaWdodHRwID0gMzg0OwogICAgdC5icmFja2V0cmlnaHRleCA9IDM4NDsKICAgIHQuYnJhY2tldHJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNlcmlnaHR0cCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodG1pZCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodGJ0ID0gNDk0OwogICAgdC5hcHBsZSA9IDc5MDsKICB9KTsKICB0WyJUaW1lcy1Sb21hbiJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDA4OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQucXVvdGVyaWdodCA9IDMzMzsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDUwMDsKICAgIHQucGx1cyA9IDU2NDsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjUwOwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDUwMDsKICAgIHQub25lID0gNTAwOwogICAgdC50d28gPSA1MDA7CiAgICB0LnRocmVlID0gNTAwOwogICAgdC5mb3VyID0gNTAwOwogICAgdC5maXZlID0gNTAwOwogICAgdC5zaXggPSA1MDA7CiAgICB0LnNldmVuID0gNTAwOwogICAgdC5laWdodCA9IDUwMDsKICAgIHQubmluZSA9IDUwMDsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU2NDsKICAgIHQuZXF1YWwgPSA1NjQ7CiAgICB0LmdyZWF0ZXIgPSA1NjQ7CiAgICB0LnF1ZXN0aW9uID0gNDQ0OwogICAgdC5hdCA9IDkyMTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDY2NzsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDYxMTsKICAgIHQuRiA9IDU1NjsKICAgIHQuRyA9IDcyMjsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDMzMzsKICAgIHQuSiA9IDM4OTsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDg4OTsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDcyMjsKICAgIHQuUCA9IDU1NjsKICAgIHQuUSA9IDcyMjsKICAgIHQuUiA9IDY2NzsKICAgIHQuUyA9IDU1NjsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDcyMjsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDcyMjsKICAgIHQuWSA9IDcyMjsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucXVvdGVsZWZ0ID0gMzMzOwogICAgdC5hID0gNDQ0OwogICAgdC5iID0gNTAwOwogICAgdC5jID0gNDQ0OwogICAgdC5kID0gNTAwOwogICAgdC5lID0gNDQ0OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNTAwOwogICAgdC5oID0gNTAwOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTAwOwogICAgdC5sID0gMjc4OwogICAgdC5tID0gNzc4OwogICAgdC5uID0gNTAwOwogICAgdC5vID0gNTAwOwogICAgdC5wID0gNTAwOwogICAgdC5xID0gNTAwOwogICAgdC5yID0gMzMzOwogICAgdC5zID0gMzg5OwogICAgdC50ID0gMjc4OwogICAgdC51ID0gNTAwOwogICAgdC52ID0gNTAwOwogICAgdC53ID0gNzIyOwogICAgdC54ID0gNTAwOwogICAgdC55ID0gNTAwOwogICAgdC56ID0gNDQ0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuYXNjaWl0aWxkZSA9IDU0MTsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDUwMDsKICAgIHQuc3RlcmxpbmcgPSA1MDA7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1MDA7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuc2VjdGlvbiA9IDUwMDsKICAgIHQuY3VycmVuY3kgPSA1MDA7CiAgICB0LnF1b3Rlc2luZ2xlID0gMTgwOwogICAgdC5xdW90ZWRibGxlZnQgPSA0NDQ7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDU1NjsKICAgIHQuZmwgPSA1NTY7CiAgICB0LmVuZGFzaCA9IDUwMDsKICAgIHQuZGFnZ2VyID0gNTAwOwogICAgdC5kYWdnZXJkYmwgPSA1MDA7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOwogICAgdC5wYXJhZ3JhcGggPSA0NTM7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDQ0NDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDQ0NDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA0NDQ7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA4ODk7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA3MjI7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA0NDQ7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNzIyOwogICAgdC5kaXZpZGUgPSA1NjQ7CiAgICB0LllhY3V0ZSA9IDcyMjsKICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LmFhY3V0ZSA9IDQ0NDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDQ0NDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDQ0NDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDQ0NDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDQ0NDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2Njc7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5BbWFjcm9uID0gNzIyOwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDU1NjsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjY3OwogICAgdC5TYWN1dGUgPSA1NTY7CiAgICB0LmRjYXJvbiA9IDU4ODsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNzIyOwogICAgdC5BYnJldmUgPSA3MjI7CiAgICB0Lm11bHRpcGx5ID0gNTY0OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDQ0NDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDU2NDsKICAgIHQuYnJva2VuYmFyID0gMjAwOwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzI2OwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA3MjI7CiAgICB0LkFkaWVyZXNpcyA9IDcyMjsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSA0NDQ7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNDQ0OwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTU2OwogICAgdC5sY2Fyb24gPSAzNDQ7CiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGFjdXRlID0gNjExOwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDU2NDsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNTY0OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSA0NDQ7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNTU1OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSAxMDAwOwogICAgdC5hbXBlcnNhbmQgPSA4MzM7CiAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSA1MDA7CiAgICB0LnBsdXMgPSA1NzA7CiAgICB0LmNvbW1hID0gMjUwOwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwMDsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMzMzOwogICAgdC5zZW1pY29sb24gPSAzMzM7CiAgICB0Lmxlc3MgPSA1NzA7CiAgICB0LmVxdWFsID0gNTcwOwogICAgdC5ncmVhdGVyID0gNTcwOwogICAgdC5xdWVzdGlvbiA9IDUwMDsKICAgIHQuYXQgPSA5MzA7CiAgICB0LkEgPSA3MjI7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3Nzg7CiAgICB0LkkgPSAzODk7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA3Nzg7CiAgICB0LkwgPSA2Njc7CiAgICB0Lk0gPSA5NDQ7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2MTE7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA1NTY7CiAgICB0LlQgPSA2Njc7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA3MjI7CiAgICB0LlcgPSAxMDAwOwogICAgdC5YID0gNzIyOwogICAgdC5ZID0gNzIyOwogICAgdC5aID0gNjY3OwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTgxOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAzMzM7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSA0NDQ7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA0NDQ7CiAgICB0LmJyYWNlbGVmdCA9IDM5NDsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzk0OwogICAgdC5hc2NpaXRpbGRlID0gNTIwOwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDU0MDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzAwOwogICAgdC5Mc2xhc2ggPSA2Njc7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7CiAgICB0LmFlID0gNzIyOwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA1MDA7CiAgICB0Lm9lID0gNzIyOwogICAgdC5nZXJtYW5kYmxzID0gNTU2OwogICAgdC5JZGllcmVzaXMgPSAzODk7CiAgICB0LmVhY3V0ZSA9IDQ0NDsKICAgIHQuYWJyZXZlID0gNTAwOwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA0NDQ7CiAgICB0LllkaWVyZXNpcyA9IDcyMjsKICAgIHQuZGl2aWRlID0gNTcwOwogICAgdC5ZYWN1dGUgPSA3MjI7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1MDA7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1MDA7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3NDc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDQ0NDsKICAgIHQuYXJpbmcgPSA1MDA7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1MDA7CiAgICB0LlRjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1MDA7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDM4OTsKICAgIHQuc2NlZGlsbGEgPSAzODk7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDUwMDsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gNDQ0OwogICAgdC5jY2VkaWxsYSA9IDQ0NDsKICAgIHQuWmRvdGFjY2VudCA9IDY2NzsKICAgIHQuVGhvcm4gPSA2MTE7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNTU2OwogICAgdC5kY2Fyb24gPSA2NzI7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU3MDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2Njc7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1MDA7CiAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKICAgIHQuY2FjdXRlID0gNDQ0OwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMzg5OwogICAgdC5wbHVzbWludXMgPSA1NzA7CiAgICB0LmJyb2tlbmJhciA9IDIyMDsKICAgIHQucmVnaXN0ZXJlZCA9IDc0NzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMzg5OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gNDQ0OwogICAgdC5vbWFjcm9uID0gNTAwOwogICAgdC5aYWN1dGUgPSA2Njc7CiAgICB0LlpjYXJvbiA9IDY2NzsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDQxNjsKICAgIHQuZW9nb25layA9IDQ0NDsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDQ0NDsKICAgIHQuemFjdXRlID0gNDQ0OwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDUwMDsKICAgIHQuYW1hY3JvbiA9IDUwMDsKICAgIHQuc2FjdXRlID0gMzg5OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOwogICAgdC5TY2VkaWxsYSA9IDU1NjsKICAgIHQubGNhcm9uID0gMzk0OwogICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LkxhY3V0ZSA9IDY2NzsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKICAgIHQuSWdyYXZlID0gMzg5OwogICAgdC5JbWFjcm9uID0gMzg5OwogICAgdC5MY2Fyb24gPSA2Njc7CiAgICB0Lm9uZWhhbGYgPSA3NTA7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNDQ0OwogICAgdC5nYnJldmUgPSA1MDA7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CiAgICB0LlNjYXJvbiA9IDU1NjsKICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDUwMDsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDUwMDsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDQ0NDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMzg5OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTcwOwogICAgdC5JY2lyY3VtZmxleCA9IDM4OTsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1NzA7CiAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5ldGggPSA1MDA7CiAgICB0LnpjYXJvbiA9IDQ0NDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMwMDsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDUwMDsKICB9KTsKICB0WyJUaW1lcy1Cb2xkSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDM4OTsKICAgIHQucXVvdGVkYmwgPSA1NTU7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNTcwOwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTcwOwogICAgdC5lcXVhbCA9IDU3MDsKICAgIHQuZ3JlYXRlciA9IDU3MDsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gODMyOwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjY3OwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzc4OwogICAgdC5JID0gMzg5OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNjExOwogICAgdC5NID0gODg5OwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjY3OwogICAgdC5TID0gNTU2OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gODg5OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjExOwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTcwOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3Nzg7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDM0ODsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzQ4OwogICAgdC5hc2NpaXRpbGRlID0gNTcwOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUwMDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDk0NDsKICAgIHQub3JkZmVtaW5pbmUgPSAyNjY7CiAgICB0LkxzbGFzaCA9IDYxMTsKICAgIHQuT3NsYXNoID0gNzIyOwogICAgdC5PRSA9IDk0NDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzAwOwogICAgdC5hZSA9IDcyMjsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNTAwOwogICAgdC5vZSA9IDcyMjsKICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKICAgIHQuSWRpZXJlc2lzID0gMzg5OwogICAgdC5lYWN1dGUgPSA0NDQ7CiAgICB0LmFicmV2ZSA9IDUwMDsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuZWNhcm9uID0gNDQ0OwogICAgdC5ZZGllcmVzaXMgPSA2MTE7CiAgICB0LmRpdmlkZSA9IDU3MDsKICAgIHQuWWFjdXRlID0gNjExOwogICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWFjdXRlID0gNTAwOwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNDQ0OwogICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTAwOwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA1NTY7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzQ3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA0NDQ7CiAgICB0LmFyaW5nID0gNTAwOwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTAwOwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDY2NzsKICAgIHQuYXRpbGRlID0gNTAwOwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSAzODk7CiAgICB0LnNjZWRpbGxhID0gMzg5OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDY2NzsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LkFtYWNyb24gPSA2Njc7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA0NDQ7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjExOwogICAgdC5PbWFjcm9uID0gNzIyOwogICAgdC5SYWN1dGUgPSA2Njc7CiAgICB0LlNhY3V0ZSA9IDU1NjsKICAgIHQuZGNhcm9uID0gNjA4OwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDU1NjsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDsKICAgIHQuT2dyYXZlID0gNzIyOwogICAgdC5BZ3JhdmUgPSA2Njc7CiAgICB0LkFicmV2ZSA9IDY2NzsKICAgIHQubXVsdGlwbHkgPSA1NzA7CiAgICB0LnVhY3V0ZSA9IDU1NjsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNDQ0OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTAwOwogICAgdC5lZGllcmVzaXMgPSA0NDQ7CiAgICB0LmNhY3V0ZSA9IDQ0NDsKICAgIHQubmFjdXRlID0gNTU2OwogICAgdC51bWFjcm9uID0gNTU2OwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDM4OTsKICAgIHQucGx1c21pbnVzID0gNTcwOwogICAgdC5icm9rZW5iYXIgPSAyMjA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3NDc7CiAgICB0LkdicmV2ZSA9IDcyMjsKICAgIHQuSWRvdGFjY2VudCA9IDM4OTsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDUwMDsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDY2NzsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzNjY7CiAgICB0LmVvZ29uZWsgPSA0NDQ7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDY2NzsKICAgIHQuQWRpZXJlc2lzID0gNjY3OwogICAgdC5lZ3JhdmUgPSA0NDQ7CiAgICB0LnphY3V0ZSA9IDM4OTsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzIyOwogICAgdC5vYWN1dGUgPSA1MDA7CiAgICB0LmFtYWNyb24gPSA1MDA7CiAgICB0LnNhY3V0ZSA9IDM4OTsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA1MDA7CiAgICB0LnR3b3N1cGVyaW9yID0gMzAwOwogICAgdC5PZGllcmVzaXMgPSA3MjI7CiAgICB0Lm11ID0gNTc2OwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDUwMDsKICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKICAgIHQuU2NlZGlsbGEgPSA1NTY7CiAgICB0LmxjYXJvbiA9IDM4MjsKICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDM4OTsKICAgIHQuSW1hY3JvbiA9IDM4OTsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1NTY7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTU2OwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA2Njc7CiAgICB0LkFvZ29uZWsgPSA2Njc7CiAgICB0LkFyaW5nID0gNjY3OwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDM4OTsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDYwNjsKICAgIHQuSWNpcmN1bWZsZXggPSAzODk7CiAgICB0Lm5jYXJvbiA9IDU1NjsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjA2OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDU1NjsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0MjA7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNjc1OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNjc1OwogICAgdC5lcXVhbCA9IDY3NTsKICAgIHQuZ3JlYXRlciA9IDY3NTsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gOTIwOwogICAgdC5BID0gNjExOwogICAgdC5CID0gNjExOwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjExOwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMzMzOwogICAgdC5KID0gNDQ0OwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNjY3OwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjExOwogICAgdC5TID0gNTAwOwogICAgdC5UID0gNTU2OwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjExOwogICAgdC5XID0gODMzOwogICAgdC5YID0gNjExOwogICAgdC5ZID0gNTU2OwogICAgdC5aID0gNTU2OwogICAgdC5icmFja2V0bGVmdCA9IDM4OTsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzODk7CiAgICB0LmFzY2lpY2lyY3VtID0gNDIyOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1MDA7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA0NDQ7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3MjI7CiAgICB0Lm4gPSA1MDA7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1MDA7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA0NDQ7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDQwMDsKICAgIHQuYmFyID0gMjc1OwogICAgdC5icmFjZXJpZ2h0ID0gNDAwOwogICAgdC5hc2NpaXRpbGRlID0gNTQxOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyMTQ7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDU1NjsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUyMzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTU2OwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTU2OwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSA4ODk7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNTAwOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDg4OTsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA5NDQ7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA2Njc7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA1MDA7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNTU2OwogICAgdC5kaXZpZGUgPSA2NzU7CiAgICB0LllhY3V0ZSA9IDU1NjsKICAgIHQuQWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFhY3V0ZSA9IDUwMDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDQ0NDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDUwMDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDUwMDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNjY3OwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDUwMDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDUwMDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2MTE7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOwogICAgdC5BbWFjcm9uID0gNjExOwogICAgdC5yY2Fyb24gPSAzODk7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNTU2OwogICAgdC5UaG9ybiA9IDYxMTsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjExOwogICAgdC5TYWN1dGUgPSA1MDA7CiAgICB0LmRjYXJvbiA9IDU0NDsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNjExOwogICAgdC5BYnJldmUgPSA2MTE7CiAgICB0Lm11bHRpcGx5ID0gNjc1OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDU1NjsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKICAgIHQuTmFjdXRlID0gNjY3OwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDUwMDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNjY3OwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDY3NTsKICAgIHQuYnJva2VuYmFyID0gMjc1OwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzODk7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDU1NjsKICAgIHQuWmNhcm9uID0gNTU2OwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzAwOwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2MTE7CiAgICB0LkFkaWVyZXNpcyA9IDYxMTsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSAzODk7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNTAwOwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTAwOwogICAgdC5sY2Fyb24gPSAzMDA7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1MDA7CiAgICB0LlNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNjY3OwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5BdGlsZGUgPSA2MTE7CiAgICB0LkFvZ29uZWsgPSA2MTE7CiAgICB0LkFyaW5nID0gNjExOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5taW51cyA9IDY3NTsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjc1OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdC5aYXBmRGluZ2JhdHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmExID0gOTc0OwogICAgdC5hMiA9IDk2MTsKICAgIHQuYTIwMiA9IDk3NDsKICAgIHQuYTMgPSA5ODA7CiAgICB0LmE0ID0gNzE5OwogICAgdC5hNSA9IDc4OTsKICAgIHQuYTExOSA9IDc5MDsKICAgIHQuYTExOCA9IDc5MTsKICAgIHQuYTExNyA9IDY5MDsKICAgIHQuYTExID0gOTYwOwogICAgdC5hMTIgPSA5Mzk7CiAgICB0LmExMyA9IDU0OTsKICAgIHQuYTE0ID0gODU1OwogICAgdC5hMTUgPSA5MTE7CiAgICB0LmExNiA9IDkzMzsKICAgIHQuYTEwNSA9IDkxMTsKICAgIHQuYTE3ID0gOTQ1OwogICAgdC5hMTggPSA5NzQ7CiAgICB0LmExOSA9IDc1NTsKICAgIHQuYTIwID0gODQ2OwogICAgdC5hMjEgPSA3NjI7CiAgICB0LmEyMiA9IDc2MTsKICAgIHQuYTIzID0gNTcxOwogICAgdC5hMjQgPSA2Nzc7CiAgICB0LmEyNSA9IDc2MzsKICAgIHQuYTI2ID0gNzYwOwogICAgdC5hMjcgPSA3NTk7CiAgICB0LmEyOCA9IDc1NDsKICAgIHQuYTYgPSA0OTQ7CiAgICB0LmE3ID0gNTUyOwogICAgdC5hOCA9IDUzNzsKICAgIHQuYTkgPSA1Nzc7CiAgICB0LmExMCA9IDY5MjsKICAgIHQuYTI5ID0gNzg2OwogICAgdC5hMzAgPSA3ODg7CiAgICB0LmEzMSA9IDc4ODsKICAgIHQuYTMyID0gNzkwOwogICAgdC5hMzMgPSA3OTM7CiAgICB0LmEzNCA9IDc5NDsKICAgIHQuYTM1ID0gODE2OwogICAgdC5hMzYgPSA4MjM7CiAgICB0LmEzNyA9IDc4OTsKICAgIHQuYTM4ID0gODQxOwogICAgdC5hMzkgPSA4MjM7CiAgICB0LmE0MCA9IDgzMzsKICAgIHQuYTQxID0gODE2OwogICAgdC5hNDIgPSA4MzE7CiAgICB0LmE0MyA9IDkyMzsKICAgIHQuYTQ0ID0gNzQ0OwogICAgdC5hNDUgPSA3MjM7CiAgICB0LmE0NiA9IDc0OTsKICAgIHQuYTQ3ID0gNzkwOwogICAgdC5hNDggPSA3OTI7CiAgICB0LmE0OSA9IDY5NTsKICAgIHQuYTUwID0gNzc2OwogICAgdC5hNTEgPSA3Njg7CiAgICB0LmE1MiA9IDc5MjsKICAgIHQuYTUzID0gNzU5OwogICAgdC5hNTQgPSA3MDc7CiAgICB0LmE1NSA9IDcwODsKICAgIHQuYTU2ID0gNjgyOwogICAgdC5hNTcgPSA3MDE7CiAgICB0LmE1OCA9IDgyNjsKICAgIHQuYTU5ID0gODE1OwogICAgdC5hNjAgPSA3ODk7CiAgICB0LmE2MSA9IDc4OTsKICAgIHQuYTYyID0gNzA3OwogICAgdC5hNjMgPSA2ODc7CiAgICB0LmE2NCA9IDY5NjsKICAgIHQuYTY1ID0gNjg5OwogICAgdC5hNjYgPSA3ODY7CiAgICB0LmE2NyA9IDc4NzsKICAgIHQuYTY4ID0gNzEzOwogICAgdC5hNjkgPSA3OTE7CiAgICB0LmE3MCA9IDc4NTsKICAgIHQuYTcxID0gNzkxOwogICAgdC5hNzIgPSA4NzM7CiAgICB0LmE3MyA9IDc2MTsKICAgIHQuYTc0ID0gNzYyOwogICAgdC5hMjAzID0gNzYyOwogICAgdC5hNzUgPSA3NTk7CiAgICB0LmEyMDQgPSA3NTk7CiAgICB0LmE3NiA9IDg5MjsKICAgIHQuYTc3ID0gODkyOwogICAgdC5hNzggPSA3ODg7CiAgICB0LmE3OSA9IDc4NDsKICAgIHQuYTgxID0gNDM4OwogICAgdC5hODIgPSAxMzg7CiAgICB0LmE4MyA9IDI3NzsKICAgIHQuYTg0ID0gNDE1OwogICAgdC5hOTcgPSAzOTI7CiAgICB0LmE5OCA9IDM5MjsKICAgIHQuYTk5ID0gNjY4OwogICAgdC5hMTAwID0gNjY4OwogICAgdC5hODkgPSAzOTA7CiAgICB0LmE5MCA9IDM5MDsKICAgIHQuYTkzID0gMzE3OwogICAgdC5hOTQgPSAzMTc7CiAgICB0LmE5MSA9IDI3NjsKICAgIHQuYTkyID0gMjc2OwogICAgdC5hMjA1ID0gNTA5OwogICAgdC5hODUgPSA1MDk7CiAgICB0LmEyMDYgPSA0MTA7CiAgICB0LmE4NiA9IDQxMDsKICAgIHQuYTg3ID0gMjM0OwogICAgdC5hODggPSAyMzQ7CiAgICB0LmE5NSA9IDMzNDsKICAgIHQuYTk2ID0gMzM0OwogICAgdC5hMTAxID0gNzMyOwogICAgdC5hMTAyID0gNTQ0OwogICAgdC5hMTAzID0gNTQ0OwogICAgdC5hMTA0ID0gOTEwOwogICAgdC5hMTA2ID0gNjY3OwogICAgdC5hMTA3ID0gNzYwOwogICAgdC5hMTA4ID0gNzYwOwogICAgdC5hMTEyID0gNzc2OwogICAgdC5hMTExID0gNTk1OwogICAgdC5hMTEwID0gNjk0OwogICAgdC5hMTA5ID0gNjI2OwogICAgdC5hMTIwID0gNzg4OwogICAgdC5hMTIxID0gNzg4OwogICAgdC5hMTIyID0gNzg4OwogICAgdC5hMTIzID0gNzg4OwogICAgdC5hMTI0ID0gNzg4OwogICAgdC5hMTI1ID0gNzg4OwogICAgdC5hMTI2ID0gNzg4OwogICAgdC5hMTI3ID0gNzg4OwogICAgdC5hMTI4ID0gNzg4OwogICAgdC5hMTI5ID0gNzg4OwogICAgdC5hMTMwID0gNzg4OwogICAgdC5hMTMxID0gNzg4OwogICAgdC5hMTMyID0gNzg4OwogICAgdC5hMTMzID0gNzg4OwogICAgdC5hMTM0ID0gNzg4OwogICAgdC5hMTM1ID0gNzg4OwogICAgdC5hMTM2ID0gNzg4OwogICAgdC5hMTM3ID0gNzg4OwogICAgdC5hMTM4ID0gNzg4OwogICAgdC5hMTM5ID0gNzg4OwogICAgdC5hMTQwID0gNzg4OwogICAgdC5hMTQxID0gNzg4OwogICAgdC5hMTQyID0gNzg4OwogICAgdC5hMTQzID0gNzg4OwogICAgdC5hMTQ0ID0gNzg4OwogICAgdC5hMTQ1ID0gNzg4OwogICAgdC5hMTQ2ID0gNzg4OwogICAgdC5hMTQ3ID0gNzg4OwogICAgdC5hMTQ4ID0gNzg4OwogICAgdC5hMTQ5ID0gNzg4OwogICAgdC5hMTUwID0gNzg4OwogICAgdC5hMTUxID0gNzg4OwogICAgdC5hMTUyID0gNzg4OwogICAgdC5hMTUzID0gNzg4OwogICAgdC5hMTU0ID0gNzg4OwogICAgdC5hMTU1ID0gNzg4OwogICAgdC5hMTU2ID0gNzg4OwogICAgdC5hMTU3ID0gNzg4OwogICAgdC5hMTU4ID0gNzg4OwogICAgdC5hMTU5ID0gNzg4OwogICAgdC5hMTYwID0gODk0OwogICAgdC5hMTYxID0gODM4OwogICAgdC5hMTYzID0gMTAxNjsKICAgIHQuYTE2NCA9IDQ1ODsKICAgIHQuYTE5NiA9IDc0ODsKICAgIHQuYTE2NSA9IDkyNDsKICAgIHQuYTE5MiA9IDc0ODsKICAgIHQuYTE2NiA9IDkxODsKICAgIHQuYTE2NyA9IDkyNzsKICAgIHQuYTE2OCA9IDkyODsKICAgIHQuYTE2OSA9IDkyODsKICAgIHQuYTE3MCA9IDgzNDsKICAgIHQuYTE3MSA9IDg3MzsKICAgIHQuYTE3MiA9IDgyODsKICAgIHQuYTE3MyA9IDkyNDsKICAgIHQuYTE2MiA9IDkyNDsKICAgIHQuYTE3NCA9IDkxNzsKICAgIHQuYTE3NSA9IDkzMDsKICAgIHQuYTE3NiA9IDkzMTsKICAgIHQuYTE3NyA9IDQ2MzsKICAgIHQuYTE3OCA9IDg4MzsKICAgIHQuYTE3OSA9IDgzNjsKICAgIHQuYTE5MyA9IDgzNjsKICAgIHQuYTE4MCA9IDg2NzsKICAgIHQuYTE5OSA9IDg2NzsKICAgIHQuYTE4MSA9IDY5NjsKICAgIHQuYTIwMCA9IDY5NjsKICAgIHQuYTE4MiA9IDg3NDsKICAgIHQuYTIwMSA9IDg3NDsKICAgIHQuYTE4MyA9IDc2MDsKICAgIHQuYTE4NCA9IDk0NjsKICAgIHQuYTE5NyA9IDc3MTsKICAgIHQuYTE4NSA9IDg2NTsKICAgIHQuYTE5NCA9IDc3MTsKICAgIHQuYTE5OCA9IDg4ODsKICAgIHQuYTE4NiA9IDk2NzsKICAgIHQuYTE5NSA9IDg4ODsKICAgIHQuYTE4NyA9IDgzMTsKICAgIHQuYTE4OCA9IDg3MzsKICAgIHQuYTE4OSA9IDkyNzsKICAgIHQuYTE5MCA9IDk3MDsKICAgIHQuYTE5MSA9IDkxODsKICB9KTsKfSk7CmNvbnN0IGdldEZvbnRCYXNpY01ldHJpY3MgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkNvdXJpZXIgPSB7CiAgICBhc2NlbnQ6IDYyOSwKICAgIGRlc2NlbnQ6IC0xNTcsCiAgICBjYXBIZWlnaHQ6IDU2MiwKICAgIHhIZWlnaHQ6IC00MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZCJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MzkKICB9OwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IHsKICAgIGFzY2VudDogNjI5LAogICAgZGVzY2VudDogLTE1NywKICAgIGNhcEhlaWdodDogNTYyLAogICAgeEhlaWdodDogNDI2CiAgfTsKICB0LkhlbHZldGljYSA9IHsKICAgIGFzY2VudDogNzE4LAogICAgZGVzY2VudDogLTIwNywKICAgIGNhcEhlaWdodDogNzE4LAogICAgeEhlaWdodDogNTIzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgYXNjZW50OiA3MTgsCiAgICBkZXNjZW50OiAtMjA3LAogICAgY2FwSGVpZ2h0OiA3MTgsCiAgICB4SGVpZ2h0OiA1MzIKICB9OwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUyMwogIH07CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUzMgogIH07CiAgdFsiVGltZXMtUm9tYW4iXSA9IHsKICAgIGFzY2VudDogNjgzLAogICAgZGVzY2VudDogLTIxNywKICAgIGNhcEhlaWdodDogNjYyLAogICAgeEhlaWdodDogNDUwCiAgfTsKICB0WyJUaW1lcy1Cb2xkIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY3NiwKICAgIHhIZWlnaHQ6IDQ2MQogIH07CiAgdFsiVGltZXMtSXRhbGljIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY1MywKICAgIHhIZWlnaHQ6IDQ0MQogIH07CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gewogICAgYXNjZW50OiA2ODMsCiAgICBkZXNjZW50OiAtMjE3LAogICAgY2FwSGVpZ2h0OiA2NjksCiAgICB4SGVpZ2h0OiA0NjIKICB9OwogIHQuU3ltYm9sID0gewogICAgYXNjZW50OiBNYXRoLk5hTiwKICAgIGRlc2NlbnQ6IE1hdGguTmFOLAogICAgY2FwSGVpZ2h0OiBNYXRoLk5hTiwKICAgIHhIZWlnaHQ6IE1hdGguTmFOCiAgfTsKICB0LlphcGZEaW5nYmF0cyA9IHsKICAgIGFzY2VudDogTWF0aC5OYU4sCiAgICBkZXNjZW50OiBNYXRoLk5hTiwKICAgIGNhcEhlaWdodDogTWF0aC5OYU4sCiAgICB4SGVpZ2h0OiBNYXRoLk5hTgogIH07Cn0pOwoKOy8vIC4vc3JjL2NvcmUvZ2x5Zi5qcwpjb25zdCBPTl9DVVJWRV9QT0lOVCA9IDEgPDwgMDsKY29uc3QgWF9TSE9SVF9WRUNUT1IgPSAxIDw8IDE7CmNvbnN0IFlfU0hPUlRfVkVDVE9SID0gMSA8PCAyOwpjb25zdCBSRVBFQVRfRkxBRyA9IDEgPDwgMzsKY29uc3QgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SID0gMSA8PCA0Owpjb25zdCBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IgPSAxIDw8IDU7CmNvbnN0IE9WRVJMQVBfU0lNUExFID0gMSA8PCA2Owpjb25zdCBBUkdfMV9BTkRfMl9BUkVfV09SRFMgPSAxIDw8IDA7CmNvbnN0IEFSR1NfQVJFX1hZX1ZBTFVFUyA9IDEgPDwgMTsKY29uc3QgV0VfSEFWRV9BX1NDQUxFID0gMSA8PCAzOwpjb25zdCBNT1JFX0NPTVBPTkVOVFMgPSAxIDw8IDU7CmNvbnN0IFdFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSA9IDEgPDwgNjsKY29uc3QgV0VfSEFWRV9BX1RXT19CWV9UV08gPSAxIDw8IDc7CmNvbnN0IFdFX0hBVkVfSU5TVFJVQ1RJT05TID0gMSA8PCA4OwpjbGFzcyBHbHlmVGFibGUgewogIGNvbnN0cnVjdG9yKHsKICAgIGdseWZUYWJsZSwKICAgIGlzR2x5cGhMb2NhdGlvbnNMb25nLAogICAgbG9jYVRhYmxlLAogICAgbnVtR2x5cGhzCiAgfSkgewogICAgdGhpcy5nbHlwaHMgPSBbXTsKICAgIGNvbnN0IGxvY2EgPSBuZXcgRGF0YVZpZXcobG9jYVRhYmxlLmJ1ZmZlciwgbG9jYVRhYmxlLmJ5dGVPZmZzZXQsIGxvY2FUYWJsZS5ieXRlTGVuZ3RoKTsKICAgIGNvbnN0IGdseWYgPSBuZXcgRGF0YVZpZXcoZ2x5ZlRhYmxlLmJ1ZmZlciwgZ2x5ZlRhYmxlLmJ5dGVPZmZzZXQsIGdseWZUYWJsZS5ieXRlTGVuZ3RoKTsKICAgIGNvbnN0IG9mZnNldFNpemUgPSBpc0dseXBoTG9jYXRpb25zTG9uZyA/IDQgOiAyOwogICAgbGV0IHByZXYgPSBpc0dseXBoTG9jYXRpb25zTG9uZyA/IGxvY2EuZ2V0VWludDMyKDApIDogMiAqIGxvY2EuZ2V0VWludDE2KDApOwogICAgbGV0IHBvcyA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CiAgICAgIHBvcyArPSBvZmZzZXRTaXplOwogICAgICBjb25zdCBuZXh0ID0gaXNHbHlwaExvY2F0aW9uc0xvbmcgPyBsb2NhLmdldFVpbnQzMihwb3MpIDogMiAqIGxvY2EuZ2V0VWludDE2KHBvcyk7CiAgICAgIGlmIChuZXh0ID09PSBwcmV2KSB7CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChuZXcgR2x5cGgoe30pKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBnbHlwaCA9IEdseXBoLnBhcnNlKHByZXYsIGdseWYpOwogICAgICB0aGlzLmdseXBocy5wdXNoKGdseXBoKTsKICAgICAgcHJldiA9IG5leHQ7CiAgICB9CiAgfQogIGdldFNpemUoKSB7CiAgICByZXR1cm4gTWF0aC5zdW1QcmVjaXNlKHRoaXMuZ2x5cGhzLm1hcChnID0+IGcuZ2V0U2l6ZSgpICsgMyAmIH4zKSk7CiAgfQogIHdyaXRlKCkgewogICAgY29uc3QgdG90YWxTaXplID0gdGhpcy5nZXRTaXplKCk7CiAgICBjb25zdCBnbHlmVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpOwogICAgY29uc3QgaXNMb2NhdGlvbkxvbmcgPSB0b3RhbFNpemUgPiAweDFmZmZlOwogICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGlzTG9jYXRpb25Mb25nID8gNCA6IDI7CiAgICBjb25zdCBsb2NhVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKCh0aGlzLmdseXBocy5sZW5ndGggKyAxKSAqIG9mZnNldFNpemUpKTsKICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICBsb2NhVGFibGUuc2V0VWludDMyKDAsIDApOwogICAgfSBlbHNlIHsKICAgICAgbG9jYVRhYmxlLnNldFVpbnQxNigwLCAwKTsKICAgIH0KICAgIGxldCBwb3MgPSAwOwogICAgbGV0IGxvY2FJbmRleCA9IDA7CiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIHRoaXMuZ2x5cGhzKSB7CiAgICAgIHBvcyArPSBnbHlwaC53cml0ZShwb3MsIGdseWZUYWJsZSk7CiAgICAgIHBvcyA9IHBvcyArIDMgJiB+MzsKICAgICAgbG9jYUluZGV4ICs9IG9mZnNldFNpemU7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MzIobG9jYUluZGV4LCBwb3MpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MTYobG9jYUluZGV4LCBwb3MgPj4gMSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGlzTG9jYXRpb25Mb25nLAogICAgICBsb2NhOiBuZXcgVWludDhBcnJheShsb2NhVGFibGUuYnVmZmVyKSwKICAgICAgZ2x5ZjogbmV3IFVpbnQ4QXJyYXkoZ2x5ZlRhYmxlLmJ1ZmZlcikKICAgIH07CiAgfQogIHNjYWxlKGZhY3RvcnMpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5nbHlwaHNbaV0uc2NhbGUoZmFjdG9yc1tpXSk7CiAgICB9CiAgfQp9CmNsYXNzIEdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBoZWFkZXIgPSBudWxsLAogICAgc2ltcGxlID0gbnVsbCwKICAgIGNvbXBvc2l0ZXMgPSBudWxsCiAgfSkgewogICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CiAgICB0aGlzLnNpbXBsZSA9IHNpbXBsZTsKICAgIHRoaXMuY29tcG9zaXRlcyA9IGNvbXBvc2l0ZXM7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIGNvbnN0IFtyZWFkLCBoZWFkZXJdID0gR2x5cGhIZWFkZXIucGFyc2UocG9zLCBnbHlmKTsKICAgIHBvcyArPSByZWFkOwogICAgaWYgKGhlYWRlci5udW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgICBjb25zdCBjb21wb3NpdGVzID0gW107CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgY29uc3QgW24sIGNvbXBvc2l0ZV0gPSBDb21wb3NpdGVHbHlwaC5wYXJzZShwb3MsIGdseWYpOwogICAgICAgIHBvcyArPSBuOwogICAgICAgIGNvbXBvc2l0ZXMucHVzaChjb21wb3NpdGUpOwogICAgICAgIGlmICghKGNvbXBvc2l0ZS5mbGFncyAmIE1PUkVfQ09NUE9ORU5UUykpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IEdseXBoKHsKICAgICAgICBoZWFkZXIsCiAgICAgICAgY29tcG9zaXRlcwogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHNpbXBsZSA9IFNpbXBsZUdseXBoLnBhcnNlKHBvcywgZ2x5ZiwgaGVhZGVyLm51bWJlck9mQ29udG91cnMpOwogICAgcmV0dXJuIG5ldyBHbHlwaCh7CiAgICAgIGhlYWRlciwKICAgICAgc2ltcGxlCiAgICB9KTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjb25zdCBzaXplID0gdGhpcy5zaW1wbGUgPyB0aGlzLnNpbXBsZS5nZXRTaXplKCkgOiBNYXRoLnN1bVByZWNpc2UodGhpcy5jb21wb3NpdGVzLm1hcChjID0+IGMuZ2V0U2l6ZSgpKSk7CiAgICByZXR1cm4gdGhpcy5oZWFkZXIuZ2V0U2l6ZSgpICsgc2l6ZTsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgcG9zICs9IHRoaXMuaGVhZGVyLndyaXRlKHBvcywgYnVmKTsKICAgIGlmICh0aGlzLnNpbXBsZSkgewogICAgICBwb3MgKz0gdGhpcy5zaW1wbGUud3JpdGUocG9zLCBidWYpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjb21wb3NpdGUgb2YgdGhpcy5jb21wb3NpdGVzKSB7CiAgICAgICAgcG9zICs9IGNvbXBvc2l0ZS53cml0ZShwb3MsIGJ1Zik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3MgLSBzcG9zOwogIH0KICBzY2FsZShmYWN0b3IpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgeE1pZGRsZSA9ICh0aGlzLmhlYWRlci54TWluICsgdGhpcy5oZWFkZXIueE1heCkgLyAyOwogICAgdGhpcy5oZWFkZXIuc2NhbGUoeE1pZGRsZSwgZmFjdG9yKTsKICAgIGlmICh0aGlzLnNpbXBsZSkgewogICAgICB0aGlzLnNpbXBsZS5zY2FsZSh4TWlkZGxlLCBmYWN0b3IpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjb21wb3NpdGUgb2YgdGhpcy5jb21wb3NpdGVzKSB7CiAgICAgICAgY29tcG9zaXRlLnNjYWxlKHhNaWRkbGUsIGZhY3Rvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KY2xhc3MgR2x5cGhIZWFkZXIgewogIGNvbnN0cnVjdG9yKHsKICAgIG51bWJlck9mQ29udG91cnMsCiAgICB4TWluLAogICAgeU1pbiwKICAgIHhNYXgsCiAgICB5TWF4CiAgfSkgewogICAgdGhpcy5udW1iZXJPZkNvbnRvdXJzID0gbnVtYmVyT2ZDb250b3VyczsKICAgIHRoaXMueE1pbiA9IHhNaW47CiAgICB0aGlzLnlNaW4gPSB5TWluOwogICAgdGhpcy54TWF4ID0geE1heDsKICAgIHRoaXMueU1heCA9IHlNYXg7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIHJldHVybiBbMTAsIG5ldyBHbHlwaEhlYWRlcih7CiAgICAgIG51bWJlck9mQ29udG91cnM6IGdseWYuZ2V0SW50MTYocG9zKSwKICAgICAgeE1pbjogZ2x5Zi5nZXRJbnQxNihwb3MgKyAyKSwKICAgICAgeU1pbjogZ2x5Zi5nZXRJbnQxNihwb3MgKyA0KSwKICAgICAgeE1heDogZ2x5Zi5nZXRJbnQxNihwb3MgKyA2KSwKICAgICAgeU1heDogZ2x5Zi5nZXRJbnQxNihwb3MgKyA4KQogICAgfSldOwogIH0KICBnZXRTaXplKCkgewogICAgcmV0dXJuIDEwOwogIH0KICB3cml0ZShwb3MsIGJ1ZikgewogICAgYnVmLnNldEludDE2KHBvcywgdGhpcy5udW1iZXJPZkNvbnRvdXJzKTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyAyLCB0aGlzLnhNaW4pOwogICAgYnVmLnNldEludDE2KHBvcyArIDQsIHRoaXMueU1pbik7CiAgICBidWYuc2V0SW50MTYocG9zICsgNiwgdGhpcy54TWF4KTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyA4LCB0aGlzLnlNYXgpOwogICAgcmV0dXJuIDEwOwogIH0KICBzY2FsZSh4LCBmYWN0b3IpIHsKICAgIHRoaXMueE1pbiA9IE1hdGgucm91bmQoeCArICh0aGlzLnhNaW4gLSB4KSAqIGZhY3Rvcik7CiAgICB0aGlzLnhNYXggPSBNYXRoLnJvdW5kKHggKyAodGhpcy54TWF4IC0geCkgKiBmYWN0b3IpOwogIH0KfQpjbGFzcyBDb250b3VyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBmbGFncywKICAgIHhDb29yZGluYXRlcywKICAgIHlDb29yZGluYXRlcwogIH0pIHsKICAgIHRoaXMueENvb3JkaW5hdGVzID0geENvb3JkaW5hdGVzOwogICAgdGhpcy55Q29vcmRpbmF0ZXMgPSB5Q29vcmRpbmF0ZXM7CiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CiAgfQp9CmNsYXNzIFNpbXBsZUdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBjb250b3VycywKICAgIGluc3RydWN0aW9ucwogIH0pIHsKICAgIHRoaXMuY29udG91cnMgPSBjb250b3VyczsKICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOwogIH0KICBzdGF0aWMgcGFyc2UocG9zLCBnbHlmLCBudW1iZXJPZkNvbnRvdXJzKSB7CiAgICBjb25zdCBlbmRQdHNPZkNvbnRvdXJzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgewogICAgICBjb25zdCBlbmRQdCA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgIHBvcyArPSAyOwogICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2goZW5kUHQpOwogICAgfQogICAgY29uc3QgbnVtYmVyT2ZQdCA9IGVuZFB0c09mQ29udG91cnNbbnVtYmVyT2ZDb250b3VycyAtIDFdICsgMTsKICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgIHBvcyArPSAyOwogICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gbmV3IFVpbnQ4QXJyYXkoZ2x5Zikuc2xpY2UocG9zLCBwb3MgKyBpbnN0cnVjdGlvbkxlbmd0aCk7CiAgICBwb3MgKz0gaW5zdHJ1Y3Rpb25MZW5ndGg7CiAgICBjb25zdCBmbGFncyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlB0OyBwb3MrKywgaSsrKSB7CiAgICAgIGxldCBmbGFnID0gZ2x5Zi5nZXRVaW50OChwb3MpOwogICAgICBmbGFncy5wdXNoKGZsYWcpOwogICAgICBpZiAoZmxhZyAmIFJFUEVBVF9GTEFHKSB7CiAgICAgICAgY29uc3QgY291bnQgPSBnbHlmLmdldFVpbnQ4KCsrcG9zKTsKICAgICAgICBmbGFnIF49IFJFUEVBVF9GTEFHOwogICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgY291bnQ7IG0rKykgewogICAgICAgICAgZmxhZ3MucHVzaChmbGFnKTsKICAgICAgICB9CiAgICAgICAgaSArPSBjb3VudDsKICAgICAgfQogICAgfQogICAgY29uc3QgYWxsWENvb3JkaW5hdGVzID0gW107CiAgICBsZXQgeENvb3JkaW5hdGVzID0gW107CiAgICBsZXQgeUNvb3JkaW5hdGVzID0gW107CiAgICBsZXQgcG9pbnRGbGFncyA9IFtdOwogICAgY29uc3QgY29udG91cnMgPSBbXTsKICAgIGxldCBlbmRQdHNPZkNvbnRvdXJzSW5kZXggPSAwOwogICAgbGV0IGxhc3RDb29yZGluYXRlID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZQdDsgaSsrKSB7CiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnc1tpXTsKICAgICAgaWYgKGZsYWcgJiBYX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIGNvbnN0IHggPSBnbHlmLmdldFVpbnQ4KHBvcysrKTsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBmbGFnICYgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SID8geCA6IC14OwogICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIGlmIChmbGFnICYgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgeENvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGxhc3RDb29yZGluYXRlICs9IGdseWYuZ2V0SW50MTYocG9zKTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0KICAgICAgaWYgKGVuZFB0c09mQ29udG91cnNbZW5kUHRzT2ZDb250b3Vyc0luZGV4XSA9PT0gaSkgewogICAgICAgIGVuZFB0c09mQ29udG91cnNJbmRleCsrOwogICAgICAgIGFsbFhDb29yZGluYXRlcy5wdXNoKHhDb29yZGluYXRlcyk7CiAgICAgICAgeENvb3JkaW5hdGVzID0gW107CiAgICAgIH0KICAgIH0KICAgIGxhc3RDb29yZGluYXRlID0gMDsKICAgIGVuZFB0c09mQ29udG91cnNJbmRleCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mUHQ7IGkrKykgewogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWV9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBjb25zdCB5ID0gZ2x5Zi5nZXRVaW50OChwb3MrKyk7CiAgICAgICAgbGFzdENvb3JkaW5hdGUgKz0gZmxhZyAmIFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUiA/IHkgOiAteTsKICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIHlDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBnbHlmLmdldEludDE2KHBvcyk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9CiAgICAgIHBvaW50RmxhZ3MucHVzaChmbGFnICYgT05fQ1VSVkVfUE9JTlQgfCBmbGFnICYgT1ZFUkxBUF9TSU1QTEUpOwogICAgICBpZiAoZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzSW5kZXhdID09PSBpKSB7CiAgICAgICAgeENvb3JkaW5hdGVzID0gYWxsWENvb3JkaW5hdGVzW2VuZFB0c09mQ29udG91cnNJbmRleF07CiAgICAgICAgZW5kUHRzT2ZDb250b3Vyc0luZGV4Kys7CiAgICAgICAgY29udG91cnMucHVzaChuZXcgQ29udG91cih7CiAgICAgICAgICBmbGFnczogcG9pbnRGbGFncywKICAgICAgICAgIHhDb29yZGluYXRlcywKICAgICAgICAgIHlDb29yZGluYXRlcwogICAgICAgIH0pKTsKICAgICAgICB5Q29vcmRpbmF0ZXMgPSBbXTsKICAgICAgICBwb2ludEZsYWdzID0gW107CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2ltcGxlR2x5cGgoewogICAgICBjb250b3VycywKICAgICAgaW5zdHJ1Y3Rpb25zCiAgICB9KTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGxldCBzaXplID0gdGhpcy5jb250b3Vycy5sZW5ndGggKiAyICsgMiArIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgIGxldCBsYXN0WCA9IDA7CiAgICBsZXQgbGFzdFkgPSAwOwogICAgZm9yIChjb25zdCBjb250b3VyIG9mIHRoaXMuY29udG91cnMpIHsKICAgICAgc2l6ZSArPSBjb250b3VyLmZsYWdzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29udG91ci54Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IHggPSBjb250b3VyLnhDb29yZGluYXRlc1tpXTsKICAgICAgICBjb25zdCB5ID0gY29udG91ci55Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgbGV0IGFicyA9IE1hdGguYWJzKHggLSBsYXN0WCk7CiAgICAgICAgaWYgKGFicyA+IDI1NSkgewogICAgICAgICAgc2l6ZSArPSAyOwogICAgICAgIH0gZWxzZSBpZiAoYWJzID4gMCkgewogICAgICAgICAgc2l6ZSArPSAxOwogICAgICAgIH0KICAgICAgICBsYXN0WCA9IHg7CiAgICAgICAgYWJzID0gTWF0aC5hYnMoeSAtIGxhc3RZKTsKICAgICAgICBpZiAoYWJzID4gMjU1KSB7CiAgICAgICAgICBzaXplICs9IDI7CiAgICAgICAgfSBlbHNlIGlmIChhYnMgPiAwKSB7CiAgICAgICAgICBzaXplICs9IDE7CiAgICAgICAgfQogICAgICAgIGxhc3RZID0geTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNpemU7CiAgfQogIHdyaXRlKHBvcywgYnVmKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgY29uc3QgeENvb3JkaW5hdGVzID0gW107CiAgICBjb25zdCB5Q29vcmRpbmF0ZXMgPSBbXTsKICAgIGNvbnN0IGZsYWdzID0gW107CiAgICBsZXQgbGFzdFggPSAwOwogICAgbGV0IGxhc3RZID0gMDsKICAgIGZvciAoY29uc3QgY29udG91ciBvZiB0aGlzLmNvbnRvdXJzKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNvbnRvdXIueENvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBsZXQgZmxhZyA9IGNvbnRvdXIuZmxhZ3NbaV07CiAgICAgICAgY29uc3QgeCA9IGNvbnRvdXIueENvb3JkaW5hdGVzW2ldOwogICAgICAgIGxldCBkZWx0YSA9IHggLSBsYXN0WDsKICAgICAgICBpZiAoZGVsdGEgPT09IDApIHsKICAgICAgICAgIGZsYWcgfD0gWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SOwogICAgICAgICAgeENvb3JkaW5hdGVzLnB1c2goMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKGRlbHRhKTsKICAgICAgICAgIGlmIChhYnMgPD0gMjU1KSB7CiAgICAgICAgICAgIGZsYWcgfD0gZGVsdGEgPj0gMCA/IFhfU0hPUlRfVkVDVE9SIHwgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SIDogWF9TSE9SVF9WRUNUT1I7CiAgICAgICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGFicyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChkZWx0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhc3RYID0geDsKICAgICAgICBjb25zdCB5ID0gY29udG91ci55Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgZGVsdGEgPSB5IC0gbGFzdFk7CiAgICAgICAgaWYgKGRlbHRhID09PSAwKSB7CiAgICAgICAgICBmbGFnIHw9IFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUjsKICAgICAgICAgIHlDb29yZGluYXRlcy5wdXNoKDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBhYnMgPSBNYXRoLmFicyhkZWx0YSk7CiAgICAgICAgICBpZiAoYWJzIDw9IDI1NSkgewogICAgICAgICAgICBmbGFnIHw9IGRlbHRhID49IDAgPyBZX1NIT1JUX1ZFQ1RPUiB8IFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUiA6IFlfU0hPUlRfVkVDVE9SOwogICAgICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChhYnMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2goZGVsdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsYXN0WSA9IHk7CiAgICAgICAgZmxhZ3MucHVzaChmbGFnKTsKICAgICAgfQogICAgICBidWYuc2V0VWludDE2KHBvcywgeENvb3JkaW5hdGVzLmxlbmd0aCAtIDEpOwogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpOwogICAgcG9zICs9IDI7CiAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSB7CiAgICAgIG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIDAsIGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCkuc2V0KHRoaXMuaW5zdHJ1Y3Rpb25zLCBwb3MpOwogICAgICBwb3MgKz0gdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgfQogICAgZm9yIChjb25zdCBmbGFnIG9mIGZsYWdzKSB7CiAgICAgIGJ1Zi5zZXRVaW50OChwb3MrKywgZmxhZyk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB4Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB4ID0geENvb3JkaW5hdGVzW2ldOwogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWF9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBidWYuc2V0VWludDgocG9zKyssIHgpOwogICAgICB9IGVsc2UgaWYgKCEoZmxhZyAmIFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUikpIHsKICAgICAgICBidWYuc2V0SW50MTYocG9zLCB4KTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0geUNvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeSA9IHlDb29yZGluYXRlc1tpXTsKICAgICAgY29uc3QgZmxhZyA9IGZsYWdzW2ldOwogICAgICBpZiAoZmxhZyAmIFlfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgYnVmLnNldFVpbnQ4KHBvcysrLCB5KTsKICAgICAgfSBlbHNlIGlmICghKGZsYWcgJiBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IpKSB7CiAgICAgICAgYnVmLnNldEludDE2KHBvcywgeSk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3MgLSBzcG9zOwogIH0KICBzY2FsZSh4LCBmYWN0b3IpIHsKICAgIGZvciAoY29uc3QgY29udG91ciBvZiB0aGlzLmNvbnRvdXJzKSB7CiAgICAgIGlmIChjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGggPT09IDApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29udG91ci54Q29vcmRpbmF0ZXNbaV0gPSBNYXRoLnJvdW5kKHggKyAoY29udG91ci54Q29vcmRpbmF0ZXNbaV0gLSB4KSAqIGZhY3Rvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KY2xhc3MgQ29tcG9zaXRlR2x5cGggewogIGNvbnN0cnVjdG9yKHsKICAgIGZsYWdzLAogICAgZ2x5cGhJbmRleCwKICAgIGFyZ3VtZW50MSwKICAgIGFyZ3VtZW50MiwKICAgIHRyYW5zZiwKICAgIGluc3RydWN0aW9ucwogIH0pIHsKICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgIHRoaXMuZ2x5cGhJbmRleCA9IGdseXBoSW5kZXg7CiAgICB0aGlzLmFyZ3VtZW50MSA9IGFyZ3VtZW50MTsKICAgIHRoaXMuYXJndW1lbnQyID0gYXJndW1lbnQyOwogICAgdGhpcy50cmFuc2YgPSB0cmFuc2Y7CiAgICB0aGlzLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uczsKICB9CiAgc3RhdGljIHBhcnNlKHBvcywgZ2x5ZikgewogICAgY29uc3Qgc3BvcyA9IHBvczsKICAgIGNvbnN0IHRyYW5zZiA9IFtdOwogICAgbGV0IGZsYWdzID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgIGNvbnN0IGdseXBoSW5kZXggPSBnbHlmLmdldFVpbnQxNihwb3MgKyAyKTsKICAgIHBvcyArPSA0OwogICAgbGV0IGFyZ3VtZW50MSwgYXJndW1lbnQyOwogICAgaWYgKGZsYWdzICYgQVJHXzFfQU5EXzJfQVJFX1dPUkRTKSB7CiAgICAgIGlmIChmbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0SW50MTYocG9zKTsKICAgICAgICBhcmd1bWVudDIgPSBnbHlmLmdldEludDE2KHBvcyArIDIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRVaW50MTYocG9zICsgMik7CiAgICAgIH0KICAgICAgcG9zICs9IDQ7CiAgICAgIGZsYWdzIF49IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0SW50OChwb3MpOwogICAgICAgIGFyZ3VtZW50MiA9IGdseWYuZ2V0SW50OChwb3MgKyAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmd1bWVudDEgPSBnbHlmLmdldFVpbnQ4KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRVaW50OChwb3MgKyAxKTsKICAgICAgfQogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGlmIChmbGFncyAmIFdFX0hBVkVfQV9TQ0FMRSkgewogICAgICB0cmFuc2YucHVzaChnbHlmLmdldFVpbnQxNihwb3MpKTsKICAgICAgcG9zICs9IDI7CiAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BTl9YX0FORF9ZX1NDQUxFKSB7CiAgICAgIHRyYW5zZi5wdXNoKGdseWYuZ2V0VWludDE2KHBvcyksIGdseWYuZ2V0VWludDE2KHBvcyArIDIpKTsKICAgICAgcG9zICs9IDQ7CiAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BX1RXT19CWV9UV08pIHsKICAgICAgdHJhbnNmLnB1c2goZ2x5Zi5nZXRVaW50MTYocG9zKSwgZ2x5Zi5nZXRVaW50MTYocG9zICsgMiksIGdseWYuZ2V0VWludDE2KHBvcyArIDQpLCBnbHlmLmdldFVpbnQxNihwb3MgKyA2KSk7CiAgICAgIHBvcyArPSA4OwogICAgfQogICAgbGV0IGluc3RydWN0aW9ucyA9IG51bGw7CiAgICBpZiAoZmxhZ3MgJiBXRV9IQVZFX0lOU1RSVUNUSU9OUykgewogICAgICBjb25zdCBpbnN0cnVjdGlvbkxlbmd0aCA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgIHBvcyArPSAyOwogICAgICBpbnN0cnVjdGlvbnMgPSBuZXcgVWludDhBcnJheShnbHlmKS5zbGljZShwb3MsIHBvcyArIGluc3RydWN0aW9uTGVuZ3RoKTsKICAgICAgcG9zICs9IGluc3RydWN0aW9uTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIFtwb3MgLSBzcG9zLCBuZXcgQ29tcG9zaXRlR2x5cGgoewogICAgICBmbGFncywKICAgICAgZ2x5cGhJbmRleCwKICAgICAgYXJndW1lbnQxLAogICAgICBhcmd1bWVudDIsCiAgICAgIHRyYW5zZiwKICAgICAgaW5zdHJ1Y3Rpb25zCiAgICB9KV07CiAgfQogIGdldFNpemUoKSB7CiAgICBsZXQgc2l6ZSA9IDIgKyAyICsgdGhpcy50cmFuc2YubGVuZ3RoICogMjsKICAgIGlmICh0aGlzLmZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpIHsKICAgICAgc2l6ZSArPSAyICsgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgfQogICAgc2l6ZSArPSAyOwogICAgaWYgKHRoaXMuZmxhZ3MgJiAyKSB7CiAgICAgIGlmICghKHRoaXMuYXJndW1lbnQxID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDEgPD0gMTI3ICYmIHRoaXMuYXJndW1lbnQyID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDIgPD0gMTI3KSkgewogICAgICAgIHNpemUgKz0gMjsKICAgICAgfQogICAgfSBlbHNlIGlmICghKHRoaXMuYXJndW1lbnQxID49IDAgJiYgdGhpcy5hcmd1bWVudDEgPD0gMjU1ICYmIHRoaXMuYXJndW1lbnQyID49IDAgJiYgdGhpcy5hcmd1bWVudDIgPD0gMjU1KSkgewogICAgICBzaXplICs9IDI7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGNvbnN0IHNwb3MgPSBwb3M7CiAgICBpZiAodGhpcy5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQxIDw9IDEyNyAmJiB0aGlzLmFyZ3VtZW50MiA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQyIDw9IDEyNykpIHsKICAgICAgICB0aGlzLmZsYWdzIHw9IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgICAgfQogICAgfSBlbHNlIGlmICghKHRoaXMuYXJndW1lbnQxID49IDAgJiYgdGhpcy5hcmd1bWVudDEgPD0gMjU1ICYmIHRoaXMuYXJndW1lbnQyID49IDAgJiYgdGhpcy5hcmd1bWVudDIgPD0gMjU1KSkgewogICAgICB0aGlzLmZsYWdzIHw9IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgIH0KICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmZsYWdzKTsKICAgIGJ1Zi5zZXRVaW50MTYocG9zICsgMiwgdGhpcy5nbHlwaEluZGV4KTsKICAgIHBvcyArPSA0OwogICAgaWYgKHRoaXMuZmxhZ3MgJiBBUkdfMV9BTkRfMl9BUkVfV09SRFMpIHsKICAgICAgaWYgKHRoaXMuZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMpIHsKICAgICAgICBidWYuc2V0SW50MTYocG9zLCB0aGlzLmFyZ3VtZW50MSk7CiAgICAgICAgYnVmLnNldEludDE2KHBvcyArIDIsIHRoaXMuYXJndW1lbnQyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWYuc2V0VWludDE2KHBvcywgdGhpcy5hcmd1bWVudDEpOwogICAgICAgIGJ1Zi5zZXRVaW50MTYocG9zICsgMiwgdGhpcy5hcmd1bWVudDIpOwogICAgICB9CiAgICAgIHBvcyArPSA0OwogICAgfSBlbHNlIHsKICAgICAgYnVmLnNldFVpbnQ4KHBvcywgdGhpcy5hcmd1bWVudDEpOwogICAgICBidWYuc2V0VWludDgocG9zICsgMSwgdGhpcy5hcmd1bWVudDIpOwogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGlmICh0aGlzLmZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpIHsKICAgICAgYnVmLnNldFVpbnQxNihwb3MsIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCk7CiAgICAgIHBvcyArPSAyOwogICAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgYnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKS5zZXQodGhpcy5pbnN0cnVjdGlvbnMsIHBvcyk7CiAgICAgICAgcG9zICs9IHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvcyAtIHNwb3M7CiAgfQogIHNjYWxlKHgsIGZhY3Rvcikge30KfQoKOy8vIC4vc3JjL2NvcmUvb3BlbnR5cGVfZmlsZV9idWlsZGVyLmpzCgoKZnVuY3Rpb24gd3JpdGVJbnQxNihkZXN0LCBvZmZzZXQsIG51bSkgewogIGRlc3Rbb2Zmc2V0XSA9IG51bSA+PiA4ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDFdID0gbnVtICYgMHhmZjsKfQpmdW5jdGlvbiB3cml0ZUludDMyKGRlc3QsIG9mZnNldCwgbnVtKSB7CiAgZGVzdFtvZmZzZXRdID0gbnVtID4+IDI0ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDFdID0gbnVtID4+IDE2ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDJdID0gbnVtID4+IDggJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgM10gPSBudW0gJiAweGZmOwp9CmZ1bmN0aW9uIHdyaXRlRGF0YShkZXN0LCBvZmZzZXQsIGRhdGEpIHsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgIGRlc3Quc2V0KGRhdGEsIG9mZnNldCk7CiAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W29mZnNldCsrXSA9IGRhdGEuY2hhckNvZGVBdChpKSAmIDB4ZmY7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoY29uc3QgbnVtIG9mIGRhdGEpIHsKICAgICAgZGVzdFtvZmZzZXQrK10gPSBudW0gJiAweGZmOwogICAgfQogIH0KfQpjb25zdCBPVEZfSEVBREVSX1NJWkUgPSAxMjsKY29uc3QgT1RGX1RBQkxFX0VOVFJZX1NJWkUgPSAxNjsKY2xhc3MgT3BlblR5cGVGaWxlQnVpbGRlciB7CiAgY29uc3RydWN0b3Ioc2ZudCkgewogICAgdGhpcy5zZm50ID0gc2ZudDsKICAgIHRoaXMudGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgc3RhdGljIGdldFNlYXJjaFBhcmFtcyhlbnRyaWVzQ291bnQsIGVudHJ5U2l6ZSkgewogICAgbGV0IG1heFBvd2VyMiA9IDEsCiAgICAgIGxvZzIgPSAwOwogICAgd2hpbGUgKChtYXhQb3dlcjIgXiBlbnRyaWVzQ291bnQpID4gbWF4UG93ZXIyKSB7CiAgICAgIG1heFBvd2VyMiA8PD0gMTsKICAgICAgbG9nMisrOwogICAgfQogICAgY29uc3Qgc2VhcmNoUmFuZ2UgPSBtYXhQb3dlcjIgKiBlbnRyeVNpemU7CiAgICByZXR1cm4gewogICAgICByYW5nZTogc2VhcmNoUmFuZ2UsCiAgICAgIGVudHJ5OiBsb2cyLAogICAgICByYW5nZVNoaWZ0OiBlbnRyeVNpemUgKiBlbnRyaWVzQ291bnQgLSBzZWFyY2hSYW5nZQogICAgfTsKICB9CiAgdG9BcnJheSgpIHsKICAgIGxldCBzZm50ID0gdGhpcy5zZm50OwogICAgY29uc3QgdGFibGVzID0gdGhpcy50YWJsZXM7CiAgICBjb25zdCB0YWJsZXNOYW1lcyA9IE9iamVjdC5rZXlzKHRhYmxlcyk7CiAgICB0YWJsZXNOYW1lcy5zb3J0KCk7CiAgICBjb25zdCBudW1UYWJsZXMgPSB0YWJsZXNOYW1lcy5sZW5ndGg7CiAgICBsZXQgaSwgaiwgamosIHRhYmxlLCB0YWJsZU5hbWU7CiAgICBsZXQgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFICsgbnVtVGFibGVzICogT1RGX1RBQkxFX0VOVFJZX1NJWkU7CiAgICBjb25zdCB0YWJsZU9mZnNldHMgPSBbb2Zmc2V0XTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICB0YWJsZSA9IHRhYmxlc1t0YWJsZXNOYW1lc1tpXV07CiAgICAgIGNvbnN0IHBhZGRlZExlbmd0aCA9ICh0YWJsZS5sZW5ndGggKyAzICYgfjMpID4+PiAwOwogICAgICBvZmZzZXQgKz0gcGFkZGVkTGVuZ3RoOwogICAgICB0YWJsZU9mZnNldHMucHVzaChvZmZzZXQpOwogICAgfQogICAgY29uc3QgZmlsZSA9IG5ldyBVaW50OEFycmF5KG9mZnNldCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgdGFibGUgPSB0YWJsZXNbdGFibGVzTmFtZXNbaV1dOwogICAgICB3cml0ZURhdGEoZmlsZSwgdGFibGVPZmZzZXRzW2ldLCB0YWJsZSk7CiAgICB9CiAgICBpZiAoc2ZudCA9PT0gInRydWUiKSB7CiAgICAgIHNmbnQgPSBzdHJpbmczMigweDAwMDEwMDAwKTsKICAgIH0KICAgIGZpbGVbMF0gPSBzZm50LmNoYXJDb2RlQXQoMCkgJiAweGZmOwogICAgZmlsZVsxXSA9IHNmbnQuY2hhckNvZGVBdCgxKSAmIDB4ZmY7CiAgICBmaWxlWzJdID0gc2ZudC5jaGFyQ29kZUF0KDIpICYgMHhmZjsKICAgIGZpbGVbM10gPSBzZm50LmNoYXJDb2RlQXQoMykgJiAweGZmOwogICAgd3JpdGVJbnQxNihmaWxlLCA0LCBudW1UYWJsZXMpOwogICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMobnVtVGFibGVzLCAxNik7CiAgICB3cml0ZUludDE2KGZpbGUsIDYsIHNlYXJjaFBhcmFtcy5yYW5nZSk7CiAgICB3cml0ZUludDE2KGZpbGUsIDgsIHNlYXJjaFBhcmFtcy5lbnRyeSk7CiAgICB3cml0ZUludDE2KGZpbGUsIDEwLCBzZWFyY2hQYXJhbXMucmFuZ2VTaGlmdCk7CiAgICBvZmZzZXQgPSBPVEZfSEVBREVSX1NJWkU7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgdGFibGVOYW1lID0gdGFibGVzTmFtZXNbaV07CiAgICAgIGZpbGVbb2Zmc2V0XSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDApICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAxXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDEpICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAyXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDIpICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAzXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDMpICYgMHhmZjsKICAgICAgbGV0IGNoZWNrc3VtID0gMDsKICAgICAgZm9yIChqID0gdGFibGVPZmZzZXRzW2ldLCBqaiA9IHRhYmxlT2Zmc2V0c1tpICsgMV07IGogPCBqajsgaiArPSA0KSB7CiAgICAgICAgY29uc3QgcXVhZCA9IHJlYWRVaW50MzIoZmlsZSwgaik7CiAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSArIHF1YWQgPj4+IDA7CiAgICAgIH0KICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyA0LCBjaGVja3N1bSk7CiAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgOCwgdGFibGVPZmZzZXRzW2ldKTsKICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyAxMiwgdGFibGVzW3RhYmxlTmFtZV0ubGVuZ3RoKTsKICAgICAgb2Zmc2V0ICs9IE9URl9UQUJMRV9FTlRSWV9TSVpFOwogICAgfQogICAgcmV0dXJuIGZpbGU7CiAgfQogIGFkZFRhYmxlKHRhZywgZGF0YSkgewogICAgaWYgKHRhZyBpbiB0aGlzLnRhYmxlcykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRhYmxlICIgKyB0YWcgKyAiIGFscmVhZHkgZXhpc3RzIik7CiAgICB9CiAgICB0aGlzLnRhYmxlc1t0YWddID0gZGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3R5cGUxX3BhcnNlci5qcwoKCgoKY29uc3QgSElOVElOR19FTkFCTEVEID0gZmFsc2U7CmNvbnN0IENPTU1BTkRfTUFQID0gewogIGhzdGVtOiBbMV0sCiAgdnN0ZW06IFszXSwKICB2bW92ZXRvOiBbNF0sCiAgcmxpbmV0bzogWzVdLAogIGhsaW5ldG86IFs2XSwKICB2bGluZXRvOiBbN10sCiAgcnJjdXJ2ZXRvOiBbOF0sCiAgY2FsbHN1YnI6IFsxMF0sCiAgZmxleDogWzEyLCAzNV0sCiAgZHJvcDogWzEyLCAxOF0sCiAgZW5kY2hhcjogWzE0XSwKICBybW92ZXRvOiBbMjFdLAogIGhtb3ZldG86IFsyMl0sCiAgdmhjdXJ2ZXRvOiBbMzBdLAogIGh2Y3VydmV0bzogWzMxXQp9OwpjbGFzcyBUeXBlMUNoYXJTdHJpbmcgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDA7CiAgICB0aGlzLmxzYiA9IDA7CiAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgIHRoaXMub3V0cHV0ID0gW107CiAgICB0aGlzLnN0YWNrID0gW107CiAgfQogIGNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGNvbnN0IGNvdW50ID0gZW5jb2RlZC5sZW5ndGg7CiAgICBsZXQgZXJyb3IgPSBmYWxzZTsKICAgIGxldCB3eCwgc2J4LCBzdWJyTnVtYmVyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxldCB2YWx1ZSA9IGVuY29kZWRbaV07CiAgICAgIGlmICh2YWx1ZSA8IDMyKSB7CiAgICAgICAgaWYgKHZhbHVlID09PSAxMikgewogICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgKyBlbmNvZGVkWysraV07CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLmhzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC52c3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGR5ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCwgZHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bW92ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC5obGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg2LCBDT01NQU5EX01BUC5ycmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghc3VicnNbc3Vick51bWJlcl0pIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmNvbnZlcnQoc3VicnNbc3Vick51bWJlcl0sIHN1YnJzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDsKICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaG1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChDT01NQU5EX01BUC5lbmRjaGFyWzBdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEsIENPTU1BTkRfTUFQLmhtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC52aGN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5odmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMDoKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDI6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OgogICAgICAgICAgICBpZiAoc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICAgIGNvbnN0IGFzYiA9IHRoaXMuc3RhY2suYXQoLTUpOwogICAgICAgICAgICAgIHRoaXMuc2VhYyA9IHRoaXMuc3RhY2suc3BsaWNlKC00LCA0KTsKICAgICAgICAgICAgICB0aGlzLnNlYWNbMF0gKz0gdGhpcy5sc2IgLSBhc2I7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDAsIENPTU1BTkRfTUFQLmVuZGNoYXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5lbmRjaGFyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgNzoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgNCkgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGNvbnN0IHNieSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OwogICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4LCBzYnkpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMywgQ09NTUFORF9NQVAucm1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxMjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBudW0yID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtMSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChudW0xIC8gbnVtMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtQXJncyA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmIChzdWJyTnVtYmVyID09PSAwICYmIG51bUFyZ3MgPT09IDMpIHsKICAgICAgICAgICAgICBjb25zdCBmbGV4QXJncyA9IHRoaXMuc3RhY2suc3BsaWNlKC0xNywgMTcpOwogICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmbGV4QXJnc1syXSArIGZsZXhBcmdzWzBdLCBmbGV4QXJnc1szXSArIGZsZXhBcmdzWzFdLCBmbGV4QXJnc1s0XSwgZmxleEFyZ3NbNV0sIGZsZXhBcmdzWzZdLCBmbGV4QXJnc1s3XSwgZmxleEFyZ3NbOF0sIGZsZXhBcmdzWzldLCBmbGV4QXJnc1sxMF0sIGZsZXhBcmdzWzExXSwgZmxleEFyZ3NbMTJdLCBmbGV4QXJnc1sxM10sIGZsZXhBcmdzWzE0XSk7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEzLCBDT01NQU5EX01BUC5mbGV4LCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZmxleEFyZ3NbMTVdLCBmbGV4QXJnc1sxNl0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnJOdW1iZXIgPT09IDEgJiYgbnVtQXJncyA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuZmxleGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE3OgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMzM6CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3YXJuKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgIicgKyB2YWx1ZSArICciJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNDYpIHsKICAgICAgICB2YWx1ZSAtPSAxMzk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7CiAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkgewogICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAyNCB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAxNiB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCA4IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDA7CiAgICAgIH0KICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBlcnJvcjsKICB9CiAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykgewogICAgY29uc3Qgc3RhY2tMZW5ndGggPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgIGlmIChob3dNYW55QXJncyA+IHN0YWNrTGVuZ3RoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3Qgc3RhcnQgPSBzdGFja0xlbmd0aCAtIGhvd01hbnlBcmdzOwogICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhY2tMZW5ndGg7IGkrKykgewogICAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YWNrW2ldOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI4LCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IDY1NTM2ICogdmFsdWUgfCAwOwogICAgICAgIHRoaXMub3V0cHV0LnB1c2goMjU1LCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CiAgICAgIH0KICAgIH0KICAgIHRoaXMub3V0cHV0LnB1c2goLi4uY29tbWFuZCk7CiAgICBpZiAoa2VlcFN0YWNrKSB7CiAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNvbnN0IEVFWEVDX0VOQ1JZUFRfS0VZID0gNTU2NjU7CmNvbnN0IENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7CmZ1bmN0aW9uIGlzSGV4RGlnaXQoY29kZSkgewogIHJldHVybiBjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcgfHwgY29kZSA+PSA2NSAmJiBjb2RlIDw9IDcwIHx8IGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMDI7Cn0KZnVuY3Rpb24gZGVjcnlwdChkYXRhLCBrZXksIGRpc2NhcmROdW1iZXIpIHsKICBpZiAoZGlzY2FyZE51bWJlciA+PSBkYXRhLmxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICBjb25zdCBjMSA9IDUyODQ1LAogICAgYzIgPSAyMjcxOTsKICBsZXQgciA9IGtleSB8IDAsCiAgICBpLAogICAgajsKICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7CiAgICByID0gKGRhdGFbaV0gKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOwogIH0KICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoIC0gZGlzY2FyZE51bWJlcjsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7CiAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHsKICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpXTsKICAgIGRlY3J5cHRlZFtqXSA9IHZhbHVlIF4gciA+PiA4OwogICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgfQogIHJldHVybiBkZWNyeXB0ZWQ7Cn0KZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikgewogIGNvbnN0IGMxID0gNTI4NDUsCiAgICBjMiA9IDIyNzE5OwogIGxldCByID0ga2V5IHwgMDsKICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoLAogICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShtYXliZUxlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBjb25zdCBkaWdpdDEgPSBkYXRhW2ldOwogICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0MSkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpKys7CiAgICBsZXQgZGlnaXQyOwogICAgd2hpbGUgKGkgPCBjb3VudCAmJiAhaXNIZXhEaWdpdChkaWdpdDIgPSBkYXRhW2ldKSkgewogICAgICBpKys7CiAgICB9CiAgICBpZiAoaSA8IGNvdW50KSB7CiAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShkaWdpdDEsIGRpZ2l0MiksIDE2KTsKICAgICAgZGVjcnlwdGVkW2orK10gPSB2YWx1ZSBeIHIgPj4gODsKICAgICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgICB9CiAgfQogIHJldHVybiBkZWNyeXB0ZWQuc2xpY2UoZGlzY2FyZE51bWJlciwgaik7Cn0KZnVuY3Rpb24gaXNTcGVjaWFsKGMpIHsKICByZXR1cm4gYyA9PT0gMHgyZiB8fCBjID09PSAweDViIHx8IGMgPT09IDB4NWQgfHwgYyA9PT0gMHg3YiB8fCBjID09PSAweDdkIHx8IGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOTsKfQpjbGFzcyBUeXBlMVBhcnNlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBlbmNyeXB0ZWQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgY29uc3QgZGF0YSA9IHN0cmVhbS5nZXRCeXRlcygpOwogICAgICBjb25zdCBpc0JpbmFyeSA9ICEoKGlzSGV4RGlnaXQoZGF0YVswXSkgfHwgaXNXaGl0ZVNwYWNlKGRhdGFbMF0pKSAmJiBpc0hleERpZ2l0KGRhdGFbMV0pICYmIGlzSGV4RGlnaXQoZGF0YVsyXSkgJiYgaXNIZXhEaWdpdChkYXRhWzNdKSAmJiBpc0hleERpZ2l0KGRhdGFbNF0pICYmIGlzSGV4RGlnaXQoZGF0YVs1XSkgJiYgaXNIZXhEaWdpdChkYXRhWzZdKSAmJiBpc0hleERpZ2l0KGRhdGFbN10pKTsKICAgICAgc3RyZWFtID0gbmV3IFN0cmVhbShpc0JpbmFyeSA/IGRlY3J5cHQoZGF0YSwgRUVYRUNfRU5DUllQVF9LRVksIDQpIDogZGVjcnlwdEFzY2lpKGRhdGEsIEVFWEVDX0VOQ1JZUFRfS0VZLCA0KSk7CiAgICB9CiAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMubmV4dENoYXIoKTsKICB9CiAgcmVhZE51bWJlckFycmF5KCkgewogICAgdGhpcy5nZXRUb2tlbigpOwogICAgY29uc3QgYXJyYXkgPSBbXTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09ICJdIiB8fCB0b2tlbiA9PT0gIn0iKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYXJyYXkucHVzaChwYXJzZUZsb2F0KHRva2VuIHx8IDApKTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CiAgcmVhZE51bWJlcigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHBhcnNlRmxvYXQodG9rZW4gfHwgMCk7CiAgfQogIHJlYWRJbnQoKSB7CiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgIHJldHVybiBwYXJzZUludCh0b2tlbiB8fCAwLCAxMCkgfCAwOwogIH0KICByZWFkQm9vbGVhbigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHRva2VuID09PSAidHJ1ZSIgPyAxIDogMDsKICB9CiAgbmV4dENoYXIoKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50Q2hhciA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICB9CiAgcHJldkNoYXIoKSB7CiAgICB0aGlzLnN0cmVhbS5za2lwKC0yKTsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBnZXRUb2tlbigpIHsKICAgIGxldCBjb21tZW50ID0gZmFsc2U7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGNoID09PSAtMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChjb21tZW50KSB7CiAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CiAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CiAgICAgICAgY29tbWVudCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChpc1NwZWNpYWwoY2gpKSB7CiAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgbGV0IHRva2VuID0gIiI7CiAgICBkbyB7CiAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0gd2hpbGUgKGNoID49IDAgJiYgIWlzV2hpdGVTcGFjZShjaCkgJiYgIWlzU3BlY2lhbChjaCkpOwogICAgcmV0dXJuIHRva2VuOwogIH0KICByZWFkQ2hhclN0cmluZ3MoYnl0ZXMsIGxlbklWKSB7CiAgICBpZiAobGVuSVYgPT09IC0xKSB7CiAgICAgIHJldHVybiBieXRlczsKICAgIH0KICAgIHJldHVybiBkZWNyeXB0KGJ5dGVzLCBDSEFSX1NUUlNfRU5DUllQVF9LRVksIGxlbklWKTsKICB9CiAgZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgY29uc3Qgc3VicnMgPSBbXSwKICAgICAgY2hhcnN0cmluZ3MgPSBbXTsKICAgIGNvbnN0IHByaXZhdGVEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHByaXZhdGVEYXRhLmxlbklWID0gNDsKICAgIGNvbnN0IHByb2dyYW0gPSB7CiAgICAgIHN1YnJzOiBbXSwKICAgICAgY2hhcnN0cmluZ3M6IFtdLAogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgcHJpdmF0ZURhdGEKICAgICAgfQogICAgfTsKICAgIGxldCB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JVjsKICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmdldFRva2VuKCkpICE9PSBudWxsKSB7CiAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICBjYXNlICJDaGFyU3RyaW5ncyI6CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSAiZW5kIikgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gIi8iKSB7CiAgICAgICAgICAgICAgdGhpcy5wcmV2Q2hhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoYXJzdHJpbmdzLnB1c2goewogICAgICAgICAgICAgIGdseXBoLAogICAgICAgICAgICAgIGVuY29kZWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTdWJycyI6CiAgICAgICAgICB0aGlzLnJlYWRJbnQoKTsKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09ICJkdXAiKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyc1tpbmRleF0gPSBlbmNvZGVkOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVZhbHVlcyI6CiAgICAgICAgY2FzZSAiT3RoZXJCbHVlcyI6CiAgICAgICAgY2FzZSAiRmFtaWx5Qmx1ZXMiOgogICAgICAgIGNhc2UgIkZhbWlseU90aGVyQmx1ZXMiOgogICAgICAgICAgY29uc3QgYmx1ZUFycmF5ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIGlmIChibHVlQXJyYXkubGVuZ3RoID4gMCAmJiBibHVlQXJyYXkubGVuZ3RoICUgMiA9PT0gMCAmJiBISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IGJsdWVBcnJheTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0ZW1TbmFwSCI6CiAgICAgICAgY2FzZSAiU3RlbVNuYXBWIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU3RkSFciOgogICAgICAgIGNhc2UgIlN0ZFZXIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVNoaWZ0IjoKICAgICAgICBjYXNlICJsZW5JViI6CiAgICAgICAgY2FzZSAiQmx1ZUZ1enoiOgogICAgICAgIGNhc2UgIkJsdWVTY2FsZSI6CiAgICAgICAgY2FzZSAiTGFuZ3VhZ2VHcm91cCI6CiAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFeHBhbnNpb25GYWN0b3IiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlcigpIHx8IDAuMDY7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb3JjZUJvbGQiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZEJvb2xlYW4oKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZW5jb2RlZCwKICAgICAgZ2x5cGgKICAgIH0gb2YgY2hhcnN0cmluZ3MpIHsKICAgICAgY29uc3QgY2hhclN0cmluZyA9IG5ldyBUeXBlMUNoYXJTdHJpbmcoKTsKICAgICAgY29uc3QgZXJyb3IgPSBjaGFyU3RyaW5nLmNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCk7CiAgICAgIGxldCBvdXRwdXQgPSBjaGFyU3RyaW5nLm91dHB1dDsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgb3V0cHV0ID0gWzE0XTsKICAgICAgfQogICAgICBjb25zdCBjaGFyU3RyaW5nT2JqZWN0ID0gewogICAgICAgIGdseXBoTmFtZTogZ2x5cGgsCiAgICAgICAgY2hhcnN0cmluZzogb3V0cHV0LAogICAgICAgIHdpZHRoOiBjaGFyU3RyaW5nLndpZHRoLAogICAgICAgIGxzYjogY2hhclN0cmluZy5sc2IsCiAgICAgICAgc2VhYzogY2hhclN0cmluZy5zZWFjCiAgICAgIH07CiAgICAgIGlmIChnbHlwaCA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgcHJvZ3JhbS5jaGFyc3RyaW5ncy51bnNoaWZ0KGNoYXJTdHJpbmdPYmplY3QpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MucHVzaChjaGFyU3RyaW5nT2JqZWN0KTsKICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgICBjb25zdCBpbmRleCA9IHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoZ2x5cGgpOwogICAgICAgIGlmIChpbmRleCA+IC0xICYmIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9PT0gdW5kZWZpbmVkICYmIGluZGV4ID49IHByb3BlcnRpZXMuZmlyc3RDaGFyICYmIGluZGV4IDw9IHByb3BlcnRpZXMubGFzdENoYXIpIHsKICAgICAgICAgIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9CiAgZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcykgewogICAgbGV0IHRva2VuOwogICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgIGNhc2UgIkZvbnRNYXRyaXgiOgogICAgICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuZm9udE1hdHJpeCA9IG1hdHJpeDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVuY29kaW5nIjoKICAgICAgICAgIGNvbnN0IGVuY29kaW5nQXJnID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgbGV0IGVuY29kaW5nOwogICAgICAgICAgaWYgKCEvXlxkKyQvLnRlc3QoZW5jb2RpbmdBcmcpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoZW5jb2RpbmdBcmcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBbXTsKICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHBhcnNlSW50KGVuY29kaW5nQXJnLCAxMCkgfCAwOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CiAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9PSAiZHVwIiAmJiB0b2tlbiAhPT0gImRlZiIpIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAiZGVmIikgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGdseXBoOwogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkZvbnRCQm94IjoKICAgICAgICAgIGNvbnN0IGZvbnRCQm94ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKICAgICAgICAgIHByb3BlcnRpZXMuZGVzY2VudCA9IE1hdGgubWluKGZvbnRCQm94WzFdLCBmb250QkJveFszXSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvdHlwZTFfZm9udC5qcwoKCgoKCgpmdW5jdGlvbiBmaW5kQmxvY2soc3RyZWFtQnl0ZXMsIHNpZ25hdHVyZSwgc3RhcnRJbmRleCkgewogIGNvbnN0IHN0cmVhbUJ5dGVzTGVuZ3RoID0gc3RyZWFtQnl0ZXMubGVuZ3RoOwogIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAgY29uc3Qgc2Nhbkxlbmd0aCA9IHN0cmVhbUJ5dGVzTGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogIGxldCBpID0gc3RhcnRJbmRleCwKICAgIGZvdW5kID0gZmFsc2U7CiAgd2hpbGUgKGkgPCBzY2FuTGVuZ3RoKSB7CiAgICBsZXQgaiA9IDA7CiAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzdHJlYW1CeXRlc1tpICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICBqKys7CiAgICB9CiAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgaSArPSBqOwogICAgICB3aGlsZSAoaSA8IHN0cmVhbUJ5dGVzTGVuZ3RoICYmIGlzV2hpdGVTcGFjZShzdHJlYW1CeXRlc1tpXSkpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgZm91bmQgPSB0cnVlOwogICAgICBicmVhazsKICAgIH0KICAgIGkrKzsKICB9CiAgcmV0dXJuIHsKICAgIGZvdW5kLAogICAgbGVuZ3RoOiBpCiAgfTsKfQpmdW5jdGlvbiBnZXRIZWFkZXJCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgewogIGNvbnN0IEVFWEVDX1NJR05BVFVSRSA9IFsweDY1LCAweDY1LCAweDc4LCAweDY1LCAweDYzXTsKICBjb25zdCBzdHJlYW1TdGFydFBvcyA9IHN0cmVhbS5wb3M7CiAgbGV0IGhlYWRlckJ5dGVzLCBoZWFkZXJCeXRlc0xlbmd0aCwgYmxvY2s7CiAgdHJ5IHsKICAgIGhlYWRlckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCk7CiAgICBoZWFkZXJCeXRlc0xlbmd0aCA9IGhlYWRlckJ5dGVzLmxlbmd0aDsKICB9IGNhdGNoIHt9CiAgaWYgKGhlYWRlckJ5dGVzTGVuZ3RoID09PSBzdWdnZXN0ZWRMZW5ndGgpIHsKICAgIGJsb2NrID0gZmluZEJsb2NrKGhlYWRlckJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIHN1Z2dlc3RlZExlbmd0aCAtIDIgKiBFRVhFQ19TSUdOQVRVUkUubGVuZ3RoKTsKICAgIGlmIChibG9jay5mb3VuZCAmJiBibG9jay5sZW5ndGggPT09IHN1Z2dlc3RlZExlbmd0aCkgewogICAgICByZXR1cm4gewogICAgICAgIHN0cmVhbTogbmV3IFN0cmVhbShoZWFkZXJCeXRlcyksCiAgICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgKICAgICAgfTsKICAgIH0KICB9CiAgd2FybignSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhcnRQb3M7CiAgY29uc3QgU0NBTl9CTE9DS19MRU5HVEggPSAyMDQ4OwogIGxldCBhY3R1YWxMZW5ndGg7CiAgd2hpbGUgKHRydWUpIHsKICAgIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpOwogICAgYmxvY2sgPSBmaW5kQmxvY2soc2NhbkJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIDApOwogICAgaWYgKGJsb2NrLmxlbmd0aCA9PT0gMCkgewogICAgICBicmVhazsKICAgIH0KICAgIHN0cmVhbS5wb3MgKz0gYmxvY2subGVuZ3RoOwogICAgaWYgKGJsb2NrLmZvdW5kKSB7CiAgICAgIGFjdHVhbExlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdHJlYW1TdGFydFBvczsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsKICBpZiAoYWN0dWFsTGVuZ3RoKSB7CiAgICByZXR1cm4gewogICAgICBzdHJlYW06IG5ldyBTdHJlYW0oc3RyZWFtLmdldEJ5dGVzKGFjdHVhbExlbmd0aCkpLAogICAgICBsZW5ndGg6IGFjdHVhbExlbmd0aAogICAgfTsKICB9CiAgd2FybignVW5hYmxlIHRvIHJlY292ZXIgIkxlbmd0aDEiIHByb3BlcnR5IGluIFR5cGUxIGZvbnQgLS0gdXNpbmcgYXMgaXMuJyk7CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogbmV3IFN0cmVhbShzdHJlYW0uZ2V0Qnl0ZXMoc3VnZ2VzdGVkTGVuZ3RoKSksCiAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aAogIH07Cn0KZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgewogIGNvbnN0IGVleGVjQnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICBpZiAoZWV4ZWNCeXRlcy5sZW5ndGggPT09IDApIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiZ2V0RWV4ZWNCbG9jayAtIG5vIGZvbnQgcHJvZ3JhbSBmb3VuZC4iKTsKICB9CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogbmV3IFN0cmVhbShlZXhlY0J5dGVzKSwKICAgIGxlbmd0aDogZWV4ZWNCeXRlcy5sZW5ndGgKICB9Owp9CmNsYXNzIFR5cGUxRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcykgewogICAgY29uc3QgUEZCX0hFQURFUl9TSVpFID0gNjsKICAgIGxldCBoZWFkZXJCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMTsKICAgIGxldCBlZXhlY0Jsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgyOwogICAgbGV0IHBmYkhlYWRlciA9IGZpbGUucGVla0J5dGVzKFBGQl9IRUFERVJfU0laRSk7CiAgICBjb25zdCBwZmJIZWFkZXJQcmVzZW50ID0gcGZiSGVhZGVyWzBdID09PSAweDgwICYmIHBmYkhlYWRlclsxXSA9PT0gMHgwMTsKICAgIGlmIChwZmJIZWFkZXJQcmVzZW50KSB7CiAgICAgIGZpbGUuc2tpcChQRkJfSEVBREVSX1NJWkUpOwogICAgICBoZWFkZXJCbG9ja0xlbmd0aCA9IHBmYkhlYWRlcls1XSA8PCAyNCB8IHBmYkhlYWRlcls0XSA8PCAxNiB8IHBmYkhlYWRlclszXSA8PCA4IHwgcGZiSGVhZGVyWzJdOwogICAgfQogICAgY29uc3QgaGVhZGVyQmxvY2sgPSBnZXRIZWFkZXJCbG9jayhmaWxlLCBoZWFkZXJCbG9ja0xlbmd0aCk7CiAgICBjb25zdCBoZWFkZXJCbG9ja1BhcnNlciA9IG5ldyBUeXBlMVBhcnNlcihoZWFkZXJCbG9jay5zdHJlYW0sIGZhbHNlLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgaGVhZGVyQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcyk7CiAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgewogICAgICBwZmJIZWFkZXIgPSBmaWxlLmdldEJ5dGVzKFBGQl9IRUFERVJfU0laRSk7CiAgICAgIGVleGVjQmxvY2tMZW5ndGggPSBwZmJIZWFkZXJbNV0gPDwgMjQgfCBwZmJIZWFkZXJbNF0gPDwgMTYgfCBwZmJIZWFkZXJbM10gPDwgOCB8IHBmYkhlYWRlclsyXTsKICAgIH0KICAgIGNvbnN0IGVleGVjQmxvY2sgPSBnZXRFZXhlY0Jsb2NrKGZpbGUsIGVleGVjQmxvY2tMZW5ndGgpOwogICAgY29uc3QgZWV4ZWNCbG9ja1BhcnNlciA9IG5ldyBUeXBlMVBhcnNlcihlZXhlY0Jsb2NrLnN0cmVhbSwgdHJ1ZSwgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIGNvbnN0IGRhdGEgPSBlZXhlY0Jsb2NrUGFyc2VyLmV4dHJhY3RGb250UHJvZ3JhbShwcm9wZXJ0aWVzKTsKICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEucHJvcGVydGllcykgewogICAgICBwcm9wZXJ0aWVzW2tleV0gPSBkYXRhLnByb3BlcnRpZXNba2V5XTsKICAgIH0KICAgIGNvbnN0IGNoYXJzdHJpbmdzID0gZGF0YS5jaGFyc3RyaW5nczsKICAgIGNvbnN0IHR5cGUyQ2hhcnN0cmluZ3MgPSB0aGlzLmdldFR5cGUyQ2hhcnN0cmluZ3MoY2hhcnN0cmluZ3MpOwogICAgY29uc3Qgc3VicnMgPSB0aGlzLmdldFR5cGUyU3VicnMoZGF0YS5zdWJycyk7CiAgICB0aGlzLmNoYXJzdHJpbmdzID0gY2hhcnN0cmluZ3M7CiAgICB0aGlzLmRhdGEgPSB0aGlzLndyYXAobmFtZSwgdHlwZTJDaGFyc3RyaW5ncywgdGhpcy5jaGFyc3RyaW5ncywgc3VicnMsIHByb3BlcnRpZXMpOwogICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7CiAgfQogIGdldCBudW1HbHlwaHMoKSB7CiAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxOwogIH0KICBnZXRDaGFyc2V0KCkgewogICAgY29uc3QgY2hhcnNldCA9IFsiLm5vdGRlZiJdOwogICAgZm9yIChjb25zdCB7CiAgICAgIGdseXBoTmFtZQogICAgfSBvZiB0aGlzLmNoYXJzdHJpbmdzKSB7CiAgICAgIGNoYXJzZXQucHVzaChnbHlwaE5hbWUpOwogICAgfQogICAgcmV0dXJuIGNoYXJzZXQ7CiAgfQogIGdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCBjaGFyc3RyaW5ncyA9IHRoaXMuY2hhcnN0cmluZ3M7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGxldCBnbHlwaElkID0gMCwgY2hhcnN0cmluZ3NMZW4gPSBjaGFyc3RyaW5ncy5sZW5ndGg7IGdseXBoSWQgPCBjaGFyc3RyaW5nc0xlbjsgZ2x5cGhJZCsrKSB7CiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBwcm9wZXJ0aWVzLmNNYXAuY2hhckNvZGVPZihnbHlwaElkKTsKICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkICsgMTsKICAgICAgfQogICAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CiAgICB9CiAgICBjb25zdCBnbHlwaE5hbWVzID0gWyIubm90ZGVmIl07CiAgICBsZXQgYnVpbHRJbkVuY29kaW5nLCBnbHlwaElkOwogICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CiAgICAgIGdseXBoTmFtZXMucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpOwogICAgfQogICAgY29uc3QgZW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZzsKICAgIGlmIChlbmNvZGluZykgewogICAgICBidWlsdEluRW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGVuY29kaW5nKSB7CiAgICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihlbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICAgIGlmIChnbHlwaElkID49IDApIHsKICAgICAgICAgIGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpOwogIH0KICBoYXNHbHlwaElkKGlkKSB7CiAgICBpZiAoaWQgPCAwIHx8IGlkID49IHRoaXMubnVtR2x5cGhzKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChpZCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNvbnN0IGdseXBoID0gdGhpcy5jaGFyc3RyaW5nc1tpZCAtIDFdOwogICAgcmV0dXJuIGdseXBoLmNoYXJzdHJpbmcubGVuZ3RoID4gMDsKICB9CiAgZ2V0U2VhY3MoY2hhcnN0cmluZ3MpIHsKICAgIGNvbnN0IHNlYWNNYXAgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2ldOwogICAgICBpZiAoY2hhcnN0cmluZy5zZWFjKSB7CiAgICAgICAgc2VhY01hcFtpICsgMV0gPSBjaGFyc3RyaW5nLnNlYWM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzZWFjTWFwOwogIH0KICBnZXRUeXBlMkNoYXJzdHJpbmdzKHR5cGUxQ2hhcnN0cmluZ3MpIHsKICAgIGNvbnN0IHR5cGUyQ2hhcnN0cmluZ3MgPSBbXTsKICAgIGZvciAoY29uc3QgdHlwZTFDaGFyc3RyaW5nIG9mIHR5cGUxQ2hhcnN0cmluZ3MpIHsKICAgICAgdHlwZTJDaGFyc3RyaW5ncy5wdXNoKHR5cGUxQ2hhcnN0cmluZy5jaGFyc3RyaW5nKTsKICAgIH0KICAgIHJldHVybiB0eXBlMkNoYXJzdHJpbmdzOwogIH0KICBnZXRUeXBlMlN1YnJzKHR5cGUxU3VicnMpIHsKICAgIGxldCBiaWFzID0gMDsKICAgIGNvbnN0IGNvdW50ID0gdHlwZTFTdWJycy5sZW5ndGg7CiAgICBpZiAoY291bnQgPCAxMTMzKSB7CiAgICAgIGJpYXMgPSAxMDc7CiAgICB9IGVsc2UgaWYgKGNvdW50IDwgMzM3NjkpIHsKICAgICAgYmlhcyA9IDExMzE7CiAgICB9IGVsc2UgewogICAgICBiaWFzID0gMzI3Njg7CiAgICB9CiAgICBjb25zdCB0eXBlMlN1YnJzID0gW107CiAgICBsZXQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBiaWFzOyBpKyspIHsKICAgICAgdHlwZTJTdWJycy5wdXNoKFsweDBiXSk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0eXBlMlN1YnJzLnB1c2godHlwZTFTdWJyc1tpXSk7CiAgICB9CiAgICByZXR1cm4gdHlwZTJTdWJyczsKICB9CiAgd3JhcChuYW1lLCBnbHlwaHMsIGNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcykgewogICAgY29uc3QgY2ZmID0gbmV3IENGRigpOwogICAgY2ZmLmhlYWRlciA9IG5ldyBDRkZIZWFkZXIoMSwgMCwgNCwgNCk7CiAgICBjZmYubmFtZXMgPSBbbmFtZV07CiAgICBjb25zdCB0b3BEaWN0ID0gbmV3IENGRlRvcERpY3QoKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJ2ZXJzaW9uIiwgMzkxKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJOb3RpY2UiLCAzOTIpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwgMzkzKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwgMzk0KTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJXZWlnaHQiLCAzOTUpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkVuY29kaW5nIiwgbnVsbCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIHByb3BlcnRpZXMuZm9udE1hdHJpeCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udEJCb3giLCBwcm9wZXJ0aWVzLmJib3gpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCBudWxsKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsIG51bGwpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIlByaXZhdGUiLCBudWxsKTsKICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKICAgIGNvbnN0IHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOwogICAgc3RyaW5ncy5hZGQoIlZlcnNpb24gMC4xMSIpOwogICAgc3RyaW5ncy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKTsKICAgIHN0cmluZ3MuYWRkKG5hbWUpOwogICAgc3RyaW5ncy5hZGQobmFtZSk7CiAgICBzdHJpbmdzLmFkZCgiTWVkaXVtIik7CiAgICBjZmYuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBjb25zdCBjb3VudCA9IGdseXBocy5sZW5ndGg7CiAgICBjb25zdCBjaGFyc2V0QXJyYXkgPSBbIi5ub3RkZWYiXTsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGNoYXJzdHJpbmdzW2ldLmdseXBoTmFtZTsKICAgICAgY29uc3QgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpOwogICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgc3RyaW5ncy5hZGQoZ2x5cGhOYW1lKTsKICAgICAgfQogICAgICBjaGFyc2V0QXJyYXkucHVzaChnbHlwaE5hbWUpOwogICAgfQogICAgY2ZmLmNoYXJzZXQgPSBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTsKICAgIGNvbnN0IGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKFsweDhiLCAweDBlXSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaHNbaV0pOwogICAgfQogICAgY2ZmLmNoYXJTdHJpbmdzID0gY2hhclN0cmluZ3NJbmRleDsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gbmV3IENGRlByaXZhdGVEaWN0KCk7CiAgICBwcml2YXRlRGljdC5zZXRCeU5hbWUoIlN1YnJzIiwgbnVsbCk7CiAgICBjb25zdCBmaWVsZHMgPSBbIkJsdWVWYWx1ZXMiLCAiT3RoZXJCbHVlcyIsICJGYW1pbHlCbHVlcyIsICJGYW1pbHlPdGhlckJsdWVzIiwgIlN0ZW1TbmFwSCIsICJTdGVtU25hcFYiLCAiQmx1ZVNoaWZ0IiwgIkJsdWVGdXp6IiwgIkJsdWVTY2FsZSIsICJMYW5ndWFnZUdyb3VwIiwgIkV4cGFuc2lvbkZhY3RvciIsICJGb3JjZUJvbGQiLCAiU3RkSFciLCAiU3RkVlciXTsKICAgIGZvciAoaSA9IDAsIGlpID0gZmllbGRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaV07CiAgICAgIGlmICghKGZpZWxkIGluIHByb3BlcnRpZXMucHJpdmF0ZURhdGEpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IHZhbHVlLmxlbmd0aCAtIDE7IGogPiAwOyBqLS0pIHsKICAgICAgICAgIHZhbHVlW2pdIC09IHZhbHVlW2ogLSAxXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKGZpZWxkLCB2YWx1ZSk7CiAgICB9CiAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OwogICAgY29uc3Qgc3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7CiAgICB9CiAgICBwcml2YXRlRGljdC5zdWJyc0luZGV4ID0gc3VickluZGV4OwogICAgY29uc3QgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTsKICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9mb250cy5qcwoKCgoKCgoKCgoKCgoKCgoKCmNvbnN0IFBSSVZBVEVfVVNFX0FSRUFTID0gW1sweGUwMDAsIDB4ZjhmZl0sIFsweDEwMDAwMCwgMHgxMGZmZmRdXTsKY29uc3QgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDsKY29uc3QgRVhQT1JUX0RBVEFfUFJPUEVSVElFUyA9IFsiYXNjZW50IiwgImJib3giLCAiYmxhY2siLCAiYm9sZCIsICJjaGFyUHJvY09wZXJhdG9yTGlzdCIsICJjc3NGb250SW5mbyIsICJkYXRhIiwgImRlZmF1bHRWTWV0cmljcyIsICJkZWZhdWx0V2lkdGgiLCAiZGVzY2VudCIsICJkaXNhYmxlRm9udEZhY2UiLCAiZmFsbGJhY2tOYW1lIiwgImZvbnRFeHRyYVByb3BlcnRpZXMiLCAiZm9udE1hdHJpeCIsICJpc0ludmFsaWRQREZqc0ZvbnQiLCAiaXNUeXBlM0ZvbnQiLCAiaXRhbGljIiwgImxvYWRlZE5hbWUiLCAibWltZXR5cGUiLCAibWlzc2luZ0ZpbGUiLCAibmFtZSIsICJyZW1lYXN1cmUiLCAic3lzdGVtRm9udEluZm8iLCAidmVydGljYWwiXTsKY29uc3QgRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyA9IFsiY01hcCIsICJjb21wb3NpdGUiLCAiZGVmYXVsdEVuY29kaW5nIiwgImRpZmZlcmVuY2VzIiwgImlzTW9ub3NwYWNlIiwgImlzU2VyaWZGb250IiwgImlzU3ltYm9saWNGb250IiwgInNlYWNNYXAiLCAic3VidHlwZSIsICJ0b0ZvbnRDaGFyIiwgInRvVW5pY29kZSIsICJ0eXBlIiwgInZtZXRyaWNzIiwgIndpZHRocyJdOwpmdW5jdGlvbiBhZGp1c3RXaWR0aHMocHJvcGVydGllcykgewogIGlmICghcHJvcGVydGllcy5mb250TWF0cml4KSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF0gPT09IEZPTlRfSURFTlRJVFlfTUFUUklYWzBdKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHNjYWxlID0gMC4wMDEgLyBwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF07CiAgY29uc3QgZ2x5cGhzV2lkdGhzID0gcHJvcGVydGllcy53aWR0aHM7CiAgZm9yIChjb25zdCBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKICAgIGdseXBoc1dpZHRoc1tnbHlwaF0gKj0gc2NhbGU7CiAgfQogIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoICo9IHNjYWxlOwp9CmZ1bmN0aW9uIGFkanVzdFRydWVUeXBlVG9Vbmljb2RlKHByb3BlcnRpZXMsIGlzU3ltYm9saWNGb250LCBuYW1lUmVjb3JkcykgewogIGlmIChwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250KSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGlmICghaXNTeW1ib2xpY0ZvbnQpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKG5hbWVSZWNvcmRzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPT09IFdpbkFuc2lFbmNvZGluZykgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGNvbnN0IHIgb2YgbmFtZVJlY29yZHMpIHsKICAgIGlmICghaXNXaW5OYW1lUmVjb3JkKHIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICB9CiAgY29uc3QgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CiAgY29uc3QgdG9Vbmljb2RlID0gW10sCiAgICBnbHlwaHNVbmljb2RlTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZW5jb2RpbmcpIHsKICAgIGNvbnN0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJDb2RlXTsKICAgIGlmIChnbHlwaE5hbWUgPT09ICIiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgIGlmICh1bmljb2RlID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICB0b1VuaWNvZGVbY2hhckNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTsKICB9CiAgaWYgKHRvVW5pY29kZS5sZW5ndGggPiAwKSB7CiAgICBwcm9wZXJ0aWVzLnRvVW5pY29kZS5hbWVuZCh0b1VuaWNvZGUpOwogIH0KfQpmdW5jdGlvbiBhZGp1c3RUeXBlMVRvVW5pY29kZShwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcpIHsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBpZiAoYnVpbHRJbkVuY29kaW5nID09PSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZykgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCB0b1VuaWNvZGUgPSBbXSwKICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CiAgICAgIGlmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgfHwgcHJvcGVydGllcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICBjb25zdCBnbHlwaE5hbWUgPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdOwogICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgIHRvVW5pY29kZVtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgfQogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmZ1bmN0aW9uIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcykgewogIGlmICghcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUpIHsKICAgIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZS5oYXMoY2hhckNvZGUpKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGVbY2hhckNvZGVdOwogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmNsYXNzIGZvbnRzX0dseXBoIHsKICBjb25zdHJ1Y3RvcihvcmlnaW5hbENoYXJDb2RlLCBmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KSB7CiAgICB0aGlzLm9yaWdpbmFsQ2hhckNvZGUgPSBvcmlnaW5hbENoYXJDb2RlOwogICAgdGhpcy5mb250Q2hhciA9IGZvbnRDaGFyOwogICAgdGhpcy51bmljb2RlID0gdW5pY29kZTsKICAgIHRoaXMuYWNjZW50ID0gYWNjZW50OwogICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgdGhpcy52bWV0cmljID0gdm1ldHJpYzsKICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDsKICAgIHRoaXMuaXNTcGFjZSA9IGlzU3BhY2U7CiAgICB0aGlzLmlzSW5Gb250ID0gaXNJbkZvbnQ7CiAgfQogIGdldCBjYXRlZ29yeSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImNhdGVnb3J5IiwgZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeSh0aGlzLnVuaWNvZGUpLCB0cnVlKTsKICB9Cn0KZnVuY3Rpb24gaW50MTYoYjAsIGIxKSB7CiAgcmV0dXJuIChiMCA8PCA4KSArIGIxOwp9CmZ1bmN0aW9uIHdyaXRlU2lnbmVkSW50MTYoYnl0ZXMsIGluZGV4LCB2YWx1ZSkgewogIGJ5dGVzW2luZGV4ICsgMV0gPSB2YWx1ZTsKICBieXRlc1tpbmRleF0gPSB2YWx1ZSA+Pj4gODsKfQpmdW5jdGlvbiBzaWduZWRJbnQxNihiMCwgYjEpIHsKICBjb25zdCB2YWx1ZSA9IChiMCA8PCA4KSArIGIxOwogIHJldHVybiB2YWx1ZSAmIDEgPDwgMTUgPyB2YWx1ZSAtIDB4MTAwMDAgOiB2YWx1ZTsKfQpmdW5jdGlvbiB3cml0ZVVpbnQzMihieXRlcywgaW5kZXgsIHZhbHVlKSB7CiAgYnl0ZXNbaW5kZXggKyAzXSA9IHZhbHVlICYgMHhmZjsKICBieXRlc1tpbmRleCArIDJdID0gdmFsdWUgPj4+IDg7CiAgYnl0ZXNbaW5kZXggKyAxXSA9IHZhbHVlID4+PiAxNjsKICBieXRlc1tpbmRleF0gPSB2YWx1ZSA+Pj4gMjQ7Cn0KZnVuY3Rpb24gaW50MzIoYjAsIGIxLCBiMiwgYjMpIHsKICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKfQpmdW5jdGlvbiBzdHJpbmcxNih2YWx1ZSkgewogIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOwp9CmZ1bmN0aW9uIHNhZmVTdHJpbmcxNih2YWx1ZSkgewogIGlmICh2YWx1ZSA+IDB4N2ZmZikgewogICAgdmFsdWUgPSAweDdmZmY7CiAgfSBlbHNlIGlmICh2YWx1ZSA8IC0weDgwMDApIHsKICAgIHZhbHVlID0gLTB4ODAwMDsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7Cn0KZnVuY3Rpb24gaXNUcnVlVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiByZWFkVWludDMyKGhlYWRlciwgMCkgPT09IDB4MDAwMTAwMDAgfHwgYnl0ZXNUb1N0cmluZyhoZWFkZXIpID09PSAidHJ1ZSI7Cn0KZnVuY3Rpb24gaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpIHsKICBjb25zdCBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyg0KTsKICByZXR1cm4gYnl0ZXNUb1N0cmluZyhoZWFkZXIpID09PSAidHRjZiI7Cn0KZnVuY3Rpb24gaXNPcGVuVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09ICJPVFRPIjsKfQpmdW5jdGlvbiBpc1R5cGUxRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoMik7CiAgaWYgKGhlYWRlclswXSA9PT0gMHgyNSAmJiBoZWFkZXJbMV0gPT09IDB4MjEpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoaGVhZGVyWzBdID09PSAweDgwICYmIGhlYWRlclsxXSA9PT0gMHgwMSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIGlmIChoZWFkZXJbMF0gPj0gMSAmJiBoZWFkZXJbM10gPj0gMSAmJiBoZWFkZXJbM10gPD0gNCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUoZmlsZSwgewogIHR5cGUsCiAgc3VidHlwZSwKICBjb21wb3NpdGUKfSkgewogIGxldCBmaWxlVHlwZSwgZmlsZVN1YnR5cGU7CiAgaWYgKGlzVHJ1ZVR5cGVGaWxlKGZpbGUpIHx8IGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmaWxlKSkgewogICAgZmlsZVR5cGUgPSBjb21wb3NpdGUgPyAiQ0lERm9udFR5cGUyIiA6ICJUcnVlVHlwZSI7CiAgfSBlbHNlIGlmIChpc09wZW5UeXBlRmlsZShmaWxlKSkgewogICAgZmlsZVR5cGUgPSBjb21wb3NpdGUgPyAiQ0lERm9udFR5cGUyIiA6ICJPcGVuVHlwZSI7CiAgfSBlbHNlIGlmIChpc1R5cGUxRmlsZShmaWxlKSkgewogICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTAiOwogICAgfSBlbHNlIHsKICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOwogICAgfQogIH0gZWxzZSBpZiAoaXNDRkZGaWxlKGZpbGUpKSB7CiAgICBpZiAoY29tcG9zaXRlKSB7CiAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMCI7CiAgICAgIGZpbGVTdWJ0eXBlID0gIkNJREZvbnRUeXBlMEMiOwogICAgfSBlbHNlIHsKICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOwogICAgICBmaWxlU3VidHlwZSA9ICJUeXBlMUMiOwogICAgfQogIH0gZWxzZSB7CiAgICB3YXJuKCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLiIpOwogICAgZmlsZVR5cGUgPSB0eXBlOwogICAgZmlsZVN1YnR5cGUgPSBzdWJ0eXBlOwogIH0KICByZXR1cm4gW2ZpbGVUeXBlLCBmaWxlU3VidHlwZV07Cn0KZnVuY3Rpb24gYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdseXBoTWFwKSB7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBnbHlwaE1hcCkgewogICAgbWFwWytjaGFyQ29kZV0gPSBnbHlwaE1hcFtjaGFyQ29kZV07CiAgfQp9CmZ1bmN0aW9uIGJ1aWxkVG9Gb250Q2hhcihlbmNvZGluZywgZ2x5cGhzVW5pY29kZU1hcCwgZGlmZmVyZW5jZXMpIHsKICBjb25zdCB0b0ZvbnRDaGFyID0gW107CiAgbGV0IHVuaWNvZGU7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChlbmNvZGluZ1tpXSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgdG9Gb250Q2hhcltpXSA9IHVuaWNvZGU7CiAgICB9CiAgfQogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgIHVuaWNvZGUgPSBnZXRVbmljb2RlRm9yR2x5cGgoZGlmZmVyZW5jZXNbY2hhckNvZGVdLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgIGlmICh1bmljb2RlICE9PSAtMSkgewogICAgICB0b0ZvbnRDaGFyWytjaGFyQ29kZV0gPSB1bmljb2RlOwogICAgfQogIH0KICByZXR1cm4gdG9Gb250Q2hhcjsKfQpmdW5jdGlvbiBpc01hY05hbWVSZWNvcmQocikgewogIHJldHVybiByLnBsYXRmb3JtID09PSAxICYmIHIuZW5jb2RpbmcgPT09IDAgJiYgci5sYW5ndWFnZSA9PT0gMDsKfQpmdW5jdGlvbiBpc1dpbk5hbWVSZWNvcmQocikgewogIHJldHVybiByLnBsYXRmb3JtID09PSAzICYmIHIuZW5jb2RpbmcgPT09IDEgJiYgci5sYW5ndWFnZSA9PT0gMHg0MDk7Cn0KZnVuY3Rpb24gY29udmVydENpZFN0cmluZyhjaGFyQ29kZSwgY2lkLCBzaG91bGRUaHJvdyA9IGZhbHNlKSB7CiAgc3dpdGNoIChjaWQubGVuZ3RoKSB7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBjaWQuY2hhckNvZGVBdCgwKTsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGNpZC5jaGFyQ29kZUF0KDApIDw8IDggfCBjaWQuY2hhckNvZGVBdCgxKTsKICB9CiAgY29uc3QgbXNnID0gYFVuc3VwcG9ydGVkIENJRCBzdHJpbmcgKGNoYXJDb2RlICR7Y2hhckNvZGV9KTogIiR7Y2lkfSIuYDsKICBpZiAoc2hvdWxkVGhyb3cpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogIH0KICB3YXJuKG1zZyk7CiAgcmV0dXJuIGNpZDsKfQpmdW5jdGlvbiBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgbmV3R2x5cGhaZXJvSWQsIHRvVW5pY29kZSkgewogIGNvbnN0IG5ld01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgdG9Vbmljb2RlRXh0cmFNYXAgPSBuZXcgTWFwKCk7CiAgY29uc3QgdG9Gb250Q2hhciA9IFtdOwogIGNvbnN0IHVzZWRHbHlwaElkcyA9IG5ldyBTZXQoKTsKICBsZXQgcHJpdmF0ZVVzZUFyZWFJbmRleCA9IDA7CiAgY29uc3QgcHJpdmF0ZVVzZU9mZmV0U3RhcnQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTsKICBsZXQgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IHByaXZhdGVVc2VPZmZldFN0YXJ0OwogIGxldCBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKICBjb25zdCBpc0luUHJpdmF0ZUFyZWEgPSBjb2RlID0+IFBSSVZBVEVfVVNFX0FSRUFTWzBdWzBdIDw9IGNvZGUgJiYgY29kZSA8PSBQUklWQVRFX1VTRV9BUkVBU1swXVsxXSB8fCBQUklWQVRFX1VTRV9BUkVBU1sxXVswXSA8PSBjb2RlICYmIGNvZGUgPD0gUFJJVkFURV9VU0VfQVJFQVNbMV1bMV07CiAgbGV0IExJR0FUVVJFX1RPX1VOSUNPREUgPSBudWxsOwogIGZvciAoY29uc3Qgb3JpZ2luYWxDaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgewogICAgbGV0IGdseXBoSWQgPSBjaGFyQ29kZVRvR2x5cGhJZFtvcmlnaW5hbENoYXJDb2RlXTsKICAgIGlmICghaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAobmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA+IHByaXZhdGVVc2VPZmZldEVuZCkgewogICAgICBwcml2YXRlVXNlQXJlYUluZGV4Kys7CiAgICAgIGlmIChwcml2YXRlVXNlQXJlYUluZGV4ID49IFBSSVZBVEVfVVNFX0FSRUFTLmxlbmd0aCkgewogICAgICAgIHdhcm4oIlJhbiBvdXQgb2Ygc3BhY2UgaW4gZm9udCBwcml2YXRlIHVzZSBhcmVhLiIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTsKICAgICAgcHJpdmF0ZVVzZU9mZmV0RW5kID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMV07CiAgICB9CiAgICBjb25zdCBmb250Q2hhckNvZGUgPSBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlKys7CiAgICBpZiAoZ2x5cGhJZCA9PT0gMCkgewogICAgICBnbHlwaElkID0gbmV3R2x5cGhaZXJvSWQ7CiAgICB9CiAgICBsZXQgdW5pY29kZSA9IHRvVW5pY29kZS5nZXQob3JpZ2luYWxDaGFyQ29kZSk7CiAgICBpZiAodHlwZW9mIHVuaWNvZGUgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmICh1bmljb2RlLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHVuaWNvZGUgPSB1bmljb2RlLmNvZGVQb2ludEF0KDApOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghTElHQVRVUkVfVE9fVU5JQ09ERSkgewogICAgICAgICAgTElHQVRVUkVfVE9fVU5JQ09ERSA9IG5ldyBNYXAoKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAweGZiMDA7IGkgPD0gMHhmYjRmOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSkubm9ybWFsaXplKCJORktEIik7CiAgICAgICAgICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICBMSUdBVFVSRV9UT19VTklDT0RFLnNldChub3JtYWxpemVkLCBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1bmljb2RlID0gTElHQVRVUkVfVE9fVU5JQ09ERS5nZXQodW5pY29kZSkgfHwgdW5pY29kZS5jb2RlUG9pbnRBdCgwKTsKICAgICAgfQogICAgfQogICAgaWYgKHVuaWNvZGUgJiYgIWlzSW5Qcml2YXRlQXJlYSh1bmljb2RlKSAmJiAhdXNlZEdseXBoSWRzLmhhcyhnbHlwaElkKSkgewogICAgICB0b1VuaWNvZGVFeHRyYU1hcC5zZXQodW5pY29kZSwgZ2x5cGhJZCk7CiAgICAgIHVzZWRHbHlwaElkcy5hZGQoZ2x5cGhJZCk7CiAgICB9CiAgICBuZXdNYXBbZm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICB0b0ZvbnRDaGFyW29yaWdpbmFsQ2hhckNvZGVdID0gZm9udENoYXJDb2RlOwogIH0KICByZXR1cm4gewogICAgdG9Gb250Q2hhciwKICAgIGNoYXJDb2RlVG9HbHlwaElkOiBuZXdNYXAsCiAgICB0b1VuaWNvZGVFeHRyYU1hcCwKICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUKICB9Owp9CmZ1bmN0aW9uIGdldFJhbmdlcyhnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpIHsKICBjb25zdCBjb2RlcyA9IFtdOwogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZ2x5cGhzKSB7CiAgICBpZiAoZ2x5cGhzW2NoYXJDb2RlXSA+PSBudW1HbHlwaHMpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb2Rlcy5wdXNoKHsKICAgICAgZm9udENoYXJDb2RlOiBjaGFyQ29kZSB8IDAsCiAgICAgIGdseXBoSWQ6IGdseXBoc1tjaGFyQ29kZV0KICAgIH0pOwogIH0KICBpZiAodG9Vbmljb2RlRXh0cmFNYXApIHsKICAgIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSWRdIG9mIHRvVW5pY29kZUV4dHJhTWFwKSB7CiAgICAgIGlmIChnbHlwaElkID49IG51bUdseXBocykgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvZGVzLnB1c2goewogICAgICAgIGZvbnRDaGFyQ29kZTogdW5pY29kZSwKICAgICAgICBnbHlwaElkCiAgICAgIH0pOwogICAgfQogIH0KICBpZiAoY29kZXMubGVuZ3RoID09PSAwKSB7CiAgICBjb2Rlcy5wdXNoKHsKICAgICAgZm9udENoYXJDb2RlOiAwLAogICAgICBnbHlwaElkOiAwCiAgICB9KTsKICB9CiAgY29kZXMuc29ydCgoYSwgYikgPT4gYS5mb250Q2hhckNvZGUgLSBiLmZvbnRDaGFyQ29kZSk7CiAgY29uc3QgcmFuZ2VzID0gW107CiAgY29uc3QgbGVuZ3RoID0gY29kZXMubGVuZ3RoOwogIGZvciAobGV0IG4gPSAwOyBuIDwgbGVuZ3RoOykgewogICAgY29uc3Qgc3RhcnQgPSBjb2Rlc1tuXS5mb250Q2hhckNvZGU7CiAgICBjb25zdCBjb2RlSW5kaWNlcyA9IFtjb2Rlc1tuXS5nbHlwaElkXTsKICAgICsrbjsKICAgIGxldCBlbmQgPSBzdGFydDsKICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkgewogICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpOwogICAgICArK2VuZDsKICAgICAgKytuOwogICAgICBpZiAoZW5kID09PSAweGZmZmYpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmFuZ2VzLnB1c2goW3N0YXJ0LCBlbmQsIGNvZGVJbmRpY2VzXSk7CiAgfQogIHJldHVybiByYW5nZXM7Cn0KZnVuY3Rpb24gY3JlYXRlQ21hcFRhYmxlKGdseXBocywgdG9Vbmljb2RlRXh0cmFNYXAsIG51bUdseXBocykgewogIGNvbnN0IHJhbmdlcyA9IGdldFJhbmdlcyhnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpOwogIGNvbnN0IG51bVRhYmxlcyA9IHJhbmdlcy5hdCgtMSlbMV0gPiAweGZmZmYgPyAyIDogMTsKICBsZXQgY21hcCA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihudW1UYWJsZXMpICsgIlx4MDBceDAzIiArICJceDAwXHgwMSIgKyBzdHJpbmczMig0ICsgbnVtVGFibGVzICogOCk7CiAgbGV0IGksIGlpLCBqLCBqajsKICBmb3IgKGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIGlmIChyYW5nZXNbaV1bMF0gPD0gMHhmZmZmKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBjb25zdCBibXBMZW5ndGggPSBpICsgMTsKICBpZiAocmFuZ2VzW2ldWzBdIDwgMHhmZmZmICYmIHJhbmdlc1tpXVsxXSA9PT0gMHhmZmZmKSB7CiAgICByYW5nZXNbaV1bMV0gPSAweGZmZmU7CiAgfQogIGNvbnN0IHRyYWlsaW5nUmFuZ2VzQ291bnQgPSByYW5nZXNbaV1bMV0gPCAweGZmZmYgPyAxIDogMDsKICBjb25zdCBzZWdDb3VudCA9IGJtcExlbmd0aCArIHRyYWlsaW5nUmFuZ2VzQ291bnQ7CiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMoc2VnQ291bnQsIDIpOwogIGxldCBzdGFydENvdW50ID0gIiI7CiAgbGV0IGVuZENvdW50ID0gIiI7CiAgbGV0IGlkRGVsdGFzID0gIiI7CiAgbGV0IGlkUmFuZ2VPZmZzZXRzID0gIiI7CiAgbGV0IGdseXBoc0lkcyA9ICIiOwogIGxldCBiaWFzID0gMDsKICBsZXQgcmFuZ2UsIHN0YXJ0LCBlbmQsIGNvZGVzOwogIGZvciAoaSA9IDAsIGlpID0gYm1wTGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgcmFuZ2UgPSByYW5nZXNbaV07CiAgICBzdGFydCA9IHJhbmdlWzBdOwogICAgZW5kID0gcmFuZ2VbMV07CiAgICBzdGFydENvdW50ICs9IHN0cmluZzE2KHN0YXJ0KTsKICAgIGVuZENvdW50ICs9IHN0cmluZzE2KGVuZCk7CiAgICBjb2RlcyA9IHJhbmdlWzJdOwogICAgbGV0IGNvbnRpZ3VvdXMgPSB0cnVlOwogICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgIGlmIChjb2Rlc1tqXSAhPT0gY29kZXNbaiAtIDFdICsgMSkgewogICAgICAgIGNvbnRpZ3VvdXMgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFjb250aWd1b3VzKSB7CiAgICAgIGNvbnN0IG9mZnNldCA9IChzZWdDb3VudCAtIGkpICogMiArIGJpYXMgKiAyOwogICAgICBiaWFzICs9IGVuZCAtIHN0YXJ0ICsgMTsKICAgICAgaWREZWx0YXMgKz0gc3RyaW5nMTYoMCk7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KG9mZnNldCk7CiAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikgewogICAgICAgIGdseXBoc0lkcyArPSBzdHJpbmcxNihjb2Rlc1tqXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0YXJ0Q29kZSA9IGNvZGVzWzBdOwogICAgICBpZERlbHRhcyArPSBzdHJpbmcxNihzdGFydENvZGUgLSBzdGFydCAmIDB4ZmZmZik7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KDApOwogICAgfQogIH0KICBpZiAodHJhaWxpbmdSYW5nZXNDb3VudCA+IDApIHsKICAgIGVuZENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBzdGFydENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBpZERlbHRhcyArPSAiXHgwMFx4MDEiOwogICAgaWRSYW5nZU9mZnNldHMgKz0gIlx4MDBceDAwIjsKICB9CiAgY29uc3QgZm9ybWF0MzE0ID0gIlx4MDBceDAwIiArIHN0cmluZzE2KDIgKiBzZWdDb3VudCkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2UpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLmVudHJ5KSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5yYW5nZVNoaWZ0KSArIGVuZENvdW50ICsgIlx4MDBceDAwIiArIHN0YXJ0Q291bnQgKyBpZERlbHRhcyArIGlkUmFuZ2VPZmZzZXRzICsgZ2x5cGhzSWRzOwogIGxldCBmb3JtYXQzMTAxMiA9ICIiOwogIGxldCBoZWFkZXIzMTAxMiA9ICIiOwogIGlmIChudW1UYWJsZXMgPiAxKSB7CiAgICBjbWFwICs9ICJceDAwXHgwMyIgKyAiXHgwMFx4MEEiICsgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDggKyA0ICsgZm9ybWF0MzE0Lmxlbmd0aCk7CiAgICBmb3JtYXQzMTAxMiA9ICIiOwogICAgZm9yIChpID0gMCwgaWkgPSByYW5nZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICByYW5nZSA9IHJhbmdlc1tpXTsKICAgICAgc3RhcnQgPSByYW5nZVswXTsKICAgICAgY29kZXMgPSByYW5nZVsyXTsKICAgICAgbGV0IGNvZGUgPSBjb2Rlc1swXTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CiAgICAgICAgICBlbmQgPSByYW5nZVswXSArIGogLSAxOwogICAgICAgICAgZm9ybWF0MzEwMTIgKz0gc3RyaW5nMzIoc3RhcnQpICsgc3RyaW5nMzIoZW5kKSArIHN0cmluZzMyKGNvZGUpOwogICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgICAgICAgY29kZSA9IGNvZGVzW2pdOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3JtYXQzMTAxMiArPSBzdHJpbmczMihzdGFydCkgKyBzdHJpbmczMihyYW5nZVsxXSkgKyBzdHJpbmczMihjb2RlKTsKICAgIH0KICAgIGhlYWRlcjMxMDEyID0gIlx4MDBceDBDIiArICJceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggKyAxNikgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggLyAxMik7CiAgfQogIHJldHVybiBjbWFwICsgIlx4MDBceDA0IiArIHN0cmluZzE2KGZvcm1hdDMxNC5sZW5ndGggKyA0KSArIGZvcm1hdDMxNCArIGhlYWRlcjMxMDEyICsgZm9ybWF0MzEwMTI7Cn0KZnVuY3Rpb24gdmFsaWRhdGVPUzJUYWJsZShvczIsIGZpbGUpIHsKICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0IHx8IDApICsgb3MyLm9mZnNldDsKICBjb25zdCB2ZXJzaW9uID0gZmlsZS5nZXRVaW50MTYoKTsKICBmaWxlLnNraXAoNjApOwogIGNvbnN0IHNlbGVjdGlvbiA9IGZpbGUuZ2V0VWludDE2KCk7CiAgaWYgKHZlcnNpb24gPCA0ICYmIHNlbGVjdGlvbiAmIDB4MDMwMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBmaXJzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOwogIGNvbnN0IGxhc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAoZmlyc3RDaGFyID4gbGFzdENoYXIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZmlsZS5za2lwKDYpOwogIGNvbnN0IHVzV2luQXNjZW50ID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgb3MyLmRhdGFbOF0gPSBvczIuZGF0YVs5XSA9IDA7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgY2hhcnN0cmluZ3MsIG92ZXJyaWRlKSB7CiAgb3ZlcnJpZGUgfHw9IHsKICAgIHVuaXRzUGVyRW06IDAsCiAgICB5TWF4OiAwLAogICAgeU1pbjogMCwKICAgIGFzY2VudDogMCwKICAgIGRlc2NlbnQ6IDAKICB9OwogIGxldCB1bFVuaWNvZGVSYW5nZTEgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTIgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTMgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTQgPSAwOwogIGxldCBmaXJzdENoYXJJbmRleCA9IG51bGw7CiAgbGV0IGxhc3RDaGFySW5kZXggPSAwOwogIGxldCBwb3NpdGlvbiA9IC0xOwogIGlmIChjaGFyc3RyaW5ncykgewogICAgZm9yIChsZXQgY29kZSBpbiBjaGFyc3RyaW5ncykgewogICAgICBjb2RlIHw9IDA7CiAgICAgIGlmIChmaXJzdENoYXJJbmRleCA+IGNvZGUgfHwgIWZpcnN0Q2hhckluZGV4KSB7CiAgICAgICAgZmlyc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIGlmIChsYXN0Q2hhckluZGV4IDwgY29kZSkgewogICAgICAgIGxhc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIHBvc2l0aW9uID0gZ2V0VW5pY29kZVJhbmdlRm9yKGNvZGUsIHBvc2l0aW9uKTsKICAgICAgaWYgKHBvc2l0aW9uIDwgMzIpIHsKICAgICAgICB1bFVuaWNvZGVSYW5nZTEgfD0gMSA8PCBwb3NpdGlvbjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDY0KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UyIHw9IDEgPDwgcG9zaXRpb24gLSAzMjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDk2KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UzIHw9IDEgPDwgcG9zaXRpb24gLSA2NDsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDEyMykgewogICAgICAgIHVsVW5pY29kZVJhbmdlNCB8PSAxIDw8IHBvc2l0aW9uIC0gOTY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmljb2RlIHJhbmdlcyBCaXRzID4gMTIzIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UiKTsKICAgICAgfQogICAgfQogICAgaWYgKGxhc3RDaGFySW5kZXggPiAweGZmZmYpIHsKICAgICAgbGFzdENoYXJJbmRleCA9IDB4ZmZmZjsKICAgIH0KICB9IGVsc2UgewogICAgZmlyc3RDaGFySW5kZXggPSAwOwogICAgbGFzdENoYXJJbmRleCA9IDI1NTsKICB9CiAgY29uc3QgYmJveCA9IHByb3BlcnRpZXMuYmJveCB8fCBbMCwgMCwgMCwgMF07CiAgY29uc3QgdW5pdHNQZXJFbSA9IG92ZXJyaWRlLnVuaXRzUGVyRW0gfHwgKHByb3BlcnRpZXMuZm9udE1hdHJpeCA/IDEgLyBNYXRoLm1heCguLi5wcm9wZXJ0aWVzLmZvbnRNYXRyaXguc2xpY2UoMCwgNCkubWFwKE1hdGguYWJzKSkgOiAxMDAwKTsKICBjb25zdCBzY2FsZSA9IHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID8gMS4wIDogdW5pdHNQZXJFbSAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICBjb25zdCB0eXBvQXNjZW50ID0gb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpOwogIGxldCB0eXBvRGVzY2VudCA9IG92ZXJyaWRlLmRlc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmRlc2NlbnQgfHwgYmJveFsxXSkpOwogIGlmICh0eXBvRGVzY2VudCA+IDAgJiYgcHJvcGVydGllcy5kZXNjZW50ID4gMCAmJiBiYm94WzFdIDwgMCkgewogICAgdHlwb0Rlc2NlbnQgPSAtdHlwb0Rlc2NlbnQ7CiAgfQogIGNvbnN0IHdpbkFzY2VudCA9IG92ZXJyaWRlLnlNYXggfHwgdHlwb0FzY2VudDsKICBjb25zdCB3aW5EZXNjZW50ID0gLW92ZXJyaWRlLnlNaW4gfHwgLXR5cG9EZXNjZW50OwogIHJldHVybiAiXHgwMFx4MDMiICsgIlx4MDJceDI0IiArICJceDAxXHhGNCIgKyAiXHgwMFx4MDUiICsgIlx4MDBceDAwIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAwXHg4QyIgKyAiXHgwMlx4OEEiICsgIlx4MDJceEJCIiArICJceDAwXHgwMCIgKyAiXHgwMVx4REYiICsgIlx4MDBceDMxIiArICJceDAxXHgwMiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwNiIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHByb3BlcnRpZXMuZml4ZWRQaXRjaCA/IDB4MDkgOiAweDAwKSArICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UxKSArIHN0cmluZzMyKHVsVW5pY29kZVJhbmdlMikgKyBzdHJpbmczMih1bFVuaWNvZGVSYW5nZTMpICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2U0KSArICJceDJBXHgzMlx4MzFceDJBIiArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAxIDogMCkgKyBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyBzdHJpbmcxNihsYXN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMubGFzdENoYXIpICsgc3RyaW5nMTYodHlwb0FzY2VudCkgKyBzdHJpbmcxNih0eXBvRGVzY2VudCkgKyAiXHgwMFx4NjQiICsgc3RyaW5nMTYod2luQXNjZW50KSArIHN0cmluZzE2KHdpbkRlc2NlbnQpICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMTYocHJvcGVydGllcy54SGVpZ2h0KSArIHN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIHN0cmluZzE2KDApICsgc3RyaW5nMTYoZmlyc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5maXJzdENoYXIpICsgIlx4MDBceDAzIjsKfQpmdW5jdGlvbiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykgewogIGNvbnN0IGFuZ2xlID0gTWF0aC5mbG9vcihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlICogMiAqKiAxNik7CiAgcmV0dXJuICJceDAwXHgwM1x4MDBceDAwIiArIHN0cmluZzMyKGFuZ2xlKSArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMzIocHJvcGVydGllcy5maXhlZFBpdGNoID8gMSA6IDApICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiOwp9CmZ1bmN0aW9uIGNyZWF0ZVBvc3RzY3JpcHROYW1lKG5hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bXlx4MjEtXHg3RV18W1tcXSgpe308Pi8lXS9nLCAiIikuc2xpY2UoMCwgNjMpOwp9CmZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykgewogIGlmICghcHJvdG8pIHsKICAgIHByb3RvID0gW1tdLCBbXV07CiAgfQogIGNvbnN0IHN0cmluZ3MgPSBbcHJvdG9bMF1bMF0gfHwgIk9yaWdpbmFsIGxpY2VuY2UiLCBwcm90b1swXVsxXSB8fCBuYW1lLCBwcm90b1swXVsyXSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzNdIHx8ICJ1bmlxdWVJRCIsIHByb3RvWzBdWzRdIHx8IG5hbWUsIHByb3RvWzBdWzVdIHx8ICJWZXJzaW9uIDAuMTEiLCBwcm90b1swXVs2XSB8fCBjcmVhdGVQb3N0c2NyaXB0TmFtZShuYW1lKSwgcHJvdG9bMF1bN10gfHwgIlVua25vd24iLCBwcm90b1swXVs4XSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzldIHx8ICJVbmtub3duIl07CiAgY29uc3Qgc3RyaW5nc1VuaWNvZGUgPSBbXTsKICBsZXQgaSwgaWksIGosIGpqLCBzdHI7CiAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07CiAgICBjb25zdCBzdHJCdWZVbmljb2RlID0gW107CiAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpOwogICAgfQogICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oIiIpKTsKICB9CiAgY29uc3QgbmFtZXMgPSBbc3RyaW5ncywgc3RyaW5nc1VuaWNvZGVdOwogIGNvbnN0IHBsYXRmb3JtcyA9IFsiXHgwMFx4MDEiLCAiXHgwMFx4MDMiXTsKICBjb25zdCBlbmNvZGluZ3MgPSBbIlx4MDBceDAwIiwgIlx4MDBceDAxIl07CiAgY29uc3QgbGFuZ3VhZ2VzID0gWyJceDAwXHgwMCIsICJceDA0XHgwOSJdOwogIGNvbnN0IG5hbWVzUmVjb3JkQ291bnQgPSBzdHJpbmdzLmxlbmd0aCAqIHBsYXRmb3Jtcy5sZW5ndGg7CiAgbGV0IG5hbWVUYWJsZSA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOwogIGxldCBzdHJPZmZzZXQgPSAwOwogIGZvciAoaSA9IDAsIGlpID0gcGxhdGZvcm1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHN0cnMgPSBuYW1lc1tpXTsKICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ciA9IHN0cnNbal07CiAgICAgIGNvbnN0IG5hbWVSZWNvcmQgPSBwbGF0Zm9ybXNbaV0gKyBlbmNvZGluZ3NbaV0gKyBsYW5ndWFnZXNbaV0gKyBzdHJpbmcxNihqKSArIHN0cmluZzE2KHN0ci5sZW5ndGgpICsgc3RyaW5nMTYoc3RyT2Zmc2V0KTsKICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7CiAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoOwogICAgfQogIH0KICBuYW1lVGFibGUgKz0gc3RyaW5ncy5qb2luKCIiKSArIHN0cmluZ3NVbmljb2RlLmpvaW4oIiIpOwogIHJldHVybiBuYW1lVGFibGU7Cn0KY2xhc3MgRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcywgZXZhbHVhdG9yT3B0aW9ucykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMucHNOYW1lID0gbnVsbDsKICAgIHRoaXMubWltZXR5cGUgPSBudWxsOwogICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBldmFsdWF0b3JPcHRpb25zLmRpc2FibGVGb250RmFjZTsKICAgIHRoaXMuZm9udEV4dHJhUHJvcGVydGllcyA9IGV2YWx1YXRvck9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllczsKICAgIHRoaXMubG9hZGVkTmFtZSA9IHByb3BlcnRpZXMubG9hZGVkTmFtZTsKICAgIHRoaXMuaXNUeXBlM0ZvbnQgPSBwcm9wZXJ0aWVzLmlzVHlwZTNGb250OwogICAgdGhpcy5taXNzaW5nRmlsZSA9IGZhbHNlOwogICAgdGhpcy5jc3NGb250SW5mbyA9IHByb3BlcnRpZXMuY3NzRm9udEluZm87CiAgICB0aGlzLl9jaGFyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuX2dseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IGlzU2VyaWZGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TZXJpZik7CiAgICBpZiAoIWlzU2VyaWZGb250ICYmICFwcm9wZXJ0aWVzLmlzU2ltdWxhdGVkRmxhZ3MpIHsKICAgICAgY29uc3QgYmFzZU5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoL1ssX10vZywgIi0iKS5zcGxpdCgiLSIsIDEpWzBdLAogICAgICAgIHNlcmlmRm9udHMgPSBnZXRTZXJpZkZvbnRzKCk7CiAgICAgIGZvciAoY29uc3QgbmFtZVBhcnQgb2YgYmFzZU5hbWUuc3BsaXQoIisiKSkgewogICAgICAgIGlmIChzZXJpZkZvbnRzW25hbWVQYXJ0XSkgewogICAgICAgICAgaXNTZXJpZkZvbnQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmlzU2VyaWZGb250ID0gaXNTZXJpZkZvbnQ7CiAgICB0aGlzLmlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTsKICAgIGxldCB7CiAgICAgIHR5cGUsCiAgICAgIHN1YnR5cGUKICAgIH0gPSBwcm9wZXJ0aWVzOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLnN5c3RlbUZvbnRJbmZvID0gcHJvcGVydGllcy5zeXN0ZW1Gb250SW5mbzsKICAgIGNvbnN0IG1hdGNoZXMgPSBuYW1lLm1hdGNoKC9eSW52YWxpZFBERmpzRm9udF8oLiopX1xkKyQvKTsKICAgIHRoaXMuaXNJbnZhbGlkUERGanNGb250ID0gISFtYXRjaGVzOwogICAgaWYgKHRoaXMuaXNJbnZhbGlkUERGanNGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gbWF0Y2hlc1sxXTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc01vbm9zcGFjZSkgewogICAgICB0aGlzLmZhbGxiYWNrTmFtZSA9ICJtb25vc3BhY2UiOwogICAgfSBlbHNlIGlmICh0aGlzLmlzU2VyaWZGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNlcmlmIjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNhbnMtc2VyaWYiOwogICAgfQogICAgaWYgKHRoaXMuc3lzdGVtRm9udEluZm8/Lmd1ZXNzRmFsbGJhY2spIHsKICAgICAgdGhpcy5zeXN0ZW1Gb250SW5mby5ndWVzc0ZhbGxiYWNrID0gZmFsc2U7CiAgICAgIHRoaXMuc3lzdGVtRm9udEluZm8uY3NzICs9IGAsJHt0aGlzLmZhbGxiYWNrTmFtZX1gOwogICAgfQogICAgdGhpcy5kaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMuY29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGU7CiAgICB0aGlzLmNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7CiAgICB0aGlzLmNhcEhlaWdodCA9IHByb3BlcnRpZXMuY2FwSGVpZ2h0IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgdGhpcy5hc2NlbnQgPSBwcm9wZXJ0aWVzLmFzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMuZGVzY2VudCA9IHByb3BlcnRpZXMuZGVzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMubGluZUhlaWdodCA9IHRoaXMuYXNjZW50IC0gdGhpcy5kZXNjZW50OwogICAgdGhpcy5mb250TWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4OwogICAgdGhpcy5iYm94ID0gcHJvcGVydGllcy5iYm94OwogICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnRvRm9udENoYXIgPSBbXTsKICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUeXBlMyIpIHsKICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgewogICAgICAgIHRoaXMudG9Gb250Q2hhcltjaGFyQ29kZV0gPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSB8fCBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5jaWRFbmNvZGluZyA9IHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgfHwgIiI7CiAgICB0aGlzLnZlcnRpY2FsID0gISFwcm9wZXJ0aWVzLnZlcnRpY2FsOwogICAgaWYgKHRoaXMudmVydGljYWwpIHsKICAgICAgdGhpcy52bWV0cmljcyA9IHByb3BlcnRpZXMudm1ldHJpY3M7CiAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7CiAgICB9CiAgICBpZiAoIWZpbGUgfHwgZmlsZS5pc0VtcHR5KSB7CiAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgd2FybignRm9udCBmaWxlIGlzIGVtcHR5IGluICInICsgbmFtZSArICciICgnICsgdGhpcy5sb2FkZWROYW1lICsgIikiKTsKICAgICAgfQogICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KHByb3BlcnRpZXMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBbdHlwZSwgc3VidHlwZV0gPSBnZXRGb250RmlsZVR5cGUoZmlsZSwgcHJvcGVydGllcyk7CiAgICBpZiAodHlwZSAhPT0gdGhpcy50eXBlIHx8IHN1YnR5cGUgIT09IHRoaXMuc3VidHlwZSkgewogICAgICBpbmZvKCJJbmNvbnNpc3RlbnQgZm9udCBmaWxlIFR5cGUvU3ViVHlwZSwgZXhwZWN0ZWQ6ICIgKyBgJHt0aGlzLnR5cGV9LyR7dGhpcy5zdWJ0eXBlfSBidXQgZm91bmQ6ICR7dHlwZX0vJHtzdWJ0eXBlfS5gKTsKICAgIH0KICAgIGxldCBkYXRhOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAiTU1UeXBlMSI6CiAgICAgICAgICBpbmZvKCJNTVR5cGUxIGZvbnQgKCIgKyBuYW1lICsgIiksIGZhbGxpbmcgYmFjayB0byBUeXBlMS4iKTsKICAgICAgICBjYXNlICJUeXBlMSI6CiAgICAgICAgY2FzZSAiQ0lERm9udFR5cGUwIjoKICAgICAgICAgIHRoaXMubWltZXR5cGUgPSAiZm9udC9vcGVudHlwZSI7CiAgICAgICAgICBjb25zdCBjZmYgPSBzdWJ0eXBlID09PSAiVHlwZTFDIiB8fCBzdWJ0eXBlID09PSAiQ0lERm9udFR5cGUwQyIgPyBuZXcgQ0ZGRm9udChmaWxlLCBwcm9wZXJ0aWVzKSA6IG5ldyBUeXBlMUZvbnQobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CiAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPcGVuVHlwZSI6CiAgICAgICAgY2FzZSAiVHJ1ZVR5cGUiOgogICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMiI6CiAgICAgICAgICB0aGlzLm1pbWV0eXBlID0gImZvbnQvb3BlbnR5cGUiOwogICAgICAgICAgZGF0YSA9IHRoaXMuY2hlY2tBbmRSZXBhaXIobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBpZiAodGhpcy5pc09wZW5UeXBlKSB7CiAgICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKICAgICAgICAgICAgdHlwZSA9ICJPcGVuVHlwZSI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oZSk7CiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7CiAgfQogIGdldCByZW5kZXJlcigpIHsKICAgIGNvbnN0IHJlbmRlcmVyID0gRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgInJlbmRlcmVyIiwgcmVuZGVyZXIpOwogIH0KICBleHBvcnREYXRhKCkgewogICAgY29uc3QgZXhwb3J0RGF0YVByb3BzID0gdGhpcy5mb250RXh0cmFQcm9wZXJ0aWVzID8gWy4uLkVYUE9SVF9EQVRBX1BST1BFUlRJRVMsIC4uLkVYUE9SVF9EQVRBX0VYVFJBX1BST1BFUlRJRVNdIDogRVhQT1JUX0RBVEFfUFJPUEVSVElFUzsKICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yIChjb25zdCBwcm9wIG9mIGV4cG9ydERhdGFQcm9wcykgewogICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcHJvcF07CiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YVtwcm9wXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcykgewogICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7CiAgICBjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIHR5cGUKICAgIH0gPSB0aGlzOwogICAgbGV0IGZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUobmFtZSk7CiAgICBjb25zdCBzdGRGb250TWFwID0gZ2V0U3RkRm9udE1hcCgpLAogICAgICBub25TdGRGb250TWFwID0gZ2V0Tm9uU3RkRm9udE1hcCgpOwogICAgY29uc3QgaXNTdGFuZGFyZEZvbnQgPSAhIXN0ZEZvbnRNYXBbZm9udE5hbWVdOwogICAgY29uc3QgaXNNYXBwZWRUb1N0YW5kYXJkRm9udCA9ICEhKG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdICYmIHN0ZEZvbnRNYXBbbm9uU3RkRm9udE1hcFtmb250TmFtZV1dKTsKICAgIGZvbnROYW1lID0gc3RkRm9udE1hcFtmb250TmFtZV0gfHwgbm9uU3RkRm9udE1hcFtmb250TmFtZV0gfHwgZm9udE5hbWU7CiAgICBjb25zdCBmb250QmFzaWNNZXRyaWNzTWFwID0gZ2V0Rm9udEJhc2ljTWV0cmljcygpOwogICAgY29uc3QgbWV0cmljcyA9IGZvbnRCYXNpY01ldHJpY3NNYXBbZm9udE5hbWVdOwogICAgaWYgKG1ldHJpY3MpIHsKICAgICAgaWYgKGlzTmFOKHRoaXMuYXNjZW50KSkgewogICAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljcy5hc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuZGVzY2VudCkpIHsKICAgICAgICB0aGlzLmRlc2NlbnQgPSBtZXRyaWNzLmRlc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuY2FwSGVpZ2h0KSkgewogICAgICAgIHRoaXMuY2FwSGVpZ2h0ID0gbWV0cmljcy5jYXBIZWlnaHQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuYm9sZCA9IC9ib2xkL2dpLnRlc3QoZm9udE5hbWUpOwogICAgdGhpcy5pdGFsaWMgPSAvb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChmb250TmFtZSk7CiAgICB0aGlzLmJsYWNrID0gL0JsYWNrL2cudGVzdChuYW1lKTsKICAgIGNvbnN0IGlzTmFycm93ID0gL05hcnJvdy9nLnRlc3QobmFtZSk7CiAgICB0aGlzLnJlbWVhc3VyZSA9ICghaXNTdGFuZGFyZEZvbnQgfHwgaXNOYXJyb3cpICYmIE9iamVjdC5rZXlzKHRoaXMud2lkdGhzKS5sZW5ndGggPiAwOwogICAgaWYgKChpc1N0YW5kYXJkRm9udCB8fCBpc01hcHBlZFRvU3RhbmRhcmRGb250KSAmJiB0eXBlID09PSAiQ0lERm9udFR5cGUyIiAmJiB0aGlzLmNpZEVuY29kaW5nLnN0YXJ0c1dpdGgoIklkZW50aXR5LSIpKSB7CiAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gcHJvcGVydGllcy5jaWRUb0dpZE1hcDsKICAgICAgY29uc3QgbWFwID0gW107CiAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMoKSk7CiAgICAgIGlmICgvQXJpYWwtP0JsYWNrL2kudGVzdChuYW1lKSkgewogICAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2soKSk7CiAgICAgIH0gZWxzZSBpZiAoL0NhbGlicmkvaS50ZXN0KG5hbWUpKSB7CiAgICAgICAgYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSgpKTsKICAgICAgfQogICAgICBpZiAoY2lkVG9HaWRNYXApIHsKICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgewogICAgICAgICAgY29uc3QgY2lkID0gbWFwW2NoYXJDb2RlXTsKICAgICAgICAgIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2lkVG9HaWRNYXAubGVuZ3RoICE9PSB0aGlzLnRvVW5pY29kZS5sZW5ndGggJiYgcHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCAmJiB0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7CiAgICAgICAgICAgIGNvbnN0IGNpZCA9IG1hcFtjaGFyQ29kZV07CiAgICAgICAgICAgIGlmIChjaWRUb0dpZE1hcFtjaWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghKHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApKSB7CiAgICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgewogICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbWFwOwogICAgICB0aGlzLnRvVW5pY29kZSA9IG5ldyBUb1VuaWNvZGVNYXAobWFwKTsKICAgIH0gZWxzZSBpZiAoL1N5bWJvbC9pLnRlc3QoZm9udE5hbWUpKSB7CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihTeW1ib2xTZXRFbmNvZGluZywgZ2V0R2x5cGhzVW5pY29kZSgpLCB0aGlzLmRpZmZlcmVuY2VzKTsKICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChmb250TmFtZSkpIHsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKFphcGZEaW5nYmF0c0VuY29kaW5nLCBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CiAgICB9IGVsc2UgaWYgKGlzU3RhbmRhcmRGb250IHx8IGlzTWFwcGVkVG9TdGFuZGFyZEZvbnQpIHsKICAgICAgY29uc3QgbWFwID0gYnVpbGRUb0ZvbnRDaGFyKHRoaXMuZGVmYXVsdEVuY29kaW5nLCBnZXRHbHlwaHNVbmljb2RlKCksIHRoaXMuZGlmZmVyZW5jZXMpOwogICAgICBpZiAodHlwZSA9PT0gIkNJREZvbnRUeXBlMiIgJiYgIXRoaXMuY2lkRW5jb2Rpbmcuc3RhcnRzV2l0aCgiSWRlbnRpdHktIikgJiYgISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpIHsKICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgICAgIGNvbnN0IG1hcCA9IFtdOwogICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSA9PiB7CiAgICAgICAgaWYgKCF0aGlzLmNvbXBvc2l0ZSkgewogICAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgICAgICAgIHVuaWNvZGVDaGFyQ29kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICB9KTsKICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKICAgICAgICBpZiAoL1RhaG9tYXxWZXJkYW5hL2kudGVzdChuYW1lKSkgewogICAgICAgICAgYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cygpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbWFwOwogICAgfQogICAgYW1lbmRGYWxsYmFja1RvVW5pY29kZShwcm9wZXJ0aWVzKTsKICAgIHRoaXMubG9hZGVkTmFtZSA9IGZvbnROYW1lLnNwbGl0KCItIiwgMSlbMF07CiAgfQogIGNoZWNrQW5kUmVwYWlyKG5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IFZBTElEX1RBQkxFUyA9IFsiT1MvMiIsICJjbWFwIiwgImhlYWQiLCAiaGhlYSIsICJobXR4IiwgIm1heHAiLCAibmFtZSIsICJwb3N0IiwgImxvY2EiLCAiZ2x5ZiIsICJmcGdtIiwgInByZXAiLCAiY3Z0ICIsICJDRkYgIl07CiAgICBmdW5jdGlvbiByZWFkVGFibGVzKGZpbGUsIG51bVRhYmxlcykgewogICAgICBjb25zdCB0YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICB0YWJsZXNbIk9TLzIiXSA9IG51bGw7CiAgICAgIHRhYmxlcy5jbWFwID0gbnVsbDsKICAgICAgdGFibGVzLmhlYWQgPSBudWxsOwogICAgICB0YWJsZXMuaGhlYSA9IG51bGw7CiAgICAgIHRhYmxlcy5obXR4ID0gbnVsbDsKICAgICAgdGFibGVzLm1heHAgPSBudWxsOwogICAgICB0YWJsZXMubmFtZSA9IG51bGw7CiAgICAgIHRhYmxlcy5wb3N0ID0gbnVsbDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICAgIGNvbnN0IHRhYmxlID0gcmVhZFRhYmxlRW50cnkoZmlsZSk7CiAgICAgICAgaWYgKCFWQUxJRF9UQUJMRVMuaW5jbHVkZXModGFibGUudGFnKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0YWJsZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0YWJsZXNbdGFibGUudGFnXSA9IHRhYmxlOwogICAgICB9CiAgICAgIHJldHVybiB0YWJsZXM7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkVGFibGVFbnRyeShmaWxlKSB7CiAgICAgIGNvbnN0IHRhZyA9IGZpbGUuZ2V0U3RyaW5nKDQpOwogICAgICBjb25zdCBjaGVja3N1bSA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgY29uc3Qgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICBjb25zdCBsZW5ndGggPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBmaWxlLnBvczsKICAgICAgZmlsZS5wb3MgPSBmaWxlLnN0YXJ0IHx8IDA7CiAgICAgIGZpbGUuc2tpcChvZmZzZXQpOwogICAgICBjb25zdCBkYXRhID0gZmlsZS5nZXRCeXRlcyhsZW5ndGgpOwogICAgICBmaWxlLnBvcyA9IHByZXZpb3VzUG9zaXRpb247CiAgICAgIGlmICh0YWcgPT09ICJoZWFkIikgewogICAgICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9IDA7CiAgICAgICAgZGF0YVsxN10gfD0gMHgyMDsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHRhZywKICAgICAgICBjaGVja3N1bSwKICAgICAgICBsZW5ndGgsCiAgICAgICAgb2Zmc2V0LAogICAgICAgIGRhdGEKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2ZXJzaW9uOiB0dGYuZ2V0U3RyaW5nKDQpLAogICAgICAgIG51bVRhYmxlczogdHRmLmdldFVpbnQxNigpLAogICAgICAgIHNlYXJjaFJhbmdlOiB0dGYuZ2V0VWludDE2KCksCiAgICAgICAgZW50cnlTZWxlY3RvcjogdHRmLmdldFVpbnQxNigpLAogICAgICAgIHJhbmdlU2hpZnQ6IHR0Zi5nZXRVaW50MTYoKQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcih0dGMpIHsKICAgICAgY29uc3QgdHRjVGFnID0gdHRjLmdldFN0cmluZyg0KTsKICAgICAgYXNzZXJ0KHR0Y1RhZyA9PT0gInR0Y2YiLCAiTXVzdCBiZSBhIFRydWVUeXBlIENvbGxlY3Rpb24gZm9udC4iKTsKICAgICAgY29uc3QgbWFqb3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpOwogICAgICBjb25zdCBtaW5vclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CiAgICAgIGNvbnN0IG51bUZvbnRzID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IG9mZnNldFRhYmxlID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRm9udHM7IGkrKykgewogICAgICAgIG9mZnNldFRhYmxlLnB1c2godHRjLmdldEludDMyKCkgPj4+IDApOwogICAgICB9CiAgICAgIGNvbnN0IGhlYWRlciA9IHsKICAgICAgICB0dGNUYWcsCiAgICAgICAgbWFqb3JWZXJzaW9uLAogICAgICAgIG1pbm9yVmVyc2lvbiwKICAgICAgICBudW1Gb250cywKICAgICAgICBvZmZzZXRUYWJsZQogICAgICB9OwogICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbikgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBoZWFkZXI7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaGVhZGVyLmRzaWdUYWcgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICAgIGhlYWRlci5kc2lnTGVuZ3RoID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBoZWFkZXIuZHNpZ09mZnNldCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgcmV0dXJuIGhlYWRlcjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBtYWpvclZlcnNpb246ICR7bWFqb3JWZXJzaW9ufS5gKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKHR0YywgZm9udE5hbWUpIHsKICAgICAgY29uc3QgewogICAgICAgIG51bUZvbnRzLAogICAgICAgIG9mZnNldFRhYmxlCiAgICAgIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7CiAgICAgIGNvbnN0IGZvbnROYW1lUGFydHMgPSBmb250TmFtZS5zcGxpdCgiKyIpOwogICAgICBsZXQgZmFsbGJhY2tEYXRhOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHsKICAgICAgICB0dGMucG9zID0gKHR0Yy5zdGFydCB8fCAwKSArIG9mZnNldFRhYmxlW2ldOwogICAgICAgIGNvbnN0IHBvdGVudGlhbEhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcih0dGMpOwogICAgICAgIGNvbnN0IHBvdGVudGlhbFRhYmxlcyA9IHJlYWRUYWJsZXModHRjLCBwb3RlbnRpYWxIZWFkZXIubnVtVGFibGVzKTsKICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IFtuYW1lVGFibGVdID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gbmFtZVRhYmxlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCBrayA9IG5hbWVUYWJsZVtqXS5sZW5ndGg7IGsgPCBrazsgaysrKSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWVFbnRyeSA9IG5hbWVUYWJsZVtqXVtrXT8ucmVwbGFjZUFsbCgvXHMvZywgIiIpOwogICAgICAgICAgICBpZiAoIW5hbWVFbnRyeSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IGZvbnROYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLAogICAgICAgICAgICAgICAgdGFibGVzOiBwb3RlbnRpYWxUYWJsZXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb250TmFtZVBhcnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZm9udE5hbWVQYXJ0cykgewogICAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IHBhcnQpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgbmFtZTogcGFydCwKICAgICAgICAgICAgICAgICAgaGVhZGVyOiBwb3RlbnRpYWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgIHRhYmxlczogcG90ZW50aWFsVGFibGVzCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmFsbGJhY2tEYXRhKSB7CiAgICAgICAgd2FybihgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluICIke2ZvbnROYW1lfSIgZm9udCwgYCArIGBmYWxsaW5nIGJhY2sgdG8gIiR7ZmFsbGJhY2tEYXRhLm5hbWV9IiBmb250IGluc3RlYWQuYCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGhlYWRlcjogZmFsbGJhY2tEYXRhLmhlYWRlciwKICAgICAgICAgIHRhYmxlczogZmFsbGJhY2tEYXRhLnRhYmxlcwogICAgICAgIH07CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIiR7Zm9udE5hbWV9IiBmb250LmApOwogICAgfQogICAgZnVuY3Rpb24gcmVhZENtYXBUYWJsZShjbWFwLCBmaWxlLCBpc1N5bWJvbGljRm9udCwgaGFzRW5jb2RpbmcpIHsKICAgICAgaWYgKCFjbWFwKSB7CiAgICAgICAgd2FybigiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuIik7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAogICAgICAgICAgZW5jb2RpbmdJZDogLTEsCiAgICAgICAgICBtYXBwaW5nczogW10sCiAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBsZXQgc2VnbWVudDsKICAgICAgbGV0IHN0YXJ0ID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBjbWFwLm9mZnNldDsKICAgICAgZmlsZS5wb3MgPSBzdGFydDsKICAgICAgZmlsZS5za2lwKDIpOwogICAgICBjb25zdCBudW1UYWJsZXMgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICBsZXQgcG90ZW50aWFsVGFibGU7CiAgICAgIGxldCBjYW5CcmVhayA9IGZhbHNlOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CiAgICAgICAgY29uc3QgcGxhdGZvcm1JZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3QgZW5jb2RpbmdJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIGxldCB1c2VUYWJsZSA9IGZhbHNlOwogICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZT8ucGxhdGZvcm1JZCA9PT0gcGxhdGZvcm1JZCAmJiBwb3RlbnRpYWxUYWJsZT8uZW5jb2RpbmdJZCA9PT0gZW5jb2RpbmdJZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChwbGF0Zm9ybUlkID09PSAwICYmIChlbmNvZGluZ0lkID09PSAwIHx8IGVuY29kaW5nSWQgPT09IDEgfHwgZW5jb2RpbmdJZCA9PT0gMykpIHsKICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtSWQgPT09IDEgJiYgZW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1JZCA9PT0gMyAmJiBlbmNvZGluZ0lkID09PSAxICYmIChoYXNFbmNvZGluZyB8fCAhcG90ZW50aWFsVGFibGUpKSB7CiAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CiAgICAgICAgICBpZiAoIWlzU3ltYm9saWNGb250KSB7CiAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlzU3ltYm9saWNGb250ICYmIHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgICAgbGV0IGNvcnJlY3RseVNvcnRlZCA9IHRydWU7CiAgICAgICAgICBpZiAoaSA8IG51bVRhYmxlcyAtIDEpIHsKICAgICAgICAgICAgY29uc3QgbmV4dEJ5dGVzID0gZmlsZS5wZWVrQnl0ZXMoMiksCiAgICAgICAgICAgICAgbmV4dFBsYXRmb3JtSWQgPSBpbnQxNihuZXh0Qnl0ZXNbMF0sIG5leHRCeXRlc1sxXSk7CiAgICAgICAgICAgIGlmIChuZXh0UGxhdGZvcm1JZCA8IHBsYXRmb3JtSWQpIHsKICAgICAgICAgICAgICBjb3JyZWN0bHlTb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvcnJlY3RseVNvcnRlZCkgewogICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh1c2VUYWJsZSkgewogICAgICAgICAgcG90ZW50aWFsVGFibGUgPSB7CiAgICAgICAgICAgIHBsYXRmb3JtSWQsCiAgICAgICAgICAgIGVuY29kaW5nSWQsCiAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhbkJyZWFrKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBvdGVudGlhbFRhYmxlKSB7CiAgICAgICAgZmlsZS5wb3MgPSBzdGFydCArIHBvdGVudGlhbFRhYmxlLm9mZnNldDsKICAgICAgfQogICAgICBpZiAoIXBvdGVudGlhbFRhYmxlIHx8IGZpbGUucGVla0J5dGUoKSA9PT0gLTEpIHsKICAgICAgICB3YXJuKCJDb3VsZCBub3QgZmluZCBhIHByZWZlcnJlZCBjbWFwIHRhYmxlLiIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAogICAgICAgICAgbWFwcGluZ3M6IFtdLAogICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3QgZm9ybWF0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgbGV0IGhhc1Nob3J0Q21hcCA9IGZhbHNlOwogICAgICBjb25zdCBtYXBwaW5ncyA9IFtdOwogICAgICBsZXQgaiwgZ2x5cGhJZDsKICAgICAgaWYgKGZvcm1hdCA9PT0gMCkgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CiAgICAgICAgICBjb25zdCBpbmRleCA9IGZpbGUuZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKCFpbmRleCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgZ2x5cGhJZDogaW5kZXgKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBoYXNTaG9ydENtYXAgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMikgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgY29uc3Qgc3ViSGVhZGVyS2V5cyA9IFtdOwogICAgICAgIGxldCBtYXhTdWJIZWFkZXJLZXkgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgIGNvbnN0IHN1YkhlYWRlcktleSA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMzsKICAgICAgICAgIHN1YkhlYWRlcktleXMucHVzaChzdWJIZWFkZXJLZXkpOwogICAgICAgICAgbWF4U3ViSGVhZGVyS2V5ID0gTWF0aC5tYXgoc3ViSGVhZGVyS2V5LCBtYXhTdWJIZWFkZXJLZXkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdWJIZWFkZXJzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4U3ViSGVhZGVyS2V5OyBpKyspIHsKICAgICAgICAgIHN1YkhlYWRlcnMucHVzaCh7CiAgICAgICAgICAgIGZpcnN0Q29kZTogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgZW50cnlDb3VudDogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgaWREZWx0YTogc2lnbmVkSW50MTYoZmlsZS5nZXRCeXRlKCksIGZpbGUuZ2V0Qnl0ZSgpKSwKICAgICAgICAgICAgaWRSYW5nZVBvczogZmlsZS5wb3MgKyBmaWxlLmdldFVpbnQxNigpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICAgaWYgKHN1YkhlYWRlcktleXNbaV0gPT09IDApIHsKICAgICAgICAgICAgZmlsZS5wb3MgPSBzdWJIZWFkZXJzWzBdLmlkUmFuZ2VQb3MgKyAyICogaTsKICAgICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgIGNoYXJDb2RlOiBpLAogICAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzID0gc3ViSGVhZGVyc1tzdWJIZWFkZXJLZXlzW2ldXTsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMuZW50cnlDb3VudDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSAoaSA8PCA4KSArIGogKyBzLmZpcnN0Q29kZTsKICAgICAgICAgICAgICBmaWxlLnBvcyA9IHMuaWRSYW5nZVBvcyArIDIgKiBqOwogICAgICAgICAgICAgIGdseXBoSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgICAgIGlmIChnbHlwaElkICE9PSAwKSB7CiAgICAgICAgICAgICAgICBnbHlwaElkID0gKGdseXBoSWQgKyBzLmlkRGVsdGEpICUgNjU1MzY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA0KSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyAyKTsKICAgICAgICBjb25zdCBzZWdDb3VudCA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMTsKICAgICAgICBmaWxlLnNraXAoNik7CiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBbXTsKICAgICAgICBsZXQgc2VnSW5kZXg7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzLnB1c2goewogICAgICAgICAgICBlbmQ6IGZpbGUuZ2V0VWludDE2KCkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmaWxlLnNraXAoMik7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzW3NlZ0luZGV4XS5zdGFydCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgfQogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50c1tzZWdJbmRleF0uZGVsdGEgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIH0KICAgICAgICBsZXQgb2Zmc2V0c0NvdW50ID0gMCwKICAgICAgICAgIG9mZnNldEluZGV4OwogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOwogICAgICAgICAgY29uc3QgcmFuZ2VPZmZzZXQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKCFyYW5nZU9mZnNldCkgewogICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gLTE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0SW5kZXggPSAocmFuZ2VPZmZzZXQgPj4gMSkgLSAoc2VnQ291bnQgLSBzZWdJbmRleCk7CiAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7CiAgICAgICAgICBvZmZzZXRzQ291bnQgPSBNYXRoLm1heChvZmZzZXRzQ291bnQsIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9mZnNldHMgPSBbXTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2Zmc2V0c0NvdW50OyBqKyspIHsKICAgICAgICAgIG9mZnNldHMucHVzaChmaWxlLmdldFVpbnQxNigpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50c1tzZWdJbmRleF07CiAgICAgICAgICBzdGFydCA9IHNlZ21lbnQuc3RhcnQ7CiAgICAgICAgICBjb25zdCBlbmQgPSBzZWdtZW50LmVuZDsKICAgICAgICAgIGNvbnN0IGRlbHRhID0gc2VnbWVudC5kZWx0YTsKICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDsKICAgICAgICAgIGZvciAoaiA9IHN0YXJ0OyBqIDw9IGVuZDsgaisrKSB7CiAgICAgICAgICAgIGlmIChqID09PSAweGZmZmYpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbHlwaElkID0gb2Zmc2V0SW5kZXggPCAwID8gaiA6IG9mZnNldHNbb2Zmc2V0SW5kZXggKyBqIC0gc3RhcnRdOwogICAgICAgICAgICBnbHlwaElkID0gZ2x5cGhJZCArIGRlbHRhICYgMHhmZmZmOwogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDYpIHsKICAgICAgICBmaWxlLnNraXAoMiArIDIpOwogICAgICAgIGNvbnN0IGZpcnN0Q29kZSA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5Q291bnQ7IGorKykgewogICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGZpcnN0Q29kZSArIGo7CiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDEyKSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyA0ICsgNCk7CiAgICAgICAgY29uc3Qgbkdyb3VwcyA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkdyb3VwczsgaisrKSB7CiAgICAgICAgICBjb25zdCBzdGFydENoYXJDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgY29uc3QgZW5kQ2hhckNvZGUgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBsZXQgZ2x5cGhDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSBzdGFydENoYXJDb2RlOyBjaGFyQ29kZSA8PSBlbmRDaGFyQ29kZTsgY2hhckNvZGUrKykgewogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZSwKICAgICAgICAgICAgICBnbHlwaElkOiBnbHlwaENvZGUrKwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiY21hcCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0OiAiICsgZm9ybWF0KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcGxhdGZvcm1JZDogLTEsCiAgICAgICAgICBlbmNvZGluZ0lkOiAtMSwKICAgICAgICAgIG1hcHBpbmdzOiBbXSwKICAgICAgICAgIGhhc1Nob3J0Q21hcDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIG1hcHBpbmdzLnNvcnQoKGEsIGIpID0+IGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlKTsKICAgICAgY29uc3QgZmluYWxNYXBwaW5ncyA9IFtdLAogICAgICAgIHNlZW5DaGFyQ29kZXMgPSBuZXcgU2V0KCk7CiAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHBpbmdzKSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2hhckNvZGUKICAgICAgICB9ID0gbWFwOwogICAgICAgIGlmIChzZWVuQ2hhckNvZGVzLmhhcyhjaGFyQ29kZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBzZWVuQ2hhckNvZGVzLmFkZChjaGFyQ29kZSk7CiAgICAgICAgZmluYWxNYXBwaW5ncy5wdXNoKG1hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBwbGF0Zm9ybUlkOiBwb3RlbnRpYWxUYWJsZS5wbGF0Zm9ybUlkLAogICAgICAgIGVuY29kaW5nSWQ6IHBvdGVudGlhbFRhYmxlLmVuY29kaW5nSWQsCiAgICAgICAgbWFwcGluZ3M6IGZpbmFsTWFwcGluZ3MsCiAgICAgICAgaGFzU2hvcnRDbWFwCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZU1ldHJpY3MoZmlsZSwgaGVhZGVyLCBtZXRyaWNzLCBoZWFkVGFibGUsIG51bUdseXBocywgZHVwRmlyc3RFbnRyeSkgewogICAgICBpZiAoIWhlYWRlcikgewogICAgICAgIGlmIChtZXRyaWNzKSB7CiAgICAgICAgICBtZXRyaWNzLmRhdGEgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZmlsZS5wb3MgPSAoZmlsZS5zdGFydCB8fCAwKSArIGhlYWRlci5vZmZzZXQ7CiAgICAgIGZpbGUucG9zICs9IDQ7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgZmlsZS5wb3MgKz0gODsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgbGV0IG51bU9mTWV0cmljcyA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgIGlmIChjYXJldE9mZnNldCAhPT0gMCkgewogICAgICAgIGNvbnN0IG1hY1N0eWxlID0gaW50MTYoaGVhZFRhYmxlLmRhdGFbNDRdLCBoZWFkVGFibGUuZGF0YVs0NV0pOwogICAgICAgIGlmICghKG1hY1N0eWxlICYgMikpIHsKICAgICAgICAgIGhlYWRlci5kYXRhWzIyXSA9IDA7CiAgICAgICAgICBoZWFkZXIuZGF0YVsyM10gPSAwOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobnVtT2ZNZXRyaWNzID4gbnVtR2x5cGhzKSB7CiAgICAgICAgaW5mbyhgVGhlIG51bU9mTWV0cmljcyAoJHtudW1PZk1ldHJpY3N9KSBzaG91bGQgbm90IGJlIGAgKyBgZ3JlYXRlciB0aGFuIHRoZSBudW1HbHlwaHMgKCR7bnVtR2x5cGhzfSkuYCk7CiAgICAgICAgbnVtT2ZNZXRyaWNzID0gbnVtR2x5cGhzOwogICAgICAgIGhlYWRlci5kYXRhWzM0XSA9IChudW1PZk1ldHJpY3MgJiAweGZmMDApID4+IDg7CiAgICAgICAgaGVhZGVyLmRhdGFbMzVdID0gbnVtT2ZNZXRyaWNzICYgMHgwMGZmOwogICAgICB9CiAgICAgIGNvbnN0IG51bU9mU2lkZWJlYXJpbmdzID0gbnVtR2x5cGhzIC0gbnVtT2ZNZXRyaWNzOwogICAgICBjb25zdCBudW1NaXNzaW5nID0gbnVtT2ZTaWRlYmVhcmluZ3MgLSAobWV0cmljcy5sZW5ndGggLSBudW1PZk1ldHJpY3MgKiA0ID4+IDEpOwogICAgICBpZiAobnVtTWlzc2luZyA+IDApIHsKICAgICAgICBjb25zdCBlbnRyaWVzID0gbmV3IFVpbnQ4QXJyYXkobWV0cmljcy5sZW5ndGggKyBudW1NaXNzaW5nICogMik7CiAgICAgICAgZW50cmllcy5zZXQobWV0cmljcy5kYXRhKTsKICAgICAgICBpZiAoZHVwRmlyc3RFbnRyeSkgewogICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aF0gPSBtZXRyaWNzLmRhdGFbMl07CiAgICAgICAgICBlbnRyaWVzW21ldHJpY3MubGVuZ3RoICsgMV0gPSBtZXRyaWNzLmRhdGFbM107CiAgICAgICAgfQogICAgICAgIG1ldHJpY3MuZGF0YSA9IGVudHJpZXM7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplR2x5cGgoc291cmNlLCBzb3VyY2VTdGFydCwgc291cmNlRW5kLCBkZXN0LCBkZXN0U3RhcnQsIGhpbnRzVmFsaWQpIHsKICAgICAgY29uc3QgZ2x5cGhQcm9maWxlID0gewogICAgICAgIGxlbmd0aDogMCwKICAgICAgICBzaXplT2ZJbnN0cnVjdGlvbnM6IDAKICAgICAgfTsKICAgICAgaWYgKHNvdXJjZVN0YXJ0IDwgMCB8fCBzb3VyY2VTdGFydCA+PSBzb3VyY2UubGVuZ3RoIHx8IHNvdXJjZUVuZCA+IHNvdXJjZS5sZW5ndGggfHwgc291cmNlRW5kIC0gc291cmNlU3RhcnQgPD0gMTIpIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGNvbnN0IGdseWYgPSBzb3VyY2Uuc3ViYXJyYXkoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiAgICAgIGNvbnN0IHhNaW4gPSBzaWduZWRJbnQxNihnbHlmWzJdLCBnbHlmWzNdKTsKICAgICAgY29uc3QgeU1pbiA9IHNpZ25lZEludDE2KGdseWZbNF0sIGdseWZbNV0pOwogICAgICBjb25zdCB4TWF4ID0gc2lnbmVkSW50MTYoZ2x5Zls2XSwgZ2x5Zls3XSk7CiAgICAgIGNvbnN0IHlNYXggPSBzaWduZWRJbnQxNihnbHlmWzhdLCBnbHlmWzldKTsKICAgICAgaWYgKHhNaW4gPiB4TWF4KSB7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCAyLCB4TWF4KTsKICAgICAgICB3cml0ZVNpZ25lZEludDE2KGdseWYsIDYsIHhNaW4pOwogICAgICB9CiAgICAgIGlmICh5TWluID4geU1heCkgewogICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgNCwgeU1heCk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCA4LCB5TWluKTsKICAgICAgfQogICAgICBjb25zdCBjb250b3Vyc0NvdW50ID0gc2lnbmVkSW50MTYoZ2x5ZlswXSwgZ2x5ZlsxXSk7CiAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgMCkgewogICAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgLTEpIHsKICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgICAgfQogICAgICAgIGRlc3Quc2V0KGdseWYsIGRlc3RTdGFydCk7CiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoOwogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgbGV0IGksCiAgICAgICAgaiA9IDEwLAogICAgICAgIGZsYWdzQ291bnQgPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgY29udG91cnNDb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBnbHlmW2pdIDw8IDggfCBnbHlmW2ogKyAxXTsKICAgICAgICBmbGFnc0NvdW50ID0gZW5kUG9pbnQgKyAxOwogICAgICAgIGogKz0gMjsKICAgICAgfQogICAgICBjb25zdCBpbnN0cnVjdGlvbnNTdGFydCA9IGo7CiAgICAgIGNvbnN0IGluc3RydWN0aW9uc0xlbmd0aCA9IGdseWZbal0gPDwgOCB8IGdseWZbaiArIDFdOwogICAgICBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICBqICs9IDIgKyBpbnN0cnVjdGlvbnNMZW5ndGg7CiAgICAgIGNvbnN0IGluc3RydWN0aW9uc0VuZCA9IGo7CiAgICAgIGxldCBjb29yZGluYXRlc0xlbmd0aCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBmbGFnc0NvdW50OyBpKyspIHsKICAgICAgICBjb25zdCBmbGFnID0gZ2x5ZltqKytdOwogICAgICAgIGlmIChmbGFnICYgMHhjMCkgewogICAgICAgICAgZ2x5ZltqIC0gMV0gPSBmbGFnICYgMHgzZjsKICAgICAgICB9CiAgICAgICAgbGV0IHhMZW5ndGggPSAyOwogICAgICAgIGlmIChmbGFnICYgMikgewogICAgICAgICAgeExlbmd0aCA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMTYpIHsKICAgICAgICAgIHhMZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICBsZXQgeUxlbmd0aCA9IDI7CiAgICAgICAgaWYgKGZsYWcgJiA0KSB7CiAgICAgICAgICB5TGVuZ3RoID0gMTsKICAgICAgICB9IGVsc2UgaWYgKGZsYWcgJiAzMikgewogICAgICAgICAgeUxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHh5TGVuZ3RoID0geExlbmd0aCArIHlMZW5ndGg7CiAgICAgICAgY29vcmRpbmF0ZXNMZW5ndGggKz0geHlMZW5ndGg7CiAgICAgICAgaWYgKGZsYWcgJiA4KSB7CiAgICAgICAgICBjb25zdCByZXBlYXQgPSBnbHlmW2orK107CiAgICAgICAgICBpZiAocmVwZWF0ID09PSAwKSB7CiAgICAgICAgICAgIGdseWZbaiAtIDFdIF49IDg7CiAgICAgICAgICB9CiAgICAgICAgICBpICs9IHJlcGVhdDsKICAgICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHJlcGVhdCAqIHh5TGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY29vcmRpbmF0ZXNMZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGxldCBnbHlwaERhdGFMZW5ndGggPSBqICsgY29vcmRpbmF0ZXNMZW5ndGg7CiAgICAgIGlmIChnbHlwaERhdGFMZW5ndGggPiBnbHlmLmxlbmd0aCkgewogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgaWYgKCFoaW50c1ZhbGlkICYmIGluc3RydWN0aW9uc0xlbmd0aCA+IDApIHsKICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KDAsIGluc3RydWN0aW9uc1N0YXJ0KSwgZGVzdFN0YXJ0KTsKICAgICAgICBkZXN0LnNldChbMCwgMF0sIGRlc3RTdGFydCArIGluc3RydWN0aW9uc1N0YXJ0KTsKICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KGluc3RydWN0aW9uc0VuZCwgZ2x5cGhEYXRhTGVuZ3RoKSwgZGVzdFN0YXJ0ICsgaW5zdHJ1Y3Rpb25zU3RhcnQgKyAyKTsKICAgICAgICBnbHlwaERhdGFMZW5ndGggLT0gaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICAgIGlmIChnbHlmLmxlbmd0aCAtIGdseXBoRGF0YUxlbmd0aCA+IDMpIHsKICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aCArIDMgJiB+MzsKICAgICAgICB9CiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aDsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGlmIChnbHlmLmxlbmd0aCAtIGdseXBoRGF0YUxlbmd0aCA+IDMpIHsKICAgICAgICBnbHlwaERhdGFMZW5ndGggPSBnbHlwaERhdGFMZW5ndGggKyAzICYgfjM7CiAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBnbHlwaERhdGFMZW5ndGgpLCBkZXN0U3RhcnQpOwogICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOwogICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5Zi5sZW5ndGg7CiAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZUhlYWQoaGVhZCwgbnVtR2x5cGhzLCBsb2NhTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBoZWFkLmRhdGE7CiAgICAgIGNvbnN0IHZlcnNpb24gPSBpbnQzMihkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKICAgICAgaWYgKHZlcnNpb24gPj4gMTYgIT09IDEpIHsKICAgICAgICBpbmZvKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIiArIHZlcnNpb24pOwogICAgICAgIGRhdGFbMF0gPSAwOwogICAgICAgIGRhdGFbMV0gPSAxOwogICAgICAgIGRhdGFbMl0gPSAwOwogICAgICAgIGRhdGFbM10gPSAwOwogICAgICB9CiAgICAgIGNvbnN0IGluZGV4VG9Mb2NGb3JtYXQgPSBpbnQxNihkYXRhWzUwXSwgZGF0YVs1MV0pOwogICAgICBpZiAoaW5kZXhUb0xvY0Zvcm1hdCA8IDAgfHwgaW5kZXhUb0xvY0Zvcm1hdCA+IDEpIHsKICAgICAgICBpbmZvKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIGluZGV4VG9Mb2NGb3JtYXQgaW4gaGVhZCB0YWJsZTogIiArIGluZGV4VG9Mb2NGb3JtYXQpOwogICAgICAgIGNvbnN0IG51bUdseXBoc1BsdXNPbmUgPSBudW1HbHlwaHMgKyAxOwogICAgICAgIGlmIChsb2NhTGVuZ3RoID09PSBudW1HbHlwaHNQbHVzT25lIDw8IDEpIHsKICAgICAgICAgIGRhdGFbNTBdID0gMDsKICAgICAgICAgIGRhdGFbNTFdID0gMDsKICAgICAgICB9IGVsc2UgaWYgKGxvY2FMZW5ndGggPT09IG51bUdseXBoc1BsdXNPbmUgPDwgMikgewogICAgICAgICAgZGF0YVs1MF0gPSAwOwogICAgICAgICAgZGF0YVs1MV0gPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogIiArIGluZGV4VG9Mb2NGb3JtYXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2FuaXRpemVHbHlwaExvY2F0aW9ucyhsb2NhLCBnbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKICAgICAgbGV0IGl0ZW1TaXplLCBpdGVtRGVjb2RlLCBpdGVtRW5jb2RlOwogICAgICBpZiAoaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICAgICAgICBpdGVtU2l6ZSA9IDQ7CiAgICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlTG9uZyhkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXTsKICAgICAgICB9OwogICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZUxvbmcoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgewogICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4+IDI0ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDJdID0gdmFsdWUgPj4gOCAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmOwogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbVNpemUgPSAyOwogICAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZShkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgOSB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTsKICAgICAgICB9OwogICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZShkYXRhLCBvZmZzZXQsIHZhbHVlKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSB2YWx1ZSA+PiA5ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxICYgMHhmZjsKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IG51bUdseXBoc091dCA9IGR1cEZpcnN0RW50cnkgPyBudW1HbHlwaHMgKyAxIDogbnVtR2x5cGhzOwogICAgICBjb25zdCBsb2NhRGF0YVNpemUgPSBpdGVtU2l6ZSAqICgxICsgbnVtR2x5cGhzT3V0KTsKICAgICAgY29uc3QgbG9jYURhdGEgPSBuZXcgVWludDhBcnJheShsb2NhRGF0YVNpemUpOwogICAgICBsb2NhRGF0YS5zZXQobG9jYS5kYXRhLnN1YmFycmF5KDAsIGxvY2FEYXRhU2l6ZSkpOwogICAgICBsb2NhLmRhdGEgPSBsb2NhRGF0YTsKICAgICAgY29uc3Qgb2xkR2x5ZkRhdGEgPSBnbHlmLmRhdGE7CiAgICAgIGNvbnN0IG9sZEdseWZEYXRhTGVuZ3RoID0gb2xkR2x5ZkRhdGEubGVuZ3RoOwogICAgICBjb25zdCBuZXdHbHlmRGF0YSA9IG5ldyBVaW50OEFycmF5KG9sZEdseWZEYXRhTGVuZ3RoKTsKICAgICAgbGV0IGksIGo7CiAgICAgIGNvbnN0IGxvY2FFbnRyaWVzID0gW107CiAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbnVtR2x5cGhzICsgMTsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CiAgICAgICAgbGV0IG9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYURhdGEsIGopOwogICAgICAgIGlmIChvZmZzZXQgPiBvbGRHbHlmRGF0YUxlbmd0aCkgewogICAgICAgICAgb2Zmc2V0ID0gb2xkR2x5ZkRhdGFMZW5ndGg7CiAgICAgICAgfQogICAgICAgIGxvY2FFbnRyaWVzLnB1c2goewogICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBlbmRPZmZzZXQ6IDAKICAgICAgICB9KTsKICAgICAgfQogICAgICBsb2NhRW50cmllcy5zb3J0KChhLCBiKSA9PiBhLm9mZnNldCAtIGIub2Zmc2V0KTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CiAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbG9jYUVudHJpZXNbaSArIDFdLm9mZnNldDsKICAgICAgfQogICAgICBsb2NhRW50cmllcy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIG9mZnNldCwKICAgICAgICAgIGVuZE9mZnNldAogICAgICAgIH0gPSBsb2NhRW50cmllc1tpXTsKICAgICAgICBpZiAob2Zmc2V0ICE9PSAwIHx8IGVuZE9mZnNldCAhPT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5leHRPZmZzZXQgPSBsb2NhRW50cmllc1tpICsgMV0ub2Zmc2V0OwogICAgICAgIGlmIChuZXh0T2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbmV4dE9mZnNldDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb25zdCBsYXN0ID0gbG9jYUVudHJpZXMuYXQoLTIpOwogICAgICBpZiAobGFzdC5vZmZzZXQgIT09IDAgJiYgbGFzdC5lbmRPZmZzZXQgPT09IDApIHsKICAgICAgICBsYXN0LmVuZE9mZnNldCA9IG9sZEdseWZEYXRhTGVuZ3RoOwogICAgICB9CiAgICAgIGNvbnN0IG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBsZXQgd3JpdGVPZmZzZXQgPSAwOwogICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCAwLCB3cml0ZU9mZnNldCk7CiAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoczsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CiAgICAgICAgY29uc3QgZ2x5cGhQcm9maWxlID0gc2FuaXRpemVHbHlwaChvbGRHbHlmRGF0YSwgbG9jYUVudHJpZXNbaV0ub2Zmc2V0LCBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQsIG5ld0dseWZEYXRhLCB3cml0ZU9mZnNldCwgaGludHNWYWxpZCk7CiAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gZ2x5cGhQcm9maWxlLmxlbmd0aDsKICAgICAgICBpZiAobmV3TGVuZ3RoID09PSAwKSB7CiAgICAgICAgICBtaXNzaW5nR2x5cGhzW2ldID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnMgPiBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKICAgICAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA9IGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnM7CiAgICAgICAgfQogICAgICAgIHdyaXRlT2Zmc2V0ICs9IG5ld0xlbmd0aDsKICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCB3cml0ZU9mZnNldCk7CiAgICAgIH0KICAgICAgaWYgKHdyaXRlT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgY29uc3Qgc2ltcGxlR2x5cGggPSBuZXcgVWludDhBcnJheShbMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNDksIDBdKTsKICAgICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHNPdXQ7IGkrKywgaiArPSBpdGVtU2l6ZSkgewogICAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgaiwgc2ltcGxlR2x5cGgubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZ2x5Zi5kYXRhID0gc2ltcGxlR2x5cGg7CiAgICAgIH0gZWxzZSBpZiAoZHVwRmlyc3RFbnRyeSkgewogICAgICAgIGNvbnN0IGZpcnN0RW50cnlMZW5ndGggPSBpdGVtRGVjb2RlKGxvY2FEYXRhLCBpdGVtU2l6ZSk7CiAgICAgICAgaWYgKG5ld0dseWZEYXRhLmxlbmd0aCA+IGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCkgewogICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKICAgICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgd3JpdGVPZmZzZXQpKTsKICAgICAgICB9CiAgICAgICAgZ2x5Zi5kYXRhLnNldChuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCBmaXJzdEVudHJ5TGVuZ3RoKSwgd3JpdGVPZmZzZXQpOwogICAgICAgIGl0ZW1FbmNvZGUobG9jYS5kYXRhLCBsb2NhRGF0YS5sZW5ndGggLSBpdGVtU2l6ZSwgd3JpdGVPZmZzZXQgKyBmaXJzdEVudHJ5TGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnbHlmLmRhdGEgPSBuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCB3cml0ZU9mZnNldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBtaXNzaW5nR2x5cGhzLAogICAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFBvc3RTY3JpcHRUYWJsZShwb3N0LCBwcm9wZXJ0aWVzT2JqLCBtYXhwTnVtR2x5cGhzKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gKGZvbnQuc3RhcnQgfHwgMCkgKyBwb3N0Lm9mZnNldDsKICAgICAgZm9udC5wb3MgPSBzdGFydDsKICAgICAgY29uc3QgbGVuZ3RoID0gcG9zdC5sZW5ndGgsCiAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7CiAgICAgIGNvbnN0IHZlcnNpb24gPSBmb250LmdldEludDMyKCk7CiAgICAgIGZvbnQuc2tpcCgyOCk7CiAgICAgIGxldCBnbHlwaE5hbWVzOwogICAgICBsZXQgdmFsaWQgPSB0cnVlOwogICAgICBsZXQgaTsKICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CiAgICAgICAgY2FzZSAweDAwMDEwMDAwOgogICAgICAgICAgZ2x5cGhOYW1lcyA9IE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAyMDAwMDoKICAgICAgICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgICAgICBpZiAobnVtR2x5cGhzICE9PSBtYXhwTnVtR2x5cGhzKSB7CiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZ2x5cGhOYW1lSW5kZXhlcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgICAgICAgaWYgKGluZGV4ID49IDMyNzY4KSB7CiAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbHlwaE5hbWVJbmRleGVzLnB1c2goaW5kZXgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGN1c3RvbU5hbWVzID0gW10sCiAgICAgICAgICAgIHN0ckJ1ZiA9IFtdOwogICAgICAgICAgd2hpbGUgKGZvbnQucG9zIDwgZW5kKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0xlbmd0aCA9IGZvbnQuZ2V0Qnl0ZSgpOwogICAgICAgICAgICBzdHJCdWYubGVuZ3RoID0gc3RyaW5nTGVuZ3RoOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBzdHJCdWZbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0Qnl0ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXN0b21OYW1lcy5wdXNoKHN0ckJ1Zi5qb2luKCIiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBnbHlwaE5hbWVzID0gW107CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKICAgICAgICAgICAgY29uc3QgaiA9IGdseXBoTmFtZUluZGV4ZXNbaV07CiAgICAgICAgICAgIGlmIChqIDwgMjU4KSB7CiAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tqXSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKGN1c3RvbU5hbWVzW2ogLSAyNThdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAzMDAwMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB3YXJuKCJVbmtub3duL3Vuc3VwcG9ydGVkIHBvc3QgdGFibGUgdmVyc2lvbiAiICsgdmVyc2lvbik7CiAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgaWYgKHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nKSB7CiAgICAgICAgICAgIGdseXBoTmFtZXMgPSBwcm9wZXJ0aWVzT2JqLmRlZmF1bHRFbmNvZGluZzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHByb3BlcnRpZXNPYmouZ2x5cGhOYW1lcyA9IGdseXBoTmFtZXM7CiAgICAgIHJldHVybiB2YWxpZDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWROYW1lVGFibGUobmFtZVRhYmxlKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gKGZvbnQuc3RhcnQgfHwgMCkgKyBuYW1lVGFibGUub2Zmc2V0OwogICAgICBmb250LnBvcyA9IHN0YXJ0OwogICAgICBjb25zdCBuYW1lcyA9IFtbXSwgW11dLAogICAgICAgIHJlY29yZHMgPSBbXTsKICAgICAgY29uc3QgbGVuZ3RoID0gbmFtZVRhYmxlLmxlbmd0aCwKICAgICAgICBlbmQgPSBzdGFydCArIGxlbmd0aDsKICAgICAgY29uc3QgZm9ybWF0ID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgY29uc3QgRk9STUFUXzBfSEVBREVSX0xFTkdUSCA9IDY7CiAgICAgIGlmIChmb3JtYXQgIT09IDAgfHwgbGVuZ3RoIDwgRk9STUFUXzBfSEVBREVSX0xFTkdUSCkgewogICAgICAgIHJldHVybiBbbmFtZXMsIHJlY29yZHNdOwogICAgICB9CiAgICAgIGNvbnN0IG51bVJlY29yZHMgPSBmb250LmdldFVpbnQxNigpOwogICAgICBjb25zdCBzdHJpbmdzU3RhcnQgPSBmb250LmdldFVpbnQxNigpOwogICAgICBjb25zdCBOQU1FX1JFQ09SRF9MRU5HVEggPSAxMjsKICAgICAgbGV0IGksIGlpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjb3JkcyAmJiBmb250LnBvcyArIE5BTUVfUkVDT1JEX0xFTkdUSCA8PSBlbmQ7IGkrKykgewogICAgICAgIGNvbnN0IHIgPSB7CiAgICAgICAgICBwbGF0Zm9ybTogZm9udC5nZXRVaW50MTYoKSwKICAgICAgICAgIGVuY29kaW5nOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgbGFuZ3VhZ2U6IGZvbnQuZ2V0VWludDE2KCksCiAgICAgICAgICBuYW1lOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgbGVuZ3RoOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgb2Zmc2V0OiBmb250LmdldFVpbnQxNigpCiAgICAgICAgfTsKICAgICAgICBpZiAoaXNNYWNOYW1lUmVjb3JkKHIpIHx8IGlzV2luTmFtZVJlY29yZChyKSkgewogICAgICAgICAgcmVjb3Jkcy5wdXNoKHIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGkgPSAwLCBpaSA9IHJlY29yZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNbaV07CiAgICAgICAgaWYgKHJlY29yZC5sZW5ndGggPD0gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBvcyA9IHN0YXJ0ICsgc3RyaW5nc1N0YXJ0ICsgcmVjb3JkLm9mZnNldDsKICAgICAgICBpZiAocG9zICsgcmVjb3JkLmxlbmd0aCA+IGVuZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvbnQucG9zID0gcG9zOwogICAgICAgIGNvbnN0IG5hbWVJbmRleCA9IHJlY29yZC5uYW1lOwogICAgICAgIGlmIChyZWNvcmQuZW5jb2RpbmcpIHsKICAgICAgICAgIGxldCBzdHIgPSAiIjsKICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJlY29yZC5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7CiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0VWludDE2KCkpOwogICAgICAgICAgfQogICAgICAgICAgbmFtZXNbMV1bbmFtZUluZGV4XSA9IHN0cjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZXNbMF1bbmFtZUluZGV4XSA9IGZvbnQuZ2V0U3RyaW5nKHJlY29yZC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gW25hbWVzLCByZWNvcmRzXTsKICAgIH0KICAgIGNvbnN0IFRUT3BzU3RhY2tEZWx0YXMgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTIsIC0yLCAtMiwgLTIsIDAsIDAsIC0yLCAtNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAtMSwgLTEsIDEsIC0xLCAtOTk5LCAwLCAxLCAwLCAtMSwgLTIsIDAsIC0xLCAtMiwgLTEsIC0xLCAwLCAtMSwgLTEsIDAsIDAsIC05OTksIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTk5OSwgLTIsIC0yLCAtOTk5LCAwLCAtMiwgLTIsIDAsIDAsIC0yLCAwLCAtMiwgMCwgMCwgMCwgLTIsIC0xLCAtMSwgMSwgMSwgMCwgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgLTEsIDAsIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0yLCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0yLCAtMiwgMCwgMCwgMCwgMCwgLTEsIC0xLCAtOTk5LCAtMiwgLTIsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIC0xLCAtMSwgLTEsIC0yXTsKICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtKHRhYmxlLCB0dENvbnRleHQpIHsKICAgICAgbGV0IGRhdGEgPSB0YWJsZS5kYXRhOwogICAgICBsZXQgaSA9IDAsCiAgICAgICAgaiwKICAgICAgICBuLAogICAgICAgIGIsCiAgICAgICAgZnVuY0lkLAogICAgICAgIHBjLAogICAgICAgIGxhc3RFbmRmID0gMCwKICAgICAgICBsYXN0RGVmZiA9IDA7CiAgICAgIGNvbnN0IHN0YWNrID0gW107CiAgICAgIGNvbnN0IGNhbGxzdGFjayA9IFtdOwogICAgICBjb25zdCBmdW5jdGlvbnNDYWxsZWQgPSBbXTsKICAgICAgbGV0IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHR0Q29udGV4dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM7CiAgICAgIGxldCBpbkZERUYgPSBmYWxzZSwKICAgICAgICBpZkxldmVsID0gMCwKICAgICAgICBpbkVMU0UgPSAwOwogICAgICBmb3IgKGxldCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7KSB7CiAgICAgICAgY29uc3Qgb3AgPSBkYXRhW2krK107CiAgICAgICAgaWYgKG9wID09PSAweDQwKSB7CiAgICAgICAgICBuID0gZGF0YVtpKytdOwogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgaSArPSBuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIHN0YWNrLnB1c2goZGF0YVtpKytdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NDEpIHsKICAgICAgICAgIG4gPSBkYXRhW2krK107CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG4gKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CiAgICAgICAgICAgICAgc3RhY2sucHVzaChiIDw8IDggfCBkYXRhW2krK10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiMCkgewogICAgICAgICAgbiA9IG9wIC0gMHhiMCArIDE7CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2krK10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiOCkgewogICAgICAgICAgbiA9IG9wIC0gMHhiOCArIDE7CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG4gKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CiAgICAgICAgICAgICAgc3RhY2sucHVzaChzaWduZWRJbnQxNihiLCBkYXRhW2krK10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmIgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgewogICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgewogICAgICAgICAgICBmdW5jSWQgPSBzdGFjay5hdCgtMSk7CiAgICAgICAgICAgIGlmIChpc05hTihmdW5jSWQpKSB7CiAgICAgICAgICAgICAgaW5mbygiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2Z1bmNJZF0gPSB0cnVlOwogICAgICAgICAgICAgIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGFja0xlbmd0aCA9IHN0YWNrLmxlbmd0aCArIHR0Q29udGV4dC5mdW5jdGlvbnNTdGFja0RlbHRhc1tmdW5jSWRdOwogICAgICAgICAgICAgICAgaWYgKG5ld1N0YWNrTGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgICB3YXJuKCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS4iKTsKICAgICAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gbmV3U3RhY2tMZW5ndGg7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWQgJiYgIWZ1bmN0aW9uc0NhbGxlZC5pbmNsdWRlcyhmdW5jSWQpKSB7CiAgICAgICAgICAgICAgICBjYWxsc3RhY2sucHVzaCh7CiAgICAgICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgIHN0YWNrVG9wOiBzdGFjay5sZW5ndGggLSAxCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uc0NhbGxlZC5wdXNoKGZ1bmNJZCk7CiAgICAgICAgICAgICAgICBwYyA9IHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkW2Z1bmNJZF07CiAgICAgICAgICAgICAgICBpZiAoIXBjKSB7CiAgICAgICAgICAgICAgICAgIHdhcm4oIlRUOiBDQUxMIG5vbi1leGlzdGVudCBmdW5jdGlvbiIpOwogICAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYXRhID0gcGMuZGF0YTsKICAgICAgICAgICAgICAgIGkgPSBwYy5pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmMgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgewogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgd2FybigiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5GREVGID0gdHJ1ZTsKICAgICAgICAgIGxhc3REZWZmID0gaTsKICAgICAgICAgIGZ1bmNJZCA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXSA9IHsKICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgaQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJkKSB7CiAgICAgICAgICBpZiAoaW5GREVGKSB7CiAgICAgICAgICAgIGluRkRFRiA9IGZhbHNlOwogICAgICAgICAgICBsYXN0RW5kZiA9IGk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYyA9IGNhbGxzdGFjay5wb3AoKTsKICAgICAgICAgICAgaWYgKCFwYykgewogICAgICAgICAgICAgIHdhcm4oIlRUOiBFTkRGIGJhZCBzdGFjayIpOwogICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmNJZCA9IGZ1bmN0aW9uc0NhbGxlZC5wb3AoKTsKICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CiAgICAgICAgICAgIGkgPSBwYy5pOwogICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXSA9IHN0YWNrLmxlbmd0aCAtIHBjLnN0YWNrVG9wOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4ODkpIHsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIHdhcm4oIlRUOiBuZXN0ZWQgSURFRnMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGluRkRFRiA9IHRydWU7CiAgICAgICAgICBsYXN0RGVmZiA9IGk7CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OCkgewogICAgICAgICAgKytpZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWIpIHsKICAgICAgICAgIGluRUxTRSA9IGlmTGV2ZWw7CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OSkgewogICAgICAgICAgaWYgKGluRUxTRSA9PT0gaWZMZXZlbCkgewogICAgICAgICAgICBpbkVMU0UgPSAwOwogICAgICAgICAgfQogICAgICAgICAgLS1pZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWMpIHsKICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgIGkgKz0gb2Zmc2V0IC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWluRkRFRiAmJiAhaW5FTFNFKSB7CiAgICAgICAgICBsZXQgc3RhY2tEZWx0YSA9IDA7CiAgICAgICAgICBpZiAob3AgPD0gMHg4ZSkgewogICAgICAgICAgICBzdGFja0RlbHRhID0gVFRPcHNTdGFja0RlbHRhc1tvcF07CiAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4YzAgJiYgb3AgPD0gMHhkZikgewogICAgICAgICAgICBzdGFja0RlbHRhID0gLTE7CiAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4ZTApIHsKICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0yOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wID49IDB4NzEgJiYgb3AgPD0gMHg3NSkgewogICAgICAgICAgICBuID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghaXNOYU4obikpIHsKICAgICAgICAgICAgICBzdGFja0RlbHRhID0gLW4gKiAyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2tEZWx0YSA8IDAgJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgc3RhY2tEZWx0YSsrOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0YWNrRGVsdGEgPiAwKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goTmFOKTsKICAgICAgICAgICAgc3RhY2tEZWx0YS0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOwogICAgICBjb25zdCBjb250ZW50ID0gW2RhdGFdOwogICAgICBpZiAoaSA+IGRhdGEubGVuZ3RoKSB7CiAgICAgICAgY29udGVudC5wdXNoKG5ldyBVaW50OEFycmF5KGkgLSBkYXRhLmxlbmd0aCkpOwogICAgICB9CiAgICAgIGlmIChsYXN0RGVmZiA+IGxhc3RFbmRmKSB7CiAgICAgICAgd2FybigiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWwiKTsKICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzB4MjIsIDB4MmRdKSk7CiAgICAgIH0KICAgICAgZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgIGlmICh0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZC5sZW5ndGggPiBtYXhGdW5jdGlvbkRlZnMpIHsKICAgICAgICB3YXJuKCJUVDogbW9yZSBmdW5jdGlvbnMgZGVmaW5lZCB0aGFuIGV4cGVjdGVkIik7CiAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gdHRDb250ZXh0LmZ1bmN0aW9uc1VzZWQubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIGlmIChqID4gbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgICAgICB3YXJuKCJUVDogaW52YWxpZCBmdW5jdGlvbiBpZDogIiArIGopOwogICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2pdICYmICF0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtqXSkgewogICAgICAgICAgd2FybigiVFQ6IHVuZGVmaW5lZCBmdW5jdGlvbjogIiArIGopOwogICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGZvbGRUVFRhYmxlKHRhYmxlLCBjb250ZW50KSB7CiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDEpIHsKICAgICAgICBsZXQgbmV3TGVuZ3RoID0gMDsKICAgICAgICBsZXQgaiwgamo7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIG5ld0xlbmd0aCArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgbmV3TGVuZ3RoID0gbmV3TGVuZ3RoICsgMyAmIH4zOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KG5ld0xlbmd0aCk7CiAgICAgICAgbGV0IHBvcyA9IDA7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5zZXQoY29udGVudFtqXSwgcG9zKTsKICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdGFibGUuZGF0YSA9IHJlc3VsdDsKICAgICAgICB0YWJsZS5sZW5ndGggPSBuZXdMZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtcyhmcGdtLCBwcmVwLCBjdnQsIG1heEZ1bmN0aW9uRGVmcykgewogICAgICBjb25zdCB0dENvbnRleHQgPSB7CiAgICAgICAgZnVuY3Rpb25zRGVmaW5lZDogW10sCiAgICAgICAgZnVuY3Rpb25zVXNlZDogW10sCiAgICAgICAgZnVuY3Rpb25zU3RhY2tEZWx0YXM6IFtdLAogICAgICAgIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczogZmFsc2UsCiAgICAgICAgaGludHNWYWxpZDogdHJ1ZQogICAgICB9OwogICAgICBpZiAoZnBnbSkgewogICAgICAgIHNhbml0aXplVFRQcm9ncmFtKGZwZ20sIHR0Q29udGV4dCk7CiAgICAgIH0KICAgICAgaWYgKHByZXApIHsKICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpOwogICAgICB9CiAgICAgIGlmIChmcGdtKSB7CiAgICAgICAgY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKTsKICAgICAgfQogICAgICBpZiAoY3Z0ICYmIGN2dC5sZW5ndGggJiAxKSB7CiAgICAgICAgY29uc3QgY3Z0RGF0YSA9IG5ldyBVaW50OEFycmF5KGN2dC5sZW5ndGggKyAxKTsKICAgICAgICBjdnREYXRhLnNldChjdnQuZGF0YSk7CiAgICAgICAgY3Z0LmRhdGEgPSBjdnREYXRhOwogICAgICB9CiAgICAgIHJldHVybiB0dENvbnRleHQuaGludHNWYWxpZDsKICAgIH0KICAgIGZvbnQgPSBuZXcgU3RyZWFtKG5ldyBVaW50OEFycmF5KGZvbnQuZ2V0Qnl0ZXMoKSkpOwogICAgbGV0IGhlYWRlciwgdGFibGVzOwogICAgaWYgKGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmb250KSkgewogICAgICBjb25zdCB0dGNEYXRhID0gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkRhdGEoZm9udCwgdGhpcy5uYW1lKTsKICAgICAgaGVhZGVyID0gdHRjRGF0YS5oZWFkZXI7CiAgICAgIHRhYmxlcyA9IHR0Y0RhdGEudGFibGVzOwogICAgfSBlbHNlIHsKICAgICAgaGVhZGVyID0gcmVhZE9wZW5UeXBlSGVhZGVyKGZvbnQpOwogICAgICB0YWJsZXMgPSByZWFkVGFibGVzKGZvbnQsIGhlYWRlci5udW1UYWJsZXMpOwogICAgfQogICAgbGV0IGNmZiwgY2ZmRmlsZTsKICAgIGNvbnN0IGlzVHJ1ZVR5cGUgPSAhdGFibGVzWyJDRkYgIl07CiAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgaXNDb21wb3NpdGUgPSBwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAmJiAocHJvcGVydGllcy5jaWRUb0dpZE1hcD8ubGVuZ3RoID4gMCB8fCAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkpOwogICAgICBpZiAoaGVhZGVyLnZlcnNpb24gPT09ICJPVFRPIiAmJiAhaXNDb21wb3NpdGUgfHwgIXRhYmxlcy5oZWFkIHx8ICF0YWJsZXMuaGhlYSB8fCAhdGFibGVzLm1heHAgfHwgIXRhYmxlcy5wb3N0KSB7CiAgICAgICAgY2ZmRmlsZSA9IG5ldyBTdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CiAgICAgICAgY2ZmID0gbmV3IENGRkZvbnQoY2ZmRmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpOwogICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnQobmFtZSwgY2ZmLCBwcm9wZXJ0aWVzKTsKICAgICAgfQogICAgICBkZWxldGUgdGFibGVzLmdseWY7CiAgICAgIGRlbGV0ZSB0YWJsZXMubG9jYTsKICAgICAgZGVsZXRlIHRhYmxlcy5mcGdtOwogICAgICBkZWxldGUgdGFibGVzLnByZXA7CiAgICAgIGRlbGV0ZSB0YWJsZXNbImN2dCAiXTsKICAgICAgdGhpcy5pc09wZW5UeXBlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGFibGVzLmxvY2EpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJsb2NhIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgICAgfQogICAgICBpZiAoIXRhYmxlcy5nbHlmKSB7CiAgICAgICAgd2FybignUmVxdWlyZWQgImdseWYiIHRhYmxlIGlzIG5vdCBmb3VuZCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICB0YWJsZXMuZ2x5ZiA9IHsKICAgICAgICAgIHRhZzogImdseWYiLAogICAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoMCkKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuaXNPcGVuVHlwZSA9IGZhbHNlOwogICAgfQogICAgaWYgKCF0YWJsZXMubWF4cCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJtYXhwIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgIH0KICAgIGZvbnQucG9zID0gKGZvbnQuc3RhcnQgfHwgMCkgKyB0YWJsZXMubWF4cC5vZmZzZXQ7CiAgICBsZXQgdmVyc2lvbiA9IGZvbnQuZ2V0SW50MzIoKTsKICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICBpZiAodmVyc2lvbiAhPT0gMHgwMDAxMDAwMCAmJiB2ZXJzaW9uICE9PSAweDAwMDA1MDAwKSB7CiAgICAgIGlmICh0YWJsZXMubWF4cC5sZW5ndGggPT09IDYpIHsKICAgICAgICB2ZXJzaW9uID0gMHgwMDA1MDAwOwogICAgICB9IGVsc2UgaWYgKHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAzMikgewogICAgICAgIHZlcnNpb24gPSAweDAwMDEwMDAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgIm1heHAiIHRhYmxlIGhhcyBhIHdyb25nIHZlcnNpb24gbnVtYmVyYCk7CiAgICAgIH0KICAgICAgd3JpdGVVaW50MzIodGFibGVzLm1heHAuZGF0YSwgMCwgdmVyc2lvbik7CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5zY2FsZUZhY3RvcnM/Lmxlbmd0aCA9PT0gbnVtR2x5cGhzICYmIGlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgewogICAgICAgIHNjYWxlRmFjdG9ycwogICAgICB9ID0gcHJvcGVydGllczsKICAgICAgY29uc3QgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOwogICAgICBjb25zdCBnbHlwaHMgPSBuZXcgR2x5ZlRhYmxlKHsKICAgICAgICBnbHlmVGFibGU6IHRhYmxlcy5nbHlmLmRhdGEsCiAgICAgICAgaXNHbHlwaExvY2F0aW9uc0xvbmcsCiAgICAgICAgbG9jYVRhYmxlOiB0YWJsZXMubG9jYS5kYXRhLAogICAgICAgIG51bUdseXBocwogICAgICB9KTsKICAgICAgZ2x5cGhzLnNjYWxlKHNjYWxlRmFjdG9ycyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBnbHlmLAogICAgICAgIGxvY2EsCiAgICAgICAgaXNMb2NhdGlvbkxvbmcKICAgICAgfSA9IGdseXBocy53cml0ZSgpOwogICAgICB0YWJsZXMuZ2x5Zi5kYXRhID0gZ2x5ZjsKICAgICAgdGFibGVzLmxvY2EuZGF0YSA9IGxvY2E7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZyAhPT0gISFpc0dseXBoTG9jYXRpb25zTG9uZykgewogICAgICAgIHRhYmxlcy5oZWFkLmRhdGFbNTBdID0gMDsKICAgICAgICB0YWJsZXMuaGVhZC5kYXRhWzUxXSA9IGlzTG9jYXRpb25Mb25nID8gMSA6IDA7CiAgICAgIH0KICAgICAgY29uc3QgbWV0cmljcyA9IHRhYmxlcy5obXR4LmRhdGE7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKICAgICAgICBjb25zdCBqID0gNCAqIGk7CiAgICAgICAgY29uc3QgYWR2YW5jZVdpZHRoID0gTWF0aC5yb3VuZChzY2FsZUZhY3RvcnNbaV0gKiBpbnQxNihtZXRyaWNzW2pdLCBtZXRyaWNzW2ogKyAxXSkpOwogICAgICAgIG1ldHJpY3Nbal0gPSBhZHZhbmNlV2lkdGggPj4gOCAmIDB4ZmY7CiAgICAgICAgbWV0cmljc1tqICsgMV0gPSBhZHZhbmNlV2lkdGggJiAweGZmOwogICAgICAgIGNvbnN0IGxzYiA9IE1hdGgucm91bmQoc2NhbGVGYWN0b3JzW2ldICogc2lnbmVkSW50MTYobWV0cmljc1tqICsgMl0sIG1ldHJpY3NbaiArIDNdKSk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihtZXRyaWNzLCBqICsgMiwgbHNiKTsKICAgICAgfQogICAgfQogICAgbGV0IG51bUdseXBoc091dCA9IG51bUdseXBocyArIDE7CiAgICBsZXQgZHVwRmlyc3RFbnRyeSA9IHRydWU7CiAgICBpZiAobnVtR2x5cGhzT3V0ID4gMHhmZmZmKSB7CiAgICAgIGR1cEZpcnN0RW50cnkgPSBmYWxzZTsKICAgICAgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzOwogICAgICB3YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGluIGdseWZzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKICAgIH0KICAgIGxldCBtYXhGdW5jdGlvbkRlZnMgPSAwOwogICAgbGV0IG1heFNpemVPZkluc3RydWN0aW9ucyA9IDA7CiAgICBpZiAodmVyc2lvbiA+PSAweDAwMDEwMDAwICYmIHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAzMikgewogICAgICBmb250LnBvcyArPSA4OwogICAgICBjb25zdCBtYXhab25lcyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGlmIChtYXhab25lcyA+IDIpIHsKICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE0XSA9IDA7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsxNV0gPSAyOwogICAgICB9CiAgICAgIGZvbnQucG9zICs9IDQ7CiAgICAgIG1heEZ1bmN0aW9uRGVmcyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGZvbnQucG9zICs9IDQ7CiAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICB9CiAgICB0YWJsZXMubWF4cC5kYXRhWzRdID0gbnVtR2x5cGhzT3V0ID4+IDg7CiAgICB0YWJsZXMubWF4cC5kYXRhWzVdID0gbnVtR2x5cGhzT3V0ICYgMjU1OwogICAgY29uc3QgaGludHNWYWxpZCA9IHNhbml0aXplVFRQcm9ncmFtcyh0YWJsZXMuZnBnbSwgdGFibGVzLnByZXAsIHRhYmxlc1siY3Z0ICJdLCBtYXhGdW5jdGlvbkRlZnMpOwogICAgaWYgKCFoaW50c1ZhbGlkKSB7CiAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTsKICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwOwogICAgICBkZWxldGUgdGFibGVzWyJjdnQgIl07CiAgICB9CiAgICBzYW5pdGl6ZU1ldHJpY3MoZm9udCwgdGFibGVzLmhoZWEsIHRhYmxlcy5obXR4LCB0YWJsZXMuaGVhZCwgbnVtR2x5cGhzT3V0LCBkdXBGaXJzdEVudHJ5KTsKICAgIGlmICghdGFibGVzLmhlYWQpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGVhZCIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBzYW5pdGl6ZUhlYWQodGFibGVzLmhlYWQsIG51bUdseXBocywgaXNUcnVlVHlwZSA/IHRhYmxlcy5sb2NhLmxlbmd0aCA6IDApOwogICAgbGV0IG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKGlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOwogICAgICBjb25zdCBnbHlwaHNJbmZvID0gc2FuaXRpemVHbHlwaExvY2F0aW9ucyh0YWJsZXMubG9jYSwgdGFibGVzLmdseWYsIG51bUdseXBocywgaXNHbHlwaExvY2F0aW9uc0xvbmcsIGhpbnRzVmFsaWQsIGR1cEZpcnN0RW50cnksIG1heFNpemVPZkluc3RydWN0aW9ucyk7CiAgICAgIG1pc3NpbmdHbHlwaHMgPSBnbHlwaHNJbmZvLm1pc3NpbmdHbHlwaHM7CiAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDMyKSB7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyNl0gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyA+PiA4OwogICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjddID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgJiAyNTU7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGFibGVzLmhoZWEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGhlYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBpZiAodGFibGVzLmhoZWEuZGF0YVsxMF0gPT09IDAgJiYgdGFibGVzLmhoZWEuZGF0YVsxMV0gPT09IDApIHsKICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMF0gPSAweGZmOwogICAgICB0YWJsZXMuaGhlYS5kYXRhWzExXSA9IDB4ZmY7CiAgICB9CiAgICBjb25zdCBtZXRyaWNzT3ZlcnJpZGUgPSB7CiAgICAgIHVuaXRzUGVyRW06IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbMThdLCB0YWJsZXMuaGVhZC5kYXRhWzE5XSksCiAgICAgIHlNYXg6IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbNDJdLCB0YWJsZXMuaGVhZC5kYXRhWzQzXSksCiAgICAgIHlNaW46IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbMzhdLCB0YWJsZXMuaGVhZC5kYXRhWzM5XSksCiAgICAgIGFzY2VudDogc2lnbmVkSW50MTYodGFibGVzLmhoZWEuZGF0YVs0XSwgdGFibGVzLmhoZWEuZGF0YVs1XSksCiAgICAgIGRlc2NlbnQ6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbNl0sIHRhYmxlcy5oaGVhLmRhdGFbN10pLAogICAgICBsaW5lR2FwOiBzaWduZWRJbnQxNih0YWJsZXMuaGhlYS5kYXRhWzhdLCB0YWJsZXMuaGhlYS5kYXRhWzldKQogICAgfTsKICAgIHRoaXMuYXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmFzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOwogICAgdGhpcy5kZXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmRlc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTsKICAgIHRoaXMubGluZUdhcCA9IG1ldHJpY3NPdmVycmlkZS5saW5lR2FwIC8gbWV0cmljc092ZXJyaWRlLnVuaXRzUGVyRW07CiAgICBpZiAodGhpcy5jc3NGb250SW5mbz8ubGluZUhlaWdodCkgewogICAgICB0aGlzLmxpbmVIZWlnaHQgPSB0aGlzLmNzc0ZvbnRJbmZvLm1ldHJpY3MubGluZUhlaWdodDsKICAgICAgdGhpcy5saW5lR2FwID0gdGhpcy5jc3NGb250SW5mby5tZXRyaWNzLmxpbmVHYXA7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxpbmVIZWlnaHQgPSB0aGlzLmFzY2VudCAtIHRoaXMuZGVzY2VudCArIHRoaXMubGluZUdhcDsKICAgIH0KICAgIGlmICh0YWJsZXMucG9zdCkgewogICAgICByZWFkUG9zdFNjcmlwdFRhYmxlKHRhYmxlcy5wb3N0LCBwcm9wZXJ0aWVzLCBudW1HbHlwaHMpOwogICAgfQogICAgdGFibGVzLnBvc3QgPSB7CiAgICAgIHRhZzogInBvc3QiLAogICAgICBkYXRhOiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykKICAgIH07CiAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmdW5jdGlvbiBoYXNHbHlwaChnbHlwaElkKSB7CiAgICAgIHJldHVybiAhbWlzc2luZ0dseXBoc1tnbHlwaElkXTsKICAgIH0KICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW107CiAgICAgIGNvbnN0IGlzQ2lkVG9HaWRNYXBFbXB0eSA9IGNpZFRvR2lkTWFwLmxlbmd0aCA9PT0gMDsKICAgICAgcHJvcGVydGllcy5jTWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCBjaWQpIHsKICAgICAgICBpZiAodHlwZW9mIGNpZCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGNpZCA9IGNvbnZlcnRDaWRTdHJpbmcoY2hhckNvZGUsIGNpZCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBsZXQgZ2x5cGhJZCA9IC0xOwogICAgICAgIGlmIChpc0NpZFRvR2lkTWFwRW1wdHkpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWQ7CiAgICAgICAgfSBlbHNlIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgIH0KICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwICYmIGdseXBoSWQgPCBudW1HbHlwaHMgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNtYXBUYWJsZSA9IHJlYWRDbWFwVGFibGUodGFibGVzLmNtYXAsIGZvbnQsIHRoaXMuaXNTeW1ib2xpY0ZvbnQsIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpOwogICAgICBjb25zdCBjbWFwUGxhdGZvcm1JZCA9IGNtYXBUYWJsZS5wbGF0Zm9ybUlkOwogICAgICBjb25zdCBjbWFwRW5jb2RpbmdJZCA9IGNtYXBUYWJsZS5lbmNvZGluZ0lkOwogICAgICBjb25zdCBjbWFwTWFwcGluZ3MgPSBjbWFwVGFibGUubWFwcGluZ3M7CiAgICAgIGxldCBiYXNlRW5jb2RpbmcgPSBbXSwKICAgICAgICBmb3JjZVBvc3RUYWJsZSA9IGZhbHNlOwogICAgICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZyAmJiAocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiTWFjUm9tYW5FbmNvZGluZyIgfHwgcHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiV2luQW5zaUVuY29kaW5nIikpIHsKICAgICAgICBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOwogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmICF0aGlzLmlzU3ltYm9saWNGb250ICYmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMSB8fCBjbWFwUGxhdGZvcm1JZCA9PT0gMSAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMCkpIHsKICAgICAgICBjb25zdCBnbHlwaHNVbmljb2RlTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogICAgICAgIGZvciAobGV0IGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCAyNTY7IGNoYXJDb2RlKyspIHsKICAgICAgICAgIGxldCBnbHlwaE5hbWU7CiAgICAgICAgICBpZiAodGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXTsKICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZUVuY29kaW5nLmxlbmd0aCAmJiBiYXNlRW5jb2RpbmdbY2hhckNvZGVdICE9PSAiIikgewogICAgICAgICAgICBnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2x5cGhOYW1lID0gU3RhbmRhcmRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWdseXBoTmFtZSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgICAgbGV0IHVuaWNvZGVPckNoYXJDb2RlOwogICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxKSB7CiAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtzdGFuZGFyZEdseXBoTmFtZV07CiAgICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CiAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gTWFjUm9tYW5FbmNvZGluZy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1bmljb2RlT3JDaGFyQ29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5nbHlwaE5hbWVzICYmIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgJiYgISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSB0aGlzLnRvVW5pY29kZS5nZXQoY2hhckNvZGUpOwogICAgICAgICAgICAgIGlmICh1bmljb2RlKSB7CiAgICAgICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh1bmljb2RlT3JDaGFyQ29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjbWFwTWFwcGluZ3MpIHsKICAgICAgICAgICAgaWYgKG1hcHBpbmcuY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gbWFwcGluZy5nbHlwaElkOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY21hcFBsYXRmb3JtSWQgPT09IDApIHsKICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgY21hcE1hcHBpbmdzKSB7CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFttYXBwaW5nLmNoYXJDb2RlXSA9IG1hcHBpbmcuZ2x5cGhJZDsKICAgICAgICB9CiAgICAgICAgZm9yY2VQb3N0VGFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CiAgICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIGNtYXBNYXBwaW5ncykgewogICAgICAgICAgbGV0IGNoYXJDb2RlID0gbWFwcGluZy5jaGFyQ29kZTsKICAgICAgICAgIGlmIChjaGFyQ29kZSA+PSAweGYwMDAgJiYgY2hhckNvZGUgPD0gMHhmMGZmKSB7CiAgICAgICAgICAgIGNoYXJDb2RlICY9IDB4ZmY7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBtYXBwaW5nLmdseXBoSWQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjbWFwTWFwcGluZ3MpIHsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW21hcHBpbmcuY2hhckNvZGVdID0gbWFwcGluZy5nbHlwaElkOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5nbHlwaE5hbWVzICYmIChiYXNlRW5jb2RpbmcubGVuZ3RoIHx8IHRoaXMuZGlmZmVyZW5jZXMubGVuZ3RoKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgICAgIGlmICghZm9yY2VQb3N0VGFibGUgJiYgY2hhckNvZGVUb0dseXBoSWRbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbaV0gfHwgYmFzZUVuY29kaW5nW2ldOwogICAgICAgICAgaWYgKCFnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBnbHlwaElkID0gcHJvcGVydGllcy5nbHlwaE5hbWVzLmluZGV4T2YoZ2x5cGhOYW1lKTsKICAgICAgICAgIGlmIChnbHlwaElkID4gMCAmJiBoYXNHbHlwaChnbHlwaElkKSkgewogICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtpXSA9IGdseXBoSWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY2hhckNvZGVUb0dseXBoSWQubGVuZ3RoID09PSAwKSB7CiAgICAgIGNoYXJDb2RlVG9HbHlwaElkWzBdID0gMDsKICAgIH0KICAgIGxldCBnbHlwaFplcm9JZCA9IG51bUdseXBoc091dCAtIDE7CiAgICBpZiAoIWR1cEZpcnN0RW50cnkpIHsKICAgICAgZ2x5cGhaZXJvSWQgPSAwOwogICAgfQogICAgaWYgKCFwcm9wZXJ0aWVzLmNzc0ZvbnRJbmZvKSB7CiAgICAgIGNvbnN0IG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgZ2x5cGhaZXJvSWQsIHRoaXMudG9Vbmljb2RlKTsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOwogICAgICB0YWJsZXMuY21hcCA9IHsKICAgICAgICB0YWc6ICJjbWFwIiwKICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbmV3TWFwcGluZy50b1VuaWNvZGVFeHRyYU1hcCwgbnVtR2x5cGhzT3V0KQogICAgICB9OwogICAgICBpZiAoIXRhYmxlc1siT1MvMiJdIHx8ICF2YWxpZGF0ZU9TMlRhYmxlKHRhYmxlc1siT1MvMiJdLCBmb250KSkgewogICAgICAgIHRhYmxlc1siT1MvMiJdID0gewogICAgICAgICAgdGFnOiAiT1MvMiIsCiAgICAgICAgICBkYXRhOiBjcmVhdGVPUzJUYWJsZShwcm9wZXJ0aWVzLCBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkLCBtZXRyaWNzT3ZlcnJpZGUpCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgaWYgKCFpc1RydWVUeXBlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY2ZmRmlsZSA9IG5ldyBTdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IENGRlBhcnNlcihjZmZGaWxlLCBwcm9wZXJ0aWVzLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgICAgIGNmZiA9IHBhcnNlci5wYXJzZSgpOwogICAgICAgIGNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7CiAgICAgICAgY29uc3QgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTsKICAgICAgICB0YWJsZXNbIkNGRiAiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB3YXJuKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoIXRhYmxlcy5uYW1lKSB7CiAgICAgIHRhYmxlcy5uYW1lID0gewogICAgICAgIHRhZzogIm5hbWUiLAogICAgICAgIGRhdGE6IGNyZWF0ZU5hbWVUYWJsZSh0aGlzLm5hbWUpCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBjb25zdCBbbmFtZVByb3RvdHlwZSwgbmFtZVJlY29yZHNdID0gcmVhZE5hbWVUYWJsZSh0YWJsZXMubmFtZSk7CiAgICAgIHRhYmxlcy5uYW1lLmRhdGEgPSBjcmVhdGVOYW1lVGFibGUobmFtZSwgbmFtZVByb3RvdHlwZSk7CiAgICAgIHRoaXMucHNOYW1lID0gbmFtZVByb3RvdHlwZVswXVs2XSB8fCBudWxsOwogICAgICBpZiAoIXByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgICAgYWRqdXN0VHJ1ZVR5cGVUb1VuaWNvZGUocHJvcGVydGllcywgdGhpcy5pc1N5bWJvbGljRm9udCwgbmFtZVJlY29yZHMpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoaGVhZGVyLnZlcnNpb24pOwogICAgZm9yIChjb25zdCB0YWJsZVRhZyBpbiB0YWJsZXMpIHsKICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTsKICB9CiAgY29udmVydChmb250TmFtZSwgZm9udCwgcHJvcGVydGllcykgewogICAgcHJvcGVydGllcy5maXhlZFBpdGNoID0gZmFsc2U7CiAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgYWRqdXN0VHlwZTFUb1VuaWNvZGUocHJvcGVydGllcywgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpOwogICAgfQogICAgbGV0IGdseXBoWmVyb0lkID0gMTsKICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkgewogICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTsKICAgIH0KICAgIGNvbnN0IG1hcHBpbmcgPSBmb250LmdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKTsKICAgIGxldCBuZXdNYXBwaW5nID0gbnVsbDsKICAgIGxldCBuZXdDaGFyQ29kZVRvR2x5cGhJZCA9IG1hcHBpbmc7CiAgICBsZXQgdG9Vbmljb2RlRXh0cmFNYXAgPSBudWxsOwogICAgaWYgKCFwcm9wZXJ0aWVzLmNzc0ZvbnRJbmZvKSB7CiAgICAgIG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKG1hcHBpbmcsIGZvbnQuaGFzR2x5cGhJZC5iaW5kKGZvbnQpLCBnbHlwaFplcm9JZCwgdGhpcy50b1VuaWNvZGUpOwogICAgICB0aGlzLnRvRm9udENoYXIgPSBuZXdNYXBwaW5nLnRvRm9udENoYXI7CiAgICAgIG5ld0NoYXJDb2RlVG9HbHlwaElkID0gbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZDsKICAgICAgdG9Vbmljb2RlRXh0cmFNYXAgPSBuZXdNYXBwaW5nLnRvVW5pY29kZUV4dHJhTWFwOwogICAgfQogICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5udW1HbHlwaHM7CiAgICBmdW5jdGlvbiBnZXRDaGFyQ29kZXMoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKICAgICAgbGV0IGNoYXJDb2RlcyA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CiAgICAgICAgICAoY2hhckNvZGVzIHx8PSBbXSkucHVzaChjaGFyQ29kZSB8IDApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gY2hhckNvZGVzOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgewogICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHsKICAgICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWRbbmV3TWFwcGluZy5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgIHJldHVybiBuZXdNYXBwaW5nLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrKzsKICAgIH0KICAgIGNvbnN0IHNlYWNzID0gZm9udC5zZWFjczsKICAgIGlmIChuZXdNYXBwaW5nICYmIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCAmJiBzZWFjcz8ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IG1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgICAgY29uc3QgY2hhcnNldCA9IGZvbnQuZ2V0Q2hhcnNldCgpOwogICAgICBjb25zdCBzZWFjTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChsZXQgZ2x5cGhJZCBpbiBzZWFjcykgewogICAgICAgIGdseXBoSWQgfD0gMDsKICAgICAgICBjb25zdCBzZWFjID0gc2VhY3NbZ2x5cGhJZF07CiAgICAgICAgY29uc3QgYmFzZUdseXBoTmFtZSA9IFN0YW5kYXJkRW5jb2Rpbmdbc2VhY1syXV07CiAgICAgICAgY29uc3QgYWNjZW50R2x5cGhOYW1lID0gU3RhbmRhcmRFbmNvZGluZ1tzZWFjWzNdXTsKICAgICAgICBjb25zdCBiYXNlR2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihiYXNlR2x5cGhOYW1lKTsKICAgICAgICBjb25zdCBhY2NlbnRHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGFjY2VudEdseXBoTmFtZSk7CiAgICAgICAgaWYgKGJhc2VHbHlwaElkIDwgMCB8fCBhY2NlbnRHbHlwaElkIDwgMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFjY2VudE9mZnNldCA9IHsKICAgICAgICAgIHg6IHNlYWNbMF0gKiBtYXRyaXhbMF0gKyBzZWFjWzFdICogbWF0cml4WzJdICsgbWF0cml4WzRdLAogICAgICAgICAgeTogc2VhY1swXSAqIG1hdHJpeFsxXSArIHNlYWNbMV0gKiBtYXRyaXhbM10gKyBtYXRyaXhbNV0KICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTsKICAgICAgICBpZiAoIWNoYXJDb2RlcykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgb2YgY2hhckNvZGVzKSB7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7CiAgICAgICAgICBjb25zdCBiYXNlRm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGJhc2VHbHlwaElkKTsKICAgICAgICAgIGNvbnN0IGFjY2VudEZvbnRDaGFyQ29kZSA9IGNyZWF0ZUNoYXJDb2RlKGNoYXJDb2RlVG9HbHlwaElkLCBhY2NlbnRHbHlwaElkKTsKICAgICAgICAgIHNlYWNNYXBbY2hhckNvZGVdID0gewogICAgICAgICAgICBiYXNlRm9udENoYXJDb2RlLAogICAgICAgICAgICBhY2NlbnRGb250Q2hhckNvZGUsCiAgICAgICAgICAgIGFjY2VudE9mZnNldAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDsKICAgIH0KICAgIGNvbnN0IHVuaXRzUGVyRW0gPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXggPyAxIC8gTWF0aC5tYXgoLi4ucHJvcGVydGllcy5mb250TWF0cml4LnNsaWNlKDAsIDQpLm1hcChNYXRoLmFicykpIDogMTAwMDsKICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgT3BlblR5cGVGaWxlQnVpbGRlcigiXHg0Rlx4NTRceDU0XHg0RiIpOwogICAgYnVpbGRlci5hZGRUYWJsZSgiQ0ZGICIsIGZvbnQuZGF0YSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJPUy8yIiwgY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3Q2hhckNvZGVUb0dseXBoSWQpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImNtYXAiLCBjcmVhdGVDbWFwVGFibGUobmV3Q2hhckNvZGVUb0dseXBoSWQsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhlYWQiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyAiXHgwMFx4MDBceDEwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHg1Rlx4MEZceDNDXHhGNSIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHVuaXRzUGVyRW0pICsgIlx4MDBceDAwXHgwMFx4MDBceDllXHgwYlx4N2VceDI3IiArICJceDAwXHgwMFx4MDBceDAwXHg5ZVx4MGJceDdlXHgyNyIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwRlx4RkYiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAyIDogMCkgKyAiXHgwMFx4MTEiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhoZWEiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwMFx4MDAiICsgIlx4RkZceEZGIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmNhcEhlaWdodCkgKyBzYWZlU3RyaW5nMTYoTWF0aC50YW4ocHJvcGVydGllcy5pdGFsaWNBbmdsZSkgKiBwcm9wZXJ0aWVzLnhIZWlnaHQpICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJobXR4IiwgZnVuY3Rpb24gZm9udEZpZWxkc0htdHgoKSB7CiAgICAgIGNvbnN0IGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5nczsKICAgICAgY29uc3QgY2ZmV2lkdGhzID0gZm9udC5jZmYgPyBmb250LmNmZi53aWR0aHMgOiBudWxsOwogICAgICBsZXQgaG10eCA9ICJceDAwXHgwMFx4MDBceDAwIjsKICAgICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbnVtR2x5cGhzOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCB3aWR0aCA9IDA7CiAgICAgICAgaWYgKGNoYXJzdHJpbmdzKSB7CiAgICAgICAgICBjb25zdCBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdOwogICAgICAgICAgd2lkdGggPSAid2lkdGgiIGluIGNoYXJzdHJpbmcgPyBjaGFyc3RyaW5nLndpZHRoIDogMDsKICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykgewogICAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwoY2ZmV2lkdGhzW2ldIHx8IDApOwogICAgICAgIH0KICAgICAgICBobXR4ICs9IHN0cmluZzE2KHdpZHRoKSArIHN0cmluZzE2KDApOwogICAgICB9CiAgICAgIHJldHVybiBobXR4OwogICAgfSgpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm1heHAiLCAiXHgwMFx4MDBceDUwXHgwMCIgKyBzdHJpbmcxNihudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm5hbWUiLCBjcmVhdGVOYW1lVGFibGUoZm9udE5hbWUpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoInBvc3QiLCBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykpOwogICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpOwogIH0KICBnZXQgX3NwYWNlV2lkdGgoKSB7CiAgICBjb25zdCBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzID0gWyJzcGFjZSIsICJtaW51cyIsICJvbmUiLCAiaSIsICJJIl07CiAgICBsZXQgd2lkdGg7CiAgICBmb3IgKGNvbnN0IGdseXBoTmFtZSBvZiBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzKSB7CiAgICAgIGlmIChnbHlwaE5hbWUgaW4gdGhpcy53aWR0aHMpIHsKICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2dseXBoTmFtZV07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgICAgY29uc3QgZ2x5cGhVbmljb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtnbHlwaE5hbWVdOwogICAgICBsZXQgY2hhcmNvZGUgPSAwOwogICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGdseXBoVW5pY29kZSkpIHsKICAgICAgICBjaGFyY29kZSA9IHRoaXMuY01hcC5sb29rdXAoZ2x5cGhVbmljb2RlKTsKICAgICAgICBpZiAodHlwZW9mIGNoYXJjb2RlID09PSAic3RyaW5nIikgewogICAgICAgICAgY2hhcmNvZGUgPSBjb252ZXJ0Q2lkU3RyaW5nKGdseXBoVW5pY29kZSwgY2hhcmNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWNoYXJjb2RlICYmIHRoaXMudG9Vbmljb2RlKSB7CiAgICAgICAgY2hhcmNvZGUgPSB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGdseXBoVW5pY29kZSk7CiAgICAgIH0KICAgICAgaWYgKGNoYXJjb2RlIDw9IDApIHsKICAgICAgICBjaGFyY29kZSA9IGdseXBoVW5pY29kZTsKICAgICAgfQogICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2NoYXJjb2RlXTsKICAgICAgaWYgKHdpZHRoKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIl9zcGFjZVdpZHRoIiwgd2lkdGggfHwgdGhpcy5kZWZhdWx0V2lkdGgpOwogIH0KICBfY2hhclRvR2x5cGgoY2hhcmNvZGUsIGlzU3BhY2UgPSBmYWxzZSkgewogICAgbGV0IGdseXBoID0gdGhpcy5fZ2x5cGhDYWNoZVtjaGFyY29kZV07CiAgICBpZiAoZ2x5cGg/LmlzU3BhY2UgPT09IGlzU3BhY2UpIHsKICAgICAgcmV0dXJuIGdseXBoOwogICAgfQogICAgbGV0IGZvbnRDaGFyQ29kZSwgd2lkdGgsIG9wZXJhdG9yTGlzdElkOwogICAgbGV0IHdpZHRoQ29kZSA9IGNoYXJjb2RlOwogICAgaWYgKHRoaXMuY01hcD8uY29udGFpbnMoY2hhcmNvZGUpKSB7CiAgICAgIHdpZHRoQ29kZSA9IHRoaXMuY01hcC5sb29rdXAoY2hhcmNvZGUpOwogICAgICBpZiAodHlwZW9mIHdpZHRoQ29kZSA9PT0gInN0cmluZyIpIHsKICAgICAgICB3aWR0aENvZGUgPSBjb252ZXJ0Q2lkU3RyaW5nKGNoYXJjb2RlLCB3aWR0aENvZGUpOwogICAgICB9CiAgICB9CiAgICB3aWR0aCA9IHRoaXMud2lkdGhzW3dpZHRoQ29kZV07CiAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAibnVtYmVyIikgewogICAgICB3aWR0aCA9IHRoaXMuZGVmYXVsdFdpZHRoOwogICAgfQogICAgY29uc3Qgdm1ldHJpYyA9IHRoaXMudm1ldHJpY3M/Llt3aWR0aENvZGVdOwogICAgbGV0IHVuaWNvZGUgPSB0aGlzLnRvVW5pY29kZS5nZXQoY2hhcmNvZGUpIHx8IGNoYXJjb2RlOwogICAgaWYgKHR5cGVvZiB1bmljb2RlID09PSAibnVtYmVyIikgewogICAgICB1bmljb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTsKICAgIH0KICAgIGxldCBpc0luRm9udCA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gIT09IHVuZGVmaW5lZDsKICAgIGZvbnRDaGFyQ29kZSA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gfHwgY2hhcmNvZGU7CiAgICBpZiAodGhpcy5taXNzaW5nRmlsZSkgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJjb2RlXSB8fCB0aGlzLmRlZmF1bHRFbmNvZGluZ1tjaGFyY29kZV07CiAgICAgIGlmICgoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIgfHwgZ2x5cGhOYW1lID09PSAiIikgJiYgdGhpcy50eXBlID09PSAiVHlwZTEiKSB7CiAgICAgICAgZm9udENoYXJDb2RlID0gMHgyMDsKICAgICAgICBpZiAoZ2x5cGhOYW1lID09PSAiIikgewogICAgICAgICAgd2lkdGggfHw9IHRoaXMuX3NwYWNlV2lkdGg7CiAgICAgICAgICB1bmljb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZShmb250Q2hhckNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb250Q2hhckNvZGUgPSBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhmb250Q2hhckNvZGUpOwogICAgfQogICAgaWYgKHRoaXMuaXNUeXBlM0ZvbnQpIHsKICAgICAgb3BlcmF0b3JMaXN0SWQgPSBmb250Q2hhckNvZGU7CiAgICB9CiAgICBsZXQgYWNjZW50ID0gbnVsbDsKICAgIGlmICh0aGlzLnNlYWNNYXA/LltjaGFyY29kZV0pIHsKICAgICAgaXNJbkZvbnQgPSB0cnVlOwogICAgICBjb25zdCBzZWFjID0gdGhpcy5zZWFjTWFwW2NoYXJjb2RlXTsKICAgICAgZm9udENoYXJDb2RlID0gc2VhYy5iYXNlRm9udENoYXJDb2RlOwogICAgICBhY2NlbnQgPSB7CiAgICAgICAgZm9udENoYXI6IFN0cmluZy5mcm9tQ29kZVBvaW50KHNlYWMuYWNjZW50Rm9udENoYXJDb2RlKSwKICAgICAgICBvZmZzZXQ6IHNlYWMuYWNjZW50T2Zmc2V0CiAgICAgIH07CiAgICB9CiAgICBsZXQgZm9udENoYXIgPSAiIjsKICAgIGlmICh0eXBlb2YgZm9udENoYXJDb2RlID09PSAibnVtYmVyIikgewogICAgICBpZiAoZm9udENoYXJDb2RlIDw9IDB4MTBmZmZmKSB7CiAgICAgICAgZm9udENoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChmb250Q2hhckNvZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oYGNoYXJUb0dseXBoIC0gaW52YWxpZCBmb250Q2hhckNvZGU6ICR7Zm9udENoYXJDb2RlfWApOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5taXNzaW5nRmlsZSAmJiB0aGlzLnZlcnRpY2FsICYmIGZvbnRDaGFyLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCB2ZXJ0aWNhbCA9IGdldFZlcnRpY2FsUHJlc2VudGF0aW9uRm9ybSgpW2ZvbnRDaGFyLmNoYXJDb2RlQXQoMCldOwogICAgICBpZiAodmVydGljYWwpIHsKICAgICAgICBmb250Q2hhciA9IHVuaWNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZlcnRpY2FsKTsKICAgICAgfQogICAgfQogICAgZ2x5cGggPSBuZXcgZm9udHNfR2x5cGgoY2hhcmNvZGUsIGZvbnRDaGFyLCB1bmljb2RlLCBhY2NlbnQsIHdpZHRoLCB2bWV0cmljLCBvcGVyYXRvckxpc3RJZCwgaXNTcGFjZSwgaXNJbkZvbnQpOwogICAgcmV0dXJuIHRoaXMuX2dseXBoQ2FjaGVbY2hhcmNvZGVdID0gZ2x5cGg7CiAgfQogIGNoYXJzVG9HbHlwaHMoY2hhcnMpIHsKICAgIGxldCBnbHlwaHMgPSB0aGlzLl9jaGFyc0NhY2hlW2NoYXJzXTsKICAgIGlmIChnbHlwaHMpIHsKICAgICAgcmV0dXJuIGdseXBoczsKICAgIH0KICAgIGdseXBocyA9IFtdOwogICAgaWYgKHRoaXMuY01hcCkgewogICAgICBjb25zdCBjID0gT2JqZWN0LmNyZWF0ZShudWxsKSwKICAgICAgICBpaSA9IGNoYXJzLmxlbmd0aDsKICAgICAgbGV0IGkgPSAwOwogICAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgICAgdGhpcy5jTWFwLnJlYWRDaGFyQ29kZShjaGFycywgaSwgYyk7CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2hhcmNvZGUsCiAgICAgICAgICBsZW5ndGgKICAgICAgICB9ID0gYzsKICAgICAgICBpICs9IGxlbmd0aDsKICAgICAgICBjb25zdCBnbHlwaCA9IHRoaXMuX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBsZW5ndGggPT09IDEgJiYgY2hhcnMuY2hhckNvZGVBdChpIC0gMSkgPT09IDB4MjApOwogICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2hhcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICAgIGNvbnN0IGNoYXJjb2RlID0gY2hhcnMuY2hhckNvZGVBdChpKTsKICAgICAgICBjb25zdCBnbHlwaCA9IHRoaXMuX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBjaGFyY29kZSA9PT0gMHgyMCk7CiAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5fY2hhcnNDYWNoZVtjaGFyc10gPSBnbHlwaHM7CiAgfQogIGdldENoYXJQb3NpdGlvbnMoY2hhcnMpIHsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogICAgaWYgKHRoaXMuY01hcCkgewogICAgICBjb25zdCBjID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgbGV0IGkgPSAwOwogICAgICB3aGlsZSAoaSA8IGNoYXJzLmxlbmd0aCkgewogICAgICAgIHRoaXMuY01hcC5yZWFkQ2hhckNvZGUoY2hhcnMsIGksIGMpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGMubGVuZ3RoOwogICAgICAgIHBvc2l0aW9ucy5wdXNoKFtpLCBpICsgbGVuZ3RoXSk7CiAgICAgICAgaSArPSBsZW5ndGg7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBwb3NpdGlvbnMucHVzaChbaSwgaSArIDFdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvc2l0aW9uczsKICB9CiAgZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKSB7CiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9nbHlwaENhY2hlKTsKICB9CiAgZW5jb2RlU3RyaW5nKHN0cikgewogICAgY29uc3QgYnVmZmVycyA9IFtdOwogICAgY29uc3QgY3VycmVudEJ1ZiA9IFtdOwogICAgY29uc3QgaGFzQ3VycmVudEJ1ZkVycm9ycyA9ICgpID0+IGJ1ZmZlcnMubGVuZ3RoICUgMiA9PT0gMTsKICAgIGNvbnN0IGdldENoYXJDb2RlID0gdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCA/IHVuaWNvZGUgPT4gdGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZih1bmljb2RlKSA6IHVuaWNvZGUgPT4gdGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZihTdHJpbmcuZnJvbUNvZGVQb2ludCh1bmljb2RlKSk7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB1bmljb2RlID0gc3RyLmNvZGVQb2ludEF0KGkpOwogICAgICBpZiAodW5pY29kZSA+IDB4ZDdmZiAmJiAodW5pY29kZSA8IDB4ZTAwMCB8fCB1bmljb2RlID4gMHhmZmZkKSkgewogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAodGhpcy50b1VuaWNvZGUpIHsKICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGdldENoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGlmIChjaGFyQ29kZSAhPT0gLTEpIHsKICAgICAgICAgIGlmIChoYXNDdXJyZW50QnVmRXJyb3JzKCkpIHsKICAgICAgICAgICAgYnVmZmVycy5wdXNoKGN1cnJlbnRCdWYuam9pbigiIikpOwogICAgICAgICAgICBjdXJyZW50QnVmLmxlbmd0aCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjaGFyQ29kZUxlbmd0aCA9IHRoaXMuY01hcCA/IHRoaXMuY01hcC5nZXRDaGFyQ29kZUxlbmd0aChjaGFyQ29kZSkgOiAxOwogICAgICAgICAgZm9yIChsZXQgaiA9IGNoYXJDb2RlTGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICAgICAgY3VycmVudEJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgPj4gOCAqIGogJiAweGZmKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFoYXNDdXJyZW50QnVmRXJyb3JzKCkpIHsKICAgICAgICBidWZmZXJzLnB1c2goY3VycmVudEJ1Zi5qb2luKCIiKSk7CiAgICAgICAgY3VycmVudEJ1Zi5sZW5ndGggPSAwOwogICAgICB9CiAgICAgIGN1cnJlbnRCdWYucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludCh1bmljb2RlKSk7CiAgICB9CiAgICBidWZmZXJzLnB1c2goY3VycmVudEJ1Zi5qb2luKCIiKSk7CiAgICByZXR1cm4gYnVmZmVyczsKICB9Cn0KY2xhc3MgRXJyb3JGb250IHsKICBjb25zdHJ1Y3RvcihlcnJvcikgewogICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgdGhpcy5sb2FkZWROYW1lID0gImdfZm9udF9lcnJvciI7CiAgICB0aGlzLm1pc3NpbmdGaWxlID0gdHJ1ZTsKICB9CiAgY2hhcnNUb0dseXBocygpIHsKICAgIHJldHVybiBbXTsKICB9CiAgZW5jb2RlU3RyaW5nKGNoYXJzKSB7CiAgICByZXR1cm4gW2NoYXJzXTsKICB9CiAgZXhwb3J0RGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIGVycm9yOiB0aGlzLmVycm9yCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvcGF0dGVybi5qcwoKCgoKY29uc3QgU2hhZGluZ1R5cGUgPSB7CiAgRlVOQ1RJT05fQkFTRUQ6IDEsCiAgQVhJQUw6IDIsCiAgUkFESUFMOiAzLAogIEZSRUVfRk9STV9NRVNIOiA0LAogIExBVFRJQ0VfRk9STV9NRVNIOiA1LAogIENPT05TX1BBVENIX01FU0g6IDYsCiAgVEVOU09SX1BBVENIX01FU0g6IDcKfTsKY2xhc3MgUGF0dGVybiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB1bnJlYWNoYWJsZSgiQ2Fubm90IGluaXRpYWxpemUgUGF0dGVybi4iKTsKICB9CiAgc3RhdGljIHBhcnNlU2hhZGluZyhzaGFkaW5nLCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgY29uc3QgZGljdCA9IHNoYWRpbmcgaW5zdGFuY2VvZiBCYXNlU3RyZWFtID8gc2hhZGluZy5kaWN0IDogc2hhZGluZzsKICAgIGNvbnN0IHR5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQVhJQUw6CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5SQURJQUw6CiAgICAgICAgICByZXR1cm4gbmV3IFJhZGlhbEF4aWFsU2hhZGluZyhkaWN0LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLkxBVFRJQ0VfRk9STV9NRVNIOgogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOgogICAgICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZyhzaGFkaW5nLCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgU2hhZGluZ1R5cGU6ICIgKyB0eXBlKTsKICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGV4KTsKICAgICAgcmV0dXJuIG5ldyBEdW1teVNoYWRpbmcoKTsKICAgIH0KICB9Cn0KY2xhc3MgQmFzZVNoYWRpbmcgewogIHN0YXRpYyBTTUFMTF9OVU1CRVIgPSAxZS02OwogIGdldElSKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0SVJgIGNhbGxlZC4iKTsKICB9Cn0KY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nIGV4dGVuZHMgQmFzZVNoYWRpbmcgewogIGNvbnN0cnVjdG9yKGRpY3QsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KCJTaGFkaW5nVHlwZSIpOwogICAgbGV0IGNvb3Jkc0xlbiA9IDA7CiAgICBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKICAgICAgY29vcmRzTGVuID0gNDsKICAgIH0gZWxzZSBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMKSB7CiAgICAgIGNvb3Jkc0xlbiA9IDY7CiAgICB9CiAgICB0aGlzLmNvb3Jkc0FyciA9IGRpY3QuZ2V0QXJyYXkoIkNvb3JkcyIpOwogICAgaWYgKCFpc051bWJlckFycmF5KHRoaXMuY29vcmRzQXJyLCBjb29yZHNMZW4pKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUmFkaWFsQXhpYWxTaGFkaW5nOiBJbnZhbGlkIC9Db29yZHMgYXJyYXkuIik7CiAgICB9CiAgICBjb25zdCBjcyA9IENvbG9yU3BhY2VVdGlscy5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgICB0aGlzLmJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgICBsZXQgdDAgPSAwLjAsCiAgICAgIHQxID0gMS4wOwogICAgY29uc3QgZG9tYWluQXJyID0gZGljdC5nZXRBcnJheSgiRG9tYWluIik7CiAgICBpZiAoaXNOdW1iZXJBcnJheShkb21haW5BcnIsIDIpKSB7CiAgICAgIFt0MCwgdDFdID0gZG9tYWluQXJyOwogICAgfQogICAgbGV0IGV4dGVuZFN0YXJ0ID0gZmFsc2UsCiAgICAgIGV4dGVuZEVuZCA9IGZhbHNlOwogICAgY29uc3QgZXh0ZW5kQXJyID0gZGljdC5nZXRBcnJheSgiRXh0ZW5kIik7CiAgICBpZiAoaXNCb29sZWFuQXJyYXkoZXh0ZW5kQXJyLCAyKSkgewogICAgICBbZXh0ZW5kU3RhcnQsIGV4dGVuZEVuZF0gPSBleHRlbmRBcnI7CiAgICB9CiAgICBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMICYmICghZXh0ZW5kU3RhcnQgfHwgIWV4dGVuZEVuZCkpIHsKICAgICAgY29uc3QgW3gxLCB5MSwgcjEsIHgyLCB5MiwgcjJdID0gdGhpcy5jb29yZHNBcnI7CiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5oeXBvdCh4MSAtIHgyLCB5MSAtIHkyKTsKICAgICAgaWYgKHIxIDw9IHIyICsgZGlzdGFuY2UgJiYgcjIgPD0gcjEgKyBkaXN0YW5jZSkgewogICAgICAgIHdhcm4oIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKTsKICAgICAgfQogICAgfQogICAgdGhpcy5leHRlbmRTdGFydCA9IGV4dGVuZFN0YXJ0OwogICAgdGhpcy5leHRlbmRFbmQgPSBleHRlbmRFbmQ7CiAgICBjb25zdCBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOwogICAgY29uc3QgZm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGZuT2JqLCB0cnVlKTsKICAgIGNvbnN0IE5VTUJFUl9PRl9TQU1QTEVTID0gODQwOwogICAgY29uc3Qgc3RlcCA9ICh0MSAtIHQwKSAvIE5VTUJFUl9PRl9TQU1QTEVTOwogICAgY29uc3QgY29sb3JTdG9wcyA9IHRoaXMuY29sb3JTdG9wcyA9IFtdOwogICAgaWYgKHQwID49IHQxIHx8IHN0ZXAgPD0gMCkgewogICAgICBpbmZvKCJCYWQgc2hhZGluZyBkb21haW4uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvbG9yID0gbmV3IEZsb2F0MzJBcnJheShjcy5udW1Db21wcyksCiAgICAgIHJhdGlvID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIGxldCByZ2JDb2xvcjsKICAgIGxldCBpQmFzZSA9IDA7CiAgICByYXRpb1swXSA9IHQwOwogICAgZm4ocmF0aW8sIDAsIGNvbG9yLCAwKTsKICAgIGxldCByZ2JCYXNlID0gY3MuZ2V0UmdiKGNvbG9yLCAwKTsKICAgIGNvbnN0IGNzc0NvbG9yQmFzZSA9IFV0aWwubWFrZUhleENvbG9yKHJnYkJhc2VbMF0sIHJnYkJhc2VbMV0sIHJnYkJhc2VbMl0pOwogICAgY29sb3JTdG9wcy5wdXNoKFswLCBjc3NDb2xvckJhc2VdKTsKICAgIGxldCBpUHJldiA9IDE7CiAgICByYXRpb1swXSA9IHQwICsgc3RlcDsKICAgIGZuKHJhdGlvLCAwLCBjb2xvciwgMCk7CiAgICBsZXQgcmdiUHJldiA9IGNzLmdldFJnYihjb2xvciwgMCk7CiAgICBsZXQgbWF4U2xvcGVSID0gcmdiUHJldlswXSAtIHJnYkJhc2VbMF0gKyAxOwogICAgbGV0IG1heFNsb3BlRyA9IHJnYlByZXZbMV0gLSByZ2JCYXNlWzFdICsgMTsKICAgIGxldCBtYXhTbG9wZUIgPSByZ2JQcmV2WzJdIC0gcmdiQmFzZVsyXSArIDE7CiAgICBsZXQgbWluU2xvcGVSID0gcmdiUHJldlswXSAtIHJnYkJhc2VbMF0gLSAxOwogICAgbGV0IG1pblNsb3BlRyA9IHJnYlByZXZbMV0gLSByZ2JCYXNlWzFdIC0gMTsKICAgIGxldCBtaW5TbG9wZUIgPSByZ2JQcmV2WzJdIC0gcmdiQmFzZVsyXSAtIDE7CiAgICBmb3IgKGxldCBpID0gMjsgaSA8IE5VTUJFUl9PRl9TQU1QTEVTOyBpKyspIHsKICAgICAgcmF0aW9bMF0gPSB0MCArIGkgKiBzdGVwOwogICAgICBmbihyYXRpbywgMCwgY29sb3IsIDApOwogICAgICByZ2JDb2xvciA9IGNzLmdldFJnYihjb2xvciwgMCk7CiAgICAgIGNvbnN0IHJ1biA9IGkgLSBpQmFzZTsKICAgICAgbWF4U2xvcGVSID0gTWF0aC5taW4obWF4U2xvcGVSLCAocmdiQ29sb3JbMF0gLSByZ2JCYXNlWzBdICsgMSkgLyBydW4pOwogICAgICBtYXhTbG9wZUcgPSBNYXRoLm1pbihtYXhTbG9wZUcsIChyZ2JDb2xvclsxXSAtIHJnYkJhc2VbMV0gKyAxKSAvIHJ1bik7CiAgICAgIG1heFNsb3BlQiA9IE1hdGgubWluKG1heFNsb3BlQiwgKHJnYkNvbG9yWzJdIC0gcmdiQmFzZVsyXSArIDEpIC8gcnVuKTsKICAgICAgbWluU2xvcGVSID0gTWF0aC5tYXgobWluU2xvcGVSLCAocmdiQ29sb3JbMF0gLSByZ2JCYXNlWzBdIC0gMSkgLyBydW4pOwogICAgICBtaW5TbG9wZUcgPSBNYXRoLm1heChtaW5TbG9wZUcsIChyZ2JDb2xvclsxXSAtIHJnYkJhc2VbMV0gLSAxKSAvIHJ1bik7CiAgICAgIG1pblNsb3BlQiA9IE1hdGgubWF4KG1pblNsb3BlQiwgKHJnYkNvbG9yWzJdIC0gcmdiQmFzZVsyXSAtIDEpIC8gcnVuKTsKICAgICAgY29uc3Qgc2xvcGVzRXhpc3QgPSBtaW5TbG9wZVIgPD0gbWF4U2xvcGVSICYmIG1pblNsb3BlRyA8PSBtYXhTbG9wZUcgJiYgbWluU2xvcGVCIDw9IG1heFNsb3BlQjsKICAgICAgaWYgKCFzbG9wZXNFeGlzdCkgewogICAgICAgIGNvbnN0IGNzc0NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IocmdiUHJldlswXSwgcmdiUHJldlsxXSwgcmdiUHJldlsyXSk7CiAgICAgICAgY29sb3JTdG9wcy5wdXNoKFtpUHJldiAvIE5VTUJFUl9PRl9TQU1QTEVTLCBjc3NDb2xvcl0pOwogICAgICAgIG1heFNsb3BlUiA9IHJnYkNvbG9yWzBdIC0gcmdiUHJldlswXSArIDE7CiAgICAgICAgbWF4U2xvcGVHID0gcmdiQ29sb3JbMV0gLSByZ2JQcmV2WzFdICsgMTsKICAgICAgICBtYXhTbG9wZUIgPSByZ2JDb2xvclsyXSAtIHJnYlByZXZbMl0gKyAxOwogICAgICAgIG1pblNsb3BlUiA9IHJnYkNvbG9yWzBdIC0gcmdiUHJldlswXSAtIDE7CiAgICAgICAgbWluU2xvcGVHID0gcmdiQ29sb3JbMV0gLSByZ2JQcmV2WzFdIC0gMTsKICAgICAgICBtaW5TbG9wZUIgPSByZ2JDb2xvclsyXSAtIHJnYlByZXZbMl0gLSAxOwogICAgICAgIGlCYXNlID0gaVByZXY7CiAgICAgICAgcmdiQmFzZSA9IHJnYlByZXY7CiAgICAgIH0KICAgICAgaVByZXYgPSBpOwogICAgICByZ2JQcmV2ID0gcmdiQ29sb3I7CiAgICB9CiAgICBjb25zdCBjc3NDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKHJnYlByZXZbMF0sIHJnYlByZXZbMV0sIHJnYlByZXZbMl0pOwogICAgY29sb3JTdG9wcy5wdXNoKFsxLCBjc3NDb2xvcl0pOwogICAgbGV0IGJhY2tncm91bmQgPSAidHJhbnNwYXJlbnQiOwogICAgaWYgKGRpY3QuaGFzKCJCYWNrZ3JvdW5kIikpIHsKICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoZGljdC5nZXQoIkJhY2tncm91bmQiKSwgMCk7CiAgICAgIGJhY2tncm91bmQgPSBVdGlsLm1ha2VIZXhDb2xvcihyZ2JDb2xvclswXSwgcmdiQ29sb3JbMV0sIHJnYkNvbG9yWzJdKTsKICAgIH0KICAgIGlmICghZXh0ZW5kU3RhcnQpIHsKICAgICAgY29sb3JTdG9wcy51bnNoaWZ0KFswLCBiYWNrZ3JvdW5kXSk7CiAgICAgIGNvbG9yU3RvcHNbMV1bMF0gKz0gQmFzZVNoYWRpbmcuU01BTExfTlVNQkVSOwogICAgfQogICAgaWYgKCFleHRlbmRFbmQpIHsKICAgICAgY29sb3JTdG9wcy5hdCgtMSlbMF0gLT0gQmFzZVNoYWRpbmcuU01BTExfTlVNQkVSOwogICAgICBjb2xvclN0b3BzLnB1c2goWzEsIGJhY2tncm91bmRdKTsKICAgIH0KICAgIHRoaXMuY29sb3JTdG9wcyA9IGNvbG9yU3RvcHM7CiAgfQogIGdldElSKCkgewogICAgY29uc3QgewogICAgICBjb29yZHNBcnIsCiAgICAgIHNoYWRpbmdUeXBlCiAgICB9ID0gdGhpczsKICAgIGxldCB0eXBlLCBwMCwgcDEsIHIwLCByMTsKICAgIGlmIChzaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOwogICAgICBwMSA9IFtjb29yZHNBcnJbMl0sIGNvb3Jkc0FyclszXV07CiAgICAgIHIwID0gbnVsbDsKICAgICAgcjEgPSBudWxsOwogICAgICB0eXBlID0gImF4aWFsIjsKICAgIH0gZWxzZSBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkgewogICAgICBwMCA9IFtjb29yZHNBcnJbMF0sIGNvb3Jkc0FyclsxXV07CiAgICAgIHAxID0gW2Nvb3Jkc0FyclszXSwgY29vcmRzQXJyWzRdXTsKICAgICAgcjAgPSBjb29yZHNBcnJbMl07CiAgICAgIHIxID0gY29vcmRzQXJyWzVdOwogICAgICB0eXBlID0gInJhZGlhbCI7CiAgICB9IGVsc2UgewogICAgICB1bnJlYWNoYWJsZShgZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICR7c2hhZGluZ1R5cGV9YCk7CiAgICB9CiAgICByZXR1cm4gWyJSYWRpYWxBeGlhbCIsIHR5cGUsIHRoaXMuYmJveCwgdGhpcy5jb2xvclN0b3BzLCBwMCwgcDEsIHIwLCByMV07CiAgfQp9CmNsYXNzIE1lc2hTdHJlYW1SZWFkZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgY29udGV4dCkgewogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwogICAgdGhpcy5idWZmZXIgPSAwOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogICAgY29uc3QgbnVtQ29tcHMgPSBjb250ZXh0Lm51bUNvbXBzOwogICAgdGhpcy50bXBDb21wc0J1ZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOwogICAgY29uc3QgY3NOdW1Db21wcyA9IGNvbnRleHQuY29sb3JTcGFjZS5udW1Db21wczsKICAgIHRoaXMudG1wQ3NDb21wc0J1ZiA9IGNvbnRleHQuY29sb3JGbiA/IG5ldyBGbG9hdDMyQXJyYXkoY3NOdW1Db21wcykgOiB0aGlzLnRtcENvbXBzQnVmOwogIH0KICBnZXQgaGFzRGF0YSgpIHsKICAgIGlmICh0aGlzLnN0cmVhbS5lbmQpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvcyA8IHRoaXMuc3RyZWFtLmVuZDsKICAgIH0KICAgIGlmICh0aGlzLmJ1ZmZlckxlbmd0aCA+IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICAgIGlmIChuZXh0Qnl0ZSA8IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gODsKICAgIHJldHVybiB0cnVlOwogIH0KICByZWFkQml0cyhuKSB7CiAgICBjb25zdCB7CiAgICAgIHN0cmVhbQogICAgfSA9IHRoaXM7CiAgICBsZXQgewogICAgICBidWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aAogICAgfSA9IHRoaXM7CiAgICBpZiAobiA9PT0gMzIpIHsKICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgfQogICAgICBidWZmZXIgPSBidWZmZXIgPDwgMjQgfCBzdHJlYW0uZ2V0Qnl0ZSgpIDw8IDE2IHwgc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgY29uc3QgbmV4dEJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICB0aGlzLmJ1ZmZlciA9IG5leHRCeXRlICYgKDEgPDwgYnVmZmVyTGVuZ3RoKSAtIDE7CiAgICAgIHJldHVybiAoYnVmZmVyIDw8IDggLSBidWZmZXJMZW5ndGggfCAobmV4dEJ5dGUgJiAweGZmKSA+PiBidWZmZXJMZW5ndGgpID4+PiAwOwogICAgfQogICAgaWYgKG4gPT09IDggJiYgYnVmZmVyTGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgfQogICAgd2hpbGUgKGJ1ZmZlckxlbmd0aCA8IG4pIHsKICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDggfCBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICBidWZmZXJMZW5ndGggKz0gODsKICAgIH0KICAgIGJ1ZmZlckxlbmd0aCAtPSBuOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgxIDw8IGJ1ZmZlckxlbmd0aCkgLSAxOwogICAgcmV0dXJuIGJ1ZmZlciA+PiBidWZmZXJMZW5ndGg7CiAgfQogIGFsaWduKCkgewogICAgdGhpcy5idWZmZXIgPSAwOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogIH0KICByZWFkRmxhZygpIHsKICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKHRoaXMuY29udGV4dC5iaXRzUGVyRmxhZyk7CiAgfQogIHJlYWRDb29yZGluYXRlKCkgewogICAgY29uc3QgewogICAgICBiaXRzUGVyQ29vcmRpbmF0ZSwKICAgICAgZGVjb2RlCiAgICB9ID0gdGhpcy5jb250ZXh0OwogICAgY29uc3QgeGkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKICAgIGNvbnN0IHlpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29vcmRpbmF0ZSk7CiAgICBjb25zdCBzY2FsZSA9IGJpdHNQZXJDb29yZGluYXRlIDwgMzIgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb29yZGluYXRlKSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIHJldHVybiBbeGkgKiBzY2FsZSAqIChkZWNvZGVbMV0gLSBkZWNvZGVbMF0pICsgZGVjb2RlWzBdLCB5aSAqIHNjYWxlICogKGRlY29kZVszXSAtIGRlY29kZVsyXSkgKyBkZWNvZGVbMl1dOwogIH0KICByZWFkQ29tcG9uZW50cygpIHsKICAgIGNvbnN0IHsKICAgICAgYml0c1BlckNvbXBvbmVudCwKICAgICAgY29sb3JGbiwKICAgICAgY29sb3JTcGFjZSwKICAgICAgZGVjb2RlLAogICAgICBudW1Db21wcwogICAgfSA9IHRoaXMuY29udGV4dDsKICAgIGNvbnN0IHNjYWxlID0gYml0c1BlckNvbXBvbmVudCA8IDMyID8gMSAvICgoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLnRtcENvbXBzQnVmOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSA0OyBpIDwgbnVtQ29tcHM7IGkrKywgaiArPSAyKSB7CiAgICAgIGNvbnN0IGNpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29tcG9uZW50KTsKICAgICAgY29tcG9uZW50c1tpXSA9IGNpICogc2NhbGUgKiAoZGVjb2RlW2ogKyAxXSAtIGRlY29kZVtqXSkgKyBkZWNvZGVbal07CiAgICB9CiAgICBjb25zdCBjb2xvciA9IHRoaXMudG1wQ3NDb21wc0J1ZjsKICAgIGNvbG9yRm4/Lihjb21wb25lbnRzLCAwLCBjb2xvciwgMCk7CiAgICByZXR1cm4gY29sb3JTcGFjZS5nZXRSZ2IoY29sb3IsIDApOwogIH0KfQpsZXQgYkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKZnVuY3Rpb24gYnVpbGRCKGNvdW50KSB7CiAgY29uc3QgbHV0ID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgY29uc3QgdCA9IGkgLyBjb3VudCwKICAgICAgdF8gPSAxIC0gdDsKICAgIGx1dC5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoW3RfICoqIDMsIDMgKiB0ICogdF8gKiogMiwgMyAqIHQgKiogMiAqIHRfLCB0ICoqIDNdKSk7CiAgfQogIHJldHVybiBsdXQ7Cn0KZnVuY3Rpb24gZ2V0Qihjb3VudCkgewogIHJldHVybiBiQ2FjaGVbY291bnRdIHx8PSBidWlsZEIoY291bnQpOwp9CmZ1bmN0aW9uIGNsZWFyUGF0dGVybkNhY2hlcygpIHsKICBiQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwp9CmNsYXNzIE1lc2hTaGFkaW5nIGV4dGVuZHMgQmFzZVNoYWRpbmcgewogIHN0YXRpYyBNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCA9IDM7CiAgc3RhdGljIE1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UID0gMjA7CiAgc3RhdGljIFRSSUFOR0xFX0RFTlNJVFkgPSAyMDsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcigpOwogICAgaWYgKCEoc3RyZWFtIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7CiAgICB9CiAgICBjb25zdCBkaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLnNoYWRpbmdUeXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CiAgICB0aGlzLmJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgICBjb25zdCBjcyA9IENvbG9yU3BhY2VVdGlscy5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgICB0aGlzLmJhY2tncm91bmQgPSBkaWN0LmhhcygiQmFja2dyb3VuZCIpID8gY3MuZ2V0UmdiKGRpY3QuZ2V0KCJCYWNrZ3JvdW5kIiksIDApIDogbnVsbDsKICAgIGNvbnN0IGZuT2JqID0gZGljdC5nZXRSYXcoIkZ1bmN0aW9uIik7CiAgICBjb25zdCBmbiA9IGZuT2JqID8gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZShmbk9iaiwgdHJ1ZSkgOiBudWxsOwogICAgdGhpcy5jb29yZHMgPSBbXTsKICAgIHRoaXMuY29sb3JzID0gW107CiAgICB0aGlzLmZpZ3VyZXMgPSBbXTsKICAgIGNvbnN0IGRlY29kZUNvbnRleHQgPSB7CiAgICAgIGJpdHNQZXJDb29yZGluYXRlOiBkaWN0LmdldCgiQml0c1BlckNvb3JkaW5hdGUiKSwKICAgICAgYml0c1BlckNvbXBvbmVudDogZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSwKICAgICAgYml0c1BlckZsYWc6IGRpY3QuZ2V0KCJCaXRzUGVyRmxhZyIpLAogICAgICBkZWNvZGU6IGRpY3QuZ2V0QXJyYXkoIkRlY29kZSIpLAogICAgICBjb2xvckZuOiBmbiwKICAgICAgY29sb3JTcGFjZTogY3MsCiAgICAgIG51bUNvbXBzOiBmbiA/IDEgOiBjcy5udW1Db21wcwogICAgfTsKICAgIGNvbnN0IHJlYWRlciA9IG5ldyBNZXNoU3RyZWFtUmVhZGVyKHN0cmVhbSwgZGVjb2RlQ29udGV4dCk7CiAgICBsZXQgcGF0Y2hNZXNoID0gZmFsc2U7CiAgICBzd2l0Y2ggKHRoaXMuc2hhZGluZ1R5cGUpIHsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKICAgICAgICB0aGlzLl9kZWNvZGVUeXBlNFNoYWRpbmcocmVhZGVyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5MQVRUSUNFX0ZPUk1fTUVTSDoKICAgICAgICBjb25zdCB2ZXJ0aWNlc1BlclJvdyA9IGRpY3QuZ2V0KCJWZXJ0aWNlc1BlclJvdyIpIHwgMDsKICAgICAgICBpZiAodmVydGljZXNQZXJSb3cgPCAyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgVmVydGljZXNQZXJSb3ciKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTVTaGFkaW5nKHJlYWRlciwgdmVydGljZXNQZXJSb3cpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFNoYWRpbmdUeXBlLkNPT05TX1BBVENIX01FU0g6CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTZTaGFkaW5nKHJlYWRlcik7CiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKICAgICAgICB0aGlzLl9kZWNvZGVUeXBlN1NoYWRpbmcocmVhZGVyKTsKICAgICAgICBwYXRjaE1lc2ggPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHVucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIik7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGF0Y2hNZXNoKSB7CiAgICAgIHRoaXMuX3VwZGF0ZUJvdW5kcygpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLmZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIHRoaXMuX2J1aWxkRmlndXJlRnJvbVBhdGNoKGkpOwogICAgICB9CiAgICB9CiAgICB0aGlzLl91cGRhdGVCb3VuZHMoKTsKICAgIHRoaXMuX3BhY2tEYXRhKCk7CiAgfQogIF9kZWNvZGVUeXBlNFNoYWRpbmcocmVhZGVyKSB7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkczsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3Qgb3BlcmF0b3JzID0gW107CiAgICBjb25zdCBwcyA9IFtdOwogICAgbGV0IHZlcnRpY2VzTGVmdCA9IDA7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBjb25zdCBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpOwogICAgICBjb25zdCBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpOwogICAgICBpZiAodmVydGljZXNMZWZ0ID09PSAwKSB7CiAgICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMikpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNCBmbGFnIik7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoZikgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcHMucHVzaChwcy5hdCgtMiksIHBzLmF0KC0xKSk7CiAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwcy5wdXNoKHBzLmF0KC0zKSwgcHMuYXQoLTEpKTsKICAgICAgICAgICAgdmVydGljZXNMZWZ0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG9wZXJhdG9ycy5wdXNoKGYpOwogICAgICB9CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgICB2ZXJ0aWNlc0xlZnQtLTsKICAgICAgcmVhZGVyLmFsaWduKCk7CiAgICB9CiAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgIHR5cGU6ICJ0cmlhbmdsZXMiLAogICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcykKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTVTaGFkaW5nKHJlYWRlciwgdmVydGljZXNQZXJSb3cpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IFtdOwogICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CiAgICAgIGNvbnN0IGNvb3JkID0gcmVhZGVyLnJlYWRDb29yZGluYXRlKCk7CiAgICAgIGNvbnN0IGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgfQogICAgdGhpcy5maWd1cmVzLnB1c2goewogICAgICB0eXBlOiAibGF0dGljZSIsCiAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgdmVydGljZXNQZXJSb3cKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTZTaGFkaW5nKHJlYWRlcikgewogICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHBzID0gbmV3IEludDMyQXJyYXkoMTYpOwogICAgY29uc3QgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsKICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgewogICAgICBjb25zdCBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CiAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTsKICAgICAgfQogICAgICBjb25zdCBwaSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGYgIT09IDAgPyA4IDogMTI7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpOwogICAgICB9CiAgICAgIGNvbnN0IGNpID0gY29sb3JzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTsKICAgICAgfQogICAgICBsZXQgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKICAgICAgc3dpdGNoIChmKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcHNbMTJdID0gcGkgKyAzOwogICAgICAgICAgcHNbMTNdID0gcGkgKyA0OwogICAgICAgICAgcHNbMTRdID0gcGkgKyA1OwogICAgICAgICAgcHNbMTVdID0gcGkgKyA2OwogICAgICAgICAgcHNbOF0gPSBwaSArIDI7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHRtcDE7CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICB0bXAxID0gY3NbMl07CiAgICAgICAgICB0bXAyID0gY3NbM107CiAgICAgICAgICBjc1syXSA9IHRtcDI7CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICB0bXAxID0gcHNbMTVdOwogICAgICAgICAgdG1wMiA9IHBzWzExXTsKICAgICAgICAgIHBzWzEyXSA9IHBzWzNdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1s3XTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gdG1wMjsKICAgICAgICAgIHBzWzddID0gcGkgKyA0OwogICAgICAgICAgcHNbMF0gPSB0bXAxOwogICAgICAgICAgcHNbMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1syXSA9IHBpICsgNjsKICAgICAgICAgIHBzWzNdID0gcGkgKyA1OwogICAgICAgICAgdG1wMSA9IGNzWzNdOwogICAgICAgICAgY3NbMl0gPSBjc1sxXTsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHBzWzEyXSA9IHBzWzBdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1sxXTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gcHNbMl07CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHBzWzVdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1swXV1bMF0gLSBjb29yZHNbcHNbMTVdXVswXSArIDYgKiAoY29vcmRzW3BzWzRdXVswXSArIGNvb3Jkc1twc1sxXV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICsgMyAqIChjb29yZHNbcHNbMTNdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1swXV1bMV0gLSBjb29yZHNbcHNbMTVdXVsxXSArIDYgKiAoY29vcmRzW3BzWzRdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTNdXVsxXSArIGNvb3Jkc1twc1s3XV1bMV0pKSAvIDldKTsKICAgICAgcHNbNl0gPSBjb29yZHMubGVuZ3RoOwogICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzNdXVswXSAtIGNvb3Jkc1twc1sxMl1dWzBdICsgNiAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzddXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzNdXVsxXSAtIGNvb3Jkc1twc1sxMl1dWzFdICsgNiAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzddXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC8gOV0pOwogICAgICBwc1s5XSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTJdXVswXSAtIGNvb3Jkc1twc1szXV1bMF0gKyA2ICogKGNvb3Jkc1twc1s4XV1bMF0gKyBjb29yZHNbcHNbMTNdXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzEyXV1bMV0gLSBjb29yZHNbcHNbM11dWzFdICsgNiAqIChjb29yZHNbcHNbOF1dWzFdICsgY29vcmRzW3BzWzEzXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pKSAvIDldKTsKICAgICAgcHNbMTBdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1sxNV1dWzBdIC0gY29vcmRzW3BzWzBdXVswXSArIDYgKiAoY29vcmRzW3BzWzExXV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkgLSAyICogKGNvb3Jkc1twc1sxMl1dWzBdICsgY29vcmRzW3BzWzNdXVswXSkgKyAzICogKGNvb3Jkc1twc1syXV1bMF0gKyBjb29yZHNbcHNbOF1dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMTVdXVsxXSAtIGNvb3Jkc1twc1swXV1bMV0gKyA2ICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzhdXVsxXSkpIC8gOV0pOwogICAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgICAgdHlwZTogInBhdGNoIiwKICAgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQogICAgICB9KTsKICAgIH0KICB9CiAgX2RlY29kZVR5cGU3U2hhZGluZyhyZWFkZXIpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKICAgIGNvbnN0IGNzID0gbmV3IEludDMyQXJyYXkoNCk7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAzKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7CiAgICAgIH0KICAgICAgY29uc3QgcGkgPSBjb29yZHMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMTIgOiAxNjsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7CiAgICAgIH0KICAgICAgY29uc3QgY2kgPSBjb2xvcnMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29sb3JzLnB1c2gocmVhZGVyLnJlYWRDb21wb25lbnRzKCkpOwogICAgICB9CiAgICAgIGxldCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwogICAgICBzd2l0Y2ggKGYpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBwc1sxMl0gPSBwaSArIDM7CiAgICAgICAgICBwc1sxM10gPSBwaSArIDQ7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDU7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDY7CiAgICAgICAgICBwc1s4XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzldID0gcGkgKyAxMzsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTQ7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzVdID0gcGkgKyAxMjsKICAgICAgICAgIHBzWzZdID0gcGkgKyAxNTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1syXTsKICAgICAgICAgIHRtcDIgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gdG1wMjsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHRtcDEgPSBwc1sxNV07CiAgICAgICAgICB0bXAyID0gcHNbMTFdOwogICAgICAgICAgcHNbMTJdID0gcHNbM107CiAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CiAgICAgICAgICBwc1s4XSA9IHBzWzddOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gY3NbMV07CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBwc1sxMl0gPSBwc1swXTsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gcHNbMV07CiAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTA7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CiAgICAgICAgICBwc1s0XSA9IHBzWzJdOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXMuZmlndXJlcy5wdXNoKHsKICAgICAgICB0eXBlOiAicGF0Y2giLAogICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpCiAgICAgIH0pOwogICAgfQogIH0KICBfYnVpbGRGaWd1cmVGcm9tUGF0Y2goaW5kZXgpIHsKICAgIGNvbnN0IGZpZ3VyZSA9IHRoaXMuZmlndXJlc1tpbmRleF07CiAgICBhc3NlcnQoZmlndXJlLnR5cGUgPT09ICJwYXRjaCIsICJVbmV4cGVjdGVkIHBhdGNoIG1lc2ggZmlndXJlIik7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkcywKICAgICAgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwaSA9IGZpZ3VyZS5jb29yZHM7CiAgICBjb25zdCBjaSA9IGZpZ3VyZS5jb2xvcnM7CiAgICBjb25zdCBmaWd1cmVNaW5YID0gTWF0aC5taW4oY29vcmRzW3BpWzBdXVswXSwgY29vcmRzW3BpWzNdXVswXSwgY29vcmRzW3BpWzEyXV1bMF0sIGNvb3Jkc1twaVsxNV1dWzBdKTsKICAgIGNvbnN0IGZpZ3VyZU1pblkgPSBNYXRoLm1pbihjb29yZHNbcGlbMF1dWzFdLCBjb29yZHNbcGlbM11dWzFdLCBjb29yZHNbcGlbMTJdXVsxXSwgY29vcmRzW3BpWzE1XV1bMV0pOwogICAgY29uc3QgZmlndXJlTWF4WCA9IE1hdGgubWF4KGNvb3Jkc1twaVswXV1bMF0sIGNvb3Jkc1twaVszXV1bMF0sIGNvb3Jkc1twaVsxMl1dWzBdLCBjb29yZHNbcGlbMTVdXVswXSk7CiAgICBjb25zdCBmaWd1cmVNYXhZID0gTWF0aC5tYXgoY29vcmRzW3BpWzBdXVsxXSwgY29vcmRzW3BpWzNdXVsxXSwgY29vcmRzW3BpWzEyXV1bMV0sIGNvb3Jkc1twaVsxNV1dWzFdKTsKICAgIGxldCBzcGxpdFhCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WCAtIGZpZ3VyZU1pblgpICogTWVzaFNoYWRpbmcuVFJJQU5HTEVfREVOU0lUWSAvICh0aGlzLmJvdW5kc1syXSAtIHRoaXMuYm91bmRzWzBdKSk7CiAgICBzcGxpdFhCeSA9IE1hdGhDbGFtcChzcGxpdFhCeSwgTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UKTsKICAgIGxldCBzcGxpdFlCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WSAtIGZpZ3VyZU1pblkpICogTWVzaFNoYWRpbmcuVFJJQU5HTEVfREVOU0lUWSAvICh0aGlzLmJvdW5kc1szXSAtIHRoaXMuYm91bmRzWzFdKSk7CiAgICBzcGxpdFlCeSA9IE1hdGhDbGFtcChzcGxpdFlCeSwgTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UKTsKICAgIGNvbnN0IHZlcnRpY2VzUGVyUm93ID0gc3BsaXRYQnkgKyAxOwogICAgY29uc3QgZmlndXJlQ29vcmRzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7CiAgICBjb25zdCBmaWd1cmVDb2xvcnMgPSBuZXcgSW50MzJBcnJheSgoc3BsaXRZQnkgKyAxKSAqIHZlcnRpY2VzUGVyUm93KTsKICAgIGxldCBrID0gMDsKICAgIGNvbnN0IGNsID0gbmV3IFVpbnQ4QXJyYXkoMyksCiAgICAgIGNyID0gbmV3IFVpbnQ4QXJyYXkoMyk7CiAgICBjb25zdCBjMCA9IGNvbG9yc1tjaVswXV0sCiAgICAgIGMxID0gY29sb3JzW2NpWzFdXSwKICAgICAgYzIgPSBjb2xvcnNbY2lbMl1dLAogICAgICBjMyA9IGNvbG9yc1tjaVszXV07CiAgICBjb25zdCBiUm93ID0gZ2V0QihzcGxpdFlCeSksCiAgICAgIGJDb2wgPSBnZXRCKHNwbGl0WEJ5KTsKICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSBzcGxpdFlCeTsgcm93KyspIHsKICAgICAgY2xbMF0gPSAoYzBbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjbFsxXSA9IChjMFsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlsxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNsWzJdID0gKGMwWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgY3JbMF0gPSAoYzFbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjclsxXSA9IChjMVsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1sxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNyWzJdID0gKGMxWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IHNwbGl0WEJ5OyBjb2wrKywgaysrKSB7CiAgICAgICAgaWYgKChyb3cgPT09IDAgfHwgcm93ID09PSBzcGxpdFlCeSkgJiYgKGNvbCA9PT0gMCB8fCBjb2wgPT09IHNwbGl0WEJ5KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCB4ID0gMCwKICAgICAgICAgIHkgPSAwOwogICAgICAgIGxldCBxID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAzOyBpKyspIHsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IDM7IGorKywgcSsrKSB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBiUm93W3Jvd11baV0gKiBiQ29sW2NvbF1bal07CiAgICAgICAgICAgIHggKz0gY29vcmRzW3BpW3FdXVswXSAqIG07CiAgICAgICAgICAgIHkgKz0gY29vcmRzW3BpW3FdXVsxXSAqIG07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpZ3VyZUNvb3Jkc1trXSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgICAgY29vcmRzLnB1c2goW3gsIHldKTsKICAgICAgICBmaWd1cmVDb2xvcnNba10gPSBjb2xvcnMubGVuZ3RoOwogICAgICAgIGNvbnN0IG5ld0NvbG9yID0gbmV3IFVpbnQ4QXJyYXkoMyk7CiAgICAgICAgbmV3Q29sb3JbMF0gPSAoY2xbMF0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMF0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOwogICAgICAgIG5ld0NvbG9yWzFdID0gKGNsWzFdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzFdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKICAgICAgICBuZXdDb2xvclsyXSA9IChjbFsyXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclsyXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CiAgICAgICAgY29sb3JzLnB1c2gobmV3Q29sb3IpOwogICAgICB9CiAgICB9CiAgICBmaWd1cmVDb29yZHNbMF0gPSBwaVswXTsKICAgIGZpZ3VyZUNvbG9yc1swXSA9IGNpWzBdOwogICAgZmlndXJlQ29vcmRzW3NwbGl0WEJ5XSA9IHBpWzNdOwogICAgZmlndXJlQ29sb3JzW3NwbGl0WEJ5XSA9IGNpWzFdOwogICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gcGlbMTJdOwogICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gY2lbMl07CiAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeSArIHNwbGl0WEJ5XSA9IHBpWzE1XTsKICAgIGZpZ3VyZUNvbG9yc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5ICsgc3BsaXRYQnldID0gY2lbM107CiAgICB0aGlzLmZpZ3VyZXNbaW5kZXhdID0gewogICAgICB0eXBlOiAibGF0dGljZSIsCiAgICAgIGNvb3JkczogZmlndXJlQ29vcmRzLAogICAgICBjb2xvcnM6IGZpZ3VyZUNvbG9ycywKICAgICAgdmVydGljZXNQZXJSb3cKICAgIH07CiAgfQogIF91cGRhdGVCb3VuZHMoKSB7CiAgICBsZXQgbWluWCA9IHRoaXMuY29vcmRzWzBdWzBdLAogICAgICBtaW5ZID0gdGhpcy5jb29yZHNbMF1bMV0sCiAgICAgIG1heFggPSBtaW5YLAogICAgICBtYXhZID0gbWluWTsKICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IHRoaXMuY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeCA9IHRoaXMuY29vcmRzW2ldWzBdLAogICAgICAgIHkgPSB0aGlzLmNvb3Jkc1tpXVsxXTsKICAgICAgbWluWCA9IG1pblggPiB4ID8geCA6IG1pblg7CiAgICAgIG1pblkgPSBtaW5ZID4geSA/IHkgOiBtaW5ZOwogICAgICBtYXhYID0gbWF4WCA8IHggPyB4IDogbWF4WDsKICAgICAgbWF4WSA9IG1heFkgPCB5ID8geSA6IG1heFk7CiAgICB9CiAgICB0aGlzLmJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTsKICB9CiAgX3BhY2tEYXRhKCkgewogICAgbGV0IGksIGlpLCBqLCBqajsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29vcmRzUGFja2VkID0gbmV3IEZsb2F0MzJBcnJheShjb29yZHMubGVuZ3RoICogMik7CiAgICBmb3IgKGkgPSAwLCBqID0gMCwgaWkgPSBjb29yZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB4eSA9IGNvb3Jkc1tpXTsKICAgICAgY29vcmRzUGFja2VkW2orK10gPSB4eVswXTsKICAgICAgY29vcmRzUGFja2VkW2orK10gPSB4eVsxXTsKICAgIH0KICAgIHRoaXMuY29vcmRzID0gY29vcmRzUGFja2VkOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBjb2xvcnNQYWNrZWQgPSBuZXcgVWludDhBcnJheShjb2xvcnMubGVuZ3RoICogMyk7CiAgICBmb3IgKGkgPSAwLCBqID0gMCwgaWkgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBjID0gY29sb3JzW2ldOwogICAgICBjb2xvcnNQYWNrZWRbaisrXSA9IGNbMF07CiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1sxXTsKICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzJdOwogICAgfQogICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNQYWNrZWQ7CiAgICBjb25zdCBmaWd1cmVzID0gdGhpcy5maWd1cmVzOwogICAgZm9yIChpID0gMCwgaWkgPSBmaWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZmlndXJlID0gZmlndXJlc1tpXSwKICAgICAgICBwcyA9IGZpZ3VyZS5jb29yZHMsCiAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzOwogICAgICBmb3IgKGogPSAwLCBqaiA9IHBzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBwc1tqXSAqPSAyOwogICAgICAgIGNzW2pdICo9IDM7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0SVIoKSB7CiAgICBjb25zdCB7CiAgICAgIGJvdW5kcwogICAgfSA9IHRoaXM7CiAgICBpZiAoYm91bmRzWzJdIC0gYm91bmRzWzBdID09PSAwIHx8IGJvdW5kc1szXSAtIGJvdW5kc1sxXSA9PT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgTWVzaFNoYWRpbmcgYm91bmRzOiBbJHtib3VuZHN9XS5gKTsKICAgIH0KICAgIHJldHVybiBbIk1lc2giLCB0aGlzLnNoYWRpbmdUeXBlLCB0aGlzLmNvb3JkcywgdGhpcy5jb2xvcnMsIHRoaXMuZmlndXJlcywgYm91bmRzLCB0aGlzLmJib3gsIHRoaXMuYmFja2dyb3VuZF07CiAgfQp9CmNsYXNzIER1bW15U2hhZGluZyBleHRlbmRzIEJhc2VTaGFkaW5nIHsKICBnZXRJUigpIHsKICAgIHJldHVybiBbIkR1bW15Il07CiAgfQp9CmZ1bmN0aW9uIGdldFRpbGluZ1BhdHRlcm5JUihvcGVyYXRvckxpc3QsIGRpY3QsIGNvbG9yKSB7CiAgY29uc3QgbWF0cml4ID0gbG9va3VwTWF0cml4KGRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBJREVOVElUWV9NQVRSSVgpOwogIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgaWYgKCFiYm94IHx8IGJib3hbMl0gLSBiYm94WzBdID09PSAwIHx8IGJib3hbM10gLSBiYm94WzFdID09PSAwKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9CQm94IGFycmF5LmApOwogIH0KICBjb25zdCB4c3RlcCA9IGRpY3QuZ2V0KCJYU3RlcCIpOwogIGlmICh0eXBlb2YgeHN0ZXAgIT09ICJudW1iZXIiKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9YU3RlcCB2YWx1ZS5gKTsKICB9CiAgY29uc3QgeXN0ZXAgPSBkaWN0LmdldCgiWVN0ZXAiKTsKICBpZiAodHlwZW9mIHlzdGVwICE9PSAibnVtYmVyIikgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvWVN0ZXAgdmFsdWUuYCk7CiAgfQogIGNvbnN0IHBhaW50VHlwZSA9IGRpY3QuZ2V0KCJQYWludFR5cGUiKTsKICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFpbnRUeXBlKSkgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvUGFpbnRUeXBlIHZhbHVlLmApOwogIH0KICBjb25zdCB0aWxpbmdUeXBlID0gZGljdC5nZXQoIlRpbGluZ1R5cGUiKTsKICBpZiAoIU51bWJlci5pc0ludGVnZXIodGlsaW5nVHlwZSkpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL1RpbGluZ1R5cGUgdmFsdWUuYCk7CiAgfQogIHJldHVybiBbIlRpbGluZ1BhdHRlcm4iLCBjb2xvciwgb3BlcmF0b3JMaXN0LCBtYXRyaXgsIGJib3gsIHhzdGVwLCB5c3RlcCwgcGFpbnRUeXBlLCB0aWxpbmdUeXBlXTsKfQoKOy8vIC4vc3JjL2NvcmUvY2FsaWJyaV9mYWN0b3JzLmpzCmNvbnN0IENhbGlicmlCb2xkRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDAuOTc4MDEsIDAuOTI0ODIsIDAuODk1NTIsIDAuOTExMzMsIDAuODE5ODgsIDAuOTc1NjYsIDAuOTgxNTIsIDAuOTM1NDgsIDAuOTM1NDgsIDEuMjc5OCwgMC44NTI4NCwgMC45Mjc5NCwgMSwgMC45NjEzNCwgMS41NDY1NywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC44Mjg0NSwgMC44Mjg0NSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC43NTg1OSwgMC45MjEzOCwgMC44MzkwOCwgMC43NzYyLCAwLjczMjkzLCAwLjg3Mjg5LCAwLjczMTMzLCAwLjc1MTQsIDAuODE5MjEsIDAuODczNTYsIDAuOTU5NTgsIDAuNTk1MjYsIDAuNzU3MjcsIDAuNjkyMjUsIDEuMDQ5MjQsIDAuOTEyMSwgMC44Njk0MywgMC43OTc5NSwgMC44ODE5OCwgMC43Nzk1OCwgMC43MDg2NCwgMC44MTA1NSwgMC45MDM5OSwgMC44ODY1MywgMC45NjAxNywgMC44MjU3NywgMC43Nzg5MiwgMC43ODI1NywgMC45NzUwNywgMS41NDY1NywgMC45NzUwNywgMC44NTI4NCwgMC44OTU1MiwgMC45MDE3NiwgMC44ODc2MiwgMC44Nzg1LCAwLjc1MjQxLCAwLjg3ODUsIDAuOTA1MTgsIDAuOTUwMTUsIDAuNzc2MTgsIDAuODc4NSwgMC44ODQwMSwgMC45MTkxNiwgMC44NjMwNCwgMC44ODQwMSwgMC45MTQ4OCwgMC44Nzg1LCAwLjg4MDEsIDAuODc4NSwgMC44Nzg1LCAwLjkxMzQzLCAwLjcxNzMsIDEuMDQxMDYsIDAuODc4NSwgMC44NTA3NSwgMC45NTc5NCwgMC44MjYxNiwgMC44NTE2MiwgMC43OTQ5MiwgMC44ODMzMSwgMS42OTgwOCwgMC44ODMzMSwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS43ODAxLCAwLjg5NTUyLCAxLjI0NDg3LCAxLjEzMjU0LCAxLjEyNDAxLCAwLjk2ODM5LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcwNjQ1LCAwLjg1NTkyLCAwLjkwNzQ3LCAxLjAxNDY2LCAxLjAwODgsIDAuOTAzMjMsIDEsIDEuMDc0NjMsIDEsIDAuOTEwNTYsIDAuNzU4MDYsIDEuMTkxMTgsIDAuOTY4MzksIDAuNzg4NjQsIDAuODI4NDUsIDAuODQxMzMsIDAuNzU4NTksIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuNzc1MzksIDAuNzMyOTMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuODg1MDYsIDAuOTEyMSwgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44NTI4NCwgMC44NzUwOCwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC43Nzg5MiwgMC43OTc5NSwgMC45MDgwNywgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44NzE1LCAwLjc1MjQxLCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg3ODUsIDAuODc4NSwgMC44ODAxLCAwLjg4MDEsIDAuODgwMSwgMC44ODAxLCAwLjg4MDEsIDAuOTA3NDcsIDAuODkwNDksIDAuODc4NSwgMC44Nzg1LCAwLjg3ODUsIDAuODc4NSwgMC44NTE2MiwgMC44Nzg1LCAwLjg1MTYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjg3Mjg5LCAwLjgzMDE2LCAwLjg4NTA2LCAwLjkzMTI1LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAxLCAxLCAwLjg3MzU2LCAwLjg3ODUsIDAuOTEwNzUsIDAuODk2MDgsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuNzYyMjksIDAuOTAxNjcsIDAuNTk1MjYsIDAuOTE5MTYsIDEsIDEsIDAuODYzMDQsIDAuNjkyMjUsIDAuODg0MDEsIDEsIDEsIDAuNzA0MjQsIDAuNzk0NjgsIDAuOTE5MjYsIDAuODgxNzUsIDAuNzA4MjMsIDAuOTQ5MDMsIDAuOTEyMSwgMC44Nzg1LCAxLCAxLCAwLjkxMjEsIDAuODc4NSwgMC44NzgwMiwgMC44ODY1NiwgMC44Nzg1LCAwLjg2OTQzLCAwLjg4MDEsIDAuODY5NDMsIDAuODgwMSwgMC44Njk0MywgMC44ODAxLCAwLjg3NDAyLCAwLjg5MjkxLCAwLjc3OTU4LCAwLjkxMzQzLCAxLCAxLCAwLjc3OTU4LCAwLjkxMzQzLCAwLjcwODY0LCAwLjcxNzMsIDAuNzA4NjQsIDAuNzE3MywgMC43MDg2NCwgMC43MTczLCAwLjcwODY0LCAwLjcxNzMsIDEsIDEsIDAuODEwNTUsIDAuNzU4NDEsIDAuODEwNTUsIDEuMDY0NTIsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTYwMTcsIDAuOTU3OTQsIDAuNzc4OTIsIDAuODUxNjIsIDAuNzc4OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuOTI5NywgMC41Njg5MiwgMC44MzkwOCwgMC44ODc2MiwgMC43NzUzOSwgMC44NzE1LCAwLjg3NTA4LCAwLjg5MDQ5LCAxLCAxLCAwLjgxMDU1LCAxLjA0MTA2LCAxLjIwNTI4LCAxLjIwNTI4LCAxLCAxLjE1NTQzLCAwLjcwNjc0LCAwLjk4Mzg3LCAwLjk0NzIxLCAxLjMzNDMxLCAxLjQ1ODk0LCAwLjk1MTYxLCAxLjA2MzAzLCAwLjgzOTA4LCAwLjgwMzUyLCAwLjU3MTg0LCAwLjY5NjUsIDAuNTYyODksIDAuODIwMDEsIDAuNTYwMjksIDAuODEyMzUsIDEuMDI5ODgsIDAuODM5MDgsIDAuNzc2MiwgMC42ODE1NiwgMC44MDM2NywgMC43MzEzMywgMC43ODI1NywgMC44NzM1NiwgMC44Njk0MywgMC45NTk1OCwgMC43NTcyNywgMC44OTAxOSwgMS4wNDkyNCwgMC45MTIxLCAwLjc2NDgsIDAuODY5NDMsIDAuODczNTYsIDAuNzk3OTUsIDAuNzgyNzUsIDAuODEwNTUsIDAuNzc4OTIsIDAuOTc2MiwgMC44MjU3NywgMC45OTgxOSwgMC44NDg5NiwgMC45NTk1OCwgMC43Nzg5MiwgMC45NjEwOCwgMS4wMTQwNywgMC44OTA0OSwgMS4wMjk4OCwgMC45NDIxMSwgMC45NjEwOCwgMC44OTM2LCAwLjg0MDIxLCAwLjg3ODQyLCAwLjk2Mzk5LCAwLjc5MTA5LCAwLjg5MDQ5LCAxLjAwODEzLCAxLjAyOTg4LCAwLjg2MDc3LCAwLjg3NDQ1LCAwLjkyMDk5LCAwLjg0NzIzLCAwLjg2NTEzLCAwLjg4MDEsIDAuNzU2MzgsIDAuODU3MTQsIDAuNzgyMTYsIDAuNzk1ODYsIDAuODc5NjUsIDAuOTQyMTEsIDAuOTc3NDcsIDAuNzgyODcsIDAuOTc5MjYsIDAuODQ5NzEsIDEuMDI5ODgsIDAuOTQyMTEsIDAuODgwMSwgMC45NDIxMSwgMC44NDk3MSwgMC43MzEzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDI2NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDUxOCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDU0OCwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC43Nzg5MiwgMC44NTE2MiwgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDM2MywgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC44NzAxMiwgMC44NzAxMiwgMC44NzAxMiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC43MTE0MywgMS4wNjE1MiwgMSwgMSwgMS4wMzM3MiwgMS4wMzM3MiwgMC45NzE3MSwgMS40OTU2LCAyLjI4MDcsIDAuOTM4MzUsIDAuODM0MDYsIDAuOTExMzMsIDAuODQxMDcsIDAuOTExMzMsIDEsIDEsIDEsIDAuNzIwMjEsIDEsIDEuMjMxMDgsIDAuODM0ODksIDAuODg1MjUsIDAuODg1MjUsIDAuODE0OTksIDAuOTA1MjcsIDEuODEwNTUsIDAuOTA1MjcsIDEuODEwNTUsIDEuMzEwMDYsIDEuNTM3MTEsIDAuOTQ0MzQsIDEuMDg2OTYsIDEsIDAuOTUwMTgsIDAuNzcxOTIsIDAuODUyODQsIDAuOTA3NDcsIDEuMTc1MzQsIDAuNjk4MjUsIDAuOTcxNiwgMS4zNzA3NywgMC45MDc0NywgMC45MDc0NywgMC44NTM1NiwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wODAwNCwgMC45MTAyNywgMSwgMSwgMSwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDcyNywgMC45MDcyNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IENhbGlicmlCb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIyMDcsCiAgbGluZUdhcDogMC4yMjA3Cn07CmNvbnN0IENhbGlicmlCb2xkSXRhbGljRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDAuOTc4MDEsIDAuOTI0ODIsIDAuODk1NTIsIDAuOTExMzMsIDAuODE5ODgsIDAuOTc1NjYsIDAuOTgxNTIsIDAuOTM1NDgsIDAuOTM1NDgsIDEuMjc5OCwgMC44NTI4NCwgMC45Mjc5NCwgMSwgMC45NjEzNCwgMS41NjIzOSwgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC44Mjg0NSwgMC44Mjg0NSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC43NTg1OSwgMC45MjEzOCwgMC44MzkwOCwgMC43NzYyLCAwLjcxODA1LCAwLjg3Mjg5LCAwLjczMTMzLCAwLjc1MTQsIDAuODE5MjEsIDAuODczNTYsIDAuOTU5NTgsIDAuNTk1MjYsIDAuNzU3MjcsIDAuNjkyMjUsIDEuMDQ5MjQsIDAuOTA4NzIsIDAuODU5MzgsIDAuNzk3OTUsIDAuODcwNjgsIDAuNzc5NTgsIDAuNjk3NjYsIDAuODEwNTUsIDAuOTAzOTksIDAuODg2NTMsIDAuOTYwNjgsIDAuODI1NzcsIDAuNzc4OTIsIDAuNzgyNTcsIDAuOTc1MDcsIDEuNTI5LCAwLjk3NTA3LCAwLjg1Mjg0LCAwLjg5NTUyLCAwLjkwMTc2LCAwLjk0OTA4LCAwLjg2NDExLCAwLjc0MDEyLCAwLjg2NDExLCAwLjg4MzIzLCAwLjk1MDE1LCAwLjg2NDExLCAwLjg2MzMxLCAwLjg4NDAxLCAwLjkxOTE2LCAwLjg2MzA0LCAwLjg4NDAxLCAwLjkwMzksIDAuODYzMzEsIDAuODYzMzEsIDAuODY0MTEsIDAuODY0MTEsIDAuOTA0NjQsIDAuNzA4NTIsIDEuMDQxMDYsIDAuODYzMzEsIDAuODQzNzIsIDAuOTU3OTQsIDAuODI2MTYsIDAuODQ1NDgsIDAuNzk0OTIsIDAuODgzMzEsIDEuNjk4MDgsIDAuODgzMzEsIDAuODUyODQsIDAuOTc4MDEsIDAuODk1NTIsIDAuOTExMzMsIDAuODk1NTIsIDAuOTExMzMsIDEuNzgwMSwgMC44OTU1MiwgMS4yNDQ4NywgMS4xMzI1NCwgMS4xOTEyOSwgMC45NjgzOSwgMC44NTI4NCwgMC42ODc4NywgMC43MDY0NSwgMC44NTU5MiwgMC45MDc0NywgMS4wMTQ2NiwgMS4wMDg4LCAwLjkwMzIzLCAxLCAxLjA3NDYzLCAxLCAwLjkxMDU2LCAwLjc1ODA2LCAxLjE5MTE4LCAwLjk2ODM5LCAwLjc4ODY0LCAwLjgyODQ1LCAwLjg0MTMzLCAwLjc1ODU5LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjc3NTM5LCAwLjcxODA1LCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjg4NTA2LCAwLjkwODcyLCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1Mjg0LCAwLjg3MDY4LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjc3ODkyLCAwLjc5Nzk1LCAwLjkwODA3LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjg1ODg3LCAwLjc0MDEyLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg3ODUsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuOTA3NDcsIDAuODkwNDksIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODQ1NDgsIDAuODY0MTEsIDAuODQ1NDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuODcyODksIDAuNzk1MzgsIDAuODg1MDYsIDAuOTI3MjYsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuODE5MjEsIDAuODY0MTEsIDAuODE5MjEsIDAuODY0MTEsIDAuODE5MjEsIDAuODY0MTEsIDEsIDEsIDAuODczNTYsIDAuODYzMzEsIDAuOTEwNzUsIDAuODc3NywgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC43NjQ2NywgMC45MDE2NywgMC41OTUyNiwgMC45MTkxNiwgMSwgMSwgMC44NjMwNCwgMC42OTIyNSwgMC44ODQwMSwgMSwgMSwgMC43MDQyNCwgMC43NzMxMiwgMC45MTkyNiwgMC44ODE3NSwgMC43MDgyMywgMC45NDkwMywgMC45MDg3MiwgMC44NjMzMSwgMSwgMSwgMC45MDg3MiwgMC44NjMzMSwgMC44NjkwNiwgMC44ODExNiwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NzQwMiwgMC44NjU0OSwgMC43Nzk1OCwgMC45MDQ2NCwgMSwgMSwgMC43Nzk1OCwgMC45MDQ2NCwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMSwgMSwgMC44MTA1NSwgMC43NTg0MSwgMC44MTA1NSwgMS4wNjQ1MiwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45NjA2OCwgMC45NTc5NCwgMC43Nzg5MiwgMC44NDU0OCwgMC43Nzg5MiwgMC43ODI1NywgMC43OTQ5MiwgMC43ODI1NywgMC43OTQ5MiwgMC43ODI1NywgMC43OTQ5MiwgMC45Mjk3LCAwLjU2ODkyLCAwLjgzOTA4LCAwLjk0OTA4LCAwLjc3NTM5LCAwLjg1ODg3LCAwLjg3MDY4LCAwLjg5MDQ5LCAxLCAxLCAwLjgxMDU1LCAxLjA0MTA2LCAxLjIwNTI4LCAxLjIwNTI4LCAxLCAxLjE1NTQzLCAwLjcwMDg4LCAwLjk4Mzg3LCAwLjk0NzIxLCAxLjMzNDMxLCAxLjQ1ODk0LCAwLjk1MTYxLCAxLjQ4Mzg3LCAwLjgzOTA4LCAwLjgwMzUyLCAwLjU3MTE4LCAwLjY5NjUsIDAuNTYzNDcsIDAuNzkxNzksIDAuNTU4NTMsIDAuODAzNDYsIDEuMDI5ODgsIDAuODM5MDgsIDAuNzc2MiwgMC42NzE3NCwgMC44NjAzNiwgMC43MzEzMywgMC43ODI1NywgMC44NzM1NiwgMC44NjQ0MSwgMC45NTk1OCwgMC43NTcyNywgMC44OTAxOSwgMS4wNDkyNCwgMC45MDg3MiwgMC43NDg4OSwgMC44NTkzOCwgMC44Nzg5MSwgMC43OTc5NSwgMC43OTU3LCAwLjgxMDU1LCAwLjc3ODkyLCAwLjk3NDQ3LCAwLjgyNTc3LCAwLjk3NDY2LCAwLjg3MTc5LCAwLjk1OTU4LCAwLjc3ODkyLCAwLjk0MjUyLCAwLjk1NjEyLCAwLjg3NTMsIDEuMDI5ODgsIDAuOTI3MzMsIDAuOTQyNTIsIDAuODc0MTEsIDAuODQwMjEsIDAuODcyOCwgMC45NTYxMiwgMC43NDA4MSwgMC44NzUzLCAxLjAyMTg5LCAxLjAyOTg4LCAwLjg0ODE0LCAwLjg3NDQ1LCAwLjkxODIyLCAwLjg0NzIzLCAwLjg1NjY4LCAwLjg2MzMxLCAwLjgxMzQ0LCAwLjg3NTgxLCAwLjc2NDIyLCAwLjgyMDQ2LCAwLjk2MDU3LCAwLjkyNzMzLCAwLjk5Mzc1LCAwLjc4MDIyLCAwLjk1NDUyLCAwLjg2MDE1LCAxLjAyOTg4LCAwLjkyNzMzLCAwLjg2MzMxLCAwLjkyNzMzLCAwLjg2MDE1LCAwLjczMTMzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjkwNjMxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg4MzIzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg1MTc0LCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjc3ODkyLCAwLjg0NTQ4LCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMzYzLCAwLjkyNzk0LCAwLjkyNzk0LCAwLjkyNzk0LCAwLjg5ODA3LCAwLjg3MDEyLCAwLjg3MDEyLCAwLjg3MDEyLCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjcxMDk0LCAxLjA2MTUyLCAxLCAxLCAxLjAzMzcyLCAxLjAzMzcyLCAwLjk3MTcxLCAxLjQ5NTYsIDIuMjgwNywgMC45Mjk3MiwgMC44MzQwNiwgMC45MTEzMywgMC44MzMyNiwgMC45MTEzMywgMSwgMSwgMSwgMC43MjAyMSwgMSwgMS4yMzEwOCwgMC44MzQ4OSwgMC44ODUyNSwgMC44ODUyNSwgMC44MTQ5OSwgMC45MDYxNiwgMS44MTA1NSwgMC45MDUyNywgMS44MTA1NSwgMS4zMTA3LCAxLjUzNzExLCAwLjk0NDM0LCAxLjA4Njk2LCAxLCAwLjk1MDE4LCAwLjc3MTkyLCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE3NTM0LCAwLjY5ODI1LCAwLjk3MTYsIDEuMzcwNzcsIDAuOTA3NDcsIDAuOTA3NDcsIDAuODUzNTYsIDAuOTA3NDcsIDAuOTA3NDcsIDEuNDQ5NDcsIDAuODUyODQsIDAuODk0MSwgMC44OTQxLCAwLjcwNTcyLCAwLjgsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMDgwMDQsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA3MjcsIDAuOTA3MjcsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9Owpjb25zdCBDYWxpYnJpSXRhbGljRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDEuMTcyMjMsIDEuMTI5MywgMC44OTU1MiwgMC45MTEzMywgMC44MDM5NSwgMS4wMjI2OSwgMS4xNTYwMSwgMC45MTA1NiwgMC45MTA1NiwgMS4yNzk4LCAwLjg1Mjg0LCAwLjg5ODA3LCAxLCAwLjkwODYxLCAxLjM5NTQzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjk2MzA5LCAwLjk2MzA5LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjgzMzE5LCAwLjg4MDcxLCAwLjg2NzUsIDAuODE1NTIsIDAuNzIzNDYsIDAuODUxOTMsIDAuNzMyMDYsIDAuNzUyMiwgMC44MTEwNSwgMC44NjI3NSwgMC45MDY4NSwgMC42Mzc3LCAwLjc3ODkyLCAwLjc1NTkzLCAxLjAyNjM4LCAwLjg5MjQ5LCAwLjg0MTE4LCAwLjc3NDUyLCAwLjg1Mzc0LCAwLjc1MTg2LCAwLjY3Nzg5LCAwLjc5Nzc2LCAwLjg4ODQ0LCAwLjg1MDY2LCAwLjk0MzA5LCAwLjc3ODE4LCAwLjczMDYsIDAuNzY2NTksIDEuMTAzNjksIDEuMzgzMTMsIDEuMTAzNjksIDEuMDYxMzksIDAuODk1NTIsIDAuODczOSwgMC45MjQ1LCAwLjkyNDUsIDAuODMyMDMsIDAuOTI0NSwgMC44NTg2NSwgMS4wOTg0MiwgMC45MjQ1LCAwLjkyNDUsIDEuMDMyOTcsIDEuMDc2OTIsIDAuOTA5MTgsIDEuMDMyOTcsIDAuOTQ5NTksIDAuOTI0NSwgMC45MjI3NCwgMC45MjQ1LCAwLjkyNDUsIDEuMDI5MzMsIDAuNzc4MzIsIDEuMjA1NjIsIDAuOTI0NSwgMC44OTE2LCAwLjk4OTg2LCAwLjg2NjIxLCAwLjg5NDUzLCAwLjc5MDA0LCAwLjk0MTUyLCAxLjc3MjU2LCAwLjk0MTUyLCAwLjg1Mjg0LCAwLjk3ODAxLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjg5NTUyLCAwLjkxMTMzLCAxLjkxNzI5LCAwLjg5NTUyLCAxLjE3ODg5LCAxLjEzMjU0LCAxLjE2MzU5LCAwLjkyMDk4LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcxMzUzLCAwLjg0NzM3LCAwLjkwNzQ3LCAxLjAwODgsIDEuMDA0NCwgMC44NzY4MywgMSwgMS4wOTA5MSwgMSwgMC45MjIyOSwgMC43MzksIDEuMTU2NDIsIDAuOTIwOTgsIDAuNzYyODgsIDAuODA1MDQsIDAuODA5NzIsIDAuNzU4NTksIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuNzYzMTgsIDAuNzIzNDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuODY0NzcsIDAuODkyNDksIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODUyODQsIDAuODQ1NTcsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuNzMwNiwgMC43NzQ1MiwgMC44NjMzMSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC44NDg0MywgMC44MzIwMywgMC44NTg2NSwgMC44NTg2NSwgMC44NTg2NSwgMC44NTg2NSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC45NDQ2OSwgMC45MjQ1LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkwNzQ3LCAwLjg2NjUxLCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuODk0NTMsIDAuOTI0NSwgMC44OTQ1MywgMC44Njc1LCAwLjkyNDUsIDAuODY3NSwgMC45MjQ1LCAwLjg2NzUsIDAuOTI0NSwgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC44NTE5MywgMC44ODc1LCAwLjg2NDc3LCAwLjk5MDM0LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjgxMTA1LCAwLjkyNDUsIDAuODExMDUsIDAuOTI0NSwgMC44MTEwNSwgMC45MjQ1LCAxLCAxLCAwLjg2Mjc1LCAwLjkyNDUsIDAuOTA4NzIsIDAuOTM1OTEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDEuMDMyOTcsIDAuOTA2ODUsIDAuODI2MDEsIDAuNzc4OTYsIDEuMDU2MTEsIDAuNjM3NywgMS4wNzY5MiwgMSwgMSwgMC45MDkxOCwgMC43NTU5MywgMS4wMzI5NywgMSwgMSwgMC43NjAzMiwgMC45Mzc1LCAwLjk4MTU2LCAwLjkzNDA3LCAwLjc3MjYxLCAxLjExNDI5LCAwLjg5MjQ5LCAwLjkyNDUsIDEsIDEsIDAuODkyNDksIDAuOTI0NSwgMC45MjUzNCwgMC44NjY5OCwgMC45MjQ1LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg2NjcsIDAuODYyOTEsIDAuNzUxODYsIDEuMDI5MzMsIDEsIDEsIDAuNzUxODYsIDEuMDI5MzMsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDEsIDEsIDAuNzk3NzYsIDAuOTc2NTUsIDAuNzk3NzYsIDEuMjMwMjMsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuOTQzMDksIDAuOTg5ODYsIDAuNzMwNiwgMC44OTQ1MywgMC43MzA2LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAxLjA5MjMxLCAwLjU0ODczLCAwLjg2NzUsIDAuOTI0NSwgMC43NjMxOCwgMC44NDg0MywgMC44NDU1NywgMC44NjY1MSwgMSwgMSwgMC43OTc3NiwgMS4yMDU2MiwgMS4xODYyMiwgMS4xODYyMiwgMSwgMS4xNDM3LCAwLjY3MDA5LCAwLjk2MzM0LCAwLjkzNjk1LCAxLjM1MTkxLCAxLjQwOTA5LCAwLjk1MTYxLCAxLjQ4Mzg3LCAwLjg2NzUsIDAuOTA4NjEsIDAuNjE5MiwgMC43MzYzLCAwLjY0ODI0LCAwLjgyNDExLCAwLjU2MzIxLCAwLjg1Njk2LCAxLjIzNTE2LCAwLjg2NzUsIDAuODE1NTIsIDAuNzI4NiwgMC44NDEzNCwgMC43MzIwNiwgMC43NjY1OSwgMC44NjI3NSwgMC44NDM2OSwgMC45MDY4NSwgMC43Nzg5MiwgMC44NTg3MSwgMS4wMjYzOCwgMC44OTI0OSwgMC43NTgyOCwgMC44NDExOCwgMC44NTk4NCwgMC43NzQ1MiwgMC43NjQ2NiwgMC43OTc3NiwgMC43MzA2LCAwLjkwNzgyLCAwLjc3ODE4LCAwLjkwMywgMC44NzI5MSwgMC45MDY4NSwgMC43MzA2LCAwLjk5MDU4LCAxLjAzNjY3LCAwLjk0NjM1LCAxLjIzNTE2LCAwLjk4NDksIDAuOTkwNTgsIDAuOTIzOTMsIDAuODkxNiwgMC45NDIsIDEuMDM2NjcsIDAuNzUwMjYsIDAuOTQ2MzUsIDEuMDI5NywgMS4yMzUxNiwgMC45MDkxOCwgMC45NDA0OCwgMC45ODIxNywgMC44OTc0NiwgMC44NDE1MywgMC45MjI3NCwgMC44MjUwNywgMC44ODgzMiwgMC44NDQzOCwgMC44ODE3OCwgMS4wMzUyNSwgMC45ODQ5LCAxLjAwMjI1LCAwLjc4MDg2LCAwLjk3MjQ4LCAwLjg5NDA0LCAxLjIzNTE2LCAwLjk4NDksIDAuOTIyNzQsIDAuOTg0OSwgMC44OTQwNCwgMC43MzIwNiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44OTY5MywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NTg2NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDkzMywgMSwgMSwgMSwgMSwgMSwgMSwgMC45NDMwOSwgMC45ODk4NiwgMC45NDMwOSwgMC45ODk4NiwgMC45NDMwOSwgMC45ODk4NiwgMC43MzA2LCAwLjg5NDUzLCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMTg2LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjI1NjYsIDEuMjU2NiwgMS4yNTY2LCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjY4OTk0LCAxLjAzODA5LCAxLCAxLCAxLjAxNzYsIDEuMDE3NiwgMS4xMTUyMywgMS40OTU2LCAyLjAxNDYyLCAwLjk3ODU4LCAwLjgyNjE2LCAwLjkxMTMzLCAwLjgzNDM3LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcwNTA4LCAxLCAxLjIzMTA4LCAwLjc5ODAxLCAwLjg0NDI2LCAwLjg0NDI2LCAwLjc3NCwgMC45MDU3MiwgMS44MTA1NSwgMC45MDc0OSwgMS44MTA1NSwgMS4yODgwOSwgMS41NTQ2OSwgMC45NDQzNCwgMS4wNzgwNiwgMSwgMC45NzA5NCwgMC43NTg5LCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE5NjU4LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjMzNTEyLCAwLjkwNzQ3LCAwLjkwNzQ3LCAwLjg1Mjg0LCAwLjkwNzQ3LCAwLjkwNzQ3LCAxLjQ0OTQ3LCAwLjg1Mjg0LCAwLjg5NDEsIDAuODk0MSwgMC43MDU3MiwgMC44LCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjAzMzYsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDU4NTksIDEuMDU4NTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIyMDcsCiAgbGluZUdhcDogMC4yMjA3Cn07CmNvbnN0IENhbGlicmlSZWd1bGFyRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDEuMTcyMjMsIDEuMTI5MywgMC44OTU1MiwgMC45MTEzMywgMC44MDM5NSwgMS4wMjI2OSwgMS4xNTYwMSwgMC45MTA1NiwgMC45MTA1NiwgMS4yNzk4LCAwLjg1Mjg0LCAwLjg5ODA3LCAxLCAwLjkwODYxLCAxLjM5MDE2LCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjk2MzA5LCAwLjk2MzA5LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjgzMzE5LCAwLjg4MDcxLCAwLjg2NzUsIDAuODE1NTIsIDAuNzM4MzQsIDAuODUxOTMsIDAuNzMyMDYsIDAuNzUyMiwgMC44MTEwNSwgMC44NjI3NSwgMC45MDY4NSwgMC42Mzc3LCAwLjc3ODkyLCAwLjc1NTkzLCAxLjAyNjM4LCAwLjg5Mzg1LCAwLjg1MTIyLCAwLjc3NDUyLCAwLjg2NTAzLCAwLjc1MTg2LCAwLjY4ODg3LCAwLjc5Nzc2LCAwLjg4ODQ0LCAwLjg1MDY2LCAwLjk0MjU4LCAwLjc3ODE4LCAwLjczMDYsIDAuNzY2NTksIDEuMTAzNjksIDEuMzkwMTYsIDEuMTAzNjksIDEuMDYxMzksIDAuODk1NTIsIDAuODczOSwgMC44NjEyOCwgMC45NDQ2OSwgMC44NDU3LCAwLjk0NDY5LCAwLjg5NDY0LCAxLjA5ODQyLCAwLjg0NjM2LCAwLjk0NDY5LCAxLjAzMjk3LCAxLjA3NjkyLCAwLjkwOTE4LCAxLjAzMjk3LCAwLjk1ODk3LCAwLjk0NDY5LCAwLjk0ODIsIDAuOTQ0NjksIDAuOTQ0NjksIDEuMDQ2OTIsIDAuNzgyMjMsIDEuMjA1NjIsIDAuOTQ0NjksIDAuOTAzMzIsIDAuOTg5ODYsIDAuODY2MjEsIDAuOTA1MjcsIDAuNzkwMDQsIDAuOTQxNTIsIDEuNzcyNTYsIDAuOTQxNTIsIDAuODUyODQsIDAuOTc4MDEsIDAuODk1NTIsIDAuOTExMzMsIDAuODk1NTIsIDAuOTExMzMsIDEuOTE3MjksIDAuODk1NTIsIDEuMTc4ODksIDEuMTMyNTQsIDEuMDg3MDcsIDAuOTIwOTgsIDAuODUyODQsIDAuNjg3ODcsIDAuNzEzNTMsIDAuODQ3MzcsIDAuOTA3NDcsIDEuMDA4OCwgMS4wMDQ0LCAwLjg3NjgzLCAxLCAxLjA5MDkxLCAxLCAwLjkyMjI5LCAwLjczOSwgMS4xNTY0MiwgMC45MjA5OCwgMC43NjI4OCwgMC44MDUwNCwgMC44MDk3MiwgMC43NTg1OSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC43NjMxOCwgMC43MzgzNCwgMC43MzIwNiwgMC43MzIwNiwgMC43MzIwNiwgMC43MzIwNiwgMC45MDY4NSwgMC45MDY4NSwgMC45MDY4NSwgMC45MDY4NSwgMC44NjQ3NywgMC44OTM4NSwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTI4NCwgMC44NTMxMSwgMC44ODg0NCwgMC44ODg0NCwgMC44ODg0NCwgMC44ODg0NCwgMC43MzA2LCAwLjc3NDUyLCAwLjg2MzMxLCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2OTMsIDAuODQ1NywgMC44OTQ2NCwgMC44OTQ2NCwgMC44OTQ2NCwgMC44OTQ2NCwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC45NDQ2OSwgMC45NDQ2OSwgMC45NDgyLCAwLjk0ODIsIDAuOTQ4MiwgMC45NDgyLCAwLjk0ODIsIDAuOTA3NDcsIDAuODY2NTEsIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTA1MjcsIDAuOTQ0NjksIDAuOTA1MjcsIDAuODY3NSwgMC44NjEyOCwgMC44Njc1LCAwLjg2MTI4LCAwLjg2NzUsIDAuODYxMjgsIDAuNzM4MzQsIDAuODQ1NywgMC43MzgzNCwgMC44NDU3LCAwLjczODM0LCAwLjg0NTcsIDAuNzM4MzQsIDAuODQ1NywgMC44NTE5MywgMC45MjQ1NCwgMC44NjQ3NywgMC45OTIxLCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjgxMTA1LCAwLjg0NjM2LCAwLjgxMTA1LCAwLjg0NjM2LCAwLjgxMTA1LCAwLjg0NjM2LCAxLCAxLCAwLjg2Mjc1LCAwLjk0NDY5LCAwLjkwODcyLCAwLjk1Nzg2LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAxLjAzMjk3LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjc3NzQxLCAxLjA1NjExLCAwLjYzNzcsIDEuMDc2OTIsIDEsIDEsIDAuOTA5MTgsIDAuNzU1OTMsIDEuMDMyOTcsIDEsIDEsIDAuNzYwMzIsIDAuOTA0NTIsIDAuOTgxNTYsIDEuMTE4NDIsIDAuNzcyNjEsIDEuMTE0MjksIDAuODkzODUsIDAuOTQ0NjksIDEsIDEsIDAuODkzODUsIDAuOTQ0NjksIDAuOTU4NzcsIDAuODY5MDEsIDAuOTQ0NjksIDAuODUxMjIsIDAuOTQ4MiwgMC44NTEyMiwgMC45NDgyLCAwLjg1MTIyLCAwLjk0ODIsIDAuODY2NywgMC45MDAxNiwgMC43NTE4NiwgMS4wNDY5MiwgMSwgMSwgMC43NTE4NiwgMS4wNDY5MiwgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMSwgMSwgMC43OTc3NiwgMC45MjE4OCwgMC43OTc3NiwgMS4yMzAyMywgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC45NDI1OCwgMC45ODk4NiwgMC43MzA2LCAwLjkwNTI3LCAwLjczMDYsIDAuNzY2NTksIDAuNzkwMDQsIDAuNzY2NTksIDAuNzkwMDQsIDAuNzY2NTksIDAuNzkwMDQsIDEuMDkyMzEsIDAuNTQ4NzMsIDAuODY3NSwgMC44NjEyOCwgMC43NjMxOCwgMC44NjkzLCAwLjg1MzExLCAwLjg2NjUxLCAxLCAxLCAwLjc5Nzc2LCAxLjIwNTYyLCAxLjE4NjIyLCAxLjE4NjIyLCAxLCAxLjE0MzcsIDAuNjc3NDIsIDAuOTYzMzQsIDAuOTM2OTUsIDEuMzUxOTEsIDEuNDA5MDksIDAuOTUxNjEsIDEuNDgzODcsIDAuODY2ODYsIDAuOTA4NjEsIDAuNjIyNjcsIDAuNzQzNTksIDAuNjU2NDksIDAuODU0OTgsIDAuNTY5NjMsIDAuODgyNTQsIDEuMjM1MTYsIDAuODY3NSwgMC44MTU1MiwgMC43NTQ0MywgMC44NDUwMywgMC43MzIwNiwgMC43NjY1OSwgMC44NjI3NSwgMC44NTEyMiwgMC45MDY4NSwgMC43Nzg5MiwgMC44NTc0NiwgMS4wMjYzOCwgMC44OTM4NSwgMC43NTY1NywgMC44NTEyMiwgMC44NjI3NSwgMC43NzQ1MiwgMC43NDE3MSwgMC43OTc3NiwgMC43MzA2LCAwLjk1MTY1LCAwLjc3ODE4LCAwLjg5NzcyLCAwLjg4ODMxLCAwLjkwNjg1LCAwLjczMDYsIDAuOTgxNDIsIDEuMDIxOTEsIDAuOTY1NzYsIDEuMjM1MTYsIDAuOTkwMTgsIDAuOTgxNDIsIDAuOTIzNiwgMC44OTI1OCwgMC45NDAzNSwgMS4wMjE5MSwgMC43ODg0OCwgMC45NjU3NiwgMC45NTYxLCAxLjIzNTE2LCAwLjkwOTE4LCAwLjkyNTc4LCAwLjk1NDI0LCAwLjg5NzQ2LCAwLjgzOTY5LCAwLjk0ODIsIDAuODAxMTMsIDAuODk0NDIsIDAuODUyMDgsIDAuODYxNTUsIDAuOTgwMjIsIDAuOTkwMTgsIDEuMDA0NTIsIDAuODEyMDksIDAuOTkyNDcsIDAuODkxODEsIDEuMjM1MTYsIDAuOTkwMTgsIDAuOTQ4MiwgMC45OTAxOCwgMC44OTE4MSwgMC43MzIwNiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44ODg0NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44OTQ2NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45Njc2NiwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NDI1OCwgMC45ODk4NiwgMC45NDI1OCwgMC45ODk4NiwgMC45NDI1OCwgMC45ODk4NiwgMC43MzA2LCAwLjkwNTI3LCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMTg2LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjI1NjYsIDEuMjU2NiwgMS4yNTY2LCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjY5MDQzLCAxLjAzODA5LCAxLCAxLCAxLjAxNzYsIDEuMDE3NiwgMS4xMTUyMywgMS40OTU2LCAyLjAxNDYyLCAwLjk5MzMxLCAwLjgyNjE2LCAwLjkxMTMzLCAwLjg0Mjg2LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcwNTA4LCAxLCAxLjIzMTA4LCAwLjc5ODAxLCAwLjg0NDI2LCAwLjg0NDI2LCAwLjc3NCwgMC45MDUyNywgMS44MTA1NSwgMC45MDUyNywgMS44MTA1NSwgMS4yODgwOSwgMS41NTQ2OSwgMC45NDQzNCwgMS4wNzgwNiwgMSwgMC45NzA5NCwgMC43NTg5LCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE5NjU4LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjMzNTEyLCAwLjkwNzQ3LCAwLjkwNzQ3LCAwLjg1MzU2LCAwLjkwNzQ3LCAwLjkwNzQ3LCAxLjQ0OTQ3LCAwLjg1Mjg0LCAwLjg5NDEsIDAuODk0MSwgMC43MDU3MiwgMC44LCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjAzMzYsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDU4NTksIDEuMDU4NTksIDEsIDEsIDEsIDEuMDcxODUsIDAuOTk0MTMsIDAuOTYzMzQsIDEuMDgwNjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9OwoKOy8vIC4vc3JjL2NvcmUvaGVsdmV0aWNhX2ZhY3RvcnMuanMKY29uc3QgSGVsdmV0aWNhQm9sZEZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTc0LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAwLjk5OTc3LCAxLjAwMDg3LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTU5LCAxLjAwMDAzLCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTk4LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDI2LCAwLjk5OTksIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMS4wMDAyNiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAwMSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAxNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTgyLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTU5LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTU5LCAxLjAwMDc3LCAwLjk5OTU5LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDc3LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI1LCAwLjk5OTY4LCAwLjk5OTczLCAxLjAwMDAzLCAxLjAwMDI1LCAwLjYwMjk5LCAxLjAwMDI0LCAxLjA2NDA5LCAxLCAxLCAwLjk5OTk4LCAxLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjA2NDA5LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAxLjAzMzc0LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNDIsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDM4MjgsIDEuMDAwMjYsIDAuOTk5OTksIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTkzLCAwLjk5OTgsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5OTgsIDEuMDAwMjYsIDAuODEyMSwgMS4wMDAyNiwgMC45OTk5OCwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLjAwMDM0LCAwLjk5OTc3LCAxLCAwLjk5OTk3LCAxLjAwMDI2LCAxLjAwMDc4LCAxLjAwMDM2LCAwLjk5OTczLCAxLjAwMDEzLCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5ODgsIDAuODUxNDgsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMS4wMDA2OSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk4NCwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAyNCwgMS4wMDAwMSwgMC45OTk5LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDEuMDAwNDEsIDAuOTk5NjIsIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk5NSwgMS4wMDA0MSwgMC45OTk0MiwgMC45OTk3MywgMC45OTkyNywgMS4wMDA4MiwgMC45OTkwMiwgMS4wMDAyNiwgMS4wMDA4NywgMS4wMDA2LCAxLjAwMDY5LCAwLjk5OTczLCAwLjk5ODY3LCAwLjk5OTczLCAwLjk5OTMsIDEuMDAwMjYsIDEuMDAwNDksIDEuMDAwNTYsIDEsIDAuOTk5ODgsIDAuOTk5MzUsIDAuOTk5OTUsIDAuOTk5NTQsIDEuMDAwNTUsIDAuOTk5NDUsIDEuMDAwMzIsIDEuMDAwNiwgMC45OTk5NSwgMS4wMDAyNiwgMC45OTk5NSwgMS4wMDAzMiwgMS4wMDAwMSwgMS4wMDAwOCwgMC45OTk3MSwgMS4wMDAxOSwgMC45OTk0LCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNDQsIDAuOTk5NzMsIDEuMDAwMjMsIDEuMDAwNDcsIDEsIDAuOTk5NDIsIDAuOTk1NjEsIDAuOTk5ODksIDEuMDAwMzUsIDAuOTk5NzcsIDEuMDAwMzUsIDAuOTk5NzcsIDEuMDAwMTksIDAuOTk5NDQsIDEuMDAwMDEsIDEuMDAwMjEsIDAuOTk5MjYsIDEuMDAwMzUsIDEuMDAwMzUsIDAuOTk5NDIsIDEuMDAwNDgsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5ODksIDEuMDAwNTcsIDEuMDAwMDEsIDAuOTk5MzYsIDEuMDAwNTIsIDEuMDAwMTIsIDAuOTk5OTYsIDEuMDAwNDMsIDEsIDEuMDAwMzUsIDAuOTk5NCwgMC45OTk3NiwgMS4wMDAzNSwgMC45OTk3MywgMS4wMDA1MiwgMS4wMDA0MSwgMS4wMDExOSwgMS4wMDAzNywgMC45OTk3MywgMS4wMDAwMiwgMC45OTk4NiwgMS4wMDA0MSwgMS4wMDA0MSwgMC45OTkwMiwgMC45OTk2LCAxLjAwMDM0LCAwLjk5OTk5LCAxLjAwMDI2LCAwLjk5OTk5LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDUyLCAwLjk5OTczLCAxLCAwLjk5OTczLCAxLjAwMDQxLCAxLjAwMDc1LCAwLjk5OTQsIDEuMDAwMywgMC45OTk5OSwgMSwgMS4wMDA0MSwgMC45OTk1NSwgMSwgMC45OTkxNSwgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMS4wMDExOSwgMC45OTk1NSwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTExLCAxLjAwMDYsIDEuMDAwMjYsIDAuOTk5NzIsIDEuMDAwMjYsIDAuOTk5MDIsIDEuMDAwNDEsIDAuOTk5NzMsIDAuOTk5OTksIDEsIDEsIDEuMDAwMzgsIDEuMDAwNSwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMSwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk1NSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMTA2LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk5LCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAwLjk5OTcxLCAxLjAwMDQ3LCAxLjAwMDIzLCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTcyLCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAxLjAwMDMxLCAxLjAwMDE1LCAxLCAwLjk5NTYxLCAxLjAwMDI3LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTE1LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTk5LCAxLjAwMDAzLCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQxMTQ0LCAxLjYsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDA1NzksIDEuNDA1NzksIDEuMzY2MjUsIDAuOTk5OTksIDEsIDAuOTk4NjEsIDAuOTk4NjEsIDEsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzIsIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDEuNDA0ODMsIDEsIDAuOTk5NzcsIDEuMDAwNTQsIDEsIDEsIDAuOTk5NTMsIDAuOTk5NjIsIDEuMDAwNDIsIDAuOTk5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IEhlbHZldGljYUJvbGRNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKY29uc3QgSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTc0LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAwLjk5OTc3LCAxLjAwMDg3LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTU5LCAxLjAwMDAzLCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTk4LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDI2LCAwLjk5OTksIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMS4wMDAyNiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAwMSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAxNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTgyLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTU5LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTU5LCAxLjAwMDc3LCAwLjk5OTU5LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDc3LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI1LCAwLjk5OTY4LCAwLjk5OTczLCAxLjAwMDAzLCAxLjAwMDI1LCAwLjYwMjk5LCAxLjAwMDI0LCAxLjA2NDA5LCAxLCAxLCAwLjk5OTk4LCAxLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjA2NDA5LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAxLjAwNDQsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MSwgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMTAxMSwgMS4wMDAyNiwgMC45OTk5OSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTMsIDAuOTk5OCwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMSwgMS4wMDAxNiwgMC45OTk3NywgMC45OTk1OSwgMC45OTk3NywgMC45OTk1OSwgMC45OTk3NywgMC45OTk1OSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDAyNiwgMC44MTIxLCAxLjAwMDI2LCAwLjk5OTk4LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDE2LCAxLjAwMDIyLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDEsIDAuOTk5ODIsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NzcsIDEsIDEsIDEuMDAwMjYsIDAuOTk5NjksIDAuOTk5NzIsIDAuOTk5ODEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDIyLCAwLjkxMTU1LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzcsIDAuOTk5NjYsIDEuMDAwMjIsIDEuMDAwMzIsIDEuMDAwMDEsIDAuOTk5NDQsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NjgsIDEuMDAwMDEsIDEuMDAwNDcsIDEsIDEuMDAwNiwgMS4wMDAwMSwgMC45OTk4MSwgMS4wMDEwMSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTQ4LCAwLjk5OTgxLCAxLjAwMDY0LCAwLjk5OTczLCAwLjk5OTQyLCAxLjAwMTAxLCAxLjAwMDYxLCAxLjAwMDI2LCAxLjAwMDY5LCAxLjAwMDYsIDEuMDAwMTQsIDAuOTk5NzMsIDEuMDEzMjIsIDAuOTk5NzMsIDEuMDAwNjUsIDEuMDAwMjYsIDEuMDAwMTIsIDAuOTk5MjMsIDEsIDEuMDAwNjQsIDEuMDAwNzYsIDAuOTk5NDgsIDEuMDAwNTUsIDEuMDAwNjMsIDEuMDAwMDcsIDAuOTk5NDMsIDEuMDAwNiwgMC45OTk0OCwgMS4wMDAyNiwgMC45OTk0OCwgMC45OTk0MywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyOSwgMS4wMDAzOCwgMS4wMDAzNSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzgsIDEuMDAwMDEsIDEuMDAwNTcsIDAuOTk5ODksIDAuOTk5NjcsIDAuOTk5NjQsIDAuOTk5NjcsIDAuOTk5NzcsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMzgsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwNjYsIDAuOTk5NjcsIDAuOTk5NjcsIDEuMDAwNDEsIDAuOTk5OTgsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDAuOTk5NjcsIDEuMDAwMDEsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NjQsIDEuMDAwMzEsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5OTksIDEsIDEuMDAwMjMsIDEsIDEsIDAuOTk5OTksIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5OTksIDEuMDAwNTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NTUsIDAuOTk5NSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAzMiwgMC45OTk4OSwgMS4wMDAzNCwgMC45OTk5OSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk3MywgMC40NTk5OCwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk4MiwgMC45OTk5NCwgMC45OTk5NiwgMSwgMS4wMDA0MiwgMS4wMDA0NCwgMS4wMDAyOSwgMS4wMDAyMywgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMC45OTk0OSwgMS4wMDAwMiwgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAzMiwgMC45ODY4NSwgMC45OTk3MywgMS4wMDAyNiwgMSwgMSwgMC45OTk2NiwgMS4wMDA0NCwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMSwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk1NSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMTA2LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk5LCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTcxLCAwLjk5OTc4LCAxLCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDk4LCAxLCAxLCAxLCAxLjAwMDQ5LCAxLCAxLCAwLjk5OTcyLCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAxLjAwMDMxLCAxLjAwMDE1LCAxLCAwLjk5NTYxLCAxLjAwMDI3LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTE1LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTk5LCAxLjAwMDAzLCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQxMTQ0LCAxLjYsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDA1NzksIDEuNDA1NzksIDEuMzY2MjUsIDAuOTk5OTksIDEsIDAuOTk4NjEsIDAuOTk4NjEsIDEsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzIsIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDEuNDA0ODMsIDEsIDAuOTk5NzcsIDEuMDAwNTQsIDEsIDEsIDAuOTk5NTMsIDAuOTk5NjIsIDEuMDAwNDIsIDAuOTk5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IEhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzUsCiAgbGluZUdhcDogMC4yCn07CmNvbnN0IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEuMDAwMDEsIDEuMDAwNDMsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NTksIDEuMDAwMDMsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMC45OTk3MywgMC45OTk4NywgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDA2LCAxLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDAxLCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDE2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ5LCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDAuOTk5MjQsIDEsIDAuOTk5MjQsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5OTgsIDEsIDEuMDAwNiwgMC45OTk3MywgMSwgMC45OTk3NywgMSwgMSwgMSwgMS4wMDAwNSwgMS4wMDA5LCAxLjAwMDA1LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDksIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjUsIDAuOTk5NjgsIDAuOTk5NzMsIDEuMDAwMDMsIDEuMDAwMjUsIDAuNjAyOTksIDEuMDAwMjQsIDEuMDY0MDksIDEsIDEsIDAuOTk5OTgsIDEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wNjQwOSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk3MywgMSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMS4wMjg4LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ2LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjA2MzExLCAwLjk5OTczLCAxLjAwMDI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQxLCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44OTU0NywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwNTQsIDAuOTk5NzcsIDEuMDAwODQsIDEuMDAwMDcsIDAuOTk5NzMsIDEuMDAwMTMsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTEyMjEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMC45OTkzMywgMS4wMDAyMiwgMS4wMDA1NCwgMS4wMDAwMSwgMS4wMDA2NSwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAxLCAxLjAwMDAxLCAxLjAwMDUyLCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTk4OTcsIDAuOTk5NjgsIDAuOTk5MjQsIDEuMDAwMzYsIDAuOTk5NDUsIDAuOTk5NDksIDEsIDEuMDAwNiwgMC45OTg5NywgMC45OTkxOCwgMC45OTk2OCwgMC45OTkxMSwgMC45OTkyNCwgMSwgMC45OTk2MiwgMS4wMTQ4NywgMSwgMS4wMDA1LCAwLjk5OTczLCAxLjAwMDEyLCAxLjAwMDQzLCAxLCAwLjk5OTk1LCAwLjk5OTk0LCAxLjAwMDM2LCAwLjk5OTQ3LCAxLjAwMDE5LCAxLjAwMDYzLCAxLjAwMDI1LCAwLjk5OTI0LCAxLjAwMDM2LCAwLjk5OTczLCAxLjAwMDM2LCAxLjAwMDI1LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI3LCAxLjAwMDEsIDEuMDAwNjgsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLjAwMDA4LCAwLjk5OTU3LCAwLjk5OTcyLCAwLjk5OTQsIDAuOTk5NTQsIDAuOTk5NzUsIDEuMDAwNTEsIDEuMDAwMDEsIDEuMDAwMTksIDEuMDAwMDEsIDEuMDAwMSwgMC45OTk4NiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAzOCwgMC45OTk1NCwgMC45OTk1NCwgMC45OTk0LCAxLjAwMDY2LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDU0LCAxLjAwMDAxLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc1LCAxLjAwMDEsIDEuMDAwMDEsIDAuOTk5OTMsIDAuOTk5NSwgMC45OTk1NSwgMS4wMDAxNiwgMC45OTk3OCwgMC45OTk3NCwgMS4wMDAxOSwgMS4wMDAyMiwgMC45OTk1NSwgMS4wMDA1MywgMC45OTk3MywgMS4wMDA4OSwgMS4wMDAwNSwgMC45OTk2NywgMS4wMDA0OCwgMC45OTk3MywgMS4wMDAwMiwgMS4wMDAzNCwgMC45OTk3MywgMC45OTk3MywgMC45OTk2NCwgMS4wMDAwNiwgMS4wMDA2NiwgMC45OTk0NywgMC45OTk3MywgMC45ODg5NCwgMC45OTk3MywgMSwgMC40NDg5OCwgMSwgMC45OTk0NiwgMSwgMS4wMDAzOSwgMS4wMDA4MiwgMC45OTk5MSwgMC45OTk5MSwgMC45OTk4NSwgMS4wMDAyMiwgMS4wMDAyMywgMS4wMDA2MSwgMS4wMDAwNiwgMC45OTk2NiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDAxOSwgMS4wMDA4LCAxLCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTgzLCAxLjAwMDQ0LCAwLjk5OTczLCAwLjk5OTY0LCAwLjk4MzMyLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTYyLCAwLjk5ODk1LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTU1LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMjY3LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAxLjAwNDIzLCAwLjk5OTI1LCAwLjk5OTk5LCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDQ5LCAxLCAxLjAwMjQ1LCAxLCAxLCAxLCAxLCAwLjk2MzI5LCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAwLjgyNTQsIDEuMDAwMTUsIDEsIDEuMDAwMzUsIDEuMDAwMjcsIDEuMDAwMzEsIDEuMDAwMzEsIDEuMDAwMDMsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5OTksIDEuMDAwMDMsIDAuOTk5OTksIDAuOTk5OTksIDEuNDExNDQsIDEuNiwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MDU3OSwgMS40MDU3OSwgMS4zNjYyNSwgMC45OTk5OSwgMSwgMC45OTg2MSwgMC45OTg2MSwgMSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45NTMxNywgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMS40MDQ4MywgMSwgMC45OTk3NywgMS4wMDA1NCwgMSwgMSwgMC45OTk1MywgMC45OTk2MiwgMS4wMDA0MiwgMC45OTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgSGVsdmV0aWNhSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjM1LAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBIZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycyA9IFswLjc2MTE2LCAxLCAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMS4wMDAwMSwgMS4wMDA0MywgMC45OTk5OCwgMC45OTk5OCwgMC45OTk1OSwgMS4wMDAwMywgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTg3LCAxLjAwMDAxLCAxLjAwMDAxLCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDYsIDEsIDEuMDAwMDEsIDAuOTk5NzMsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMDEsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMTYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NDksIDAuOTk5NzMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTkyNCwgMC45OTkyNCwgMSwgMC45OTkyNCwgMC45OTk5OSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk5OCwgMSwgMS4wMDA2LCAwLjk5OTczLCAxLCAwLjk5OTc3LCAxLCAxLCAxLCAxLjAwMDA1LCAxLjAwMDksIDEuMDAwMDUsIDEuMDAwMDMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwOSwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNSwgMC45OTk2OCwgMC45OTk3MywgMS4wMDAwMywgMS4wMDAyNSwgMC42MDI5OSwgMS4wMDAyNCwgMS4wNjQwOSwgMSwgMSwgMC45OTk5OCwgMSwgMC45OTk4LCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjA2NDA5LCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAxLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLjA0NTk2LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDE5LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAyNTcyLCAwLjk5OTczLCAxLjAwMDA1LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44NDUzMywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5MjgsIDEsIDAuOTk5NzcsIDEuMDAwMTMsIDEuMDAwNTUsIDAuOTk5NDcsIDAuOTk5NDUsIDAuOTk5NDEsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNCwgMC45MTYyMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDA2LCAxLjAwMDAxLCAxLjAwMDA1LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDE1LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDE5LCAxLjAwMDAxLCAwLjk5OTQ2LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NzgsIDEuMDAwNDUsIDAuOTk5NzMsIDAuOTk5MjQsIDEuMDAwMjMsIDAuOTk5NzgsIDAuOTk5NjYsIDEsIDEuMDAwNjUsIDEuMDAwNDUsIDEuMDAwMTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDEsIDEsIDAuOTY0OTksIDEsIDEuMDAwNTUsIDAuOTk5NzMsIDEuMDAwMDgsIDEuMDAwMjcsIDEsIDAuOTk5NywgMC45OTk5NSwgMS4wMDAyMywgMC45OTkzMywgMS4wMDAxOSwgMS4wMDAxNSwgMS4wMDAzMSwgMC45OTkyNCwgMS4wMDAyMywgMC45OTk3MywgMS4wMDAyMywgMS4wMDAzMSwgMS4wMDAwMSwgMC45OTkyOCwgMS4wMDAyOSwgMS4wMDA5MiwgMS4wMDAzNSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDEsIDAuOTk5ODgsIDAuOTk5NzUsIDEsIDEuMDAwODIsIDAuOTk1NjEsIDAuOTk5NiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk2MiwgMS4wMDAwMSwgMS4wMDA5MiwgMC45OTk2NCwgMS4wMDAwMSwgMC45OTk2MywgMC45OTk5OSwgMS4wMDAzNSwgMS4wMDAzNSwgMS4wMDA4MiwgMC45OTk2MiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk2LCAwLjk5OTY3LCAxLjAwMDAxLCAxLjAwMDM0LCAxLjAwMDc0LCAxLjAwMDU0LCAxLjAwMDUzLCAxLjAwMDYzLCAwLjk5OTcxLCAwLjk5OTYyLCAxLjAwMDM1LCAwLjk5OTc1LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQzLCAwLjk5OTUzLCAxLjAwMDcsIDAuOTk5MTUsIDAuOTk5NzMsIDEuMDAwMDgsIDAuOTk4OTIsIDEuMDAwNzMsIDEuMDAwNzMsIDEuMDAxMTQsIDAuOTk5MTUsIDEuMDAwNzMsIDAuOTk5NTUsIDAuOTk5NzMsIDEuMDAwOTIsIDAuOTk5NzMsIDEsIDAuOTk5OTgsIDEsIDEuMDAwMywgMSwgMS4wMDA0MywgMS4wMDAwMSwgMC45OTk2OSwgMS4wMDAzLCAxLCAxLjAwMDM1LCAxLjAwMDAxLCAwLjk5OTUsIDEsIDEuMDAwOTIsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNywgMC45OTk1LCAxLCAwLjk5OTI0LCAxLjAwMDYsIDAuOTk5MjQsIDAuOTk5NzIsIDEuMDAwNjIsIDAuOTk5NzMsIDEuMDAxMTQsIDEuMDAwNzMsIDEsIDAuOTk5NTUsIDEsIDEsIDEuMDAwNDcsIDAuOTk5NjgsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMDEsIDEsIDEsIDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NTUsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzIsIDEsIDEsIDEuMDAyNjcsIDAuOTk5OTksIDAuOTk5OTgsIDAuOTk5OTgsIDEsIDAuOTk5OTgsIDEuNjY0NzUsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjMsIDAuOTk5NzMsIDAuOTk5NzEsIDAuOTk5MjUsIDEuMDAwMjMsIDEsIDAuOTk5OTEsIDAuOTk5ODQsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTYzMjksIDEsIDEuMjA5ODUsIDEuMzk3MTMsIDEuMDAwMDMsIDAuODI1NCwgMS4wMDAxNSwgMSwgMS4wMDAzNSwgMS4wMDAyNywgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTkxNSwgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTk5OSwgMS4wMDAwMywgMC45OTk5OSwgMC45OTk5OSwgMS40MTE0NCwgMS42LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQwNTc5LCAxLjQwNTc5LCAxLjM2NjI1LCAwLjk5OTk5LCAxLCAwLjk5ODYxLCAwLjk5ODYxLCAxLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk1MzE3LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQwNDgzLCAxLCAwLjk5OTc3LCAxLjAwMDU0LCAxLCAxLCAwLjk5OTUzLCAwLjk5OTYyLCAxLjAwMDQyLCAwLjk5OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBIZWx2ZXRpY2FSZWd1bGFyTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07Cgo7Ly8gLi9zcmMvY29yZS9saWJlcmF0aW9uc2Fuc193aWR0aHMuanMKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDMzMywgNDc0LCA1NTYsIDU1NiwgODg5LCA3MjIsIDIzOCwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCAzMzMsIDU4NCwgNTg0LCA1ODQsIDYxMSwgOTc1LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1NTYsIDcyMiwgNjExLCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMzMzLCAyNzgsIDMzMywgNTg0LCA1NTYsIDMzMywgNTU2LCA2MTEsIDU1NiwgNjExLCA1NTYsIDMzMywgNjExLCA2MTEsIDI3OCwgMjc4LCA1NTYsIDI3OCwgODg5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDM4OSwgNTU2LCAzMzMsIDYxMSwgNTU2LCA3NzgsIDU1NiwgNTU2LCA1MDAsIDM4OSwgMjgwLCAzODksIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI4MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDU1NiwgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNzIyLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTQ5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTU2LCA2MTEsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNzE5LCA3MjIsIDYxMSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDc4NSwgNTU2LCA1NTYsIDI3OCwgNzIyLCA1NTYsIDU1NiwgNjExLCAyNzgsIDYxMSwgMjc4LCA2MTEsIDM4NSwgNjExLCA0NzksIDYxMSwgMjc4LCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MDgsIDcyMywgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCAxMDAwLCA5NDQsIDcyMiwgMzg5LCA3MjIsIDM4OSwgNzIyLCAzODksIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2MTEsIDMzMywgNjExLCA0NzksIDYxMSwgMzMzLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA5NDQsIDc3OCwgNjY3LCA1NTYsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjc4LCA1NTYsIDcyMiwgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDU1NiwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgNDY1LCA3MjIsIDMzMywgODUzLCA5MDYsIDQ3NCwgODI1LCA5MjcsIDgzOCwgMjc4LCA3MjIsIDcyMiwgNjAxLCA3MTksIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA3MjIsIDY2NywgODMzLCA3MjIsIDY0NCwgNzc4LCA3MjIsIDY2NywgNjAwLCA2MTEsIDY2NywgODIxLCA2NjcsIDgwOSwgODAyLCAyNzgsIDY2NywgNjE1LCA0NTEsIDYxMSwgMjc4LCA1ODIsIDYxNSwgNjEwLCA1NTYsIDYwNiwgNDc1LCA0NjAsIDYxMSwgNTQxLCAyNzgsIDU1OCwgNTU2LCA2MTIsIDU1NiwgNDQ1LCA2MTEsIDc2NiwgNjE5LCA1MjAsIDY4NCwgNDQ2LCA1ODIsIDcxNSwgNTc2LCA3NTMsIDg0NSwgMjc4LCA1ODIsIDYxMSwgNTgyLCA4NDUsIDY2NywgNjY5LCA4ODUsIDU2NywgNzExLCA2NjcsIDI3OCwgMjc2LCA1NTYsIDEwOTQsIDEwNjIsIDg3NSwgNjEwLCA3MjIsIDYyMiwgNzE5LCA3MjIsIDcxOSwgNzIyLCA1NjcsIDcxMiwgNjY3LCA5MDQsIDYyNiwgNzE5LCA3MTksIDYxMCwgNzAyLCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDYyMiwgODU0LCA2NjcsIDczMCwgNzAzLCAxMDA1LCAxMDE5LCA4NzAsIDk3OSwgNzE5LCA3MTEsIDEwMzEsIDcxOSwgNTU2LCA2MTgsIDYxNSwgNDE3LCA2MzUsIDU1NiwgNzA5LCA0OTcsIDYxNSwgNjE1LCA1MDAsIDYzNSwgNzQwLCA2MDQsIDYxMSwgNjA0LCA2MTEsIDU1NiwgNDkwLCA1NTYsIDg3NSwgNTU2LCA2MTUsIDU4MSwgODMzLCA4NDQsIDcyOSwgODU0LCA2MTUsIDU1MiwgODU0LCA1ODMsIDU1NiwgNTU2LCA2MTEsIDQxNywgNTUyLCA1NTYsIDI3OCwgMjgxLCAyNzgsIDk2OSwgOTA2LCA2MTEsIDUwMCwgNjE1LCA1NTYsIDYwNCwgNzc4LCA2MTEsIDQ4NywgNDQ3LCA5NDQsIDc3OCwgOTQ0LCA3NzgsIDk0NCwgNzc4LCA2NjcsIDU1NiwgMzMzLCAzMzMsIDU1NiwgMTAwMCwgMTAwMCwgNTUyLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDUwMCwgNTAwLCA1MDAsIDU1NiwgNTU2LCAzNTAsIDEwMDAsIDEwMDAsIDI0MCwgNDc5LCAzMzMsIDMzMywgNjA0LCAzMzMsIDE2NywgMzk2LCA1NTYsIDU1NiwgMTA5NCwgNTU2LCA4ODUsIDQ4OSwgMTExNSwgMTAwMCwgNzY4LCA2MDAsIDgzNCwgODM0LCA4MzQsIDgzNCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzIyLCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDYxMSwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzXTsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMgPSBbMzY1LCAwLCAzMzMsIDI3OCwgMzMzLCA0NzQsIDU1NiwgNTU2LCA4ODksIDcyMiwgMjM4LCAzMzMsIDMzMywgMzg5LCA1ODQsIDI3OCwgMzMzLCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAzMzMsIDMzMywgNTg0LCA1ODQsIDU4NCwgNjExLCA5NzUsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNjY3LCA2MTEsIDc3OCwgNzIyLCAyNzgsIDU1NiwgNzIyLCA2MTEsIDgzMywgNzIyLCA3NzgsIDY2NywgNzc4LCA3MjIsIDY2NywgNjExLCA3MjIsIDY2NywgOTQ0LCA2NjcsIDY2NywgNjExLCAzMzMsIDI3OCwgMzMzLCA1ODQsIDU1NiwgMzMzLCA1NTYsIDYxMSwgNTU2LCA2MTEsIDU1NiwgMzMzLCA2MTEsIDYxMSwgMjc4LCAyNzgsIDU1NiwgMjc4LCA4ODksIDYxMSwgNjExLCA2MTEsIDYxMSwgMzg5LCA1NTYsIDMzMywgNjExLCA1NTYsIDc3OCwgNTU2LCA1NTYsIDUwMCwgMzg5LCAyODAsIDM4OSwgNTg0LCAzMzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjgwLCA1NTYsIDMzMywgNzM3LCAzNzAsIDU1NiwgNTg0LCA3MzcsIDU1MiwgNDAwLCA1NDksIDMzMywgMzMzLCAzMzMsIDU3NiwgNTU2LCAyNzgsIDMzMywgMzMzLCAzNjUsIDU1NiwgODM0LCA4MzQsIDgzNCwgNjExLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNzIyLCAxMDAwLCA3MjIsIDY2NywgNjY3LCA2NjcsIDY2NywgMjc4LCAyNzgsIDI3OCwgMjc4LCA3MjIsIDcyMiwgNzc4LCA3NzgsIDc3OCwgNzc4LCA3NzgsIDU4NCwgNzc4LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjY3LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDg4OSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA1NDksIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA1NTYsIDYxMSwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA3NDAsIDcyMiwgNjExLCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzgyLCA1NTYsIDU1NiwgMjc4LCA3MjIsIDU1NiwgNTU2LCA2MTEsIDI3OCwgNjExLCAyNzgsIDYxMSwgMzk2LCA2MTEsIDQ3OSwgNjExLCAyNzgsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcwOCwgNzIzLCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDEwMDAsIDk0NCwgNzIyLCAzODksIDcyMiwgMzg5LCA3MjIsIDM4OSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDYxMSwgMzMzLCA2MTEsIDQ3OSwgNjExLCAzMzMsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDk0NCwgNzc4LCA2NjcsIDU1NiwgNjY3LCA2MTEsIDUwMCwgNjExLCA1MDAsIDYxMSwgNTAwLCAyNzgsIDU1NiwgNzIyLCA1NTYsIDEwMDAsIDg4OSwgNzc4LCA2MTEsIDY2NywgNTU2LCA2MTEsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDcyMiwgMzMzLCA4NTQsIDkwNiwgNDczLCA4NDQsIDkzMCwgODQ3LCAyNzgsIDcyMiwgNzIyLCA2MTAsIDY3MSwgNjY3LCA2MTEsIDcyMiwgNzc4LCAyNzgsIDcyMiwgNjY3LCA4MzMsIDcyMiwgNjU3LCA3NzgsIDcxOCwgNjY3LCA1OTAsIDYxMSwgNjY3LCA4MjIsIDY2NywgODI5LCA3ODEsIDI3OCwgNjY3LCA2MjAsIDQ3OSwgNjExLCAyNzgsIDU5MSwgNjIwLCA2MjEsIDU1NiwgNjEwLCA0NzksIDQ5MiwgNjExLCA1NTgsIDI3OCwgNTY2LCA1NTYsIDYwMywgNTU2LCA0NTAsIDYxMSwgNzEyLCA2MDUsIDUzMiwgNjY0LCA0MDksIDU5MSwgNzA0LCA1NzgsIDc3MywgODM0LCAyNzgsIDU5MSwgNjExLCA1OTEsIDgzNCwgNjY3LCA2NjcsIDg4NiwgNjE0LCA3MTksIDY2NywgMjc4LCAyNzgsIDU1NiwgMTA5NCwgMTA0MiwgODU0LCA2MjIsIDcxOSwgNjc3LCA3MTksIDcyMiwgNzA4LCA3MjIsIDYxNCwgNzIyLCA2NjcsIDkyNywgNjQzLCA3MTksIDcxOSwgNjE1LCA2ODcsIDgzMywgNzIyLCA3NzgsIDcxOSwgNjY3LCA3MjIsIDYxMSwgNjc3LCA3ODEsIDY2NywgNzI5LCA3MDgsIDk3OSwgOTg5LCA4NTQsIDEwMDAsIDcwOCwgNzE5LCAxMDQyLCA3MjksIDU1NiwgNjE5LCA2MDQsIDUzNCwgNjE4LCA1NTYsIDczNiwgNTEwLCA2MTEsIDYxMSwgNTA3LCA2MjIsIDc0MCwgNjA0LCA2MTEsIDYxMSwgNjExLCA1NTYsIDg4OSwgNTU2LCA4ODUsIDU1NiwgNjQ2LCA1ODMsIDg4OSwgOTM1LCA3MDcsIDg1NCwgNTk0LCA1NTIsIDg2NSwgNTg5LCA1NTYsIDU1NiwgNjExLCA0NjksIDU2MywgNTU2LCAyNzgsIDI3OCwgMjc4LCA5NjksIDkwNiwgNjExLCA1MDcsIDYxOSwgNTU2LCA2MTEsIDc3OCwgNjExLCA1NzUsIDQ2NywgOTQ0LCA3NzgsIDk0NCwgNzc4LCA5NDQsIDc3OCwgNjY3LCA1NTYsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjc4LCAyNzgsIDI3OCwgMjc4LCA1MDAsIDUwMCwgNTAwLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAyNDAsIDQ3OSwgMzMzLCAzMzMsIDYwNCwgMzMzLCAxNjcsIDM5NiwgNTU2LCA1NTYsIDExMDQsIDU1NiwgODg1LCA1MTYsIDExNDYsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDk5OSwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzIyLCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDYxMSwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzXTsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyA9IFszNjUsIDAsIDMzMywgMjc4LCAyNzgsIDM1NSwgNTU2LCA1NTYsIDg4OSwgNjY3LCAxOTEsIDMzMywgMzMzLCAzODksIDU4NCwgMjc4LCAzMzMsIDI3OCwgMjc4LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCA1ODQsIDU4NCwgNTg0LCA1NTYsIDEwMTUsIDY2NywgNjY3LCA3MjIsIDcyMiwgNjY3LCA2MTEsIDc3OCwgNzIyLCAyNzgsIDUwMCwgNjY3LCA1NTYsIDgzMywgNzIyLCA3NzgsIDY2NywgNzc4LCA3MjIsIDY2NywgNjExLCA3MjIsIDY2NywgOTQ0LCA2NjcsIDY2NywgNjExLCAyNzgsIDI3OCwgMjc4LCA0NjksIDU1NiwgMzMzLCA1NTYsIDU1NiwgNTAwLCA1NTYsIDU1NiwgMjc4LCA1NTYsIDU1NiwgMjIyLCAyMjIsIDUwMCwgMjIyLCA4MzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCA1MDAsIDI3OCwgNTU2LCA1MDAsIDcyMiwgNTAwLCA1MDAsIDUwMCwgMzM0LCAyNjAsIDMzNCwgNTg0LCAzMzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjYwLCA1NTYsIDMzMywgNzM3LCAzNzAsIDU1NiwgNTg0LCA3MzcsIDU1MiwgNDAwLCA1NDksIDMzMywgMzMzLCAzMzMsIDU3NiwgNTM3LCAyNzgsIDMzMywgMzMzLCAzNjUsIDU1NiwgODM0LCA4MzQsIDgzNCwgNjExLCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgNjY3LCAxMDAwLCA3MjIsIDY2NywgNjY3LCA2NjcsIDY2NywgMjc4LCAyNzgsIDI3OCwgMjc4LCA3MjIsIDcyMiwgNzc4LCA3NzgsIDc3OCwgNzc4LCA3NzgsIDU4NCwgNzc4LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjY3LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDg4OSwgNTAwLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NDksIDYxMSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1MDAsIDU1NiwgNTAwLCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA2MjUsIDcyMiwgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjIyLCAyNzgsIDI3OCwgNzMzLCA0NDQsIDUwMCwgMjIyLCA2NjcsIDUwMCwgNTAwLCA1NTYsIDIyMiwgNTU2LCAyMjIsIDU1NiwgMjgxLCA1NTYsIDQwMCwgNTU2LCAyMjIsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDYxNSwgNzIzLCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDEwMDAsIDk0NCwgNzIyLCAzMzMsIDcyMiwgMzMzLCA3MjIsIDMzMywgNjY3LCA1MDAsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDYxMSwgMjc4LCA2MTEsIDM1NCwgNjExLCAyNzgsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDk0NCwgNzIyLCA2NjcsIDUwMCwgNjY3LCA2MTEsIDUwMCwgNjExLCA1MDAsIDYxMSwgNTAwLCAyMjIsIDU1NiwgNjY3LCA1NTYsIDEwMDAsIDg4OSwgNzc4LCA2MTEsIDY2NywgNTAwLCA2MTEsIDI3OCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDY2NywgMjc4LCA3ODksIDg0NiwgMzg5LCA3OTQsIDg2NSwgNzc1LCAyMjIsIDY2NywgNjY3LCA1NzAsIDY3MSwgNjY3LCA2MTEsIDcyMiwgNzc4LCAyNzgsIDY2NywgNjY3LCA4MzMsIDcyMiwgNjQ4LCA3NzgsIDcyNSwgNjY3LCA2MDAsIDYxMSwgNjY3LCA4MzcsIDY2NywgODMxLCA3NjEsIDI3OCwgNjY3LCA1NzAsIDQzOSwgNTU1LCAyMjIsIDU1MCwgNTcwLCA1NzEsIDUwMCwgNTU2LCA0MzksIDQ2MywgNTU1LCA1NDIsIDIyMiwgNTAwLCA0OTIsIDU0OCwgNTAwLCA0NDcsIDU1NiwgNjcwLCA1NzMsIDQ4NiwgNjAzLCAzNzQsIDU1MCwgNjUyLCA1NDYsIDcyOCwgNzc5LCAyMjIsIDU1MCwgNTU2LCA1NTAsIDc3OSwgNjY3LCA2NjcsIDg0MywgNTQ0LCA3MDgsIDY2NywgMjc4LCAyNzgsIDUwMCwgMTA2NiwgOTgyLCA4NDQsIDU4OSwgNzE1LCA2MzksIDcyNCwgNjY3LCA2NTEsIDY2NywgNTQ0LCA3MDQsIDY2NywgOTE3LCA2MTQsIDcxNSwgNzE1LCA1ODksIDY4NiwgODMzLCA3MjIsIDc3OCwgNzI1LCA2NjcsIDcyMiwgNjExLCA2MzksIDc5NSwgNjY3LCA3MjcsIDY3MywgOTIwLCA5MjMsIDgwNSwgODg2LCA2NTEsIDY5NCwgMTAyMiwgNjgyLCA1NTYsIDU2MiwgNTIyLCA0OTMsIDU1MywgNTU2LCA2ODgsIDQ2NSwgNTU2LCA1NTYsIDQ3MiwgNTY0LCA2ODYsIDU1MCwgNTU2LCA1NTYsIDU1NiwgNTAwLCA4MzMsIDUwMCwgODM1LCA1MDAsIDU3MiwgNTE4LCA4MzAsIDg1MSwgNjIxLCA3MzYsIDUyNiwgNDkyLCA3NTIsIDUzNCwgNTU2LCA1NTYsIDU1NiwgMzc4LCA0OTYsIDUwMCwgMjIyLCAyMjIsIDIyMiwgOTEwLCA4MjgsIDU1NiwgNDcyLCA1NjUsIDUwMCwgNTU2LCA3NzgsIDU1NiwgNDkyLCAzMzksIDk0NCwgNzIyLCA5NDQsIDcyMiwgOTQ0LCA3MjIsIDY2NywgNTAwLCAzMzMsIDMzMywgNTU2LCAxMDAwLCAxMDAwLCA1NTIsIDIyMiwgMjIyLCAyMjIsIDIyMiwgMzMzLCAzMzMsIDMzMywgNTU2LCA1NTYsIDM1MCwgMTAwMCwgMTAwMCwgMTg4LCAzNTQsIDMzMywgMzMzLCA1MDAsIDMzMywgMTY3LCAzNjUsIDU1NiwgNTU2LCAxMDk0LCA1NTYsIDg4NSwgMzIzLCAxMDgzLCAxMDAwLCA3NjgsIDYwMCwgODM0LCA4MzQsIDgzNCwgODM0LCAxMDAwLCA1MDAsIDk5OCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcxOSwgMjc0LCA1NDksIDU0OSwgNTg0LCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA1MDAsIDUwMCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAyOTQsIDI5NCwgMzI0LCAzMjQsIDMxNiwgMzI4LCAzOTgsIDI4NV07CmNvbnN0IExpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMgPSBbMzY1LCAwLCAzMzMsIDI3OCwgMjc4LCAzNTUsIDU1NiwgNTU2LCA4ODksIDY2NywgMTkxLCAzMzMsIDMzMywgMzg5LCA1ODQsIDI3OCwgMzMzLCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgNTg0LCA1ODQsIDU4NCwgNTU2LCAxMDE1LCA2NjcsIDY2NywgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1MDAsIDY2NywgNTU2LCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMjc4LCAyNzgsIDI3OCwgNDY5LCA1NTYsIDMzMywgNTU2LCA1NTYsIDUwMCwgNTU2LCA1NTYsIDI3OCwgNTU2LCA1NTYsIDIyMiwgMjIyLCA1MDAsIDIyMiwgODMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDMzMywgNTAwLCAyNzgsIDU1NiwgNTAwLCA3MjIsIDUwMCwgNTAwLCA1MDAsIDMzNCwgMjYwLCAzMzQsIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI2MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDUzNywgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNjY3LCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDUwMCwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTQ5LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTAwLCA1NTYsIDUwMCwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNjE1LCA3MjIsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDIyMiwgMjc4LCAyNzgsIDczNSwgNDQ0LCA1MDAsIDIyMiwgNjY3LCA1MDAsIDUwMCwgNTU2LCAyMjIsIDU1NiwgMjIyLCA1NTYsIDI5MiwgNTU2LCAzMzQsIDU1NiwgMjIyLCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA2MDQsIDcyMywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCAxMDAwLCA5NDQsIDcyMiwgMzMzLCA3MjIsIDMzMywgNzIyLCAzMzMsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDY2NywgNTAwLCA2MTEsIDI3OCwgNjExLCAzNzUsIDYxMSwgMjc4LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA5NDQsIDcyMiwgNjY3LCA1MDAsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjIyLCA1NTYsIDY2NywgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDUwMCwgNjExLCAyNzgsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCA2NjcsIDI3OCwgNzg0LCA4MzgsIDM4NCwgNzc0LCA4NTUsIDc1MiwgMjIyLCA2NjcsIDY2NywgNTUxLCA2NjgsIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA2NjcsIDY2OCwgODMzLCA3MjIsIDY1MCwgNzc4LCA3MjIsIDY2NywgNjE4LCA2MTEsIDY2NywgNzk4LCA2NjcsIDgzNSwgNzQ4LCAyNzgsIDY2NywgNTc4LCA0NDYsIDU1NiwgMjIyLCA1NDcsIDU3OCwgNTc1LCA1MDAsIDU1NywgNDQ2LCA0NDEsIDU1NiwgNTU2LCAyMjIsIDUwMCwgNTAwLCA1NzYsIDUwMCwgNDQ4LCA1NTYsIDY5MCwgNTY5LCA0ODIsIDYxNywgMzk1LCA1NDcsIDY0OCwgNTI1LCA3MTMsIDc4MSwgMjIyLCA1NDcsIDU1NiwgNTQ3LCA3ODEsIDY2NywgNjY3LCA4NjUsIDU0MiwgNzE5LCA2NjcsIDI3OCwgMjc4LCA1MDAsIDEwNTcsIDEwMTAsIDg1NCwgNTgzLCA3MjIsIDYzNSwgNzE5LCA2NjcsIDY1NiwgNjY3LCA1NDIsIDY3NywgNjY3LCA5MjMsIDYwNCwgNzE5LCA3MTksIDU4MywgNjU2LCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDYzNSwgNzYwLCA2NjcsIDc0MCwgNjY3LCA5MTcsIDkzOCwgNzkyLCA4ODUsIDY1NiwgNzE5LCAxMDEwLCA3MjIsIDU1NiwgNTczLCA1MzEsIDM2NSwgNTgzLCA1NTYsIDY2OSwgNDU4LCA1NTksIDU1OSwgNDM4LCA1ODMsIDY4OCwgNTUyLCA1NTYsIDU0MiwgNTU2LCA1MDAsIDQ1OCwgNTAwLCA4MjMsIDUwMCwgNTczLCA1MjEsIDgwMiwgODIzLCA2MjUsIDcxOSwgNTIxLCA1MTAsIDc1MCwgNTQyLCA1NTYsIDU1NiwgNTU2LCAzNjUsIDUxMCwgNTAwLCAyMjIsIDI3OCwgMjIyLCA5MDYsIDgxMiwgNTU2LCA0MzgsIDU1OSwgNTAwLCA1NTIsIDc3OCwgNTU2LCA0ODksIDQxMSwgOTQ0LCA3MjIsIDk0NCwgNzIyLCA5NDQsIDcyMiwgNjY3LCA1MDAsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjIyLCAyMjIsIDIyMiwgMjIyLCAzMzMsIDMzMywgMzMzLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAxODgsIDM1NCwgMzMzLCAzMzMsIDUwMCwgMzMzLCAxNjcsIDM2NSwgNTU2LCA1NTYsIDEwOTQsIDU1NiwgODg1LCAzMjMsIDEwNzMsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDEwMDAsIDUwMCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcxOSwgMjc0LCA1NDksIDU0OSwgNTgzLCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA1MDAsIDUwMCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAyOTQsIDI5NCwgMzI0LCAzMjQsIDMxNiwgMzI4LCAzOTgsIDI4NV07CmNvbnN0IExpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKCjsvLyAuL3NyYy9jb3JlL215cmlhZHByb19mYWN0b3JzLmpzCmNvbnN0IE15cmlhZFByb0JvbGRGYWN0b3JzID0gWzEuMzY4OTgsIDEsIDEsIDAuNzI3MDYsIDAuODA0NzksIDAuODM3MzQsIDAuOTg4OTQsIDAuOTk3OTMsIDAuOTg5NywgMC45Mzg4NCwgMC44NjIwOSwgMC45NDI5MiwgMC45NDI5MiwgMS4xNjY2MSwgMS4wMjA1OCwgMC45MzU4MiwgMC45NjY5NCwgMC45MzU4MiwgMS4xOTEzNywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC43ODA3NiwgMC43ODA3NiwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43Mjg1MSwgMC43ODk2NiwgMC45MDgzOCwgMC44MzYzNywgMC44MjM5MSwgMC45NjM3NiwgMC44MDA2MSwgMC44NjI3NSwgMC44NzY4LCAwLjk1NDA3LCAxLjAyNTgsIDAuNzM5MDEsIDAuODUwMjIsIDAuODM2NTUsIDEuMDE1NiwgMC45NTU0NiwgMC45MjE3OSwgMC44NzEwNywgMC45MjE3OSwgMC44MjExNCwgMC44MDk2LCAwLjg5NzEzLCAwLjk0NDM4LCAwLjk1MzUzLCAwLjk0MDgzLCAwLjkxOTA1LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTQyOTIsIDEuMTg3NzcsIDAuOTQyOTIsIDEuMDIwNTgsIDAuODk5MDMsIDAuOTAwODgsIDAuOTQ5MzgsIDAuOTc4OTgsIDAuODEwOTMsIDAuOTc1NzEsIDAuOTQ5MzgsIDEuMDI0LCAwLjk1NzcsIDAuOTU5MzMsIDAuOTg2MjEsIDEuMDQ3NCwgMC45NzQ1NSwgMC45ODk4MSwgMC45NjcyLCAwLjk1OTMzLCAwLjk0NDYsIDAuOTc4OTgsIDAuOTc0MDcsIDAuOTc2NDYsIDAuNzgwMzYsIDEuMTAyMDgsIDAuOTU0NDIsIDAuOTUyOTgsIDAuOTc1NzksIDAuOTMzMiwgMC45NDAzOSwgMC45MzgsIDAuODA2ODcsIDEuMDExNDksIDAuODA2ODcsIDEuMDIwNTgsIDAuODA0NzksIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDEuMDExNDksIDEuMDA4NzIsIDAuOTAwODgsIDAuOTE4ODIsIDEuMDIxMywgMC44MzYxLCAxLjAyMDU4LCAwLjYyMjk1LCAwLjU0MzI0LCAwLjg5MDIyLCAxLjA4NTk1LCAxLCAxLCAwLjkwMDg4LCAxLCAwLjk3NDU1LCAwLjkzNTgyLCAwLjkwMDg4LCAxLCAxLjA1Njg2LCAwLjgzNjEsIDAuOTk2NDIsIDAuOTk2NDIsIDAuOTk2NDIsIDAuNzI4NTEsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuODY4LCAwLjgyMzkxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAxLjAyNTgsIDEuMDI1OCwgMS4wMjU4LCAxLjAyNTgsIDAuOTc0ODQsIDAuOTU1NDYsIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDEuMDIwNTgsIDAuOTIxNzksIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTA0MDYsIDAuODY5NTgsIDAuOTgyMjUsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTAzMSwgMC44MTA5MywgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45Mzk2OSwgMC45NTkzMywgMC45NDQ2LCAwLjk0NDYsIDAuOTQ0NiwgMC45NDQ2LCAwLjk0NDYsIDEuMDg1OTUsIDAuOTQ0NiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NDAzOSwgMC45Nzg5OCwgMC45NDAzOSwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC45NjM3NiwgMC44NDMxMywgMC45NzQ4NCwgMC45NzU3MSwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44NzY4LCAwLjk1NzcsIDAuODc2OCwgMC45NTc3LCAwLjg3NjgsIDAuOTU3NywgMSwgMSwgMC45NTQwNywgMC45NTkzMywgMC45NzA2OSwgMC45NTkzMywgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDEuMDI1OCwgMC45ODYyMSwgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDAuODg3LCAxLjAxNTkxLCAwLjczOTAxLCAxLjA0NzQsIDEsIDEsIDAuOTc0NTUsIDAuODM2NTUsIDAuOTg5ODEsIDEsIDEsIDAuODM2NTUsIDAuNzM5NzcsIDAuODM2NTUsIDAuNzM5MDMsIDAuODQ2MzgsIDEuMDMzLCAwLjk1NTQ2LCAwLjk1OTMzLCAxLCAxLCAwLjk1NTQ2LCAwLjk1OTMzLCAwLjgyNzEsIDAuOTU0MTcsIDAuOTU5MzMsIDAuOTIxNzksIDAuOTQ0NiwgMC45MjE3OSwgMC45NDQ2LCAwLjkyMTc5LCAwLjk0NDYsIDAuOTM2LCAwLjkxOTY0LCAwLjgyMTE0LCAwLjk3NjQ2LCAxLCAxLCAwLjgyMTE0LCAwLjk3NjQ2LCAwLjgwOTYsIDAuNzgwMzYsIDAuODA5NiwgMC43ODAzNiwgMSwgMSwgMC44MDk2LCAwLjc4MDM2LCAxLCAxLCAwLjg5NzEzLCAwLjc3NDUyLCAwLjg5NzEzLCAxLjEwMjA4LCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAxLCAwLjk5NzkzLCAwLjkwODM4LCAwLjk0OTM4LCAwLjg2OCwgMC45MDMxLCAwLjkyMTc5LCAwLjk0NDYsIDEsIDEsIDAuODk3MTMsIDEuMTAyMDgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTA5ODksIDAuOTM1OCwgMC45MTk0NSwgMC44MzE4MSwgMC43NTI2MSwgMC44Nzk5MiwgMC44Mjk3NiwgMC45NjAzNCwgMC44MzY4OSwgMC45NzI2OCwgMS4wMDc4LCAwLjkwODM4LCAwLjgzNjM3LCAwLjgwMTksIDAuOTAxNTcsIDAuODAwNjEsIDAuOTQ0NiwgMC45NTQwNywgMC45MjQzNiwgMS4wMjU4LCAwLjg1MDIyLCAwLjk3MTUzLCAxLjAxNTYsIDAuOTU1NDYsIDAuODkxOTIsIDAuOTIxNzksIDAuOTIzNjEsIDAuODcxMDcsIDAuOTYzMTgsIDAuODk3MTMsIDAuOTM3MDQsIDAuOTU2MzgsIDAuOTE5MDUsIDAuOTE3MDksIDAuOTI3OTYsIDEuMDI1OCwgMC45MzcwNCwgMC45NDgzNiwgMS4wMzczLCAwLjk1OTMzLCAxLjAwNzgsIDAuOTU4NzEsIDAuOTQ4MzYsIDAuOTYxNzQsIDAuOTI2MDEsIDAuOTQ5OCwgMC45ODYwNywgMC45NTc3NiwgMC45NTkzMywgMS4wNTQ1MywgMS4wMDc4LCAwLjk4Mjc1LCAwLjkzMTQsIDAuOTU2MTcsIDAuOTE3MDEsIDEuMDU5OTMsIDAuOTQ0NiwgMC43ODM2NywgMC45NTUzLCAxLCAwLjg2ODMyLCAxLjAxMjgsIDAuOTU4NzEsIDAuOTkzOTQsIDAuODc1NDgsIDAuOTYzNjEsIDAuODY3NzQsIDEuMDA3OCwgMC45NTg3MSwgMC45NDQ2LCAwLjk1ODcxLCAwLjg2Nzc0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjk2Njk0LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkzNTgyLCAwLjkzNTgyLCAwLjkzNTgyLCAxLCAwLjkwOCwgMC45MDgsIDAuOTE4LCAwLjk0MjE5LCAwLjk0MjE5LCAwLjk2NTQ0LCAxLCAxLjI4NSwgMSwgMSwgMC44MTA3OSwgMC44MTA3OSwgMSwgMSwgMC43NDg1NCwgMSwgMSwgMSwgMSwgMC45OTc5MywgMSwgMSwgMSwgMC42NSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4xNzE3MywgMSwgMC44MDUzNSwgMC43NjE2OSwgMS4wMjA1OCwgMS4wNzMyLCAxLjA1NDg2LCAxLCAxLCAxLjMwNjkyLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjE2MTYxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgTXlyaWFkUHJvQm9sZE1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBNeXJpYWRQcm9Cb2xkSXRhbGljRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjY2MjI3LCAwLjgwNzc5LCAwLjgxNjI1LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3NzMzLCAwLjkyMjIyLCAwLjgzMjY2LCAwLjk0MjkyLCAwLjk0MjkyLCAxLjE2MTQ4LCAxLjAyMDU4LCAwLjkzNTgyLCAwLjk2Njk0LCAwLjkzNTgyLCAxLjE3MzM3LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjc4MDc2LCAwLjc4MDc2LCAxLjAyMDU4LCAxLjAyMDU4LCAxLjAyMDU4LCAwLjcxNTQxLCAwLjc2ODEzLCAwLjg1NTc2LCAwLjgwNTkxLCAwLjgwNzI5LCAwLjk0Mjk5LCAwLjc3NTEyLCAwLjgzNjU1LCAwLjg2NTIzLCAwLjkyMjIyLCAwLjk4NjIxLCAwLjcxNzQzLCAwLjgxNjk4LCAwLjc5NzI2LCAwLjk4NTU4LCAwLjkyMjIyLCAwLjkwNjM3LCAwLjgzODA5LCAwLjkwNjM3LCAwLjgwNzI5LCAwLjc2NDYzLCAwLjg2Mjc1LCAwLjkwNjk5LCAwLjkxNjA1LCAwLjkxNTQsIDAuODUzMDgsIDAuODU0NTgsIDAuOTA1MzEsIDAuOTQyOTIsIDEuMjEyOTYsIDAuOTQyOTIsIDEuMDIwNTgsIDAuODk5MDMsIDEuMTg2MTYsIDAuOTk2MTMsIDAuOTE2NzcsIDAuNzgyMTYsIDAuOTE2NzcsIDAuOTAwODMsIDAuOTg3OTYsIDAuOTEzNSwgMC45MjE2OCwgMC45NTM4MSwgMC45ODk4MSwgMC45NTI5OCwgMC45NTM4MSwgMC45MzQ1OSwgMC45MjE2OCwgMC45MTUxMywgMC45MjAwNCwgMC45MTY3NywgMC45NTA3NywgMC43NDgsIDEuMDQ1MDIsIDAuOTE2NzcsIDAuOTIwNjEsIDAuOTQyMzYsIDAuODk1NDQsIDAuODkzNjQsIDAuOSwgMC44MDY4NywgMC44NTc4LCAwLjgwNjg3LCAxLjAyMDU4LCAwLjgwNzc5LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjg1NzgsIDAuOTk5NzMsIDEuMTg2MTYsIDAuOTEzMzksIDEuMDgwNzQsIDAuODI4OTEsIDEuMDIwNTgsIDAuNTU1MDksIDAuNzE1MjYsIDAuODkwMjIsIDEuMDg1OTUsIDEsIDEsIDEuMTg2MTYsIDEsIDAuOTY3MzYsIDAuOTM1ODIsIDEuMTg2MTYsIDEsIDEuMDQ4NjQsIDAuODI3MTEsIDAuOTkwNDMsIDAuOTkwNDMsIDAuOTkwNDMsIDAuNzE1NDEsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODQ1LCAwLjgwNzI5LCAwLjc3NTEyLCAwLjc3NTEyLCAwLjc3NTEyLCAwLjc3NTEyLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk1OTYxLCAwLjkyMjIyLCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAxLjAyMDU4LCAwLjkwMjUxLCAwLjkwNjk5LCAwLjkwNjk5LCAwLjkwNjk5LCAwLjkwNjk5LCAwLjg1NDU4LCAwLjgzNjU5LCAwLjk0OTUxLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjg1ODExLCAwLjc4MjE2LCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjkxMzUsIDAuOTIxNjgsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDEuMDg1OTUsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuODkzNjQsIDAuOTIzMzIsIDAuODkzNjQsIDAuODU1NzYsIDAuOTk2MTMsIDAuODU1NzYsIDAuOTk2MTMsIDAuODU1NzYsIDAuOTk2MTMsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuOTQyOTksIDAuNzY3ODMsIDAuOTU5NjEsIDAuOTE2NzcsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuODY1MjMsIDAuOTEzNSwgMC44NjUyMywgMC45MTM1LCAwLjg2NTIzLCAwLjkxMzUsIDEsIDEsIDAuOTIyMjIsIDAuOTIxNjgsIDAuOTIyMjIsIDAuOTIxNjgsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuODYwMzYsIDAuOTcwOTYsIDAuNzE3NDMsIDAuOTg5ODEsIDEsIDEsIDAuOTUyOTgsIDAuNzk3MjYsIDAuOTUzODEsIDEsIDEsIDAuNzk3MjYsIDAuNjg5NCwgMC43OTcyNiwgMC43NDMyMSwgMC44MTY5MSwgMS4wMDA2LCAwLjkyMjIyLCAwLjkyMTY4LCAxLCAxLCAwLjkyMjIyLCAwLjkyMTY4LCAwLjc5NDY0LCAwLjkyMDk4LCAwLjkyMTY4LCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwOSwgMC44NzUxNCwgMC44MDcyOSwgMC45NTA3NywgMSwgMSwgMC44MDcyOSwgMC45NTA3NywgMC43NjQ2MywgMC43NDgsIDAuNzY0NjMsIDAuNzQ4LCAxLCAxLCAwLjc2NDYzLCAwLjc0OCwgMSwgMSwgMC44NjI3NSwgMC43MjY1MSwgMC44NjI3NSwgMS4wNDUwMiwgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MTU0LCAwLjk0MjM2LCAwLjg1NDU4LCAwLjg5MzY0LCAwLjg1NDU4LCAwLjkwNTMxLCAwLjksIDAuOTA1MzEsIDAuOSwgMC45MDUzMSwgMC45LCAxLCAwLjk3Mjc2LCAwLjg1NTc2LCAwLjk5NjEzLCAwLjg0NSwgMC44NTgxMSwgMC45MDI1MSwgMC45MTY3NywgMSwgMSwgMC44NjI3NSwgMS4wNDUwMiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4wMDg5OSwgMS4zMDYyOCwgMC44NTU3NiwgMC44MDE3OCwgMC42Njg2MiwgMC43OTI3LCAwLjY5MzIzLCAwLjg4MTI3LCAwLjcyNDU5LCAwLjg5NzExLCAwLjk1MzgxLCAwLjg1NTc2LCAwLjgwNTkxLCAwLjc4MDUsIDAuOTQ3MjksIDAuNzc1MTIsIDAuOTA1MzEsIDAuOTIyMjIsIDAuOTA2MzcsIDAuOTg2MjEsIDAuODE2OTgsIDAuOTI2NTUsIDAuOTg1NTgsIDAuOTIyMjIsIDAuODUzNTksIDAuOTA2MzcsIDAuOTA5NzYsIDAuODM4MDksIDAuOTQ1MjMsIDAuODYyNzUsIDAuODM1MDksIDAuOTMxNTcsIDAuODUzMDgsIDAuODMzOTIsIDAuOTIzNDYsIDAuOTg2MjEsIDAuODM1MDksIDAuOTI4ODYsIDAuOTEzMjQsIDAuOTIxNjgsIDAuOTUzODEsIDAuOTA2NDYsIDAuOTI4ODYsIDAuOTA1NTcsIDAuODY4NDcsIDAuOTAyNzYsIDAuOTEzMjQsIDAuODY4NDIsIDAuOTIxNjgsIDAuOTk1MzEsIDAuOTUzODEsIDAuOTIyNCwgMC44NTQwOCwgMC45MjY5OSwgMC44Njg0NywgMS4wMDUxLCAwLjkxNTEzLCAwLjgwNDg3LCAwLjkzNDgxLCAxLCAwLjg4MTU5LCAxLjA1MjE0LCAwLjkwNjQ2LCAwLjk3MzU1LCAwLjgxNTM5LCAwLjg5Mzk4LCAwLjg1OTIzLCAwLjk1MzgxLCAwLjkwNjQ2LCAwLjkxNTEzLCAwLjkwNjQ2LCAwLjg1OTIzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjkxNTQsIDAuOTQyMzYsIDAuOTE1NCwgMC45NDIzNiwgMC45MTU0LCAwLjk0MjM2LCAwLjg1NDU4LCAwLjg5MzY0LCAwLjk2Njk0LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkxNzgyLCAwLjkxNzgyLCAwLjkxNzgyLCAxLCAwLjg5NiwgMC44OTYsIDAuODk2LCAwLjkzMzIsIDAuOTMzMiwgMC45NTk3MywgMSwgMS4yNiwgMSwgMSwgMC44MDQ3OSwgMC44MDE3OCwgMSwgMSwgMC44NTYzMywgMSwgMSwgMSwgMSwgMC45NzI3NiwgMSwgMSwgMSwgMC42OTgsIDEsIDEuMzYxNDUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMTQ1NDIsIDEsIDAuNzkxOTksIDAuNzg2OTQsIDEuMDIwNTgsIDEuMDM0OTMsIDEuMDU0ODYsIDEsIDEsIDEuMjMwMjYsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMjAwMDYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07CmNvbnN0IE15cmlhZFByb0l0YWxpY0ZhY3RvcnMgPSBbMS4zNjg5OCwgMSwgMSwgMC42NTUwNywgMC44NDk0MywgMC44NTYzOSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44NjkzNiwgMC44ODMwNywgMC44Njk0OCwgMC44NTI4MywgMC44NTI4MywgMS4wNjM4MywgMS4wMjA1OCwgMC43NTk0NSwgMC45MjE5LCAwLjc1OTQ1LCAxLjE3MzM3LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjc1OTQ1LCAwLjc1OTQ1LCAxLjAyMDU4LCAxLjAyMDU4LCAxLjAyMDU4LCAwLjY5MDQ2LCAwLjcwOTI2LCAwLjg1MTU4LCAwLjc3ODEyLCAwLjc2ODUyLCAwLjg5NTkxLCAwLjcwNDY2LCAwLjc2MTI1LCAwLjgwMDk0LCAwLjg2ODIyLCAwLjgzODY0LCAwLjcyOCwgMC43NzIxMiwgMC43OTQ3NSwgMC45MzYzNywgMC44NzUxNCwgMC44NTg4LCAwLjc2MDEzLCAwLjg1ODgsIDAuNzI0MjEsIDAuNjk4NjYsIDAuNzc1OTgsIDAuODU5OTEsIDAuODA4MTEsIDAuODc4MzIsIDAuNzgxMTIsIDAuNzc1MTIsIDAuODU2MiwgMS4wMjIyLCAxLjE4NDE3LCAxLjAyMjIsIDEuMjcwMTQsIDAuODk5MDMsIDEuMTUwMTIsIDAuOTM4NTksIDAuOTQzOTksIDAuODQ2LCAwLjk0Mzk5LCAwLjgxNDUzLCAxLjAxODYsIDAuOTQyMTksIDAuOTYwMTcsIDEuMDMwNzUsIDEuMDIxNzUsIDAuOTEyLCAxLjAzMDc1LCAwLjk2OTk4LCAwLjk2MDE3LCAwLjkzODU5LCAwLjk0Mzk5LCAwLjk0Mzk5LCAwLjk1NDkzLCAwLjc0NiwgMS4xMjY1OCwgMC45NDU3OCwgMC45MSwgMC45NzksIDAuODgyLCAwLjg4MiwgMC44MywgMC44NTAzNCwgMC44MzUzNywgMC44NTAzNCwgMS4wMjA1OCwgMC43MDg2OSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44MzUzNywgMC45MDA4MywgMS4xNTAxMiwgMC45MTYxLCAwLjk0NTY1LCAwLjczNTQxLCAxLjAyMDU4LCAwLjUzNjA5LCAwLjY5MzUzLCAwLjc5NTE5LCAxLjA4NTk1LCAxLCAxLCAxLjE1MDEyLCAxLCAwLjkxOTc0LCAwLjc1OTQ1LCAxLjE1MDEyLCAxLCAwLjk0NDYsIDAuNzMzNjEsIDAuOTAwNSwgMC45MDA1LCAwLjkwMDUsIDAuNjI4NjQsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuNzczLCAwLjc2ODUyLCAwLjcwNDY2LCAwLjcwNDY2LCAwLjcwNDY2LCAwLjcwNDY2LCAwLjgzODY0LCAwLjgzODY0LCAwLjgzODY0LCAwLjgzODY0LCAwLjkwNTYxLCAwLjg3NTE0LCAwLjg1ODgsIDAuODU4OCwgMC44NTg4LCAwLjg1ODgsIDAuODU4OCwgMS4wMjA1OCwgMC44NTc1MSwgMC44NTk5MSwgMC44NTk5MSwgMC44NTk5MSwgMC44NTk5MSwgMC43NzUxMiwgMC43NjAxMywgMC44ODA3NSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC44MDc1LCAwLjg0NiwgMC44MTQ1MywgMC44MTQ1MywgMC44MTQ1MywgMC44MTQ1MywgMC44MjQyNCwgMC44MjQyNCwgMC44MjQyNCwgMC44MjQyNCwgMC45Mjc4LCAwLjk2MDE3LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAxLjA4NTk1LCAwLjg1NjIsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuODgyLCAwLjk0NTc4LCAwLjg4MiwgMC44NTE1OCwgMC45Mzg1OSwgMC44NTE1OCwgMC45Mzg1OSwgMC44NTE1OCwgMC45Mzg1OSwgMC43Njg1MiwgMC44NDYsIDAuNzY4NTIsIDAuODQ2LCAwLjc2ODUyLCAwLjg0NiwgMC43Njg1MiwgMC44NDYsIDAuODk1OTEsIDAuODU0NCwgMC45MDU2MSwgMC45NDM5OSwgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC44MDA5NCwgMC45NDIxOSwgMC44MDA5NCwgMC45NDIxOSwgMC44MDA5NCwgMC45NDIxOSwgMSwgMSwgMC44NjgyMiwgMC45NjAxNywgMC44NjgyMiwgMC45NjAxNywgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMS4wMzA3NSwgMC44Mzg2NCwgMC44MjQyNCwgMC44MTQwMiwgMS4wMjczOCwgMC43MjgsIDEuMDIxNzUsIDEsIDEsIDAuOTEyLCAwLjc5NDc1LCAxLjAzMDc1LCAxLCAxLCAwLjc5NDc1LCAwLjgzOTExLCAwLjc5NDc1LCAwLjY2MjY2LCAwLjgwNTUzLCAxLjA2Njc2LCAwLjg3NTE0LCAwLjk2MDE3LCAxLCAxLCAwLjg3NTE0LCAwLjk2MDE3LCAwLjg2ODY1LCAwLjg3Mzk2LCAwLjk2MDE3LCAwLjg1ODgsIDAuOTM4NTksIDAuODU4OCwgMC45Mzg1OSwgMC44NTg4LCAwLjkzODU5LCAwLjg2NywgMC44NDc1OSwgMC43MjQyMSwgMC45NTQ5MywgMSwgMSwgMC43MjQyMSwgMC45NTQ5MywgMC42OTg2NiwgMC43NDYsIDAuNjk4NjYsIDAuNzQ2LCAxLCAxLCAwLjY5ODY2LCAwLjc0NiwgMSwgMSwgMC43NzU5OCwgMC44ODQxNywgMC43NzU5OCwgMS4xMjY1OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NzgzMiwgMC45NzksIDAuNzc1MTIsIDAuODgyLCAwLjc3NTEyLCAwLjg1NjIsIDAuODMsIDAuODU2MiwgMC44MywgMC44NTYyLCAwLjgzLCAxLCAwLjg4NDY1LCAwLjg1MTU4LCAwLjkzODU5LCAwLjc3MywgMC44MDc1LCAwLjg1NzUxLCAwLjg1NjIsIDEsIDEsIDAuNzc1OTgsIDEuMTI2NTgsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUzMTMsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMDgxMDYsIDEuMDM5MDEsIDAuODUxNTgsIDAuNzcwMjUsIDAuNjIyNjQsIDAuNzY0NiwgMC42NTM1MSwgMC44NjAyNiwgMC42OTQ2MSwgMC44OTk0NywgMS4wMzA3NSwgMC44NTE1OCwgMC43NzgxMiwgMC43NjQ0OSwgMC44ODgzNiwgMC43MDQ2NiwgMC44NTYyLCAwLjg2ODIyLCAwLjg1ODgsIDAuODM4NjQsIDAuNzcyMTIsIDAuODUzMDgsIDAuOTM2MzcsIDAuODc1MTQsIDAuODIzNTIsIDAuODU4OCwgMC44NTcwMSwgMC43NjAxMywgMC44OTA1OCwgMC43NzU5OCwgMC44MTU2LCAwLjgyNTY1LCAwLjc4MTEyLCAwLjc3ODk5LCAwLjg5Mzg2LCAwLjgzODY0LCAwLjgxNTYsIDAuOTQ4NiwgMC45MjM4OCwgMC45NjE4NiwgMS4wMzA3NSwgMC45MTEyMywgMC45NDg2LCAwLjkzMjk4LCAwLjg3OCwgMC45Mzk0MiwgMC45MjM4OCwgMC44NDU5NiwgMC45NjE4NiwgMC45NTExOSwgMS4wMzA3NSwgMC45MjIsIDAuODg3ODcsIDAuOTU4MjksIDAuODgsIDAuOTM1NTksIDAuOTM4NTksIDAuNzg4MTUsIDAuOTM3NTgsIDEsIDAuODkyMTcsIDEuMDM3MzcsIDAuOTExMjMsIDAuOTM5NjksIDAuNzc0ODcsIDAuODU3NjksIDAuODY3OTksIDEuMDMwNzUsIDAuOTExMjMsIDAuOTM4NTksIDAuOTExMjMsIDAuODY3OTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODc4MzIsIDAuOTc5LCAwLjg3ODMyLCAwLjk3OSwgMC44NzgzMiwgMC45NzksIDAuNzc1MTIsIDAuODgyLCAwLjkyMTksIDEsIDAuODk5MDMsIDEsIDEsIDEsIDAuODczMjEsIDAuODczMjEsIDAuODczMjEsIDEsIDEuMDI3LCAxLjAyNywgMS4wMjcsIDAuODY4NDcsIDAuODY4NDcsIDAuNzkxMjEsIDEsIDEuMTI0LCAxLCAxLCAwLjczNTcyLCAwLjczNTcyLCAxLCAxLCAwLjg1MDM0LCAxLCAxLCAxLCAxLCAwLjg4NDY1LCAxLCAxLCAxLCAwLjY2OSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNDgyOCwgMSwgMC43NDk0OCwgMC43NTE4NywgMS4wMjA1OCwgMC45ODM5MSwgMS4wMjExOSwgMSwgMSwgMS4wNjIzMywgMS4wODU5NSwgMS4wODU5NSwgMSwgMS4wODU5NSwgMS4wODU5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNTIzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IE15cmlhZFByb0l0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBNeXJpYWRQcm9SZWd1bGFyRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjc2MzA1LCAwLjgyNzg0LCAwLjk0OTM1LCAwLjg5MzY0LCAwLjkyMjQxLCAwLjg5MDczLCAwLjkwNzA2LCAwLjk4NDcyLCAwLjg1MjgzLCAwLjg1MjgzLCAxLjA2NjQsIDEuMDIwNTgsIDAuNzQ1MDUsIDAuOTIxOSwgMC43NDUwNSwgMS4yMzQ1NiwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC43NDUwNSwgMC43NDUwNSwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43MzAwMiwgMC43MjYwMSwgMC45MTc1NSwgMC44MTI2LCAwLjgwMzE0LCAwLjkyMjIyLCAwLjczNzY0LCAwLjc5NzI2LCAwLjgzMDUxLCAwLjkwMjg0LCAwLjg2MDIzLCAwLjc0LCAwLjgxMjYsIDAuODQ4NjksIDAuOTY1MTgsIDAuOTExMTUsIDAuODg1OCwgMC43OTc2MSwgMC44ODU4LCAwLjc0NDk4LCAwLjczOTE0LCAwLjgxMzYzLCAwLjg5NTkxLCAwLjgzNjU5LCAwLjg5NjMzLCAwLjg1NjA4LCAwLjgxMTEsIDAuOTA1MzEsIDEuMDIyMiwgMS4yMjczNiwgMS4wMjIyLCAxLjI3MDE0LCAwLjg5OTAzLCAwLjkwMDg4LCAwLjg2NjY3LCAxLjAyMzEsIDAuODk2LCAxLjAxNDExLCAwLjkwMDgzLCAxLjA1MDk5LCAxLjAwNTEyLCAwLjk5NzkzLCAxLjA1MzI2LCAxLjA5Mzc3LCAwLjkzOCwgMS4wNjIyNiwgMS4wMDExOSwgMC45OTc5MywgMC45ODcxNCwgMS4wMjMxLCAxLjAxMjMxLCAwLjk4MTk2LCAwLjc5MiwgMS4xOTEzNywgMC45OTA3NCwgMC45NjIsIDEuMDE5MTUsIDAuOTI2LCAwLjk0MiwgMC44NTYsIDAuODUwMzQsIDAuOTIwMDYsIDAuODUwMzQsIDEuMDIwNTgsIDAuNjkwNjcsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIwMDYsIDAuOTMzMiwgMC45MDA4OCwgMC45MTg4MiwgMC45MzQ4NCwgMC43NTMzOSwgMS4wMjA1OCwgMC41Njg2NiwgMC41NDMyNCwgMC43OTUxOSwgMS4wODU5NSwgMSwgMSwgMC45MDA4OCwgMSwgMC45NTMyNSwgMC43NDUwNSwgMC45MDA4OCwgMSwgMC45NzE5OCwgMC43NTMzOSwgMC45MTAwOSwgMC45MTAwOSwgMC45MTAwOSwgMC42NjQ2NiwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC43ODgsIDAuODAzMTQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuODYwMjMsIDAuODYwMjMsIDAuODYwMjMsIDAuODYwMjMsIDAuOTI5MTUsIDAuOTExMTUsIDAuODg1OCwgMC44ODU4LCAwLjg4NTgsIDAuODg1OCwgMC44ODU4LCAxLjAyMDU4LCAwLjg4NTgsIDAuODk1OTEsIDAuODk1OTEsIDAuODk1OTEsIDAuODk1OTEsIDAuODExMSwgMC43OTYxMSwgMC44OTcxMywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjkzNiwgMC44OTYsIDAuOTAwODMsIDAuOTAwODMsIDAuOTAwODMsIDAuOTAwODMsIDAuODQyMjQsIDAuODQyMjQsIDAuODQyMjQsIDAuODQyMjQsIDAuOTcyNzYsIDAuOTk3OTMsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDEuMDg1OTUsIDAuODk4NzYsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTQyLCAxLjAyMzEsIDAuOTQyLCAwLjkxNzU1LCAwLjg2NjY3LCAwLjkxNzU1LCAwLjg2NjY3LCAwLjkxNzU1LCAwLjg2NjY3LCAwLjgwMzE0LCAwLjg5NiwgMC44MDMxNCwgMC44OTYsIDAuODAzMTQsIDAuODk2LCAwLjgwMzE0LCAwLjg5NiwgMC45MjIyMiwgMC45MzM3MiwgMC45MjkxNSwgMS4wMTQxMSwgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC44MzA1MSwgMS4wMDUxMiwgMC44MzA1MSwgMS4wMDUxMiwgMC44MzA1MSwgMS4wMDUxMiwgMSwgMSwgMC45MDI4NCwgMC45OTc5MywgMC45MDk3NiwgMC45OTc5MywgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMS4wNTMyNiwgMC44NjAyMywgMC44NDIyNCwgMC44Mjg3MywgMS4wNzQ2OSwgMC43NCwgMS4wOTM3NywgMSwgMSwgMC45MzgsIDAuODQ4NjksIDEuMDYyMjYsIDEsIDEsIDAuODQ4NjksIDAuODM3MDQsIDAuODQ4NjksIDAuODE0NDEsIDAuODU1ODgsIDEuMDg5MjcsIDAuOTExMTUsIDAuOTk3OTMsIDEsIDEsIDAuOTExMTUsIDAuOTk3OTMsIDAuOTE4ODcsIDAuOTA5OTEsIDAuOTk3OTMsIDAuODg1OCwgMC45ODcxNCwgMC44ODU4LCAwLjk4NzE0LCAwLjg4NTgsIDAuOTg3MTQsIDAuODk0LCAwLjkxNDM0LCAwLjc0NDk4LCAwLjk4MTk2LCAxLCAxLCAwLjc0NDk4LCAwLjk4MTk2LCAwLjczOTE0LCAwLjc5MiwgMC43MzkxNCwgMC43OTIsIDEsIDEsIDAuNzM5MTQsIDAuNzkyLCAxLCAxLCAwLjgxMzYzLCAwLjkwNCwgMC44MTM2MywgMS4xOTEzNywgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTYzMywgMS4wMTkxNSwgMC44MTExLCAwLjk0MiwgMC44MTExLCAwLjkwNTMxLCAwLjg1NiwgMC45MDUzMSwgMC44NTYsIDAuOTA1MzEsIDAuODU2LCAxLCAwLjkyMjQxLCAwLjkxNzU1LCAwLjg2NjY3LCAwLjc4OCwgMC44NjkzNiwgMC44ODU4LCAwLjg5ODc2LCAxLCAxLCAwLjgxMzYzLCAxLjE5MTM3LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMzg4LCAxLjAzOTAxLCAwLjkyMTM4LCAwLjc4MTA1LCAwLjcxNTQsIDAuODYxNjksIDAuODA1MTMsIDAuOTQwMDcsIDAuODI1MjgsIDAuOTg2MTIsIDEuMDYyMjYsIDAuOTE3NTUsIDAuODEyNiwgMC44MTg4NCwgMC45MjgxOSwgMC43Mzc2NCwgMC45MDUzMSwgMC45MDI4NCwgMC44ODU4LCAwLjg2MDIzLCAwLjgxMjYsIDAuOTExNzIsIDAuOTY1MTgsIDAuOTExMTUsIDAuODMwODksIDAuODg1OCwgMC44Nzc5MSwgMC43OTc2MSwgMC44OTI5NywgMC44MTM2MywgMC44ODE1NywgMC44OTk5MiwgMC44NTYwOCwgMC44MTk5MiwgMC45NDMwNywgMC44NjAyMywgMC44ODE1NywgMC45NTMwOCwgMC45ODY5OSwgMC45OTc5MywgMS4wNjIyNiwgMC45NTgxNywgMC45NTMwOCwgMC45NzM1OCwgMC45MjgsIDAuOTgwODgsIDAuOTg2OTksIDAuOTI3NjEsIDAuOTk3OTMsIDAuOTYwMTcsIDEuMDYyMjYsIDAuOTg2LCAwLjk0NCwgMC45NTk3OCwgMC45MzgsIDAuOTY3MDUsIDAuOTg3MTQsIDAuODA0NDIsIDAuOTg5NzIsIDEsIDAuODk3NjIsIDEuMDQ1NTIsIDAuOTU4MTcsIDAuOTkwMDcsIDAuODcwNjQsIDAuOTE4NzksIDAuODg4ODgsIDEuMDYyMjYsIDAuOTU4MTcsIDAuOTg3MTQsIDAuOTU4MTcsIDAuODg4ODgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODk2MzMsIDEuMDE5MTUsIDAuODk2MzMsIDEuMDE5MTUsIDAuODk2MzMsIDEuMDE5MTUsIDAuODExMSwgMC45NDIsIDAuOTIxOSwgMSwgMC44OTkwMywgMSwgMSwgMSwgMC45MzE3MywgMC45MzE3MywgMC45MzE3MywgMSwgMS4wNjMwNCwgMS4wNjMwNCwgMS4wNjkwNCwgMC44OTkwMywgMC44OTkwMywgMC44MDU0OSwgMSwgMS4xNTYsIDEsIDEsIDAuNzY1NzUsIDAuNzY1NzUsIDEsIDEsIDAuNzI0NTgsIDEsIDEsIDEsIDEsIDAuOTIyNDEsIDEsIDEsIDEsIDAuNjE5LCAxLCAxLjM2MTQ1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA3MjU3LCAxLCAwLjc0NzA1LCAwLjcxMTE5LCAxLjAyMDU4LCAxLjAyNCwgMS4wMjExOSwgMSwgMSwgMS4xNTM2LCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA1NjM4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgTXlyaWFkUHJvUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9OwoKOy8vIC4vc3JjL2NvcmUvc2Vnb2V1aV9mYWN0b3JzLmpzCmNvbnN0IFNlZ29ldWlCb2xkRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk5Mjk3LCAwLjk4MjQsIDEuMDQwMTYsIDEuMDY0OTcsIDEuMDM0MjQsIDAuOTc1MjksIDEuMTc2NDcsIDEuMjMyMDMsIDEuMTA4NSwgMS4xMDg1LCAxLjE2OTM5LCAxLjIxMDcsIDAuOTc1NCwgMS4yMTQwOCwgMC45NzU0LCAxLjU5NTc4LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAwLjgxMzc4LCAwLjgxMzc4LCAxLjIxMDcsIDEuMjEwNywgMS4yMTA3LCAwLjcxNzAzLCAwLjk3ODQ3LCAwLjk3MzYzLCAwLjg4Nzc2LCAwLjg2NDEsIDEuMDIwOTYsIDAuNzk3OTUsIDAuODUxMzIsIDAuOTE0LCAxLjA2MDg1LCAxLjE0MDYsIDAuODAwNywgMC44OTg1OCwgMC44MzY5MywgMS4xNDg4OSwgMS4wOTM5OCwgMC45NzQ4OSwgMC45MjA5NCwgMC45NzQ4OSwgMC45MDM5OSwgMC44NDA0MSwgMC45NTkyMywgMS4wMDEzNSwgMSwgMS4wNjQ2NywgMC45ODI0MywgMC45MDk5NiwgMC45OTM2MSwgMS4xMDg1LCAxLjU2OTQyLCAxLjEwODUsIDEuMjEwNywgMC43NDYyNywgMC45NDI4MiwgMC45Njc1MiwgMS4wMTUxOSwgMC44NjMwNCwgMS4wMTM1OSwgMC45NzI3OCwgMS4xNTEwMywgMS4wMTM1OSwgMC45ODU2MSwgMS4wMjI4NSwgMS4wMjI4NSwgMS4wMDUyNywgMS4wMjI4NSwgMS4wMzAyLCAwLjk5MDQxLCAxLjAwMDgsIDEuMDE1MTksIDEuMDEzNTksIDEuMDIyNTgsIDAuNzkxMDQsIDEuMTY4NjIsIDAuOTkwNDEsIDAuOTc0NTQsIDEuMDI1MTEsIDAuOTkyOTgsIDAuOTY3NTIsIDAuOTU4MDEsIDAuOTQ4NTYsIDEuMTY1NzksIDAuOTQ4NTYsIDEuMjEwNywgMC45ODI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLCAxLjAzNDI0LCAxLjE2NTc5LCAwLjg3MjcsIDEuMzg3MSwgMS4xODYyMiwgMS4xMDgxOCwgMS4wNDQ3OCwgMS4yMTA3LCAxLjE4NjIyLCAwLjc1MTU1LCAwLjk0OTk0LCAxLjI4ODI2LCAxLjIxNDA4LCAxLjIxNDA4LCAwLjkxMDU2LCAxLCAwLjkxNTcyLCAwLjk3NTQsIDAuNjQ2NjMsIDEuMTgzMjgsIDEuMjQ4NjYsIDEuMDQ0NzgsIDEuMTQxNjksIDEuMTU3NDksIDEuMTczODksIDAuNzE3MDMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTM1MDYsIDAuODY0MSwgMC43OTc5NSwgMC43OTc5NSwgMC43OTc5NSwgMC43OTc5NSwgMS4xNDA2LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjAyMDk2LCAxLjA5Mzk4LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAxLjIxMDcsIDAuOTc0ODksIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDAuOTA5OTYsIDAuOTIwOTQsIDEuMDI3OTgsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTMxMzYsIDAuODYzMDQsIDAuOTcyNzgsIDAuOTcyNzgsIDAuOTcyNzgsIDAuOTcyNzgsIDEuMDIyODUsIDEuMDIyODUsIDEuMDIyODUsIDEuMDIyODUsIDAuOTcxMjIsIDAuOTkwNDEsIDEsIDEsIDEsIDEsIDEsIDEuMjg4MjYsIDEuMDAwOCwgMC45OTA0MSwgMC45OTA0MSwgMC45OTA0MSwgMC45OTA0MSwgMC45Njc1MiwgMS4wMTUxOSwgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC44NjQxLCAwLjg2MzA0LCAwLjg2NDEsIDAuODYzMDQsIDAuODY0MSwgMC44NjMwNCwgMC44NjQxLCAwLjg2MzA0LCAxLjAyMDk2LCAxLjAzMDU3LCAxLjAyMDk2LCAxLjAzNTE3LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjkxNCwgMS4wMTM1OSwgMC45MTQsIDEuMDEzNTksIDAuOTE0LCAxLjAxMzU5LCAxLCAxLCAxLjA2MDg1LCAwLjk4NTYxLCAxLjA2MDg1LCAxLjAwODc5LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMS4xNDA2LCAxLjAyMjg1LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMC45NzEzOCwgMS4wODY5MiwgMC44MDA3LCAxLjAyMjg1LCAxLCAxLCAxLjAwNTI3LCAwLjgzNjkzLCAxLjAyMjg1LCAxLCAxLCAwLjgzNjkzLCAwLjk0NTUsIDAuODM2OTMsIDAuOTA0MTgsIDAuODM2OTMsIDEuMTMwMDUsIDEuMDkzOTgsIDAuOTkwNDEsIDEsIDEsIDEuMDkzOTgsIDAuOTkwNDEsIDAuOTY2OTIsIDEuMDkyNTEsIDAuOTkwNDEsIDAuOTc0ODksIDEuMDAwOCwgMC45NzQ4OSwgMS4wMDA4LCAwLjk3NDg5LCAxLjAwMDgsIDAuOTM5OTQsIDAuOTc5MzEsIDAuOTAzOTksIDEuMDIyNTgsIDEsIDEsIDAuOTAzOTksIDEuMDIyNTgsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDEsIDEsIDAuOTU5MjMsIDEuMDcwMzQsIDAuOTU5MjMsIDEuMTY4NjIsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDY0NjcsIDEuMDI1MTEsIDAuOTA5OTYsIDAuOTY3NTIsIDAuOTA5OTYsIDAuOTkzNjEsIDAuOTU4MDEsIDAuOTkzNjEsIDAuOTU4MDEsIDAuOTkzNjEsIDAuOTU4MDEsIDEuMDc3MzMsIDEuMDM0MjQsIDAuOTczNjMsIDAuOTY3NTIsIDAuOTM1MDYsIDAuOTMxMzYsIDAuOTc0ODksIDEuMDAwOCwgMSwgMSwgMC45NTkyMywgMS4xNjg2MiwgMS4xNTEwMywgMS4xNTEwMywgMS4wMTE3MywgMS4wMzk1OSwgMC43NTk1MywgMC44MTM3OCwgMC43OTkxMiwgMS4xNTEwMywgMS4yMTk5NCwgMC45NTE2MSwgMC44NzgxNSwgMS4wMTE0OSwgMC44MTUyNSwgMC43Njc2LCAwLjk4MTY3LCAxLjAxMTM0LCAxLjAyNTQ2LCAwLjg0MDk3LCAxLjAzMDg5LCAxLjE4MTAyLCAwLjk3MzYzLCAwLjg4Nzc2LCAwLjg1MTM0LCAwLjk3ODI2LCAwLjc5Nzk1LCAwLjk5MzYxLCAxLjA2MDg1LCAwLjk3NDg5LCAxLjE0MDYsIDAuODk4NTgsIDEuMDM4OCwgMS4xNDg4OSwgMS4wOTM5OCwgMC44NjAzOSwgMC45NzQ4OSwgMS4wNTk1LCAwLjkyMDk0LCAwLjk0NzkzLCAwLjk1OTIzLCAwLjkwOTk2LCAwLjk5MzQ2LCAwLjk4MjQzLCAxLjAyMTEyLCAwLjk1NDkzLCAxLjE0MDYsIDAuOTA5OTYsIDEuMDM1NzQsIDEuMDI1OTcsIDEuMDAwOCwgMS4xODEwMiwgMS4wNjYyOCwgMS4wMzU3NCwgMS4wMTkyLCAxLjAxOTMyLCAxLjAwODg2LCAwLjk3NTMxLCAxLjAxMDYsIDEuMDAwOCwgMS4xMzE4OSwgMS4xODEwMiwgMS4wMjI3NywgMC45ODY4MywgMS4wMDE2LCAwLjk5NTYxLCAxLjA3MjM3LCAxLjAwMDgsIDAuOTA0MzQsIDAuOTk5MjEsIDAuOTM4MDMsIDAuODk2NSwgMS4yMzA4NSwgMS4wNjYyOCwgMS4wNDk4MywgMC45NjI2OCwgMS4wNDk5LCAwLjk4NDM5LCAxLjE4MTAyLCAxLjA2NjI4LCAxLjAwMDgsIDEuMDY2MjgsIDAuOTg0MzksIDAuNzk3OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDk0NjYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTcyNzgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDIwNjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDY0NjcsIDEuMDI1MTEsIDEuMDY0NjcsIDEuMDI1MTEsIDEuMDY0NjcsIDEuMDI1MTEsIDAuOTA5OTYsIDAuOTY3NTIsIDEsIDEuMjE0MDgsIDAuODk5MDMsIDEsIDEsIDAuNzUxNTUsIDEuMDQzOTQsIDEuMDQzOTQsIDEuMDQzOTQsIDEuMDQzOTQsIDAuOTg2MzMsIDAuOTg2MzMsIDAuOTg2MzMsIDAuNzMwNDcsIDAuNzMwNDcsIDEuMjA2NDIsIDAuOTEyMTEsIDEuMjU2MzUsIDEuMjIyLCAxLjAyOTU2LCAxLjAzMzcyLCAxLjAzMzcyLCAwLjk2MDM5LCAxLjI0NjMzLCAxLCAxLjEyNDU0LCAwLjkzNTAzLCAxLjAzNDI0LCAxLjE5Njg3LCAxLjAzNDI0LCAxLCAxLCAxLCAwLjc3MSwgMSwgMSwgMS4xNTc0OSwgMS4xNTc0OSwgMS4xNTc0OSwgMS4xMDk0OCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjE4MiwgMSwgMSwgMS4xNjg5NywgMSwgMC45NjA4NSwgMC45MDEzNywgMS4yMTA3LCAxLjE4NDE2LCAxLjEzOTczLCAwLjY5ODI1LCAwLjk3MTYsIDIuMTAzMzksIDEuMjkwMDQsIDEuMjkwMDQsIDEuMjExNzIsIDEuMjkwMDQsIDEuMjkwMDQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTg4NzQsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4wOTE5MywgMS4wOTE5MywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IFNlZ29ldWlCb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjMzMDA4LAogIGxpbmVHYXA6IDAKfTsKY29uc3QgU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzID0gWzEuNzY3MzgsIDEsIDEsIDAuOTg5NDYsIDEuMDM5NTksIDEuMDQwMTYsIDEuMDI4MDksIDEuMDM2LCAwLjk3NjM5LCAxLjEwOTUzLCAxLjIzMjAzLCAxLjExMTQ0LCAxLjExMTQ0LCAxLjE2OTM5LCAxLjIxMjM3LCAwLjk3NTQsIDEuMjEyNjEsIDAuOTc1NCwgMS41OTc1NCwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDAuODEzNzgsIDAuODEzNzgsIDEuMjEyMzcsIDEuMjEyMzcsIDEuMjEyMzcsIDAuNzM1NDEsIDAuOTc4NDcsIDAuOTczNjMsIDAuODk3MjMsIDAuODc4OTcsIDEuMDQyNiwgMC43OTQyOSwgMC44NTI5MiwgMC45MTE0OSwgMS4wNTgxNSwgMS4xNDA2LCAwLjc5NjMxLCAwLjkwMTI4LCAwLjgzODUzLCAxLjA0Mzk2LCAxLjEwNjE1LCAwLjk3NTUyLCAwLjk0NDM2LCAwLjk3NTUyLCAwLjg4NjQxLCAwLjgwNTI3LCAwLjk2MDgzLCAxLjAwMTM1LCAxLCAxLjA2Nzc3LCAwLjk4MTcsIDAuOTExNDIsIDAuOTkzNjEsIDEuMTExNDQsIDEuNTcyOTMsIDEuMTExNDQsIDEuMjEyMzcsIDAuNzQ2MjcsIDEuMzE4MTgsIDEuMDY1ODUsIDAuOTcwNDIsIDAuODMwNTUsIDAuOTcwNDIsIDAuOTM1MDMsIDEuMTI2MSwgMC45NzA0MiwgMC45NzkyMiwgMS4xNDIzNiwgMC45NDU1MiwgMS4wMTA1NCwgMS4xNDIzNiwgMS4wMjQ3MSwgMC45NzkyMiwgMC45NDE2NSwgMC45NzA0MiwgMC45NzA0MiwgMS4wMjc2LCAwLjc4OTI5LCAxLjEyNjEsIDAuOTc5MjIsIDAuOTU4NzQsIDEuMDIxOTcsIDAuOTg1MDcsIDAuOTY3NTIsIDAuOTcxNjgsIDAuOTUxMDcsIDEuMTY1NzksIDAuOTUxMDcsIDEuMjEyMzcsIDEuMDM5NTksIDEuMDM2LCAxLjAzNiwgMSwgMS4wMzYsIDEuMTY1NzksIDAuODczNTcsIDEuMzE4MTgsIDEuMTg3NTQsIDEuMjY3ODEsIDEuMDUzNTYsIDEuMjEyMzcsIDEuMTg2MjIsIDAuNzk0ODcsIDAuOTQ5OTQsIDEuMjkwMDQsIDEuMjQwNDcsIDEuMjQwNDcsIDEuMzE4MTgsIDEsIDAuOTE0ODQsIDAuOTc1NCwgMS4zMTgxOCwgMS4xMzQ5LCAxLjI0ODY2LCAxLjA1MzU2LCAxLjEzOTM0LCAxLjE1NTc0LCAxLjE3Mzg5LCAwLjczNTQxLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk0Mzg1LCAwLjg3ODk3LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjE0MDYsIDEuMDQyNiwgMS4xMDYxNSwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMS4yMTIzNywgMC45NzU1MiwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMC45MTE0MiwgMC45NDQzNiwgMC45ODcyMSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMC45NjcwNSwgMC44MzA1NSwgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMC45MzEyNSwgMC45NzkyMiwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMS4yOTAwNCwgMC45NDE2NSwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45Njc1MiwgMC45NzA0MiwgMC45Njc1MiwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMS4wNDI2LCAxLjAwMzMsIDEuMDQyNiwgMC45NzA0MiwgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMSwgMSwgMS4wNTgxNSwgMC45NzkyMiwgMS4wNTgxNSwgMC45NzkyMiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDEuMTQwNiwgMS4xNDIzNiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDAuOTc0NDEsIDEuMDQzMDIsIDAuNzk2MzEsIDEuMDE1ODIsIDEsIDEsIDEuMDEwNTQsIDAuODM4NTMsIDEuMTQyMzYsIDEsIDEsIDAuODM4NTMsIDEuMDkxMjUsIDAuODM4NTMsIDAuOTA0MTgsIDAuODM4NTMsIDEuMTk1MDgsIDEuMTA2MTUsIDAuOTc5MjIsIDEsIDEsIDEuMTA2MTUsIDAuOTc5MjIsIDEuMDEwMzQsIDEuMTA0NjYsIDAuOTc5MjIsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTE2MDIsIDAuOTE5ODEsIDAuODg2NDEsIDEuMDI3NiwgMSwgMSwgMC44ODY0MSwgMS4wMjc2LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAxLCAxLCAwLjk2MDgzLCAxLjA1NDAzLCAwLjk1OTIzLCAxLjE2ODYyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjA2Nzc3LCAxLjAyMTk3LCAwLjkxMTQyLCAwLjk2NzUyLCAwLjkxMTQyLCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAxLjIzMTk5LCAxLjAzNiwgMC45NzM2MywgMS4wNjU4NSwgMC45NDM4NSwgMC45NjcwNSwgMC45NzU1MiwgMC45NDE2NSwgMSwgMSwgMC45NjA4MywgMS4xMjYxLCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAwLjk1MTYxLCAxLjI3MTI2LCAxLjAwODExLCAwLjgzMjg0LCAwLjc3NzAyLCAwLjk5MTM3LCAwLjk1MjUzLCAxLjAzNDcsIDAuODYxNDIsIDEuMDcyMDUsIDEuMTQyMzYsIDAuOTczNjMsIDAuODk3MjMsIDAuODY4NjksIDEuMDk4MTgsIDAuNzk0MjksIDAuOTkzNjEsIDEuMDU4MTUsIDAuOTc1NTIsIDEuMTQwNiwgMC45MDEyOCwgMS4wNjY2MiwgMS4wNDM5NiwgMS4xMDYxNSwgMC44NDkxOCwgMC45NzU1MiwgMS4wNDY5NCwgMC45NDQzNiwgMC45ODAxNSwgMC45NjA4MywgMC45MTE0MiwgMS4wMDM1NiwgMC45ODE3LCAxLjAxOTQ1LCAwLjk4OTk5LCAxLjE0MDYsIDAuOTExNDIsIDEuMDQ5NjEsIDAuOTg5OCwgMS4wMDYzOSwgMS4xNDIzNiwgMS4wNzUxNCwgMS4wNDk2MSwgMC45OTYwNywgMS4wMjg5NywgMS4wMDgsIDAuOTg5OCwgMC45NTEzNCwgMS4wMDYzOSwgMS4xMTEyMSwgMS4xNDIzNiwgMS4wMDUxOCwgMC45Nzk4MSwgMS4wMjE4NiwgMSwgMS4wODU3OCwgMC45NDE2NSwgMC45OTMxNCwgMC45ODM4NywgMC45MzAyOCwgMC45MzM3NywgMS4zNTEyNSwgMS4wNzUxNCwgMS4xMDY4NywgMC45MzQ5MSwgMS4wNDIzMiwgMS4wMDM1MSwgMS4xNDIzNiwgMS4wNzUxNCwgMC45NDE2NSwgMS4wNzUxNCwgMS4wMDM1MSwgMC43OTQyOSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wOTA5NywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MzUwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjYwOSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMC45MTE0MiwgMC45Njc1MiwgMSwgMS4yMTI2MSwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDM5NCwgMC45ODYzMywgMC45ODYzMywgMC45ODYzMywgMC43Mjk1OSwgMC43Mjk1OSwgMS4yMDUwMiwgMC45MTQwNiwgMS4yNjUxNCwgMS4yMjIsIDEuMDI5NTYsIDEuMDMzNzIsIDEuMDMzNzIsIDAuOTYwMzksIDEuMjQ2MzMsIDEsIDEuMDkxMjUsIDAuOTMzMjcsIDEuMDMzMzYsIDEuMTY1NDEsIDEuMDM2LCAxLCAxLCAxLCAwLjc3MSwgMSwgMSwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMC44NjM2NCwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjIyNCwgMSwgMSwgMS4xNjc5OCwgMSwgMC45NjA4NSwgMC45MDA2OCwgMS4yMTIzNywgMS4xODQxNiwgMS4xMzkwNCwgMC42OTgyNSwgMC45NzE2LCAyLjEwMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLjIxMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE4Nzc1LCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMTMyNjksIDEuMTMyNjksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBTZWdvZXVpQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmNvbnN0IFNlZ29ldWlJdGFsaWNGYWN0b3JzID0gWzEuNzY3MzgsIDEsIDEsIDAuOTg5NDYsIDEuMTQ3NjMsIDEuMDUzNjUsIDEuMDYyMzQsIDAuOTY5MjcsIDAuOTI1ODYsIDEuMTUzNzMsIDEuMTg0MTQsIDAuOTEzNDksIDAuOTEzNDksIDEuMDc0MDMsIDEuMTczMDgsIDAuNzgzODMsIDEuMjAwODgsIDAuNzgzODMsIDEuNDI1MzEsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuNzgzODMsIDAuNzgzODMsIDEuMTczMDgsIDEuMTczMDgsIDEuMTczMDgsIDAuNzczNDksIDAuOTQ1NjUsIDAuOTQ3MjksIDAuODU5NDQsIDAuODg1MDYsIDAuOTg1OCwgMC43NDgxNywgMC44MDAxNiwgMC44ODQ0OSwgMC45ODAzOSwgMC45NTc4MiwgMC42OTIzOCwgMC44OTg5OCwgMC44MzIzMSwgMC45ODE4MywgMS4wMzk4OSwgMC45NjkyNCwgMC44NjIzNywgMC45NjkyNCwgMC44MDU5NSwgMC43NDUyNCwgMC44NjA5MSwgMC45NTQwMiwgMC45NDE0MywgMC45ODQ0OCwgMC44ODU4LCAwLjgzMDg5LCAwLjkzMjg1LCAxLjA5NDksIDEuMzkwMTYsIDEuMDk0OSwgMS40NTk5NCwgMC43NDYyNywgMS4wNDgzOSwgMC45NzQ1NCwgMC45NzQ1NCwgMC44NzIwNywgMC45NzQ1NCwgMC44NzUzMywgMS4wNjE1MSwgMC45NzQ1NCwgMS4wMDE3NiwgMS4xNjQ4NCwgMS4wODEzMiwgMC45ODA0NywgMS4xNjQ4NCwgMS4wMjk4OSwgMS4wMTA1NCwgMC45NjIyNSwgMC45NzQ1NCwgMC45NzQ1NCwgMS4wNjU5OCwgMC43OTAwNCwgMS4xNjM0NCwgMS4wMDM1MSwgMC45NDYyOSwgMC45OTczLCAwLjkxMDE2LCAwLjk2Nzc3LCAwLjkwNDMsIDAuOTEwODIsIDAuOTI0ODEsIDAuOTEwODIsIDEuMTczMDgsIDAuOTU3NDgsIDAuOTY5MjcsIDAuOTY5MjcsIDEsIDAuOTY5MjcsIDAuOTI0ODEsIDAuODA1OTcsIDEuMDQ4MzksIDEuMjMzOTMsIDEuMTc4MSwgMC45MjQ1LCAxLjE3MzA4LCAxLjIwODA4LCAwLjYzMjE4LCAwLjk0MjYxLCAxLjI0ODIyLCAxLjA5OTcxLCAxLjA5OTcxLCAxLjA0ODM5LCAxLCAwLjg1MjczLCAwLjc4MDMyLCAxLjA0ODM5LCAxLjA5OTcxLCAxLjIyMzI2LCAwLjkyNDUsIDEuMDk4MzYsIDEuMTM1MjUsIDEuMTUyMjIsIDAuNzA0MjQsIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuODU0OTgsIDAuODg1MDYsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTg1OCwgMS4wMzk4OSwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMS4xNzMwOCwgMC45NjkyNCwgMC45NTQwMiwgMC45NTQwMiwgMC45NTQwMiwgMC45NTQwMiwgMC44MzA4OSwgMC44NjIzNywgMC44ODQwOSwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45MjkxNiwgMC44NzIwNywgMC44NzUzMywgMC44NzUzMywgMC44NzUzMywgMC44NzUzMywgMC45MzE0NiwgMC45MzE0NiwgMC45MzE0NiwgMC45MzE0NiwgMC45Mzg1NCwgMS4wMTA1NCwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMS4yNDgyMiwgMC44NzYxLCAxLjAwMzUxLCAxLjAwMzUxLCAxLjAwMzUxLCAxLjAwMzUxLCAwLjk2Nzc3LCAwLjk3NDU0LCAwLjk2Nzc3LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjk4NTgsIDAuOTUzOTEsIDAuOTg1OCwgMC45NzQ1NCwgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC44ODQ0OSwgMC45NzQ1NCwgMC44ODQ0OSwgMC45NzQ1NCwgMC44ODQ0OSwgMC45NzQ1NCwgMSwgMSwgMC45ODAzOSwgMS4wMDE3NiwgMC45ODAzOSwgMS4wMDE3NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMS4xNjQ4NCwgMC45NTc4MiwgMC45MzE0NiwgMC44NDQyMSwgMS4xMjc2MSwgMC42OTIzOCwgMS4wODEzMiwgMSwgMSwgMC45ODA0NywgMC44MzIzMSwgMS4xNjQ4NCwgMSwgMSwgMC44NDcyMywgMS4wNDg2MSwgMC44NDcyMywgMC43ODc1NSwgMC44MzIzMSwgMS4yMzczNiwgMS4wMzk4OSwgMS4wMTA1NCwgMSwgMSwgMS4wMzk4OSwgMS4wMTA1NCwgMC45ODU3LCAxLjAzODQ5LCAxLjAxMDU0LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjkyMzgzLCAwLjkwMTcxLCAwLjgwNTk1LCAxLjA2NTk4LCAxLCAxLCAwLjgwNTk1LCAxLjA2NTk4LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAxLCAxLCAwLjg2MDkxLCAxLjAyNzU5LCAwLjg1NzcxLCAxLjE2MzQ0LCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk4NDQ4LCAwLjk5NzMsIDAuODMwODksIDAuOTY3NzcsIDAuODMwODksIDAuOTMyODUsIDAuOTA0MywgMC45MzI4NSwgMC45MDQzLCAwLjkzMjg1LCAwLjkwNDMsIDEuMzE4NjgsIDAuOTY5MjcsIDAuOTQ3MjksIDAuOTc0NTQsIDAuODU0OTgsIDAuOTI5MTYsIDAuOTY5MjQsIDAuODc2MSwgMSwgMSwgMC44NjA5MSwgMS4xNjM0NCwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMC44MTk2NSwgMC44MTk2NSwgMC45NDcyOSwgMC43ODAzMiwgMC43MTAyMiwgMC45MDg4MywgMC44NDE3MSwgMC45OTg3NywgMC43NzU5NiwgMS4wNTczNCwgMS4yLCAwLjk0NzI5LCAwLjg1OTQ0LCAwLjgyNzkxLCAwLjk2MDcsIDAuNzQ4MTcsIDAuOTMyODUsIDAuOTgwMzksIDAuOTY5MjQsIDAuOTU3ODIsIDAuODk4OTgsIDAuOTgzMTYsIDAuOTgxODMsIDEuMDM5ODksIDAuNzg2MTQsIDAuOTY5MjQsIDAuOTc2NDIsIDAuODYyMzcsIDAuODYwNzUsIDAuODYwOTEsIDAuODMwODksIDAuOTAwODIsIDAuODg1OCwgMC45NzI5NiwgMS4wMTI4NCwgMC45NTc4MiwgMC44MzA4OSwgMS4wOTc2LCAxLjA0LCAxLjAzMzQyLCAxLjIsIDEuMDY3NSwgMS4wOTc2LCAwLjk4MjA1LCAxLjAzODA5LCAxLjA1MDk3LCAxLjA0LCAwLjk1MzY0LCAxLjAzMzQyLCAxLjA1NDAxLCAxLjIsIDEuMDIxNDgsIDEuMDExOSwgMS4wNDcyNCwgMS4wMTI3LCAxLjAyNzMyLCAwLjk2MjI1LCAwLjg5NjUsIDAuOTc3ODMsIDAuOTM1NzQsIDAuOTQ4MTgsIDEuMzA2NzksIDEuMDY3NSwgMS4xMTgyNiwgMC45OTgyMSwgMS4wNTU3LCAxLjAzMjYsIDEuMiwgMS4wNjc1LCAwLjk2MjI1LCAxLjA2NzUsIDEuMDMyNiwgMC43NDgxNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wMzc1NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NzUzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODcwNSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODQ0OCwgMC45OTczLCAwLjk4NDQ4LCAwLjk5NzMsIDAuOTg0NDgsIDAuOTk3MywgMC44MzA4OSwgMC45Njc3NywgMSwgMS4yMDA4OCwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMC45NDk0NSwgMC45NDk0NSwgMC45NDk0NSwgMC45NDk0NSwgMS4xMjMxNywgMS4xMjMxNywgMS4xMjMxNywgMC42NzYwMywgMC42NzYwMywgMS4xNTYyMSwgMC43MzU4NCwgMS4yMTE5MSwgMS4yMjEzNSwgMS4wNjQ4MywgMC45NDg2OCwgMC45NDg2OCwgMC45NTk5NiwgMS4yNDYzMywgMSwgMS4wNzQ5NywgMC44NzcwOSwgMC45NjkyNywgMS4wMTQ3MywgMC45NjkyNywgMSwgMSwgMSwgMC43NzI5NSwgMSwgMSwgMS4wOTgzNiwgMS4wOTgzNiwgMS4wOTgzNiwgMS4wMTUyMiwgMC44NjMyMSwgMC45NDQzNCwgMC44NjQ5LCAwLjk0NDM0LCAwLjg2MTgyLCAxLCAxLCAxLjA4MywgMSwgMC45MTU3OCwgMC44NjQzOCwgMS4xNzMwOCwgMS4xODQxNiwgMS4xNDU4OSwgMC42OTgyNSwgMC45NzYyMiwgMS45Njc5MSwgMS4yNDgyMiwgMS4yNDgyMiwgMS4xNzMwOCwgMS4yNDgyMiwgMS4yNDgyMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS40MjYwMywgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMS4xNzk4NCwgMS40MjYwMywgMSwgMS40MjYwMywgMS40MjYwMywgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4yODg2LCAxLjA0MzE1LCAxLjE1Mjk2LCAxLjM0MTYzLCAxLCAxLCAxLCAxLjEwNzQyLCAxLjEwNzQyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgU2Vnb2V1aUl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmNvbnN0IFNlZ29ldWlSZWd1bGFyRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk4NTk0LCAxLjAyMjg1LCAxLjEwNDU0LCAxLjA2MjM0LCAwLjk2OTI3LCAwLjkyMDM3LCAxLjE5OTg1LCAxLjIwNDYsIDAuOTA2MTYsIDAuOTA2MTYsIDEuMDcxNTIsIDEuMTcxNCwgMC43ODAzMiwgMS4yMDA4OCwgMC43ODAzMiwgMS40MDI0NiwgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC43ODAzMiwgMC43ODAzMiwgMS4xNzE0LCAxLjE3MTQsIDEuMTcxNCwgMC44MDU5NywgMC45NDA4NCwgMC45NjcwNiwgMC44NTk0NCwgMC44NTczNCwgMC45NzA5MywgMC43NTg0MiwgMC43OTkzNiwgMC44ODE5OCwgMC45ODMxLCAwLjk1NzgyLCAwLjcxMzg3LCAwLjg2OTY5LCAwLjg0NjM2LCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjk2OTI0LCAwLjgzOTY4LCAwLjk2OTI0LCAwLjgyODI2LCAwLjc5NjQ5LCAwLjg1NzcxLCAwLjk1MTMyLCAwLjkzMTE5LCAwLjk4OTY1LCAwLjg4NDMzLCAwLjgyODcsIDAuOTMzNjUsIDEuMDg2MTIsIDEuMzYzOCwgMS4wODYxMiwgMS40NTc4NiwgMC43NDYyNywgMC44MDQ5OSwgMC45MTQ4NCwgMS4wNTcwNywgMC45MjM4MywgMS4wNTg4MiwgMC45NDAzLCAxLjEyNjU0LCAxLjA1ODgyLCAxLjAxNzU2LCAxLjA5MDExLCAxLjA5MDExLCAwLjk5NDE0LCAxLjA5MDExLCAxLjAzNCwgMS4wMTc1NiwgMS4wNTM1NiwgMS4wNTcwNywgMS4wNTg4MiwgMS4wNDM5OSwgMC44NDg2MywgMS4yMTk2OCwgMS4wMTc1NiwgMC45NTgwMSwgMS4wMDA2OCwgMC45MTc5NywgMC45Njc3NywgMC45MDQzLCAwLjkwMzUxLCAwLjkyMTA1LCAwLjkwMzUxLCAxLjE3MTQsIDAuODUzMzcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTk5MTIsIDAuOTY5MjcsIDAuOTIxMDUsIDAuODA1OTcsIDEuMjQzNCwgMS4yMDgwOCwgMS4wNTkzNywgMC45MDk1NywgMS4xNzE0LCAxLjIwODA4LCAwLjc1MTU1LCAwLjk0MjYxLCAxLjI0NjQ0LCAxLjA5OTcxLCAxLjA5OTcxLCAwLjg0NzUxLCAxLCAwLjg1MjczLCAwLjc4MDMyLCAwLjYxNTg0LCAxLjA1NDI1LCAxLjE3OTE0LCAwLjkwOTU3LCAxLjA4NjY1LCAxLjExNTkzLCAxLjE0MTY5LCAwLjczMzgxLCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjg2MDM1LCAwLjg1NzM0LCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk3MDkzLCAxLjAzNTg0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAxLjE3MTQsIDAuOTY5MjQsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuODI4NywgMC44Mzk2OCwgMC44OTA0OSwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MzU3NSwgMC45MjM4MywgMC45NDAzLCAwLjk0MDMsIDAuOTQwMywgMC45NDAzLCAwLjg3MTcsIDAuODcxNywgMC44NzE3LCAwLjg3MTcsIDEuMDA1MjcsIDEuMDE3NTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMjQ2NDQsIDAuOTU5MjMsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDAuOTY3NzcsIDEuMDU3MDcsIDAuOTY3NzcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuOTcwOTMsIDEuMDk2OSwgMC45NzA5MywgMS4wNTg4MiwgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuNzU4NDIsIDAuOTQwMywgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDEsIDEsIDAuOTgzMSwgMS4wMTc1NiwgMC45ODMxLCAxLjAxNzU2LCAwLjk1NzgyLCAwLjg3MTcsIDAuOTU3ODIsIDAuODcxNywgMC45NTc4MiwgMC44NzE3LCAwLjk1NzgyLCAxLjA5MDExLCAwLjk1NzgyLCAwLjg3MTcsIDAuODQ3ODQsIDEuMTE1NTEsIDAuNzEzODcsIDEuMDkwMTEsIDEsIDEsIDAuOTk0MTQsIDAuODQ2MzYsIDEuMDkwMTEsIDEsIDEsIDAuODQ2MzYsIDEuMDUzNiwgMC44NDYzNiwgMC45NDI5OCwgMC44NDYzNiwgMS4yMzI5NywgMS4wMzU4NCwgMS4wMTc1NiwgMSwgMSwgMS4wMzU4NCwgMS4wMTc1NiwgMS4wMDMyMywgMS4wMzQ0NCwgMS4wMTc1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45MzA2NiwgMC45ODI5MywgMC44MjgyNiwgMS4wNDM5OSwgMSwgMSwgMC44MjgyNiwgMS4wNDM5OSwgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMSwgMSwgMC44NTc3MSwgMS4xNzMxOCwgMC44NTc3MSwgMS4yMTk2OCwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAwLjgyODcsIDAuOTMzNjUsIDAuOTA0MywgMC45MzM2NSwgMC45MDQzLCAwLjkzMzY1LCAwLjkwNDMsIDEuMDg1NzEsIDAuOTY5MjcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODYwMzUsIDAuOTM1NzUsIDAuOTY5MjQsIDAuOTU5MjMsIDEsIDEsIDAuODU3NzEsIDEuMjE5NjgsIDEuMTE0MzcsIDEuMTE0MzcsIDAuOTMxMDksIDAuOTEyMDIsIDAuNjA0MTEsIDAuODQxNjQsIDAuNTU1NzIsIDEuMDExNzMsIDAuOTczNjEsIDAuODE4MTgsIDAuODE4MTgsIDAuOTY2MzUsIDAuNzgwMzIsIDAuNzI3MjcsIDAuOTIzNjYsIDAuOTg2MDEsIDEuMDM0MDUsIDAuNzc5NjgsIDEuMDk3OTksIDEuMiwgMC45NjcwNiwgMC44NTk0NCwgMC44NTYzOCwgMC45NjQ5MSwgMC43NTg0MiwgMC45MzM2NSwgMC45ODMxLCAwLjk2OTI0LCAwLjk1NzgyLCAwLjg2OTY5LCAwLjk0MTUyLCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjc4NDM3LCAwLjk2OTI0LCAwLjk4NzE1LCAwLjgzOTY4LCAwLjgzNDkxLCAwLjg1NzcxLCAwLjgyODcsIDAuOTQ0OTIsIDAuODg0MzMsIDAuOTI4NywgMS4wMDk4LCAwLjk1NzgyLCAwLjgyODcsIDEuMDYyNSwgMC45ODI0OCwgMS4wMzQyNCwgMS4yLCAxLjAxMDcxLCAxLjA2MjUsIDAuOTUyNDYsIDEuMDM4MDksIDEuMDQ5MTIsIDAuOTgyNDgsIDEuMDAyMjEsIDEuMDM0MjQsIDEuMDU0NDMsIDEuMiwgMS4wNDc4NSwgMC45OTYwOSwgMS4wMDE2OSwgMS4wNTE3NiwgMC45OTM0NiwgMS4wNTM1NiwgMC45MDg3LCAxLjAzMDA0LCAwLjk1NTQyLCAwLjkzMTE3LCAxLjIzMzYyLCAxLjAxMDcxLCAxLjA3ODMxLCAxLjAyNTEyLCAxLjA1MjA1LCAxLjAzNTAyLCAxLjIsIDEuMDEwNzEsIDEuMDUzNTYsIDEuMDEwNzEsIDEuMDM1MDIsIDAuNzU4NDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDM3MTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTQwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNDAyMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAxLCAxLjIwMDg4LCAwLjg5OTAzLCAxLCAxLCAwLjc1MTU1LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjEzMTk2LCAxLjEzMTk2LCAxLjEzMTk2LCAwLjY3NDI4LCAwLjY3NDI4LCAxLjE2MDM5LCAwLjczMjkxLCAxLjIwOTk2LCAxLjIyMTM1LCAxLjA2NDgzLCAwLjk0ODY4LCAwLjk0ODY4LCAwLjk1OTk2LCAxLjI0NjMzLCAxLCAxLjA3NDk3LCAwLjg3Nzk2LCAwLjk2OTI3LCAxLjAxNTE4LCAwLjk2OTI3LCAxLCAxLCAxLCAwLjc3Mjk1LCAxLCAxLCAxLjEwNTM5LCAxLjEwNTM5LCAxLjExMzU4LCAxLjA2OTY3LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2MTgyLCAxLCAxLCAxLjA4MywgMSwgMC45MTU3OCwgMC44NjUwNywgMS4xNzE0LCAxLjE4NDE2LCAxLjE0NTg5LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjk2OTcsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEuMTcyMzgsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTgwODMsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4xMDkzOCwgMS4xMDkzOCwgMSwgMSwgMSwgMS4wNTQyNSwgMS4wOTk3MSwgMS4wOTk3MSwgMS4wOTk3MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IFNlZ29ldWlSZWd1bGFyTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjMzMDA4LAogIGxpbmVHYXA6IDAKfTsKCjsvLyAuL3NyYy9jb3JlL3hmYV9mb250cy5qcwoKCgoKCgoKCmNvbnN0IGdldFhGQUZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJNeXJpYWRQcm8tUmVndWxhciJdID0gdFsiUGRmSlMtRmFsbGJhY2stUmVndWxhciJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogTXlyaWFkUHJvUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb1JlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tQm9sZCJdID0gdFsiUGRmSlMtRmFsbGJhY2stQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogTXlyaWFkUHJvQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb0JvbGRNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tSXQiXSA9IHRbIk15cmlhZFByby1JdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsCiAgICBmYWN0b3JzOiBNeXJpYWRQcm9JdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nLAogICAgbWV0cmljczogTXlyaWFkUHJvSXRhbGljTWV0cmljcwogIH07CiAgdFsiTXlyaWFkUHJvLUJvbGRJdCJdID0gdFsiTXlyaWFkUHJvLUJvbGRJdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUJvbGRJdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIiwKICAgIGZhY3RvcnM6IE15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcwogIH07CiAgdC5BcmlhbE1UID0gdC5BcmlhbCA9IHRbIkFyaWFsLVJlZ3VsYXIiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1Cb2xkTVQiXSA9IHRbIkFyaWFsLUJvbGQiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zQm9sZFdpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gdFsiQXJpYWwtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZwogIH07CiAgdFsiQXJpYWwtQm9sZEl0YWxpY01UIl0gPSB0WyJBcmlhbC1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZwogIH07CiAgdFsiQ2FsaWJyaS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBDYWxpYnJpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogQ2FsaWJyaUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBDYWxpYnJpSXRhbGljTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBTZWdvZXVpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogU2Vnb2V1aUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBTZWdvZXVpSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiSGVsdmV0aWNhLVJlZ3VsYXIiXSA9IHQuSGVsdmV0aWNhID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogSGVsdmV0aWNhUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYVJlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGZhY3RvcnM6IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBIZWx2ZXRpY2FJdGFsaWNNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzCiAgfTsKfSk7CmZ1bmN0aW9uIGdldFhmYUZvbnROYW1lKG5hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIGNvbnN0IGZvbnRNYXAgPSBnZXRYRkFGb250TWFwKCk7CiAgcmV0dXJuIGZvbnRNYXBbZm9udE5hbWVdOwp9CmZ1bmN0aW9uIGdldFhmYUZvbnRXaWR0aHMobmFtZSkgewogIGNvbnN0IGluZm8gPSBnZXRYZmFGb250TmFtZShuYW1lKTsKICBpZiAoIWluZm8pIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCB7CiAgICBiYXNlV2lkdGhzLAogICAgYmFzZU1hcHBpbmcsCiAgICBmYWN0b3JzCiAgfSA9IGluZm87CiAgY29uc3QgcmVzY2FsZWRCYXNlV2lkdGhzID0gIWZhY3RvcnMgPyBiYXNlV2lkdGhzIDogYmFzZVdpZHRocy5tYXAoKHcsIGkpID0+IHcgKiBmYWN0b3JzW2ldKTsKICBsZXQgY3VycmVudENvZGUgPSAtMjsKICBsZXQgY3VycmVudEFycmF5OwogIGNvbnN0IG5ld1dpZHRocyA9IFtdOwogIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSW5kZXhdIG9mIGJhc2VNYXBwaW5nLm1hcCgoY2hhclVuaWNvZGUsIGluZGV4KSA9PiBbY2hhclVuaWNvZGUsIGluZGV4XSkuc29ydCgoW3VuaWNvZGUxXSwgW3VuaWNvZGUyXSkgPT4gdW5pY29kZTEgLSB1bmljb2RlMikpIHsKICAgIGlmICh1bmljb2RlID09PSAtMSkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICh1bmljb2RlID09PSBjdXJyZW50Q29kZSArIDEpIHsKICAgICAgY3VycmVudEFycmF5LnB1c2gocmVzY2FsZWRCYXNlV2lkdGhzW2dseXBoSW5kZXhdKTsKICAgICAgY3VycmVudENvZGUgKz0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnRDb2RlID0gdW5pY29kZTsKICAgICAgY3VycmVudEFycmF5ID0gW3Jlc2NhbGVkQmFzZVdpZHRoc1tnbHlwaEluZGV4XV07CiAgICAgIG5ld1dpZHRocy5wdXNoKHVuaWNvZGUsIGN1cnJlbnRBcnJheSk7CiAgICB9CiAgfQogIHJldHVybiBuZXdXaWR0aHM7Cn0KZnVuY3Rpb24gZ2V0WGZhRm9udERpY3QobmFtZSkgewogIGNvbnN0IHdpZHRocyA9IGdldFhmYUZvbnRXaWR0aHMobmFtZSk7CiAgY29uc3QgZGljdCA9IG5ldyBEaWN0KG51bGwpOwogIGRpY3Quc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KG5hbWUpKTsKICBkaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250IikpOwogIGRpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkNJREZvbnRUeXBlMiIpKTsKICBkaWN0LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICBkaWN0LnNldCgiQ0lEVG9HSURNYXAiLCBOYW1lLmdldCgiSWRlbnRpdHkiKSk7CiAgZGljdC5zZXQoIlciLCB3aWR0aHMpOwogIGRpY3Quc2V0KCJGaXJzdENoYXIiLCB3aWR0aHNbMF0pOwogIGRpY3Quc2V0KCJMYXN0Q2hhciIsIHdpZHRocy5hdCgtMikgKyB3aWR0aHMuYXQoLTEpLmxlbmd0aCAtIDEpOwogIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgRGljdChudWxsKTsKICBkaWN0LnNldCgiRm9udERlc2NyaXB0b3IiLCBkZXNjcmlwdG9yKTsKICBjb25zdCBzeXN0ZW1JbmZvID0gbmV3IERpY3QobnVsbCk7CiAgc3lzdGVtSW5mby5zZXQoIk9yZGVyaW5nIiwgIklkZW50aXR5Iik7CiAgc3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgc3lzdGVtSW5mby5zZXQoIlN1cHBsZW1lbnQiLCAwKTsKICBkaWN0LnNldCgiQ0lEU3lzdGVtSW5mbyIsIHN5c3RlbUluZm8pOwogIHJldHVybiBkaWN0Owp9Cgo7Ly8gLi9zcmMvY29yZS9wc19wYXJzZXIuanMKCgoKY2xhc3MgUG9zdFNjcmlwdFBhcnNlciB7CiAgY29uc3RydWN0b3IobGV4ZXIpIHsKICAgIHRoaXMubGV4ZXIgPSBsZXhlcjsKICAgIHRoaXMub3BlcmF0b3JzID0gW107CiAgICB0aGlzLnRva2VuID0gbnVsbDsKICAgIHRoaXMucHJldiA9IG51bGw7CiAgfQogIG5leHRUb2tlbigpIHsKICAgIHRoaXMucHJldiA9IHRoaXMudG9rZW47CiAgICB0aGlzLnRva2VuID0gdGhpcy5sZXhlci5nZXRUb2tlbigpOwogIH0KICBhY2NlcHQodHlwZSkgewogICAgaWYgKHRoaXMudG9rZW4udHlwZSA9PT0gdHlwZSkgewogICAgICB0aGlzLm5leHRUb2tlbigpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgZXhwZWN0KHR5cGUpIHsKICAgIGlmICh0aGlzLmFjY2VwdCh0eXBlKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5leHBlY3RlZCBzeW1ib2w6IGZvdW5kICR7dGhpcy50b2tlbi50eXBlfSBleHBlY3RlZCAke3R5cGV9LmApOwogIH0KICBwYXJzZSgpIHsKICAgIHRoaXMubmV4dFRva2VuKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzOwogIH0KICBwYXJzZUJsb2NrKCkgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk5VTUJFUikpIHsKICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IpKSB7CiAgICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHsKICAgICAgICB0aGlzLnBhcnNlQ29uZGl0aW9uKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlQ29uZGl0aW9uKCkgewogICAgY29uc3QgY29uZGl0aW9uTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGKSkgewogICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbl0gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOwogICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7CiAgICAgIGNvbnN0IGp1bXBMb2NhdGlvbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKICAgICAgY29uc3QgZW5kT2ZUcnVlID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOwogICAgICB0aGlzLnBhcnNlQmxvY2soKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFKTsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uICsgMV0gPSAiaiI7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IGVuZE9mVHJ1ZTsKICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9ICJqeiI7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBTIEZ1bmN0aW9uOiBlcnJvciBwYXJzaW5nIGNvbmRpdGlvbmFsLiIpOwogICAgfQogIH0KfQpjb25zdCBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHsKICBMQlJBQ0U6IDAsCiAgUkJSQUNFOiAxLAogIE5VTUJFUjogMiwKICBPUEVSQVRPUjogMywKICBJRjogNCwKICBJRkVMU0U6IDUKfTsKY2xhc3MgUG9zdFNjcmlwdFRva2VuIHsKICBzdGF0aWMgZ2V0IG9wQ2FjaGUoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcENhY2hlIiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgfQogIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKSB7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogIH0KICBzdGF0aWMgZ2V0T3BlcmF0b3Iob3ApIHsKICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4ub3BDYWNoZVtvcF0gfHw9IG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IsIG9wKTsKICB9CiAgc3RhdGljIGdldCBMQlJBQ0UoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJMQlJBQ0UiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSwgInsiKSk7CiAgfQogIHN0YXRpYyBnZXQgUkJSQUNFKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiUkJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UsICJ9IikpOwogIH0KICBzdGF0aWMgZ2V0IElGKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiSUYiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLklGLCAiSUYiKSk7CiAgfQogIHN0YXRpYyBnZXQgSUZFTFNFKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiSUZFTFNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRkVMU0UsICJJRkVMU0UiKSk7CiAgfQp9CmNsYXNzIFBvc3RTY3JpcHRMZXhlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMubmV4dENoYXIoKTsKICAgIHRoaXMuc3RyQnVmID0gW107CiAgfQogIG5leHRDaGFyKCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudENoYXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgfQogIGdldFRva2VuKCkgewogICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgcmV0dXJuIEVPRjsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB9CiAgICBzd2l0Y2ggKGNoIHwgMCkgewogICAgICBjYXNlIDB4MzA6CiAgICAgIGNhc2UgMHgzMToKICAgICAgY2FzZSAweDMyOgogICAgICBjYXNlIDB4MzM6CiAgICAgIGNhc2UgMHgzNDoKICAgICAgY2FzZSAweDM1OgogICAgICBjYXNlIDB4MzY6CiAgICAgIGNhc2UgMHgzNzoKICAgICAgY2FzZSAweDM4OgogICAgICBjYXNlIDB4Mzk6CiAgICAgIGNhc2UgMHgyYjoKICAgICAgY2FzZSAweDJkOgogICAgICBjYXNlIDB4MmU6CiAgICAgICAgcmV0dXJuIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuTlVNQkVSLCB0aGlzLmdldE51bWJlcigpKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTsKICAgICAgY2FzZSAweDdkOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLlJCUkFDRTsKICAgIH0KICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBzdHJCdWZbMF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1YSB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4N2EpKSB7CiAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgIH0KICAgIGNvbnN0IHN0ciA9IHN0ckJ1Zi5qb2luKCIiKTsKICAgIHN3aXRjaCAoc3RyLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAiaWYiOgogICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7CiAgICAgIGNhc2UgImlmZWxzZSI6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5JRkVMU0U7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihzdHIpOwogICAgfQogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgewogICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8IGNoID09PSAweDJkIHx8IGNoID09PSAweDJlKSB7CiAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oIiIpKTsKICAgIGlmIChpc05hTih2YWx1ZSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGZsb2F0aW5nIHBvaW50IG51bWJlcjogJHt2YWx1ZX1gKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2ltYWdlX3V0aWxzLmpzCgoKY2xhc3MgQmFzZUxvY2FsQ2FjaGUgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHRoaXMuX29ubHlSZWZzID0gb3B0aW9ucz8ub25seVJlZnMgPT09IHRydWU7CiAgICBpZiAoIXRoaXMuX29ubHlSZWZzKSB7CiAgICAgIHRoaXMuX25hbWVSZWZNYXAgPSBuZXcgTWFwKCk7CiAgICAgIHRoaXMuX2ltYWdlTWFwID0gbmV3IE1hcCgpOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogIH0KICBnZXRCeU5hbWUobmFtZSkgewogICAgaWYgKHRoaXMuX29ubHlSZWZzKSB7CiAgICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgYGdldEJ5TmFtZWAgbWV0aG9kLiIpOwogICAgfQogICAgY29uc3QgcmVmID0gdGhpcy5fbmFtZVJlZk1hcC5nZXQobmFtZSk7CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEJ5UmVmKHJlZik7CiAgICB9CiAgICByZXR1cm4gdGhpcy5faW1hZ2VNYXAuZ2V0KG5hbWUpIHx8IG51bGw7CiAgfQogIGdldEJ5UmVmKHJlZikgewogICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZikgfHwgbnVsbDsKICB9CiAgc2V0KG5hbWUsIHJlZiwgZGF0YSkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgc2V0YCBjYWxsZWQuIik7CiAgfQp9CmNsYXNzIExvY2FsSW1hZ2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkgewogICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBzZXQobmFtZSA9IG51bGwsIHJlZiA9IG51bGwsIGRhdGEpIHsKICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIgJiYgIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKICAgICAgfQogICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKICB9Cn0KY2xhc3MgTG9jYWxGdW5jdGlvbkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKHsKICAgICAgb25seVJlZnM6IHRydWUKICAgIH0pOwogIH0KICBzZXQobmFtZSA9IG51bGwsIHJlZiwgZGF0YSkgewogICAgaWYgKCFyZWYpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbEdTdGF0ZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIHNldChuYW1lLCByZWYgPSBudWxsLCBkYXRhKSB7CiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxHU3RhdGVDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KfQpjbGFzcyBSZWdpb25hbEltYWdlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoewogICAgICBvbmx5UmVmczogdHJ1ZQogICAgfSk7CiAgfQogIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7CiAgICBpZiAoIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAicmVmIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgfQp9CmNsYXNzIEdsb2JhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignR2xvYmFsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLl9pbWFnZUNhY2hlLmNsZWFyKCk7CiAgfQp9CmNsYXNzIEdsb2JhbEltYWdlQ2FjaGUgewogIHN0YXRpYyBOVU1fUEFHRVNfVEhSRVNIT0xEID0gMjsKICBzdGF0aWMgTUlOX0lNQUdFU19UT19DQUNIRSA9IDEwOwogIHN0YXRpYyBNQVhfQllURV9TSVpFID0gNWU3OwogICNkZWNvZGVGYWlsZWRTZXQgPSBuZXcgUmVmU2V0KCk7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogIH0KICBnZXQgI2J5dGVTaXplKCkgewogICAgbGV0IGJ5dGVTaXplID0gMDsKICAgIGZvciAoY29uc3QgaW1hZ2VEYXRhIG9mIHRoaXMuX2ltYWdlQ2FjaGUpIHsKICAgICAgYnl0ZVNpemUgKz0gaW1hZ2VEYXRhLmJ5dGVTaXplOwogICAgfQogICAgcmV0dXJuIGJ5dGVTaXplOwogIH0KICBnZXQgI2NhY2hlTGltaXRSZWFjaGVkKCkgewogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA8IEdsb2JhbEltYWdlQ2FjaGUuTUlOX0lNQUdFU19UT19DQUNIRSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy4jYnl0ZVNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk1BWF9CWVRFX1NJWkUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHNob3VsZENhY2hlKHJlZiwgcGFnZUluZGV4KSB7CiAgICBsZXQgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7CiAgICBpZiAoIXBhZ2VJbmRleFNldCkgewogICAgICBwYWdlSW5kZXhTZXQgPSBuZXcgU2V0KCk7CiAgICAgIHRoaXMuX3JlZkNhY2hlLnB1dChyZWYsIHBhZ2VJbmRleFNldCk7CiAgICB9CiAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7CiAgICBpZiAocGFnZUluZGV4U2V0LnNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpICYmIHRoaXMuI2NhY2hlTGltaXRSZWFjaGVkKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhZGREZWNvZGVGYWlsZWQocmVmKSB7CiAgICB0aGlzLiNkZWNvZGVGYWlsZWRTZXQucHV0KHJlZik7CiAgfQogIGhhc0RlY29kZUZhaWxlZChyZWYpIHsKICAgIHJldHVybiB0aGlzLiNkZWNvZGVGYWlsZWRTZXQuaGFzKHJlZik7CiAgfQogIGFkZEJ5dGVTaXplKHJlZiwgYnl0ZVNpemUpIHsKICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZik7CiAgICBpZiAoIWltYWdlRGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW1hZ2VEYXRhLmJ5dGVTaXplKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGltYWdlRGF0YS5ieXRlU2l6ZSA9IGJ5dGVTaXplOwogIH0KICBnZXREYXRhKHJlZiwgcGFnZUluZGV4KSB7CiAgICBjb25zdCBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTsKICAgIGlmICghcGFnZUluZGV4U2V0KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHBhZ2VJbmRleFNldC5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTsKICAgIGlmICghaW1hZ2VEYXRhKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcGFnZUluZGV4U2V0LmFkZChwYWdlSW5kZXgpOwogICAgcmV0dXJuIGltYWdlRGF0YTsKICB9CiAgc2V0RGF0YShyZWYsIGRhdGEpIHsKICAgIGlmICghdGhpcy5fcmVmQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBleHBlY3RlZCAic2hvdWxkQ2FjaGUiIHRvIGhhdmUgYmVlbiBjYWxsZWQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy4jY2FjaGVMaW1pdFJlYWNoZWQpIHsKICAgICAgd2FybigiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gY2FjaGUgbGltaXQgcmVhY2hlZC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9CiAgY2xlYXIob25seURhdGEgPSBmYWxzZSkgewogICAgaWYgKCFvbmx5RGF0YSkgewogICAgICB0aGlzLiNkZWNvZGVGYWlsZWRTZXQuY2xlYXIoKTsKICAgICAgdGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUuY2xlYXIoKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2Z1bmN0aW9uLmpzCgoKCgoKCmNsYXNzIFBERkZ1bmN0aW9uRmFjdG9yeSB7CiAgY29uc3RydWN0b3IoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlOwogIH0KICBjcmVhdGUoZm4sIHBhcnNlQXJyYXkgPSBmYWxzZSkgewogICAgbGV0IGZuUmVmLCBwYXJzZWRGbjsKICAgIGlmIChmbiBpbnN0YW5jZW9mIFJlZikgewogICAgICBmblJlZiA9IGZuOwogICAgfSBlbHNlIGlmIChmbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgZm5SZWYgPSBmbi5vYmpJZDsKICAgIH0gZWxzZSBpZiAoZm4gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGZuUmVmID0gZm4uZGljdD8ub2JqSWQ7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgY29uc3QgY2FjaGVkRm4gPSB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuZ2V0QnlSZWYoZm5SZWYpOwogICAgICBpZiAoY2FjaGVkRm4pIHsKICAgICAgICByZXR1cm4gY2FjaGVkRm47CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZuT2JqID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZm4pOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZm5PYmopKSB7CiAgICAgIGlmICghcGFyc2VBcnJheSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignUERGRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSAtIGV4cGVjdGVkICJwYXJzZUFycmF5IiBhcmd1bWVudC4nKTsKICAgICAgfQogICAgICBwYXJzZWRGbiA9IFBERkZ1bmN0aW9uLnBhcnNlQXJyYXkodGhpcywgZm5PYmopOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VkRm4gPSBQREZGdW5jdGlvbi5wYXJzZSh0aGlzLCBmbk9iaik7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLnNldChudWxsLCBmblJlZiwgcGFyc2VkRm4pOwogICAgfQogICAgcmV0dXJuIHBhcnNlZEZuOwogIH0KICBnZXQgX2xvY2FsRnVuY3Rpb25DYWNoZSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9sb2NhbEZ1bmN0aW9uQ2FjaGUiLCBuZXcgTG9jYWxGdW5jdGlvbkNhY2hlKCkpOwogIH0KfQpmdW5jdGlvbiB0b051bWJlckFycmF5KGFycikgewogIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKCFpc051bWJlckFycmF5KGFyciwgbnVsbCkpIHsKICAgIHJldHVybiBhcnIubWFwKHggPT4gK3gpOwogIH0KICByZXR1cm4gYXJyOwp9CmNsYXNzIFBERkZ1bmN0aW9uIHsKICBzdGF0aWMgZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHsKICAgIGxldCBpLCBpaTsKICAgIGxldCBsZW5ndGggPSAxOwogICAgZm9yIChpID0gMCwgaWkgPSBzaXplLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgbGVuZ3RoICo9IHNpemVbaV07CiAgICB9CiAgICBsZW5ndGggKj0gb3V0cHV0U2l6ZTsKICAgIGNvbnN0IGFycmF5ID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICBsZXQgY29kZVNpemUgPSAwOwogICAgbGV0IGNvZGVCdWYgPSAwOwogICAgY29uc3Qgc2FtcGxlTXVsID0gMS4wIC8gKDIuMCAqKiBicHMgLSAxKTsKICAgIGNvbnN0IHN0ckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKChsZW5ndGggKiBicHMgKyA3KSAvIDgpOwogICAgbGV0IHN0cklkeCA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgd2hpbGUgKGNvZGVTaXplIDwgYnBzKSB7CiAgICAgICAgY29kZUJ1ZiA8PD0gODsKICAgICAgICBjb2RlQnVmIHw9IHN0ckJ5dGVzW3N0cklkeCsrXTsKICAgICAgICBjb2RlU2l6ZSArPSA4OwogICAgICB9CiAgICAgIGNvZGVTaXplIC09IGJwczsKICAgICAgYXJyYXlbaV0gPSAoY29kZUJ1ZiA+PiBjb2RlU2l6ZSkgKiBzYW1wbGVNdWw7CiAgICAgIGNvZGVCdWYgJj0gKDEgPDwgY29kZVNpemUpIC0gMTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CiAgc3RhdGljIHBhcnNlKGZhY3RvcnksIGZuKSB7CiAgICBjb25zdCBkaWN0ID0gZm4uZGljdCB8fCBmbjsKICAgIGNvbnN0IHR5cGVOdW0gPSBkaWN0LmdldCgiRnVuY3Rpb25UeXBlIik7CiAgICBzd2l0Y2ggKHR5cGVOdW0pIHsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWQoZmFjdG9yeSwgZm4sIGRpY3QpOwogICAgICBjYXNlIDE6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoZmFjdG9yeSwgZGljdCk7CiAgICAgIGNhc2UgMzoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RTdGljaGVkKGZhY3RvcnksIGRpY3QpOwogICAgICBjYXNlIDQ6CiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0UG9zdFNjcmlwdChmYWN0b3J5LCBmbiwgZGljdCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZSBvZiBmdW5jdGlvbiIpOwogIH0KICBzdGF0aWMgcGFyc2VBcnJheShmYWN0b3J5LCBmbk9iaikgewogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZmFjdG9yeTsKICAgIGNvbnN0IGZuQXJyYXkgPSBbXTsKICAgIGZvciAoY29uc3QgZm4gb2YgZm5PYmopIHsKICAgICAgZm5BcnJheS5wdXNoKHRoaXMucGFyc2UoZmFjdG9yeSwgeHJlZi5mZXRjaElmUmVmKGZuKSkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBmbkFycmF5W2ldKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0ICsgaSk7CiAgICAgIH0KICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RTYW1wbGVkKGZhY3RvcnksIGZuLCBkaWN0KSB7CiAgICBmdW5jdGlvbiB0b011bHRpQXJyYXkoYXJyKSB7CiAgICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gYXJyLmxlbmd0aDsKICAgICAgY29uc3Qgb3V0ID0gW107CiAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkgKz0gMikgewogICAgICAgIG91dFtpbmRleCsrXSA9IFthcnJbaV0sIGFycltpICsgMV1dOwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh4LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4KSB7CiAgICAgIHJldHVybiB5bWluICsgKHggLSB4bWluKSAqICgoeW1heCAtIHltaW4pIC8gKHhtYXggLSB4bWluKSk7CiAgICB9CiAgICBsZXQgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBsZXQgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOwogICAgaWYgKCFkb21haW4gfHwgIXJhbmdlKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gZG9tYWluIG9yIHJhbmdlIik7CiAgICB9CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoIC8gMjsKICAgIGNvbnN0IG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggLyAyOwogICAgZG9tYWluID0gdG9NdWx0aUFycmF5KGRvbWFpbik7CiAgICByYW5nZSA9IHRvTXVsdGlBcnJheShyYW5nZSk7CiAgICBjb25zdCBzaXplID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJTaXplIikpOwogICAgY29uc3QgYnBzID0gZGljdC5nZXQoIkJpdHNQZXJTYW1wbGUiKTsKICAgIGNvbnN0IG9yZGVyID0gZGljdC5nZXQoIk9yZGVyIikgfHwgMTsKICAgIGlmIChvcmRlciAhPT0gMSkgewogICAgICBpbmZvKCJObyBzdXBwb3J0IGZvciBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbjogIiArIG9yZGVyKTsKICAgIH0KICAgIGxldCBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKICAgIGlmICghZW5jb2RlKSB7CiAgICAgIGVuY29kZSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7CiAgICAgICAgZW5jb2RlLnB1c2goWzAsIHNpemVbaV0gLSAxXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVuY29kZSA9IHRvTXVsdGlBcnJheShlbmNvZGUpOwogICAgfQogICAgbGV0IGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOwogICAgZGVjb2RlID0gIWRlY29kZSA/IHJhbmdlIDogdG9NdWx0aUFycmF5KGRlY29kZSk7CiAgICBjb25zdCBzYW1wbGVzID0gdGhpcy5nZXRTYW1wbGVBcnJheShzaXplLCBvdXRwdXRTaXplLCBicHMsIGZuKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgY3ViZVZlcnRpY2VzID0gMSA8PCBpbnB1dFNpemU7CiAgICAgIGNvbnN0IGN1YmVOID0gbmV3IEZsb2F0NjRBcnJheShjdWJlVmVydGljZXMpLmZpbGwoMSk7CiAgICAgIGNvbnN0IGN1YmVWZXJ0ZXggPSBuZXcgVWludDMyQXJyYXkoY3ViZVZlcnRpY2VzKTsKICAgICAgbGV0IGksIGo7CiAgICAgIGxldCBrID0gb3V0cHV0U2l6ZSwKICAgICAgICBwb3MgPSAxOwogICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRTaXplOyArK2kpIHsKICAgICAgICBjb25zdCBkb21haW5fMmkgPSBkb21haW5baV1bMF07CiAgICAgICAgY29uc3QgZG9tYWluXzJpXzEgPSBkb21haW5baV1bMV07CiAgICAgICAgY29uc3QgeGkgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldCArIGldLCBkb21haW5fMmksIGRvbWFpbl8yaV8xKTsKICAgICAgICBsZXQgZSA9IGludGVycG9sYXRlKHhpLCBkb21haW5fMmksIGRvbWFpbl8yaV8xLCBlbmNvZGVbaV1bMF0sIGVuY29kZVtpXVsxXSk7CiAgICAgICAgY29uc3Qgc2l6ZV9pID0gc2l6ZVtpXTsKICAgICAgICBlID0gTWF0aENsYW1wKGUsIDAsIHNpemVfaSAtIDEpOwogICAgICAgIGNvbnN0IGUwID0gZSA8IHNpemVfaSAtIDEgPyBNYXRoLmZsb29yKGUpIDogZSAtIDE7CiAgICAgICAgY29uc3QgbjAgPSBlMCArIDEgLSBlOwogICAgICAgIGNvbnN0IG4xID0gZSAtIGUwOwogICAgICAgIGNvbnN0IG9mZnNldDAgPSBlMCAqIGs7CiAgICAgICAgY29uc3Qgb2Zmc2V0MSA9IG9mZnNldDAgKyBrOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWJlVmVydGljZXM7IGorKykgewogICAgICAgICAgaWYgKGogJiBwb3MpIHsKICAgICAgICAgICAgY3ViZU5bal0gKj0gbjE7CiAgICAgICAgICAgIGN1YmVWZXJ0ZXhbal0gKz0gb2Zmc2V0MTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1YmVOW2pdICo9IG4wOwogICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGsgKj0gc2l6ZV9pOwogICAgICAgIHBvcyA8PD0gMTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0U2l6ZTsgKytqKSB7CiAgICAgICAgbGV0IHJqID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3ViZVZlcnRpY2VzOyBpKyspIHsKICAgICAgICAgIHJqICs9IHNhbXBsZXNbY3ViZVZlcnRleFtpXSArIGpdICogY3ViZU5baV07CiAgICAgICAgfQogICAgICAgIHJqID0gaW50ZXJwb2xhdGUocmosIDAsIDEsIGRlY29kZVtqXVswXSwgZGVjb2RlW2pdWzFdKTsKICAgICAgICBkZXN0W2Rlc3RPZmZzZXQgKyBqXSA9IE1hdGhDbGFtcChyaiwgcmFuZ2Vbal1bMF0sIHJhbmdlW2pdWzFdKTsKICAgICAgfQogICAgfTsKICB9CiAgc3RhdGljIGNvbnN0cnVjdEludGVycG9sYXRlZChmYWN0b3J5LCBkaWN0KSB7CiAgICBjb25zdCBjMCA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQzAiKSkgfHwgWzBdOwogICAgY29uc3QgYzEgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkMxIikpIHx8IFsxXTsKICAgIGNvbnN0IG4gPSBkaWN0LmdldCgiTiIpOwogICAgY29uc3QgZGlmZiA9IFtdOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYzAubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBkaWZmLnB1c2goYzFbaV0gLSBjMFtpXSk7CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBkaWZmLmxlbmd0aDsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGbihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBjb25zdCB4ID0gbiA9PT0gMSA/IHNyY1tzcmNPZmZzZXRdIDogc3JjW3NyY09mZnNldF0gKiogbjsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgewogICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gYzBbal0gKyB4ICogZGlmZltqXTsKICAgICAgfQogICAgfTsKICB9CiAgc3RhdGljIGNvbnN0cnVjdFN0aWNoZWQoZmFjdG9yeSwgZGljdCkgewogICAgY29uc3QgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBpZiAoIWRvbWFpbikgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpOwogICAgfQogICAgY29uc3QgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7CiAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGRvbWFpbiBmb3Igc3RpY2hlZCBmdW5jdGlvbiIpOwogICAgfQogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZmFjdG9yeTsKICAgIGNvbnN0IGZucyA9IFtdOwogICAgZm9yIChjb25zdCBmbiBvZiBkaWN0LmdldCgiRnVuY3Rpb25zIikpIHsKICAgICAgZm5zLnB1c2godGhpcy5wYXJzZShmYWN0b3J5LCB4cmVmLmZldGNoSWZSZWYoZm4pKSk7CiAgICB9CiAgICBjb25zdCBib3VuZHMgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkJvdW5kcyIpKTsKICAgIGNvbnN0IGVuY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRW5jb2RlIikpOwogICAgY29uc3QgdG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgdiA9IE1hdGhDbGFtcChzcmNbc3JjT2Zmc2V0XSwgZG9tYWluWzBdLCBkb21haW5bMV0pOwogICAgICBjb25zdCBsZW5ndGggPSBib3VuZHMubGVuZ3RoOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHYgPCBib3VuZHNbaV0pIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZG1pbiA9IGRvbWFpblswXTsKICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgZG1pbiA9IGJvdW5kc1tpIC0gMV07CiAgICAgIH0KICAgICAgbGV0IGRtYXggPSBkb21haW5bMV07CiAgICAgIGlmIChpIDwgYm91bmRzLmxlbmd0aCkgewogICAgICAgIGRtYXggPSBib3VuZHNbaV07CiAgICAgIH0KICAgICAgY29uc3Qgcm1pbiA9IGVuY29kZVsyICogaV07CiAgICAgIGNvbnN0IHJtYXggPSBlbmNvZGVbMiAqIGkgKyAxXTsKICAgICAgdG1wQnVmWzBdID0gZG1pbiA9PT0gZG1heCA/IHJtaW4gOiBybWluICsgKHYgLSBkbWluKSAqIChybWF4IC0gcm1pbikgLyAoZG1heCAtIGRtaW4pOwogICAgICBmbnNbaV0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RQb3N0U2NyaXB0KGZhY3RvcnksIGZuLCBkaWN0KSB7CiAgICBjb25zdCBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKICAgIGNvbnN0IHJhbmdlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJSYW5nZSIpKTsKICAgIGlmICghZG9tYWluKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpOwogICAgfQogICAgaWYgKCFyYW5nZSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIHJhbmdlLiIpOwogICAgfQogICAgY29uc3QgbGV4ZXIgPSBuZXcgUG9zdFNjcmlwdExleGVyKGZuKTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQb3N0U2NyaXB0UGFyc2VyKGxleGVyKTsKICAgIGNvbnN0IGNvZGUgPSBwYXJzZXIucGFyc2UoKTsKICAgIGlmIChmYWN0b3J5LmlzRXZhbFN1cHBvcnRlZCAmJiBGZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpIHsKICAgICAgY29uc3QgY29tcGlsZWQgPSBuZXcgUG9zdFNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKTsKICAgICAgaWYgKGNvbXBpbGVkKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbigic3JjIiwgInNyY09mZnNldCIsICJkZXN0IiwgImRlc3RPZmZzZXQiLCBjb21waWxlZCk7CiAgICAgIH0KICAgIH0KICAgIGluZm8oIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7CiAgICBjb25zdCBudW1PdXRwdXRzID0gcmFuZ2UubGVuZ3RoID4+IDE7CiAgICBjb25zdCBudW1JbnB1dHMgPSBkb21haW4ubGVuZ3RoID4+IDE7CiAgICBjb25zdCBldmFsdWF0b3IgPSBuZXcgUG9zdFNjcmlwdEV2YWx1YXRvcihjb2RlKTsKICAgIGNvbnN0IGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IE1BWF9DQUNIRV9TSVpFID0gMjA0OCAqIDQ7CiAgICBsZXQgY2FjaGVfYXZhaWxhYmxlID0gTUFYX0NBQ0hFX1NJWkU7CiAgICBjb25zdCB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUlucHV0cyk7CiAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZuKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICAgIGxldCBpLCB2YWx1ZTsKICAgICAgbGV0IGtleSA9ICIiOwogICAgICBjb25zdCBpbnB1dCA9IHRtcEJ1ZjsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUlucHV0czsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSBzcmNbc3JjT2Zmc2V0ICsgaV07CiAgICAgICAgaW5wdXRbaV0gPSB2YWx1ZTsKICAgICAgICBrZXkgKz0gdmFsdWUgKyAiXyI7CiAgICAgIH0KICAgICAgY29uc3QgY2FjaGVkVmFsdWUgPSBjYWNoZVtrZXldOwogICAgICBpZiAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlc3Quc2V0KGNhY2hlZFZhbHVlLCBkZXN0T2Zmc2V0KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShudW1PdXRwdXRzKTsKICAgICAgY29uc3Qgc3RhY2sgPSBldmFsdWF0b3IuZXhlY3V0ZShpbnB1dCk7CiAgICAgIGNvbnN0IHN0YWNrSW5kZXggPSBzdGFjay5sZW5ndGggLSBudW1PdXRwdXRzOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSBzdGFja1tzdGFja0luZGV4ICsgaV07CiAgICAgICAgbGV0IGJvdW5kID0gcmFuZ2VbaSAqIDJdOwogICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7CiAgICAgICAgICB2YWx1ZSA9IGJvdW5kOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07CiAgICAgICAgICBpZiAodmFsdWUgPiBib3VuZCkgewogICAgICAgICAgICB2YWx1ZSA9IGJvdW5kOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTsKICAgICAgfQogICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkgewogICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tOwogICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7CiAgICAgIH0KICAgICAgZGVzdC5zZXQob3V0cHV0LCBkZXN0T2Zmc2V0KTsKICAgIH07CiAgfQp9CmZ1bmN0aW9uIGlzUERGRnVuY3Rpb24odikgewogIGxldCBmbkRpY3Q7CiAgaWYgKHYgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBmbkRpY3QgPSB2OwogIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIGZuRGljdCA9IHYuZGljdDsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gZm5EaWN0LmhhcygiRnVuY3Rpb25UeXBlIik7Cn0KY2xhc3MgUG9zdFNjcmlwdFN0YWNrIHsKICBzdGF0aWMgTUFYX1NUQUNLX1NJWkUgPSAxMDA7CiAgY29uc3RydWN0b3IoaW5pdGlhbFN0YWNrKSB7CiAgICB0aGlzLnN0YWNrID0gaW5pdGlhbFN0YWNrID8gQXJyYXkuZnJvbShpbml0aWFsU3RhY2spIDogW107CiAgfQogIHB1c2godmFsdWUpIHsKICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+PSBQb3N0U2NyaXB0U3RhY2suTUFYX1NUQUNLX1NJWkUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpOwogICAgfQogICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICB9CiAgcG9wKCkgewogICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIHVuZGVyZmxvdy4iKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpOwogIH0KICBjb3B5KG4pIHsKICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCArIG4gPj0gUG9zdFNjcmlwdFN0YWNrLk1BWF9TVEFDS19TSVpFKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy4iKTsKICAgIH0KICAgIGNvbnN0IHN0YWNrID0gdGhpcy5zdGFjazsKICAgIGZvciAobGV0IGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHsKICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7CiAgICB9CiAgfQogIGluZGV4KG4pIHsKICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTsKICB9CiAgcm9sbChuLCBwKSB7CiAgICBjb25zdCBzdGFjayA9IHRoaXMuc3RhY2s7CiAgICBjb25zdCBsID0gc3RhY2subGVuZ3RoIC0gbjsKICAgIGNvbnN0IHIgPSBzdGFjay5sZW5ndGggLSAxOwogICAgY29uc3QgYyA9IGwgKyAocCAtIE1hdGguZmxvb3IocCAvIG4pICogbik7CiAgICBmb3IgKGxldCBpID0gbCwgaiA9IHI7IGkgPCBqOyBpKyssIGotLSkgewogICAgICBjb25zdCB0ID0gc3RhY2tbaV07CiAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07CiAgICAgIHN0YWNrW2pdID0gdDsKICAgIH0KICAgIGZvciAobGV0IGkgPSBsLCBqID0gYyAtIDE7IGkgPCBqOyBpKyssIGotLSkgewogICAgICBjb25zdCB0ID0gc3RhY2tbaV07CiAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07CiAgICAgIHN0YWNrW2pdID0gdDsKICAgIH0KICAgIGZvciAobGV0IGkgPSBjLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CiAgICAgIGNvbnN0IHQgPSBzdGFja1tpXTsKICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKICAgICAgc3RhY2tbal0gPSB0OwogICAgfQogIH0KfQpjbGFzcyBQb3N0U2NyaXB0RXZhbHVhdG9yIHsKICBjb25zdHJ1Y3RvcihvcGVyYXRvcnMpIHsKICAgIHRoaXMub3BlcmF0b3JzID0gb3BlcmF0b3JzOwogIH0KICBleGVjdXRlKGluaXRpYWxTdGFjaykgewogICAgY29uc3Qgc3RhY2sgPSBuZXcgUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjayk7CiAgICBsZXQgY291bnRlciA9IDA7CiAgICBjb25zdCBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9yczsKICAgIGNvbnN0IGxlbmd0aCA9IG9wZXJhdG9ycy5sZW5ndGg7CiAgICBsZXQgb3BlcmF0b3IsIGEsIGI7CiAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgewogICAgICBvcGVyYXRvciA9IG9wZXJhdG9yc1tjb3VudGVyKytdOwogICAgICBpZiAodHlwZW9mIG9wZXJhdG9yID09PSAibnVtYmVyIikgewogICAgICAgIHN0YWNrLnB1c2gob3BlcmF0b3IpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgICBjYXNlICJqeiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAoIWEpIHsKICAgICAgICAgICAgY291bnRlciA9IGI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJqIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGNvdW50ZXIgPSBhOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYWJzIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hYnMoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYWRkIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSArIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYW5kIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICYmIGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICYgYik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhdGFuIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBNYXRoLmF0YW4yKGEsIGIpIC8gTWF0aC5QSSAqIDE4MDsKICAgICAgICAgIGlmIChhIDwgMCkgewogICAgICAgICAgICBhICs9IDM2MDsKICAgICAgICAgIH0KICAgICAgICAgIHN0YWNrLnB1c2goYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJiaXRzaGlmdCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAoYSA+IDApIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhIDw8IGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhID4+IGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY2VpbGluZyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY2VpbChhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjb3B5IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLmNvcHkoYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjb3MiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLmNvcyhhICUgMzYwIC8gMTgwICogTWF0aC5QSSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY3ZpIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKSB8IDA7CiAgICAgICAgICBzdGFjay5wdXNoKGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY3ZyIjoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRpdiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImR1cCI6CiAgICAgICAgICBzdGFjay5jb3B5KDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXEiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhID09PSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImV4Y2giOgogICAgICAgICAgc3RhY2sucm9sbCgyLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImV4cCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgKiogYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmYWxzZSI6CiAgICAgICAgICBzdGFjay5wdXNoKGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZsb29yIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPj0gYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJndCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPiBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImlkaXYiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhIC8gYiB8IDApOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaW5kZXgiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2suaW5kZXgoYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJsZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPD0gYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJsbiI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvZyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nMTAoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibHQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhIDwgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtb2QiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICUgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtdWwiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICogYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJuZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibmVnIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goLWEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibm90IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goIWEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh+YSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJvciI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAodHlwZW9mIGEgPT09ICJib29sZWFuIiAmJiB0eXBlb2YgYiA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8IGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicG9wIjoKICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm9sbCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5yb2xsKGEsIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm91bmQiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLnJvdW5kKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNpbiI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc2luKGEgJSAzNjAgLyAxODAgKiBNYXRoLlBJKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJzcXJ0IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5zcXJ0KGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1YiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydWUiOgogICAgICAgICAgc3RhY2sucHVzaCh0cnVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydW5jYXRlIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBhIDwgMCA/IE1hdGguY2VpbChhKSA6IE1hdGguZmxvb3IoYSk7CiAgICAgICAgICBzdGFjay5wdXNoKGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAieG9yIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICE9PSBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSBeIGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBvcGVyYXRvciAke29wZXJhdG9yfWApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RhY2suc3RhY2s7CiAgfQp9CmNsYXNzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKHR5cGUpIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHVucmVhY2hhYmxlKCJhYnN0cmFjdCBtZXRob2QiKTsKICB9Cn0KY2xhc3MgQXN0QXJndW1lbnQgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihpbmRleCwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJhcmdzIik7CiAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0QXJndW1lbnQodGhpcyk7CiAgfQp9CmNsYXNzIEFzdExpdGVyYWwgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihudW1iZXIpIHsKICAgIHN1cGVyKCJsaXRlcmFsIik7CiAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKICAgIHRoaXMubWluID0gbnVtYmVyOwogICAgdGhpcy5tYXggPSBudW1iZXI7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRMaXRlcmFsKHRoaXMpOwogIH0KfQpjbGFzcyBBc3RCaW5hcnlPcGVyYXRpb24gZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihvcCwgYXJnMSwgYXJnMiwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJiaW5hcnkiKTsKICAgIHRoaXMub3AgPSBvcDsKICAgIHRoaXMuYXJnMSA9IGFyZzE7CiAgICB0aGlzLmFyZzIgPSBhcmcyOwogICAgdGhpcy5taW4gPSBtaW47CiAgICB0aGlzLm1heCA9IG1heDsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdEJpbmFyeU9wZXJhdGlvbih0aGlzKTsKICB9Cn0KY2xhc3MgQXN0TWluIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IoYXJnLCBtYXgpIHsKICAgIHN1cGVyKCJtYXgiKTsKICAgIHRoaXMuYXJnID0gYXJnOwogICAgdGhpcy5taW4gPSBhcmcubWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRNaW4odGhpcyk7CiAgfQp9CmNsYXNzIEFzdFZhcmlhYmxlIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IoaW5kZXgsIG1pbiwgbWF4KSB7CiAgICBzdXBlcigidmFyIik7CiAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGUodGhpcyk7CiAgfQp9CmNsYXNzIEFzdFZhcmlhYmxlRGVmaW5pdGlvbiBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKHZhcmlhYmxlLCBhcmcpIHsKICAgIHN1cGVyKCJkZWZpbml0aW9uIik7CiAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7CiAgICB0aGlzLmFyZyA9IGFyZzsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzKTsKICB9Cn0KY2xhc3MgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMucGFydHMgPSBbXTsKICB9CiAgdmlzaXRBcmd1bWVudChhcmcpIHsKICAgIHRoaXMucGFydHMucHVzaCgiTWF0aC5tYXgoIiwgYXJnLm1pbiwgIiwgTWF0aC5taW4oIiwgYXJnLm1heCwgIiwgc3JjW3NyY09mZnNldCArICIsIGFyZy5pbmRleCwgIl0pKSIpOwogIH0KICB2aXNpdFZhcmlhYmxlKHZhcmlhYmxlKSB7CiAgICB0aGlzLnBhcnRzLnB1c2goInYiLCB2YXJpYWJsZS5pbmRleCk7CiAgfQogIHZpc2l0TGl0ZXJhbChsaXRlcmFsKSB7CiAgICB0aGlzLnBhcnRzLnB1c2gobGl0ZXJhbC5udW1iZXIpOwogIH0KICB2aXNpdEJpbmFyeU9wZXJhdGlvbihvcGVyYXRpb24pIHsKICAgIHRoaXMucGFydHMucHVzaCgiKCIpOwogICAgb3BlcmF0aW9uLmFyZzEudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIiAiLCBvcGVyYXRpb24ub3AsICIgIik7CiAgICBvcGVyYXRpb24uYXJnMi52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiKSIpOwogIH0KICB2aXNpdFZhcmlhYmxlRGVmaW5pdGlvbihkZWZpbml0aW9uKSB7CiAgICB0aGlzLnBhcnRzLnB1c2goInZhciAiKTsKICAgIGRlZmluaXRpb24udmFyaWFibGUudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIiA9ICIpOwogICAgZGVmaW5pdGlvbi5hcmcudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIjsiKTsKICB9CiAgdmlzaXRNaW4obWF4KSB7CiAgICB0aGlzLnBhcnRzLnB1c2goIk1hdGgubWluKCIpOwogICAgbWF4LmFyZy52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiLCAiLCBtYXgubWF4LCAiKSIpOwogIH0KICB0b1N0cmluZygpIHsKICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oIiIpOwogIH0KfQpmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIubnVtYmVyID09PSAwKSB7CiAgICByZXR1cm4gbnVtMTsKICB9CiAgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEubnVtYmVyID09PSAwKSB7CiAgICByZXR1cm4gbnVtMjsKICB9CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobnVtMS5udW1iZXIgKyBudW0yLm51bWJlcik7CiAgfQogIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gKyBudW0yLm1pbiwgbnVtMS5tYXggKyBudW0yLm1heCk7Cn0KZnVuY3Rpb24gYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikgewogIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgaWYgKG51bTIubnVtYmVyID09PSAwKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbCgwKTsKICAgIH0gZWxzZSBpZiAobnVtMi5udW1iZXIgPT09IDEpIHsKICAgICAgcmV0dXJuIG51bTE7CiAgICB9IGVsc2UgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciAqIG51bTIubnVtYmVyKTsKICAgIH0KICB9CiAgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICBpZiAobnVtMS5udW1iZXIgPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOwogICAgfSBlbHNlIGlmIChudW0xLm51bWJlciA9PT0gMSkgewogICAgICByZXR1cm4gbnVtMjsKICAgIH0KICB9CiAgY29uc3QgbWluID0gTWF0aC5taW4obnVtMS5taW4gKiBudW0yLm1pbiwgbnVtMS5taW4gKiBudW0yLm1heCwgbnVtMS5tYXggKiBudW0yLm1pbiwgbnVtMS5tYXggKiBudW0yLm1heCk7CiAgY29uc3QgbWF4ID0gTWF0aC5tYXgobnVtMS5taW4gKiBudW0yLm1pbiwgbnVtMS5taW4gKiBudW0yLm1heCwgbnVtMS5tYXggKiBudW0yLm1pbiwgbnVtMS5tYXggKiBudW0yLm1heCk7CiAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIioiLCBudW0xLCBudW0yLCBtaW4sIG1heCk7Cn0KZnVuY3Rpb24gYnVpbGRTdWJPcGVyYXRpb24obnVtMSwgbnVtMikgewogIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgaWYgKG51bTIubnVtYmVyID09PSAwKSB7CiAgICAgIHJldHVybiBudW0xOwogICAgfSBlbHNlIGlmIChudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobnVtMS5udW1iZXIgLSBudW0yLm51bWJlcik7CiAgICB9CiAgfQogIGlmIChudW0yLnR5cGUgPT09ICJiaW5hcnkiICYmIG51bTIub3AgPT09ICItIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLm51bWJlciA9PT0gMSAmJiBudW0yLmFyZzEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIuYXJnMS5udW1iZXIgPT09IDEpIHsKICAgIHJldHVybiBudW0yLmFyZzI7CiAgfQogIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCItIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gLSBudW0yLm1heCwgbnVtMS5tYXggLSBudW0yLm1pbik7Cn0KZnVuY3Rpb24gYnVpbGRNaW5PcGVyYXRpb24obnVtMSwgbWF4KSB7CiAgaWYgKG51bTEubWluID49IG1heCkgewogICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG1heCk7CiAgfSBlbHNlIGlmIChudW0xLm1heCA8PSBtYXgpIHsKICAgIHJldHVybiBudW0xOwogIH0KICByZXR1cm4gbmV3IEFzdE1pbihudW0xLCBtYXgpOwp9CmNsYXNzIFBvc3RTY3JpcHRDb21waWxlciB7CiAgY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKSB7CiAgICBjb25zdCBzdGFjayA9IFtdOwogICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gW107CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoID4+IDEsCiAgICAgIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggPj4gMTsKICAgIGxldCBsYXN0UmVnaXN0ZXIgPSAwOwogICAgbGV0IG4sIGo7CiAgICBsZXQgbnVtMSwgbnVtMiwgYXN0MSwgYXN0MiwgdG1wVmFyLCBpdGVtOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykgewogICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29kZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGl0ZW0gPSBjb2RlW2ldOwogICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgc3RhY2sucHVzaChuZXcgQXN0TGl0ZXJhbChpdGVtKSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgc3dpdGNoIChpdGVtKSB7CiAgICAgICAgY2FzZSAiYWRkIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjdnIiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtdWwiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTXVsT3BlcmF0aW9uKG51bTEsIG51bTIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1YiI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIG51bTIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG51bTEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRTdWJPcGVyYXRpb24obnVtMSwgbnVtMikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXhjaCI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGFzdDEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGFzdDIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYXN0MSwgYXN0Mik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJwb3AiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImluZGV4IjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKG51bTEudHlwZSAhPT0gImxpdGVyYWwiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbiA9IG51bTEubnVtYmVyOwogICAgICAgICAgaWYgKG4gPCAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IHN0YWNrLmxlbmd0aCA8IG4pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBhc3QxID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gbiAtIDFdOwogICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7CiAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSBuIC0gMV0gPSB0bXBWYXI7CiAgICAgICAgICBzdGFjay5wdXNoKHRtcFZhcik7CiAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKHRtcFZhciwgYXN0MSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZHVwIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBjb2RlW2kgKyAxXSA9PT0gIm51bWJlciIgJiYgY29kZVtpICsgMl0gPT09ICJndCIgJiYgY29kZVtpICsgM10gPT09IGkgKyA3ICYmIGNvZGVbaSArIDRdID09PSAianoiICYmIGNvZGVbaSArIDVdID09PSAicG9wIiAmJiBjb2RlW2kgKyA2XSA9PT0gY29kZVtpICsgMV0pIHsKICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbaSArIDFdKSk7CiAgICAgICAgICAgIGkgKz0gNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBhc3QxID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7CiAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9IHRtcFZhcjsKICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTsKICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyb2xsIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKG51bTIudHlwZSAhPT0gImxpdGVyYWwiIHx8IG51bTEudHlwZSAhPT0gImxpdGVyYWwiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaiA9IG51bTIubnVtYmVyOwogICAgICAgICAgbiA9IG51bTEubnVtYmVyOwogICAgICAgICAgaWYgKG4gPD0gMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihqKSB8fCBzdGFjay5sZW5ndGggPCBuKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaiA9IChqICUgbiArIG4pICUgbjsKICAgICAgICAgIGlmIChqID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2sucHVzaCguLi5zdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gbiwgbiAtIGopKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHN0YWNrLmxlbmd0aCAhPT0gb3V0cHV0U2l6ZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHsKICAgICAgY29uc3Qgc3RhdGVtZW50QnVpbGRlciA9IG5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKTsKICAgICAgaW5zdHJ1Y3Rpb24udmlzaXQoc3RhdGVtZW50QnVpbGRlcik7CiAgICAgIHJlc3VsdC5wdXNoKHN0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdGFjay5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGV4cHIgPSBzdGFja1tpXSwKICAgICAgICBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOwogICAgICBleHByLnZpc2l0KHN0YXRlbWVudEJ1aWxkZXIpOwogICAgICBjb25zdCBtaW4gPSByYW5nZVtpICogMl0sCiAgICAgICAgbWF4ID0gcmFuZ2VbaSAqIDIgKyAxXTsKICAgICAgY29uc3Qgb3V0ID0gW3N0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKV07CiAgICAgIGlmIChtaW4gPiBleHByLm1pbikgewogICAgICAgIG91dC51bnNoaWZ0KCJNYXRoLm1heCgiLCBtaW4sICIsICIpOwogICAgICAgIG91dC5wdXNoKCIpIik7CiAgICAgIH0KICAgICAgaWYgKG1heCA8IGV4cHIubWF4KSB7CiAgICAgICAgb3V0LnVuc2hpZnQoIk1hdGgubWluKCIsIG1heCwgIiwgIik7CiAgICAgICAgb3V0LnB1c2goIikiKTsKICAgICAgfQogICAgICBvdXQudW5zaGlmdCgiZGVzdFtkZXN0T2Zmc2V0ICsgIiwgaSwgIl0gPSAiKTsKICAgICAgb3V0LnB1c2goIjsiKTsKICAgICAgcmVzdWx0LnB1c2gob3V0LmpvaW4oIiIpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQuam9pbigiXG4iKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2JpZGkuanMKCmNvbnN0IGJhc2VUeXBlcyA9IFsiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiUyIsICJCIiwgIlMiLCAiV1MiLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCIiwgIkIiLCAiQiIsICJTIiwgIldTIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVUIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkVTIiwgIkNTIiwgIkVTIiwgIkNTIiwgIkNTIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkNTIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJDUyIsICJPTiIsICJFVCIsICJFVCIsICJFVCIsICJFVCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIk9OIiwgIk9OIiwgIkJOIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVOIiwgIkVOIiwgIk9OIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiRU4iLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiXTsKY29uc3QgYXJhYmljVHlwZXMgPSBbIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIk9OIiwgIk9OIiwgIkFMIiwgIkVUIiwgIkVUIiwgIkFMIiwgIkNTIiwgIkFMIiwgIk9OIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkVUIiwgIkFOIiwgIkFOIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQU4iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiXTsKZnVuY3Rpb24gaXNPZGQoaSkgewogIHJldHVybiAoaSAmIDEpICE9PSAwOwp9CmZ1bmN0aW9uIGlzRXZlbihpKSB7CiAgcmV0dXJuIChpICYgMSkgPT09IDA7Cn0KZnVuY3Rpb24gZmluZFVuZXF1YWwoYXJyLCBzdGFydCwgdmFsdWUpIHsKICBsZXQgaiwgamo7CiAgZm9yIChqID0gc3RhcnQsIGpqID0gYXJyLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgIGlmIChhcnJbal0gIT09IHZhbHVlKSB7CiAgICAgIHJldHVybiBqOwogICAgfQogIH0KICByZXR1cm4gajsKfQpmdW5jdGlvbiByZXZlcnNlVmFsdWVzKGFyciwgc3RhcnQsIGVuZCkgewogIGZvciAobGV0IGkgPSBzdGFydCwgaiA9IGVuZCAtIDE7IGkgPCBqOyArK2ksIC0taikgewogICAgY29uc3QgdGVtcCA9IGFycltpXTsKICAgIGFycltpXSA9IGFycltqXTsKICAgIGFycltqXSA9IHRlbXA7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgZGlyID0gImx0ciI7CiAgaWYgKHZlcnRpY2FsKSB7CiAgICBkaXIgPSAidHRiIjsKICB9IGVsc2UgaWYgKCFpc0xUUikgewogICAgZGlyID0gInJ0bCI7CiAgfQogIHJldHVybiB7CiAgICBzdHIsCiAgICBkaXIKICB9Owp9CmNvbnN0IGNoYXJzID0gW107CmNvbnN0IHR5cGVzID0gW107CmZ1bmN0aW9uIGJpZGkoc3RyLCBzdGFydExldmVsID0gLTEsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgaXNMVFIgPSB0cnVlOwogIGNvbnN0IHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgaWYgKHN0ckxlbmd0aCA9PT0gMCB8fCB2ZXJ0aWNhbCkgewogICAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsKTsKICB9CiAgY2hhcnMubGVuZ3RoID0gc3RyTGVuZ3RoOwogIHR5cGVzLmxlbmd0aCA9IHN0ckxlbmd0aDsKICBsZXQgbnVtQmlkaSA9IDA7CiAgbGV0IGksIGlpOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgY2hhcnNbaV0gPSBzdHIuY2hhckF0KGkpOwogICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgIGxldCBjaGFyVHlwZSA9ICJMIjsKICAgIGlmIChjaGFyQ29kZSA8PSAweDAwZmYpIHsKICAgICAgY2hhclR5cGUgPSBiYXNlVHlwZXNbY2hhckNvZGVdOwogICAgfSBlbHNlIGlmICgweDA1OTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNWY0KSB7CiAgICAgIGNoYXJUeXBlID0gIlIiOwogICAgfSBlbHNlIGlmICgweDA2MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNmZmKSB7CiAgICAgIGNoYXJUeXBlID0gYXJhYmljVHlwZXNbY2hhckNvZGUgJiAweGZmXTsKICAgICAgaWYgKCFjaGFyVHlwZSkgewogICAgICAgIHdhcm4oIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIiArIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoMHgwNzAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDhhYyB8fCAweGZiNTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhmZGZmIHx8IDB4ZmU3MCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweGZlZmYpIHsKICAgICAgY2hhclR5cGUgPSAiQUwiOwogICAgfQogICAgaWYgKGNoYXJUeXBlID09PSAiUiIgfHwgY2hhclR5cGUgPT09ICJBTCIgfHwgY2hhclR5cGUgPT09ICJBTiIpIHsKICAgICAgbnVtQmlkaSsrOwogICAgfQogICAgdHlwZXNbaV0gPSBjaGFyVHlwZTsKICB9CiAgaWYgKG51bUJpZGkgPT09IDApIHsKICAgIGlzTFRSID0gdHJ1ZTsKICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKTsKICB9CiAgaWYgKHN0YXJ0TGV2ZWwgPT09IC0xKSB7CiAgICBpZiAobnVtQmlkaSAvIHN0ckxlbmd0aCA8IDAuMyAmJiBzdHJMZW5ndGggPiA0KSB7CiAgICAgIGlzTFRSID0gdHJ1ZTsKICAgICAgc3RhcnRMZXZlbCA9IDA7CiAgICB9IGVsc2UgewogICAgICBpc0xUUiA9IGZhbHNlOwogICAgICBzdGFydExldmVsID0gMTsKICAgIH0KICB9CiAgY29uc3QgbGV2ZWxzID0gW107CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICBsZXZlbHNbaV0gPSBzdGFydExldmVsOwogIH0KICBjb25zdCBlID0gaXNPZGQoc3RhcnRMZXZlbCkgPyAiUiIgOiAiTCI7CiAgY29uc3Qgc29yID0gZTsKICBjb25zdCBlb3IgPSBzb3I7CiAgbGV0IGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiTlNNIikgewogICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlOwogICAgfSBlbHNlIHsKICAgICAgbGFzdFR5cGUgPSB0eXBlc1tpXTsKICAgIH0KICB9CiAgbGFzdFR5cGUgPSBzb3I7CiAgbGV0IHQ7CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIkVOIikgewogICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSAiQUwiID8gIkFOIiA6ICJFTiI7CiAgICB9IGVsc2UgaWYgKHQgPT09ICJSIiB8fCB0ID09PSAiTCIgfHwgdCA9PT0gIkFMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJBTCIpIHsKICAgICAgdHlwZXNbaV0gPSAiUiI7CiAgICB9CiAgfQogIGZvciAoaSA9IDE7IGkgPCBzdHJMZW5ndGggLSAxOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIkVTIiAmJiB0eXBlc1tpIC0gMV0gPT09ICJFTiIgJiYgdHlwZXNbaSArIDFdID09PSAiRU4iKSB7CiAgICAgIHR5cGVzW2ldID0gIkVOIjsKICAgIH0KICAgIGlmICh0eXBlc1tpXSA9PT0gIkNTIiAmJiAodHlwZXNbaSAtIDFdID09PSAiRU4iIHx8IHR5cGVzW2kgLSAxXSA9PT0gIkFOIikgJiYgdHlwZXNbaSArIDFdID09PSB0eXBlc1tpIC0gMV0pIHsKICAgICAgdHlwZXNbaV0gPSB0eXBlc1tpIC0gMV07CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiRU4iKSB7CiAgICAgIGZvciAobGV0IGogPSBpIC0gMTsgaiA+PSAwOyAtLWopIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgc3RyTGVuZ3RoOyArK2opIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIldTIiB8fCB0ID09PSAiRVMiIHx8IHQgPT09ICJFVCIgfHwgdCA9PT0gIkNTIikgewogICAgICB0eXBlc1tpXSA9ICJPTiI7CiAgICB9CiAgfQogIGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJFTiIpIHsKICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZSA9PT0gIkwiID8gIkwiIDogIkVOIjsKICAgIH0gZWxzZSBpZiAodCA9PT0gIlIiIHx8IHQgPT09ICJMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiT04iKSB7CiAgICAgIGNvbnN0IGVuZCA9IGZpbmRVbmVxdWFsKHR5cGVzLCBpICsgMSwgIk9OIik7CiAgICAgIGxldCBiZWZvcmUgPSBzb3I7CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIGJlZm9yZSA9IHR5cGVzW2kgLSAxXTsKICAgICAgfQogICAgICBsZXQgYWZ0ZXIgPSBlb3I7CiAgICAgIGlmIChlbmQgKyAxIDwgc3RyTGVuZ3RoKSB7CiAgICAgICAgYWZ0ZXIgPSB0eXBlc1tlbmQgKyAxXTsKICAgICAgfQogICAgICBpZiAoYmVmb3JlICE9PSAiTCIpIHsKICAgICAgICBiZWZvcmUgPSAiUiI7CiAgICAgIH0KICAgICAgaWYgKGFmdGVyICE9PSAiTCIpIHsKICAgICAgICBhZnRlciA9ICJSIjsKICAgICAgfQogICAgICBpZiAoYmVmb3JlID09PSBhZnRlcikgewogICAgICAgIHR5cGVzLmZpbGwoYmVmb3JlLCBpLCBlbmQpOwogICAgICB9CiAgICAgIGkgPSBlbmQgLSAxOwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIk9OIikgewogICAgICB0eXBlc1tpXSA9IGU7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKGlzRXZlbihsZXZlbHNbaV0pKSB7CiAgICAgIGlmICh0ID09PSAiUiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMTsKICAgICAgfSBlbHNlIGlmICh0ID09PSAiQU4iIHx8IHQgPT09ICJFTiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMjsKICAgICAgfQogICAgfSBlbHNlIGlmICh0ID09PSAiTCIgfHwgdCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CiAgICAgIGxldmVsc1tpXSArPSAxOwogICAgfQogIH0KICBsZXQgaGlnaGVzdExldmVsID0gLTE7CiAgbGV0IGxvd2VzdE9kZExldmVsID0gOTk7CiAgbGV0IGxldmVsOwogIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGxldmVsID0gbGV2ZWxzW2ldOwogICAgaWYgKGhpZ2hlc3RMZXZlbCA8IGxldmVsKSB7CiAgICAgIGhpZ2hlc3RMZXZlbCA9IGxldmVsOwogICAgfQogICAgaWYgKGxvd2VzdE9kZExldmVsID4gbGV2ZWwgJiYgaXNPZGQobGV2ZWwpKSB7CiAgICAgIGxvd2VzdE9kZExldmVsID0gbGV2ZWw7CiAgICB9CiAgfQogIGZvciAobGV2ZWwgPSBoaWdoZXN0TGV2ZWw7IGxldmVsID49IGxvd2VzdE9kZExldmVsOyAtLWxldmVsKSB7CiAgICBsZXQgc3RhcnQgPSAtMTsKICAgIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgaWYgKGxldmVsc1tpXSA8IGxldmVsKSB7CiAgICAgICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgICAgIHJldmVyc2VWYWx1ZXMoY2hhcnMsIHN0YXJ0LCBpKTsKICAgICAgICAgIHN0YXJ0ID0gLTE7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ID0gaTsKICAgICAgfQogICAgfQogICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGxldmVscy5sZW5ndGgpOwogICAgfQogIH0KICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGNvbnN0IGNoID0gY2hhcnNbaV07CiAgICBpZiAoY2ggPT09ICI8IiB8fCBjaCA9PT0gIj4iKSB7CiAgICAgIGNoYXJzW2ldID0gIiI7CiAgICB9CiAgfQogIHJldHVybiBjcmVhdGVCaWRpVGV4dChjaGFycy5qb2luKCIiKSwgaXNMVFIpOwp9Cgo7Ly8gLi9zcmMvY29yZS9mb250X3N1YnN0aXR1dGlvbnMuanMKCgoKY29uc3QgTk9STUFMID0gewogIHN0eWxlOiAibm9ybWFsIiwKICB3ZWlnaHQ6ICJub3JtYWwiCn07CmNvbnN0IEJPTEQgPSB7CiAgc3R5bGU6ICJub3JtYWwiLAogIHdlaWdodDogImJvbGQiCn07CmNvbnN0IElUQUxJQyA9IHsKICBzdHlsZTogIml0YWxpYyIsCiAgd2VpZ2h0OiAibm9ybWFsIgp9Owpjb25zdCBCT0xESVRBTElDID0gewogIHN0eWxlOiAiaXRhbGljIiwKICB3ZWlnaHQ6ICJib2xkIgp9Owpjb25zdCBzdWJzdGl0dXRpb25NYXAgPSBuZXcgTWFwKFtbIlRpbWVzLVJvbWFuIiwgewogIGxvY2FsOiBbIlRpbWVzIE5ldyBSb21hbiIsICJUaW1lcy1Sb21hbiIsICJUaW1lcyIsICJMaWJlcmF0aW9uIFNlcmlmIiwgIk5pbWJ1cyBSb21hbiIsICJOaW1idXMgUm9tYW4gTCIsICJUaW5vcyIsICJUaG9ybmRhbGUiLCAiVGVYIEd5cmUgVGVybWVzIiwgIkZyZWVTZXJpZiIsICJMaW51eCBMaWJlcnRpbmUgTyIsICJMaWJlcnRpbnVzIFNlcmlmIiwgIkRlamFWdSBTZXJpZiIsICJCaXRzdHJlYW0gVmVyYSBTZXJpZiIsICJVYnVudHUiXSwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAic2VyaWYiCn1dLCBbIlRpbWVzLUJvbGQiLCB7CiAgYWxpYXM6ICJUaW1lcy1Sb21hbiIsCiAgc3R5bGU6IEJPTEQsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiVGltZXMtSXRhbGljIiwgewogIGFsaWFzOiAiVGltZXMtUm9tYW4iLAogIHN0eWxlOiBJVEFMSUMsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiVGltZXMtQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIlRpbWVzLVJvbWFuIiwKICBzdHlsZTogQk9MRElUQUxJQywKICB1bHRpbWF0ZTogInNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EiLCB7CiAgbG9jYWw6IFsiSGVsdmV0aWNhIiwgIkhlbHZldGljYSBOZXVlIiwgIkFyaWFsIiwgIkFyaWFsIE5vdmEiLCAiTGliZXJhdGlvbiBTYW5zIiwgIkFyaW1vIiwgIk5pbWJ1cyBTYW5zIiwgIk5pbWJ1cyBTYW5zIEwiLCAiQTAzMCIsICJUZVggR3lyZSBIZXJvcyIsICJGcmVlU2FucyIsICJEZWphVnUgU2FucyIsICJBbGJhbnkiLCAiQml0c3RyZWFtIFZlcmEgU2FucyIsICJBcmlhbCBVbmljb2RlIE1TIiwgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgIkFwcGxlIFN5bWJvbHMiLCAiQ2FudGFyZWxsIl0sCiAgcGF0aDogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmIiwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiSGVsdmV0aWNhLUJvbGQiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiIsCiAgc3R5bGU6IEJPTEQsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EtT2JsaXF1ZSIsIHsKICBhbGlhczogIkhlbHZldGljYSIsCiAgcGF0aDogIkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLAogIHN0eWxlOiBJVEFMSUMsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljLnR0ZiIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJDb3VyaWVyIiwgewogIGxvY2FsOiBbIkNvdXJpZXIiLCAiQ291cmllciBOZXciLCAiTGliZXJhdGlvbiBNb25vIiwgIk5pbWJ1cyBNb25vIiwgIk5pbWJ1cyBNb25vIEwiLCAiQ291c2luZSIsICJDdW1iZXJsYW5kIiwgIlRlWCBHeXJlIEN1cnNvciIsICJGcmVlTW9ubyIsICJMaW51eCBMaWJlcnRpbmUgTW9ubyBPIiwgIkxpYmVydGludXMgTW9ubyJdLAogIHN0eWxlOiBOT1JNQUwsCiAgdWx0aW1hdGU6ICJtb25vc3BhY2UiCn1dLCBbIkNvdXJpZXItQm9sZCIsIHsKICBhbGlhczogIkNvdXJpZXIiLAogIHN0eWxlOiBCT0xELAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLU9ibGlxdWUiLCB7CiAgYWxpYXM6ICJDb3VyaWVyIiwKICBzdHlsZTogSVRBTElDLAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgewogIGFsaWFzOiAiQ291cmllciIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJtb25vc3BhY2UiCn1dLCBbIkFyaWFsQmxhY2siLCB7CiAgbG9jYWw6IFsiQXJpYWwgQmxhY2siXSwKICBzdHlsZTogewogICAgc3R5bGU6ICJub3JtYWwiLAogICAgd2VpZ2h0OiAiOTAwIgogIH0sCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQXJpYWxCbGFjay1Cb2xkIiwgewogIGFsaWFzOiAiQXJpYWxCbGFjayIKfV0sIFsiQXJpYWxCbGFjay1JdGFsaWMiLCB7CiAgYWxpYXM6ICJBcmlhbEJsYWNrIiwKICBzdHlsZTogewogICAgc3R5bGU6ICJpdGFsaWMiLAogICAgd2VpZ2h0OiAiOTAwIgogIH0sCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsQmxhY2stSXRhbGljIgp9XSwgWyJBcmlhbE5hcnJvdyIsIHsKICBsb2NhbDogWyJBcmlhbCBOYXJyb3ciLCAiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyIsICJIZWx2ZXRpY2EgQ29uZGVuc2VkIiwgIk5pbWJ1cyBTYW5zIE5hcnJvdyIsICJUZVggR3lyZSBIZXJvcyBDbiJdLAogIHN0eWxlOiBOT1JNQUwsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EiCn1dLCBbIkFyaWFsTmFycm93LUJvbGQiLCB7CiAgYWxpYXM6ICJBcmlhbE5hcnJvdyIsCiAgc3R5bGU6IEJPTEQsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQXJpYWxOYXJyb3ctSXRhbGljIiwgewogIGFsaWFzOiAiQXJpYWxOYXJyb3ciLAogIHN0eWxlOiBJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtT2JsaXF1ZSIKfV0sIFsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsTmFycm93IiwKICBzdHlsZTogQk9MRElUQUxJQywKICBmYWxsYmFjazogIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIKfV0sIFsiQ2FsaWJyaSIsIHsKICBsb2NhbDogWyJDYWxpYnJpIiwgIkNhcmxpdG8iXSwKICBzdHlsZTogTk9STUFMLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhIgp9XSwgWyJDYWxpYnJpLUJvbGQiLCB7CiAgYWxpYXM6ICJDYWxpYnJpIiwKICBzdHlsZTogQk9MRCwKICBmYWxsYmFjazogIkhlbHZldGljYS1Cb2xkIgp9XSwgWyJDYWxpYnJpLUl0YWxpYyIsIHsKICBhbGlhczogIkNhbGlicmkiLAogIHN0eWxlOiBJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtT2JsaXF1ZSIKfV0sIFsiQ2FsaWJyaS1Cb2xkSXRhbGljIiwgewogIGFsaWFzOiAiQ2FsaWJyaSIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIldpbmdkaW5ncyIsIHsKICBsb2NhbDogWyJXaW5nZGluZ3MiLCAiVVJXIERpbmdiYXRzIl0sCiAgc3R5bGU6IE5PUk1BTAp9XSwgWyJXaW5nZGluZ3MtUmVndWxhciIsIHsKICBhbGlhczogIldpbmdkaW5ncyIKfV0sIFsiV2luZ2RpbmdzLUJvbGQiLCB7CiAgYWxpYXM6ICJXaW5nZGluZ3MiCn1dXSk7CmNvbnN0IGZvbnRBbGlhc2VzID0gbmV3IE1hcChbWyJBcmlhbC1CbGFjayIsICJBcmlhbEJsYWNrIl1dKTsKZnVuY3Rpb24gZ2V0U3R5bGVUb0FwcGVuZChzdHlsZSkgewogIHN3aXRjaCAoc3R5bGUpIHsKICAgIGNhc2UgQk9MRDoKICAgICAgcmV0dXJuICJCb2xkIjsKICAgIGNhc2UgSVRBTElDOgogICAgICByZXR1cm4gIkl0YWxpYyI7CiAgICBjYXNlIEJPTERJVEFMSUM6CiAgICAgIHJldHVybiAiQm9sZCBJdGFsaWMiOwogICAgZGVmYXVsdDoKICAgICAgaWYgKHN0eWxlPy53ZWlnaHQgPT09ICJib2xkIikgewogICAgICAgIHJldHVybiAiQm9sZCI7CiAgICAgIH0KICAgICAgaWYgKHN0eWxlPy5zdHlsZSA9PT0gIml0YWxpYyIpIHsKICAgICAgICByZXR1cm4gIkl0YWxpYyI7CiAgICAgIH0KICB9CiAgcmV0dXJuICIiOwp9CmZ1bmN0aW9uIGdldEZhbWlseU5hbWUoc3RyKSB7CiAgY29uc3Qga2V5d29yZHMgPSBuZXcgU2V0KFsidGhpbiIsICJleHRyYWxpZ2h0IiwgInVsdHJhbGlnaHQiLCAiZGVtaWxpZ2h0IiwgInNlbWlsaWdodCIsICJsaWdodCIsICJib29rIiwgInJlZ3VsYXIiLCAibm9ybWFsIiwgIm1lZGl1bSIsICJkZW1pYm9sZCIsICJzZW1pYm9sZCIsICJib2xkIiwgImV4dHJhYm9sZCIsICJ1bHRyYWJvbGQiLCAiYmxhY2siLCAiaGVhdnkiLCAiZXh0cmFibGFjayIsICJ1bHRyYWJsYWNrIiwgInJvbWFuIiwgIml0YWxpYyIsICJvYmxpcXVlIiwgInVsdHJhY29uZGVuc2VkIiwgImV4dHJhY29uZGVuc2VkIiwgImNvbmRlbnNlZCIsICJzZW1pY29uZGVuc2VkIiwgIm5vcm1hbCIsICJzZW1pZXhwYW5kZWQiLCAiZXhwYW5kZWQiLCAiZXh0cmFleHBhbmRlZCIsICJ1bHRyYWV4cGFuZGVkIiwgImJvbGRpdGFsaWMiXSk7CiAgcmV0dXJuIHN0ci5zcGxpdCgvWy0gLCtdKy9nKS5maWx0ZXIodG9rID0+ICFrZXl3b3Jkcy5oYXModG9rLnRvTG93ZXJDYXNlKCkpKS5qb2luKCIgIik7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVGb250KHsKICBhbGlhcywKICBsb2NhbCwKICBwYXRoLAogIGZhbGxiYWNrLAogIHN0eWxlLAogIHVsdGltYXRlCn0sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2sgPSB0cnVlLCB1c2VQYXRoID0gdHJ1ZSwgYXBwZW5kID0gIiIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICBzdHlsZTogbnVsbCwKICAgIHVsdGltYXRlOiBudWxsCiAgfTsKICBpZiAobG9jYWwpIHsKICAgIGNvbnN0IGV4dHJhID0gYXBwZW5kID8gYCAke2FwcGVuZH1gIDogIiI7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbG9jYWwpIHsKICAgICAgc3JjLnB1c2goYGxvY2FsKCR7bmFtZX0ke2V4dHJhfSlgKTsKICAgIH0KICB9CiAgaWYgKGFsaWFzKSB7CiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KGFsaWFzKTsKICAgIGNvbnN0IGFsaWFzQXBwZW5kID0gYXBwZW5kIHx8IGdldFN0eWxlVG9BcHBlbmQoc3R5bGUpOwogICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIGdlbmVyYXRlRm9udChzdWJzdGl0dXRpb24sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2sgJiYgIWZhbGxiYWNrLCB1c2VQYXRoICYmICFwYXRoLCBhbGlhc0FwcGVuZCkpOwogIH0KICBpZiAoc3R5bGUpIHsKICAgIHJlc3VsdC5zdHlsZSA9IHN0eWxlOwogIH0KICBpZiAodWx0aW1hdGUpIHsKICAgIHJlc3VsdC51bHRpbWF0ZSA9IHVsdGltYXRlOwogIH0KICBpZiAodXNlRmFsbGJhY2sgJiYgZmFsbGJhY2spIHsKICAgIGNvbnN0IGZhbGxiYWNrSW5mbyA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoZmFsbGJhY2spOwogICAgY29uc3QgewogICAgICB1bHRpbWF0ZTogZmFsbGJhY2tVbHRpbWF0ZQogICAgfSA9IGdlbmVyYXRlRm9udChmYWxsYmFja0luZm8sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2ssIHVzZVBhdGggJiYgIXBhdGgsIGFwcGVuZCk7CiAgICByZXN1bHQudWx0aW1hdGUgfHw9IGZhbGxiYWNrVWx0aW1hdGU7CiAgfQogIGlmICh1c2VQYXRoICYmIHBhdGggJiYgbG9jYWxGb250UGF0aCkgewogICAgc3JjLnB1c2goYHVybCgke2xvY2FsRm9udFBhdGh9JHtwYXRofSlgKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBnZXRGb250U3Vic3RpdHV0aW9uKHN5c3RlbUZvbnRDYWNoZSwgaWRGYWN0b3J5LCBsb2NhbEZvbnRQYXRoLCBiYXNlRm9udE5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpIHsKICBpZiAoYmFzZUZvbnROYW1lLnN0YXJ0c1dpdGgoIkludmFsaWRQREZqc0ZvbnRfIikpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoKHR5cGUgPT09ICJUcnVlVHlwZSIgfHwgdHlwZSA9PT0gIlR5cGUxIikgJiYgL15bQS1aXXs2fVwrLy50ZXN0KGJhc2VGb250TmFtZSkpIHsKICAgIGJhc2VGb250TmFtZSA9IGJhc2VGb250TmFtZS5zbGljZSg3KTsKICB9CiAgYmFzZUZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUoYmFzZUZvbnROYW1lKTsKICBjb25zdCBrZXkgPSBiYXNlRm9udE5hbWU7CiAgbGV0IHN1YnN0aXR1dGlvbkluZm8gPSBzeXN0ZW1Gb250Q2FjaGUuZ2V0KGtleSk7CiAgaWYgKHN1YnN0aXR1dGlvbkluZm8pIHsKICAgIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwogIH0KICBsZXQgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uTWFwLmdldChiYXNlRm9udE5hbWUpOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBmb3IgKGNvbnN0IFthbGlhcywgc3Vic3RdIG9mIGZvbnRBbGlhc2VzKSB7CiAgICAgIGlmIChiYXNlRm9udE5hbWUuc3RhcnRzV2l0aChhbGlhcykpIHsKICAgICAgICBiYXNlRm9udE5hbWUgPSBgJHtzdWJzdH0ke2Jhc2VGb250TmFtZS5zdWJzdHJpbmcoYWxpYXMubGVuZ3RoKX1gOwogICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoYmFzZUZvbnROYW1lKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICBsZXQgbXVzdEFkZEJhc2VGb250ID0gZmFsc2U7CiAgaWYgKCFzdWJzdGl0dXRpb24pIHsKICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoc3RhbmRhcmRGb250TmFtZSk7CiAgICBtdXN0QWRkQmFzZUZvbnQgPSB0cnVlOwogIH0KICBjb25zdCBsb2FkZWROYW1lID0gYCR7aWRGYWN0b3J5LmdldERvY0lkKCl9X3Mke2lkRmFjdG9yeS5jcmVhdGVGb250SWQoKX1gOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBpZiAoIXZhbGlkYXRlRm9udE5hbWUoYmFzZUZvbnROYW1lKSkgewogICAgICB3YXJuKGBDYW5ub3Qgc3Vic3RpdHV0ZSB0aGUgZm9udCBiZWNhdXNlIG9mIGl0cyBuYW1lOiAke2Jhc2VGb250TmFtZX1gKTsKICAgICAgc3lzdGVtRm9udENhY2hlLnNldChrZXksIG51bGwpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGJvbGQgPSAvYm9sZC9naS50ZXN0KGJhc2VGb250TmFtZSk7CiAgICBjb25zdCBpdGFsaWMgPSAvb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChiYXNlRm9udE5hbWUpOwogICAgY29uc3Qgc3R5bGUgPSBib2xkICYmIGl0YWxpYyAmJiBCT0xESVRBTElDIHx8IGJvbGQgJiYgQk9MRCB8fCBpdGFsaWMgJiYgSVRBTElDIHx8IE5PUk1BTDsKICAgIHN1YnN0aXR1dGlvbkluZm8gPSB7CiAgICAgIGNzczogYCIke2dldEZhbWlseU5hbWUoYmFzZUZvbnROYW1lKX0iLCR7bG9hZGVkTmFtZX1gLAogICAgICBndWVzc0ZhbGxiYWNrOiB0cnVlLAogICAgICBsb2FkZWROYW1lLAogICAgICBiYXNlRm9udE5hbWUsCiAgICAgIHNyYzogYGxvY2FsKCR7YmFzZUZvbnROYW1lfSlgLAogICAgICBzdHlsZQogICAgfTsKICAgIHN5c3RlbUZvbnRDYWNoZS5zZXQoa2V5LCBzdWJzdGl0dXRpb25JbmZvKTsKICAgIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwogIH0KICBjb25zdCBzcmMgPSBbXTsKICBpZiAobXVzdEFkZEJhc2VGb250ICYmIHZhbGlkYXRlRm9udE5hbWUoYmFzZUZvbnROYW1lKSkgewogICAgc3JjLnB1c2goYGxvY2FsKCR7YmFzZUZvbnROYW1lfSlgKTsKICB9CiAgY29uc3QgewogICAgc3R5bGUsCiAgICB1bHRpbWF0ZQogIH0gPSBnZW5lcmF0ZUZvbnQoc3Vic3RpdHV0aW9uLCBzcmMsIGxvY2FsRm9udFBhdGgpOwogIGNvbnN0IGd1ZXNzRmFsbGJhY2sgPSB1bHRpbWF0ZSA9PT0gbnVsbDsKICBjb25zdCBmYWxsYmFjayA9IGd1ZXNzRmFsbGJhY2sgPyAiIiA6IGAsJHt1bHRpbWF0ZX1gOwogIHN1YnN0aXR1dGlvbkluZm8gPSB7CiAgICBjc3M6IGAiJHtnZXRGYW1pbHlOYW1lKGJhc2VGb250TmFtZSl9Iiwke2xvYWRlZE5hbWV9JHtmYWxsYmFja31gLAogICAgZ3Vlc3NGYWxsYmFjaywKICAgIGxvYWRlZE5hbWUsCiAgICBiYXNlRm9udE5hbWUsCiAgICBzcmM6IHNyYy5qb2luKCIsIiksCiAgICBzdHlsZQogIH07CiAgc3lzdGVtRm9udENhY2hlLnNldChrZXksIHN1YnN0aXR1dGlvbkluZm8pOwogIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwp9Cgo7Ly8gLi9zcmMvc2hhcmVkL211cm11cmhhc2gzLmpzCmNvbnN0IFNFRUQgPSAweGMzZDJlMWYwOwpjb25zdCBNQVNLX0hJR0ggPSAweGZmZmYwMDAwOwpjb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjsKY2xhc3MgTXVybXVySGFzaDNfNjQgewogIGNvbnN0cnVjdG9yKHNlZWQpIHsKICAgIHRoaXMuaDEgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEOwogICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CiAgfQogIHVwZGF0ZShpbnB1dCkgewogICAgbGV0IGRhdGEsIGxlbmd0aDsKICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICJzdHJpbmciKSB7CiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTsKICAgICAgbGVuZ3RoID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5wdXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHsKICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlID4+PiA4OwogICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlICYgMHhmZjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkgewogICAgICBkYXRhID0gaW5wdXQuc2xpY2UoKTsKICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGEgZm9ybWF0LCBtdXN0IGJlIGEgc3RyaW5nIG9yIFR5cGVkQXJyYXkuIik7CiAgICB9CiAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyOwogICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDsKICAgIGNvbnN0IGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTsKICAgIGxldCBrMSA9IDAsCiAgICAgIGsyID0gMDsKICAgIGxldCBoMSA9IHRoaXMuaDEsCiAgICAgIGgyID0gdGhpcy5oMjsKICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSwKICAgICAgQzIgPSAweDFiODczNTkzOwogICAgY29uc3QgQzFfTE9XID0gQzEgJiBNQVNLX0xPVywKICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykgewogICAgICBpZiAoaSAmIDEpIHsKICAgICAgICBrMSA9IGRhdGFVaW50MzJbaV07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaDEgXj0gazE7CiAgICAgICAgaDEgPSBoMSA8PCAxMyB8IGgxID4+PiAxOTsKICAgICAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgazIgPSBkYXRhVWludDMyW2ldOwogICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7CiAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNzsKICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XOwogICAgICAgIGgyIF49IGsyOwogICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7CiAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0OwogICAgICB9CiAgICB9CiAgICBrMSA9IDA7CiAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHsKICAgICAgY2FzZSAzOgogICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7CiAgICAgIGNhc2UgMjoKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7CiAgICAgIGNhc2UgMToKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaWYgKGJsb2NrQ291bnRzICYgMSkgewogICAgICAgICAgaDEgXj0gazE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGgyIF49IGsxOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMuaDEgPSBoMTsKICAgIHRoaXMuaDIgPSBoMjsKICB9CiAgaGV4ZGlnZXN0KCkgewogICAgbGV0IGgxID0gdGhpcy5oMSwKICAgICAgaDIgPSB0aGlzLmgyOwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICByZXR1cm4gKGgxID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgIjAiKSArIChoMiA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICIwIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9vcGVyYXRvcl9saXN0LmpzCgpmdW5jdGlvbiBhZGRTdGF0ZShwYXJlbnRTdGF0ZSwgcGF0dGVybiwgY2hlY2tGbiwgaXRlcmF0ZUZuLCBwcm9jZXNzRm4pIHsKICBsZXQgc3RhdGUgPSBwYXJlbnRTdGF0ZTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBwYXR0ZXJuLmxlbmd0aCAtIDE7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBpdGVtID0gcGF0dGVybltpXTsKICAgIHN0YXRlID0gc3RhdGVbaXRlbV0gfHw9IFtdOwogIH0KICBzdGF0ZVtwYXR0ZXJuLmF0KC0xKV0gPSB7CiAgICBjaGVja0ZuLAogICAgaXRlcmF0ZUZuLAogICAgcHJvY2Vzc0ZuCiAgfTsKfQpjb25zdCBJbml0aWFsU3RhdGUgPSBbXTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbT1BTLnNhdmUsIE9QUy50cmFuc2Zvcm0sIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdCwgT1BTLnJlc3RvcmVdLCBudWxsLCBmdW5jdGlvbiBpdGVyYXRlSW5saW5lSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zYXZlOwogICAgY2FzZSAxOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnRyYW5zZm9ybTsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5wYWludElubGluZUltYWdlWE9iamVjdDsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyA9IDEwOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyA9IDIwMDsKICBjb25zdCBNQVhfV0lEVEggPSAxMDAwOwogIGNvbnN0IElNQUdFX1BBRERJTkcgPSAxOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElJWE8gPSBjdXJyIC0gMTsKICBjb25zdCBjb3VudCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgLSBpRmlyc3RTYXZlKSAvIDQpLCBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spOwogIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgbGV0IG1heFggPSAwOwogIGNvbnN0IG1hcCA9IFtdOwogIGxldCBtYXhMaW5lSGVpZ2h0ID0gMDsKICBsZXQgY3VycmVudFggPSBJTUFHRV9QQURESU5HLAogICAgY3VycmVudFkgPSBJTUFHRV9QQURESU5HOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKykgewogICAgY29uc3QgdHJhbnNmb3JtID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTsKICAgIGNvbnN0IGltZyA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXTsKICAgIGlmIChjdXJyZW50WCArIGltZy53aWR0aCA+IE1BWF9XSURUSCkgewogICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpOwogICAgICBjdXJyZW50WSArPSBtYXhMaW5lSGVpZ2h0ICsgMiAqIElNQUdFX1BBRERJTkc7CiAgICAgIGN1cnJlbnRYID0gMDsKICAgICAgbWF4TGluZUhlaWdodCA9IDA7CiAgICB9CiAgICBtYXAucHVzaCh7CiAgICAgIHRyYW5zZm9ybSwKICAgICAgeDogY3VycmVudFgsCiAgICAgIHk6IGN1cnJlbnRZLAogICAgICB3OiBpbWcud2lkdGgsCiAgICAgIGg6IGltZy5oZWlnaHQKICAgIH0pOwogICAgY3VycmVudFggKz0gaW1nLndpZHRoICsgMiAqIElNQUdFX1BBRERJTkc7CiAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgaW1nLmhlaWdodCk7CiAgfQogIGNvbnN0IGltZ1dpZHRoID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpICsgSU1BR0VfUEFERElORzsKICBjb25zdCBpbWdIZWlnaHQgPSBjdXJyZW50WSArIG1heExpbmVIZWlnaHQgKyBJTUFHRV9QQURESU5HOwogIGNvbnN0IGltZ0RhdGEgPSBuZXcgVWludDhBcnJheShpbWdXaWR0aCAqIGltZ0hlaWdodCAqIDQpOwogIGNvbnN0IGltZ1Jvd1NpemUgPSBpbWdXaWR0aCA8PCAyOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKykgewogICAgY29uc3QgZGF0YSA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXS5kYXRhOwogICAgY29uc3Qgcm93U2l6ZSA9IG1hcFtxXS53IDw8IDI7CiAgICBsZXQgZGF0YU9mZnNldCA9IDA7CiAgICBsZXQgb2Zmc2V0ID0gbWFwW3FdLnggKyBtYXBbcV0ueSAqIGltZ1dpZHRoIDw8IDI7CiAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KDAsIHJvd1NpemUpLCBvZmZzZXQgLSBpbWdSb3dTaXplKTsKICAgIGZvciAobGV0IGsgPSAwLCBrayA9IG1hcFtxXS5oOyBrIDwga2s7IGsrKykgewogICAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQsIGRhdGFPZmZzZXQgKyByb3dTaXplKSwgb2Zmc2V0KTsKICAgICAgZGF0YU9mZnNldCArPSByb3dTaXplOwogICAgICBvZmZzZXQgKz0gaW1nUm93U2l6ZTsKICAgIH0KICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoZGF0YU9mZnNldCAtIHJvd1NpemUsIGRhdGFPZmZzZXQpLCBvZmZzZXQpOwogICAgd2hpbGUgKG9mZnNldCA+PSAwKSB7CiAgICAgIGRhdGFbb2Zmc2V0IC0gNF0gPSBkYXRhW29mZnNldF07CiAgICAgIGRhdGFbb2Zmc2V0IC0gM10gPSBkYXRhW29mZnNldCArIDFdOwogICAgICBkYXRhW29mZnNldCAtIDJdID0gZGF0YVtvZmZzZXQgKyAyXTsKICAgICAgZGF0YVtvZmZzZXQgLSAxXSA9IGRhdGFbb2Zmc2V0ICsgM107CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSA0XTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAzXTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMl0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAyXTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgM10gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAxXTsKICAgICAgb2Zmc2V0IC09IGltZ1Jvd1NpemU7CiAgICB9CiAgfQogIGNvbnN0IGltZyA9IHsKICAgIHdpZHRoOiBpbWdXaWR0aCwKICAgIGhlaWdodDogaW1nSGVpZ2h0CiAgfTsKICBpZiAoY29udGV4dC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhpbWdXaWR0aCwgaW1nSGVpZ2h0KTsKICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgY3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdEYXRhLmJ1ZmZlciksIGltZ1dpZHRoLCBpbWdIZWlnaHQpLCAwLCAwKTsKICAgIGltZy5iaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICBpbWcuZGF0YSA9IG51bGw7CiAgfSBlbHNlIHsKICAgIGltZy5raW5kID0gSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICBpbWcuZGF0YSA9IGltZ0RhdGE7CiAgfQogIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXApOwogIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbaW1nLCBtYXBdKTsKICByZXR1cm4gaUZpcnN0U2F2ZSArIDE7Cn0pOwphZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtPUFMuc2F2ZSwgT1BTLnRyYW5zZm9ybSwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwgT1BTLnJlc3RvcmVdLCBudWxsLCBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOwogIGNvbnN0IHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIHN3aXRjaCAocG9zKSB7CiAgICBjYXNlIDA6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2F2ZTsKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy50cmFuc2Zvcm07CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OwogICAgY2FzZSAzOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnJlc3RvcmU7CiAgfQogIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZUltYWdlTWFza0dyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiBmb3VuZEltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTA7CiAgY29uc3QgTUFYX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwMDsKICBjb25zdCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElNWE8gPSBjdXJyIC0gMTsKICBsZXQgY291bnQgPSBNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KTsKICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7CiAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIH0KICBsZXQgaXNTYW1lSW1hZ2UgPSBmYWxzZTsKICBsZXQgaVRyYW5zZm9ybSwgdHJhbnNmb3JtQXJnczsKICBjb25zdCBmaXJzdFBJTVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YT11bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF0sCiAgICBmaXJzdFRyYW5zZm9ybUFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSwKICAgIGZpcnN0VHJhbnNmb3JtQXJnMiA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdLAogICAgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgaWYgKGZpcnN0VHJhbnNmb3JtQXJnMSA9PT0gZmlyc3RUcmFuc2Zvcm1BcmcyKSB7CiAgICBpc1NhbWVJbWFnZSA9IHRydWU7CiAgICBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtICsgNDsKICAgIGxldCBpUElNWE8gPSBpRmlyc3RQSU1YTyArIDQ7CiAgICBmb3IgKGxldCBxID0gMTsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCwgaVBJTVhPICs9IDQpIHsKICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpUElNWE9dWzBdICE9PSBmaXJzdFBJTVhPQXJnMCB8fCB0cmFuc2Zvcm1BcmdzWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHwgdHJhbnNmb3JtQXJnc1sxXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcxIHx8IHRyYW5zZm9ybUFyZ3NbMl0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMiB8fCB0cmFuc2Zvcm1BcmdzWzNdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzMpIHsKICAgICAgICBpZiAocSA8IE1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spIHsKICAgICAgICAgIGlzU2FtZUltYWdlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvdW50ID0gcTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGlzU2FtZUltYWdlKSB7CiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOwogICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTsKICAgIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7CiAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07CiAgICAgIHBvc2l0aW9uc1txIDw8IDFdID0gdHJhbnNmb3JtQXJnc1s0XTsKICAgICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOwogICAgfQogICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KTsKICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbZmlyc3RQSU1YT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmcxLCBmaXJzdFRyYW5zZm9ybUFyZzIsIGZpcnN0VHJhbnNmb3JtQXJnMywgcG9zaXRpb25zXSk7CiAgfSBlbHNlIHsKICAgIGNvdW50ID0gTWF0aC5taW4oY291bnQsIE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOwogICAgY29uc3QgaW1hZ2VzID0gW107CiAgICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm0gKyAocSA8PCAyKV07CiAgICAgIGNvbnN0IG1hc2tQYXJhbXMgPSBhcmdzQXJyYXlbaUZpcnN0UElNWE8gKyAocSA8PCAyKV1bMF07CiAgICAgIGltYWdlcy5wdXNoKHsKICAgICAgICBkYXRhOiBtYXNrUGFyYW1zLmRhdGEsCiAgICAgICAgd2lkdGg6IG1hc2tQYXJhbXMud2lkdGgsCiAgICAgICAgaGVpZ2h0OiBtYXNrUGFyYW1zLmhlaWdodCwKICAgICAgICBpbnRlcnBvbGF0ZTogbWFza1BhcmFtcy5pbnRlcnBvbGF0ZSwKICAgICAgICBjb3VudDogbWFza1BhcmFtcy5jb3VudCwKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFyZ3MKICAgICAgfSk7CiAgICB9CiAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIE9QUy5wYWludEltYWdlTWFza1hPYmplY3RHcm91cCk7CiAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ltYWdlc10pOwogIH0KICByZXR1cm4gaUZpcnN0U2F2ZSArIDE7Cn0pOwphZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtPUFMuc2F2ZSwgT1BTLnRyYW5zZm9ybSwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0LCBPUFMucmVzdG9yZV0sIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgY29uc3QgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY29udGV4dC5pQ3VyciAtIDI7CiAgcmV0dXJuIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzFdID09PSAwICYmIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdID09PSAwOwp9LCBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMzsKICBjb25zdCBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICBzd2l0Y2ggKHBvcykgewogICAgY2FzZSAwOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnNhdmU7CiAgICBjYXNlIDE6CiAgICAgIGlmIChmbkFycmF5W2ldICE9PSBPUFMudHJhbnNmb3JtKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOwogICAgICBjb25zdCBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXTsKICAgICAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMCB8fCBhcmdzQXJyYXlbaV1bMV0gIT09IDAgfHwgYXJnc0FycmF5W2ldWzJdICE9PSAwIHx8IGFyZ3NBcnJheVtpXVszXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmczKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSAyOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLnBhaW50SW1hZ2VYT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFBJWE8gPSBjb250ZXh0LmlDdXJyIC0gMTsKICAgICAgY29uc3QgZmlyc3RQSVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSVhPXVswXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RQSVhPQXJnMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiAoY29udGV4dCwgaSkgewogIGNvbnN0IE1JTl9JTUFHRVNfSU5fQkxPQ0sgPSAzOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElYTyA9IGN1cnIgLSAxOwogIGNvbnN0IGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgY29uc3QgY291bnQgPSBNYXRoLm1pbihNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KSwgTUFYX0lNQUdFU19JTl9CTE9DSyk7CiAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOwogIGxldCBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7CiAgICBjb25zdCB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOwogICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdOwogICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOwogIH0KICBjb25zdCBhcmdzID0gW2ZpcnN0UElYT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmczLCBwb3NpdGlvbnNdOwogIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTsKICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgYXJncyk7CiAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOwp9KTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbT1BTLmJlZ2luVGV4dCwgT1BTLnNldEZvbnQsIE9QUy5zZXRUZXh0TWF0cml4LCBPUFMuc2hvd1RleHQsIE9QUy5lbmRUZXh0XSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDQ7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDU7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5iZWdpblRleHQ7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0Rm9udDsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zZXRUZXh0TWF0cml4OwogICAgY2FzZSAzOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLnNob3dUZXh0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFNldEZvbnQgPSBjb250ZXh0LmlDdXJyIC0gMzsKICAgICAgY29uc3QgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTsKICAgICAgY29uc3QgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RTZXRGb250QXJnMCB8fCBhcmdzQXJyYXlbaV1bMV0gIT09IGZpcnN0U2V0Rm9udEFyZzEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIDQ6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuZW5kVGV4dDsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlU2hvd1RleHRHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fQ0hBUlNfSU5fQkxPQ0sgPSAzOwogIGNvbnN0IE1BWF9DSEFSU19JTl9CTE9DSyA9IDEwMDA7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGN1cnIgPSBjb250ZXh0LmlDdXJyOwogIGNvbnN0IGlGaXJzdEJlZ2luVGV4dCA9IGN1cnIgLSA0OwogIGNvbnN0IGlGaXJzdFNldEZvbnQgPSBjdXJyIC0gMzsKICBjb25zdCBpRmlyc3RTZXRUZXh0TWF0cml4ID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0U2hvd1RleHQgPSBjdXJyIC0gMTsKICBjb25zdCBpRmlyc3RFbmRUZXh0ID0gY3VycjsKICBjb25zdCBmaXJzdFNldEZvbnRBcmcwID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzBdOwogIGNvbnN0IGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07CiAgbGV0IGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdEJlZ2luVGV4dCkgLyA1KSwgTUFYX0NIQVJTX0lOX0JMT0NLKTsKICBpZiAoY291bnQgPCBNSU5fQ0hBUlNfSU5fQkxPQ0spIHsKICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RCZWdpblRleHQpICUgNTsKICB9CiAgbGV0IGlGaXJzdCA9IGlGaXJzdEJlZ2luVGV4dDsKICBpZiAoaUZpcnN0QmVnaW5UZXh0ID49IDQgJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XSA9PT0gZm5BcnJheVtpRmlyc3RTZXRGb250XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDNdID09PSBmbkFycmF5W2lGaXJzdFNldFRleHRNYXRyaXhdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMl0gPT09IGZuQXJyYXlbaUZpcnN0U2hvd1RleHRdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMV0gPT09IGZuQXJyYXlbaUZpcnN0RW5kVGV4dF0gJiYgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzBdID09PSBmaXJzdFNldEZvbnRBcmcwICYmIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVsxXSA9PT0gZmlyc3RTZXRGb250QXJnMSkgewogICAgY291bnQrKzsKICAgIGlGaXJzdCAtPSA1OwogIH0KICBsZXQgaUVuZFRleHQgPSBpRmlyc3QgKyA0OwogIGZvciAobGV0IHEgPSAxOyBxIDwgY291bnQ7IHErKykgewogICAgZm5BcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOwogICAgYXJnc0FycmF5LnNwbGljZShpRW5kVGV4dCwgMyk7CiAgICBpRW5kVGV4dCArPSAyOwogIH0KICByZXR1cm4gaUVuZFRleHQgKyAxOwp9KTsKY2xhc3MgTnVsbE9wdGltaXplciB7CiAgY29uc3RydWN0b3IocXVldWUpIHsKICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKICB9CiAgX29wdGltaXplKCkge30KICBwdXNoKGZuLCBhcmdzKSB7CiAgICB0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaChmbik7CiAgICB0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKGFyZ3MpOwogICAgdGhpcy5fb3B0aW1pemUoKTsKICB9CiAgZmx1c2goKSB7fQogIHJlc2V0KCkge30KfQpjbGFzcyBRdWV1ZU9wdGltaXplciBleHRlbmRzIE51bGxPcHRpbWl6ZXIgewogIGNvbnN0cnVjdG9yKHF1ZXVlKSB7CiAgICBzdXBlcihxdWV1ZSk7CiAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgIHRoaXMuY29udGV4dCA9IHsKICAgICAgaUN1cnI6IDAsCiAgICAgIGZuQXJyYXk6IHF1ZXVlLmZuQXJyYXksCiAgICAgIGFyZ3NBcnJheTogcXVldWUuYXJnc0FycmF5LAogICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogZmFsc2UKICAgIH07CiAgICB0aGlzLm1hdGNoID0gbnVsbDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7CiAgfQogIHNldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCh2YWx1ZSkgewogICAgdGhpcy5jb250ZXh0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdmFsdWU7CiAgfQogIF9vcHRpbWl6ZSgpIHsKICAgIGNvbnN0IGZuQXJyYXkgPSB0aGlzLnF1ZXVlLmZuQXJyYXk7CiAgICBsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZCwKICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CiAgICBsZXQgbWF0Y2ggPSB0aGlzLm1hdGNoOwogICAgaWYgKCFzdGF0ZSAmJiAhbWF0Y2ggJiYgaSArIDEgPT09IGlpICYmICFJbml0aWFsU3RhdGVbZm5BcnJheVtpXV0pIHsKICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gaWk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CiAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIGNvbnN0IGl0ZXJhdGUgPSAoMCwgbWF0Y2guaXRlcmF0ZUZuKShjb250ZXh0LCBpKTsKICAgICAgICBpZiAoaXRlcmF0ZSkgewogICAgICAgICAgaSsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGkgPSAoMCwgbWF0Y2gucHJvY2Vzc0ZuKShjb250ZXh0LCBpICsgMSk7CiAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKICAgICAgICBtYXRjaCA9IG51bGw7CiAgICAgICAgc3RhdGUgPSBudWxsOwogICAgICAgIGlmIChpID49IGlpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGUgPSAoc3RhdGUgfHwgSW5pdGlhbFN0YXRlKVtmbkFycmF5W2ldXTsKICAgICAgaWYgKCFzdGF0ZSB8fCBBcnJheS5pc0FycmF5KHN0YXRlKSkgewogICAgICAgIGkrKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb250ZXh0LmlDdXJyID0gaTsKICAgICAgaSsrOwogICAgICBpZiAoc3RhdGUuY2hlY2tGbiAmJiAhKDAsIHN0YXRlLmNoZWNrRm4pKGNvbnRleHQpKSB7CiAgICAgICAgc3RhdGUgPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG1hdGNoID0gc3RhdGU7CiAgICAgIHN0YXRlID0gbnVsbDsKICAgIH0KICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKICAgIHRoaXMubWF0Y2ggPSBtYXRjaDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGk7CiAgfQogIGZsdXNoKCkgewogICAgd2hpbGUgKHRoaXMubWF0Y2gpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDsKICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gKDAsIHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsIGxlbmd0aCk7CiAgICAgIHRoaXMubWF0Y2ggPSBudWxsOwogICAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgICAgdGhpcy5fb3B0aW1pemUoKTsKICAgIH0KICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgIHRoaXMubWF0Y2ggPSBudWxsOwogICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gMDsKICB9Cn0KY2xhc3MgT3BlcmF0b3JMaXN0IHsKICBzdGF0aWMgQ0hVTktfU0laRSA9IDEwMDA7CiAgc3RhdGljIENIVU5LX1NJWkVfQUJPVVQgPSB0aGlzLkNIVU5LX1NJWkUgLSA1OwogIGNvbnN0cnVjdG9yKGludGVudCA9IDAsIHN0cmVhbVNpbmspIHsKICAgIHRoaXMuX3N0cmVhbVNpbmsgPSBzdHJlYW1TaW5rOwogICAgdGhpcy5mbkFycmF5ID0gW107CiAgICB0aGlzLmFyZ3NBcnJheSA9IFtdOwogICAgdGhpcy5vcHRpbWl6ZXIgPSBzdHJlYW1TaW5rICYmICEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5PUExJU1QpID8gbmV3IFF1ZXVlT3B0aW1pemVyKHRoaXMpIDogbmV3IE51bGxPcHRpbWl6ZXIodGhpcyk7CiAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBTZXQoKTsKICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDsKICAgIHRoaXMud2VpZ2h0ID0gMDsKICAgIHRoaXMuX3Jlc29sdmVkID0gc3RyZWFtU2luayA/IG51bGwgOiBQcm9taXNlLnJlc29sdmUoKTsKICB9CiAgc2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKHZhbHVlKSB7CiAgICB0aGlzLm9wdGltaXplci5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IHZhbHVlOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc0FycmF5Lmxlbmd0aDsKICB9CiAgZ2V0IHJlYWR5KCkgewogICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkIHx8IHRoaXMuX3N0cmVhbVNpbmsucmVhZHk7CiAgfQogIGdldCB0b3RhbExlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLl90b3RhbExlbmd0aCArIHRoaXMubGVuZ3RoOwogIH0KICBhZGRPcChmbiwgYXJncykgewogICAgdGhpcy5vcHRpbWl6ZXIucHVzaChmbiwgYXJncyk7CiAgICB0aGlzLndlaWdodCsrOwogICAgaWYgKHRoaXMuX3N0cmVhbVNpbmspIHsKICAgICAgaWYgKHRoaXMud2VpZ2h0ID49IE9wZXJhdG9yTGlzdC5DSFVOS19TSVpFKSB7CiAgICAgICAgdGhpcy5mbHVzaCgpOwogICAgICB9IGVsc2UgaWYgKHRoaXMud2VpZ2h0ID49IE9wZXJhdG9yTGlzdC5DSFVOS19TSVpFX0FCT1VUICYmIChmbiA9PT0gT1BTLnJlc3RvcmUgfHwgZm4gPT09IE9QUy5lbmRUZXh0KSkgewogICAgICAgIHRoaXMuZmx1c2goKTsKICAgICAgfQogICAgfQogIH0KICBhZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50LCBoYXNNYXNrID0gZmFsc2UpIHsKICAgIGlmIChoYXNNYXNrKSB7CiAgICAgIHRoaXMuYWRkT3AoT1BTLnNhdmUpOwogICAgICB0aGlzLmFkZE9wKE9QUy5zZXRHU3RhdGUsIFtbWyJTTWFzayIsIGZhbHNlXV1dKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgdGhpcy5hZGRPcChmbiwgYXJncyk7CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5hZGRPcChPUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogICAgaWYgKGhhc01hc2spIHsKICAgICAgdGhpcy5hZGRPcChPUFMucmVzdG9yZSk7CiAgICB9CiAgfQogIGFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSkgewogICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CiAgICB0aGlzLmFkZE9wKE9QUy5kZXBlbmRlbmN5LCBbZGVwZW5kZW5jeV0pOwogIH0KICBhZGREZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKSB7CiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgZGVwZW5kZW5jaWVzKSB7CiAgICAgIHRoaXMuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKICAgIH0KICB9CiAgYWRkT3BMaXN0KG9wTGlzdCkgewogICAgaWYgKCEob3BMaXN0IGluc3RhbmNlb2YgT3BlcmF0b3JMaXN0KSkgewogICAgICB3YXJuKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9wTGlzdC5kZXBlbmRlbmNpZXMpIHsKICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3BMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5hZGRPcChvcExpc3QuZm5BcnJheVtpXSwgb3BMaXN0LmFyZ3NBcnJheVtpXSk7CiAgICB9CiAgfQogIGdldElSKCkgewogICAgcmV0dXJuIHsKICAgICAgZm5BcnJheTogdGhpcy5mbkFycmF5LAogICAgICBhcmdzQXJyYXk6IHRoaXMuYXJnc0FycmF5LAogICAgICBsZW5ndGg6IHRoaXMubGVuZ3RoCiAgICB9OwogIH0KICBnZXQgX3RyYW5zZmVycygpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IFtdOwogICAgY29uc3QgewogICAgICBmbkFycmF5LAogICAgICBhcmdzQXJyYXksCiAgICAgIGxlbmd0aAogICAgfSA9IHRoaXM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHN3aXRjaCAoZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OgogICAgICAgIGNhc2UgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6CiAgICAgICAgY2FzZSBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OgogICAgICAgICAgY29uc3QgYXJnID0gYXJnc0FycmF5W2ldWzBdOwogICAgICAgICAgaWYgKCFhcmcuY2FjaGVkICYmIGFyZy5kYXRhPy5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgICAgICB0cmFuc2ZlcnMucHVzaChhcmcuZGF0YS5idWZmZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPUFMuY29uc3RydWN0UGF0aDoKICAgICAgICAgIGNvbnN0IFssIFtkYXRhXSwgbWluTWF4XSA9IGFyZ3NBcnJheVtpXTsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIHRyYW5zZmVycy5wdXNoKGRhdGEuYnVmZmVyLCBtaW5NYXguYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJhbnNmZXJzOwogIH0KICBmbHVzaChsYXN0Q2h1bmsgPSBmYWxzZSwgc2VwYXJhdGVBbm5vdHMgPSBudWxsKSB7CiAgICB0aGlzLm9wdGltaXplci5mbHVzaCgpOwogICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICB0aGlzLl90b3RhbExlbmd0aCArPSBsZW5ndGg7CiAgICB0aGlzLl9zdHJlYW1TaW5rLmVucXVldWUoewogICAgICBmbkFycmF5OiB0aGlzLmZuQXJyYXksCiAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksCiAgICAgIGxhc3RDaHVuaywKICAgICAgc2VwYXJhdGVBbm5vdHMsCiAgICAgIGxlbmd0aAogICAgfSwgMSwgdGhpcy5fdHJhbnNmZXJzKTsKICAgIHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7CiAgICB0aGlzLmZuQXJyYXkubGVuZ3RoID0gMDsKICAgIHRoaXMuYXJnc0FycmF5Lmxlbmd0aCA9IDA7CiAgICB0aGlzLndlaWdodCA9IDA7CiAgICB0aGlzLm9wdGltaXplci5yZXNldCgpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2UuanMKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlc2l6ZUltYWdlTWFzayhzcmMsIGJwYywgdzEsIGgxLCB3MiwgaDIpIHsKICBjb25zdCBsZW5ndGggPSB3MiAqIGgyOwogIGxldCBkZXN0OwogIGlmIChicGMgPD0gOCkgewogICAgZGVzdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgfSBlbHNlIGlmIChicGMgPD0gMTYpIHsKICAgIGRlc3QgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTsKICB9IGVsc2UgewogICAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShsZW5ndGgpOwogIH0KICBjb25zdCB4UmF0aW8gPSB3MSAvIHcyOwogIGNvbnN0IHlSYXRpbyA9IGgxIC8gaDI7CiAgbGV0IGksCiAgICBqLAogICAgcHksCiAgICBuZXdJbmRleCA9IDAsCiAgICBvbGRJbmRleDsKICBjb25zdCB4U2NhbGVkID0gbmV3IFVpbnQxNkFycmF5KHcyKTsKICBjb25zdCB3MVNjYW5saW5lID0gdzE7CiAgZm9yIChpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgaDI7IGkrKykgewogICAgcHkgPSBNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZTsKICAgIGZvciAoaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4XTsKICAgIH0KICB9CiAgcmV0dXJuIGRlc3Q7Cn0KY2xhc3MgUERGSW1hZ2UgewogIGNvbnN0cnVjdG9yKHsKICAgIHhyZWYsCiAgICByZXMsCiAgICBpbWFnZSwKICAgIGlzSW5saW5lID0gZmFsc2UsCiAgICBzbWFzayA9IG51bGwsCiAgICBtYXNrID0gbnVsbCwKICAgIGlzTWFzayA9IGZhbHNlLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICB0aGlzLmltYWdlID0gaW1hZ2U7CiAgICBjb25zdCBkaWN0ID0gaW1hZ2UuZGljdDsKICAgIGNvbnN0IGZpbHRlciA9IGRpY3QuZ2V0KCJGIiwgIkZpbHRlciIpOwogICAgbGV0IGZpbHRlck5hbWU7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJaZXJvID0geHJlZi5mZXRjaElmUmVmKGZpbHRlclswXSk7CiAgICAgIGlmIChmaWx0ZXJaZXJvIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXJaZXJvLm5hbWU7CiAgICAgIH0KICAgIH0KICAgIHN3aXRjaCAoZmlsdGVyTmFtZSkgewogICAgICBjYXNlICJKUFhEZWNvZGUiOgogICAgICAgICh7CiAgICAgICAgICB3aWR0aDogaW1hZ2Uud2lkdGgsCiAgICAgICAgICBoZWlnaHQ6IGltYWdlLmhlaWdodCwKICAgICAgICAgIGNvbXBvbmVudHNDb3VudDogaW1hZ2UubnVtQ29tcHMsCiAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50OiBpbWFnZS5iaXRzUGVyQ29tcG9uZW50CiAgICAgICAgfSA9IEpweEltYWdlLnBhcnNlSW1hZ2VQcm9wZXJ0aWVzKGltYWdlLnN0cmVhbSkpOwogICAgICAgIGltYWdlLnN0cmVhbS5yZXNldCgpOwogICAgICAgIHRoaXMuanB4RGVjb2Rlck9wdGlvbnMgPSB7CiAgICAgICAgICBudW1Db21wb25lbnRzOiAwLAogICAgICAgICAgaXNJbmRleGVkQ29sb3JtYXA6IGZhbHNlLAogICAgICAgICAgc21hc2tJbkRhdGE6IGRpY3QuaGFzKCJTTWFza0luRGF0YSIpCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIGltYWdlLm51bUNvbXBzID0gMTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGxldCB3aWR0aCA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBsZXQgaGVpZ2h0ID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbWFnZS53aWR0aCkgJiYgaW1hZ2Uud2lkdGggPiAwICYmIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJiBpbWFnZS5oZWlnaHQgPiAwICYmIChpbWFnZS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2UuaGVpZ2h0ICE9PSBoZWlnaHQpKSB7CiAgICAgIHdhcm4oIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgIiArICJyYXRoZXIgdGhhbiB0aGUgaW1hZ2UgZGljdGlvbmFyeS4iKTsKICAgICAgd2lkdGggPSBpbWFnZS53aWR0aDsKICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgdmFsaWRXaWR0aCA9IHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIgJiYgd2lkdGggPiAwLAogICAgICAgIHZhbGlkSGVpZ2h0ID0gdHlwZW9mIGhlaWdodCA9PT0gIm51bWJlciIgJiYgaGVpZ2h0ID4gMDsKICAgICAgaWYgKCF2YWxpZFdpZHRoIHx8ICF2YWxpZEhlaWdodCkgewogICAgICAgIGlmICghaW1hZ2UuZmFsbGJhY2tEaW1zKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgaW1hZ2Ugd2lkdGg6ICR7d2lkdGh9IG9yIGhlaWdodDogJHtoZWlnaHR9YCk7CiAgICAgICAgfQogICAgICAgIHdhcm4oIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgcGFyZW50IGltYWdlLCBmb3IgU01hc2svTWFzayBkYXRhLiIpOwogICAgICAgIGlmICghdmFsaWRXaWR0aCkgewogICAgICAgICAgd2lkdGggPSBpbWFnZS5mYWxsYmFja0RpbXMud2lkdGg7CiAgICAgICAgfQogICAgICAgIGlmICghdmFsaWRIZWlnaHQpIHsKICAgICAgICAgIGhlaWdodCA9IGltYWdlLmZhbGxiYWNrRGltcy5oZWlnaHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIHRoaXMuaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgdGhpcy5pbWFnZU1hc2sgPSBkaWN0LmdldCgiSU0iLCAiSW1hZ2VNYXNrIikgfHwgZmFsc2U7CiAgICB0aGlzLm1hdHRlID0gZGljdC5nZXQoIk1hdHRlIikgfHwgZmFsc2U7CiAgICBsZXQgYml0c1BlckNvbXBvbmVudCA9IGltYWdlLmJpdHNQZXJDb21wb25lbnQ7CiAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRpY3QuZ2V0KCJCUEMiLCAiQml0c1BlckNvbXBvbmVudCIpOwogICAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHsKICAgICAgICAgIGJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAke3RoaXMuaW1hZ2VNYXNrfWApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50OwogICAgaWYgKCF0aGlzLmltYWdlTWFzaykgewogICAgICBsZXQgY29sb3JTcGFjZSA9IGRpY3QuZ2V0UmF3KCJDUyIpIHx8IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIik7CiAgICAgIGNvbnN0IGhhc0NvbG9yU3BhY2UgPSAhIWNvbG9yU3BhY2U7CiAgICAgIGlmICghaGFzQ29sb3JTcGFjZSkgewogICAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQkEiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VDTVlLIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZXMgd2l0aCAke2ltYWdlLm51bUNvbXBzfSBjb2xvciBjb21wb25lbnRzIG5vdCBzdXBwb3J0ZWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuanB4RGVjb2Rlck9wdGlvbnM/LnNtYXNrSW5EYXRhKSB7CiAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VSR0JBIik7CiAgICAgIH0KICAgICAgdGhpcy5jb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLnBhcnNlKHsKICAgICAgICBjczogY29sb3JTcGFjZSwKICAgICAgICB4cmVmLAogICAgICAgIHJlc291cmNlczogaXNJbmxpbmUgPyByZXMgOiBudWxsLAogICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgfSk7CiAgICAgIHRoaXMubnVtQ29tcHMgPSB0aGlzLmNvbG9yU3BhY2UubnVtQ29tcHM7CiAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucy5udW1Db21wb25lbnRzID0gaGFzQ29sb3JTcGFjZSA/IHRoaXMubnVtQ29tcHMgOiAwOwogICAgICAgIHRoaXMuanB4RGVjb2Rlck9wdGlvbnMuaXNJbmRleGVkQ29sb3JtYXAgPSB0aGlzLmNvbG9yU3BhY2UubmFtZSA9PT0gIkluZGV4ZWQiOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoIkQiLCAiRGVjb2RlIik7CiAgICB0aGlzLm5lZWRzRGVjb2RlID0gZmFsc2U7CiAgICBpZiAodGhpcy5kZWNvZGUgJiYgKHRoaXMuY29sb3JTcGFjZSAmJiAhdGhpcy5jb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgYml0c1BlckNvbXBvbmVudCkgfHwgaXNNYXNrICYmICFDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgMSkpKSB7CiAgICAgIHRoaXMubmVlZHNEZWNvZGUgPSB0cnVlOwogICAgICBjb25zdCBtYXggPSAoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDE7CiAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzID0gW107CiAgICAgIHRoaXMuZGVjb2RlQWRkZW5kcyA9IFtdOwogICAgICBjb25zdCBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2U/Lm5hbWUgPT09ICJJbmRleGVkIjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikgewogICAgICAgIGNvbnN0IGRtaW4gPSB0aGlzLmRlY29kZVtpXTsKICAgICAgICBjb25zdCBkbWF4ID0gdGhpcy5kZWNvZGVbaSArIDFdOwogICAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzW2pdID0gaXNJbmRleGVkID8gKGRtYXggLSBkbWluKSAvIG1heCA6IGRtYXggLSBkbWluOwogICAgICAgIHRoaXMuZGVjb2RlQWRkZW5kc1tqXSA9IGlzSW5kZXhlZCA/IGRtaW4gOiBtYXggKiBkbWluOwogICAgICB9CiAgICB9CiAgICBpZiAoc21hc2spIHsKICAgICAgc21hc2suZmFsbGJhY2tEaW1zID8/PSB7CiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0CiAgICAgIH07CiAgICAgIHRoaXMuc21hc2sgPSBuZXcgUERGSW1hZ2UoewogICAgICAgIHhyZWYsCiAgICAgICAgcmVzLAogICAgICAgIGltYWdlOiBzbWFzaywKICAgICAgICBpc0lubGluZSwKICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnN0IG1hc2tEaWN0ID0gbWFzay5kaWN0LAogICAgICAgICAgaW1hZ2VNYXNrID0gbWFza0RpY3QuZ2V0KCJJTSIsICJJbWFnZU1hc2siKTsKICAgICAgICBpZiAoIWltYWdlTWFzaykgewogICAgICAgICAgd2FybigiSWdub3JpbmcgL01hc2sgaW4gaW1hZ2Ugd2l0aG91dCAvSW1hZ2VNYXNrLiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXNrLmZhbGxiYWNrRGltcyA/Pz0gewogICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgaGVpZ2h0CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHsKICAgICAgICAgICAgeHJlZiwKICAgICAgICAgICAgcmVzLAogICAgICAgICAgICBpbWFnZTogbWFzaywKICAgICAgICAgICAgaXNJbmxpbmUsCiAgICAgICAgICAgIGlzTWFzazogdHJ1ZSwKICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgYnVpbGRJbWFnZSh7CiAgICB4cmVmLAogICAgcmVzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZTsKICAgIGxldCBzbWFza0RhdGEgPSBudWxsOwogICAgbGV0IG1hc2tEYXRhID0gbnVsbDsKICAgIGNvbnN0IHNtYXNrID0gaW1hZ2UuZGljdC5nZXQoIlNNYXNrIik7CiAgICBjb25zdCBtYXNrID0gaW1hZ2UuZGljdC5nZXQoIk1hc2siKTsKICAgIGlmIChzbWFzaykgewogICAgICBpZiAoc21hc2sgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgc21hc2tEYXRhID0gc21hc2s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiVW5zdXBwb3J0ZWQgL1NNYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSB8fCBBcnJheS5pc0FycmF5KG1hc2spKSB7CiAgICAgICAgbWFza0RhdGEgPSBtYXNrOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIlVuc3VwcG9ydGVkIC9NYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBQREZJbWFnZSh7CiAgICAgIHhyZWYsCiAgICAgIHJlcywKICAgICAgaW1hZ2U6IGltYWdlRGF0YSwKICAgICAgaXNJbmxpbmUsCiAgICAgIHNtYXNrOiBzbWFza0RhdGEsCiAgICAgIG1hc2s6IG1hc2tEYXRhLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0pOwogIH0KICBzdGF0aWMgY3JlYXRlUmF3TWFzayh7CiAgICBpbWdBcnJheSwKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCiAgICBpbnZlcnNlRGVjb2RlLAogICAgaW50ZXJwb2xhdGUKICB9KSB7CiAgICBjb25zdCBjb21wdXRlZExlbmd0aCA9ICh3aWR0aCArIDcgPj4gMykgKiBoZWlnaHQ7CiAgICBjb25zdCBhY3R1YWxMZW5ndGggPSBpbWdBcnJheS5ieXRlTGVuZ3RoOwogICAgY29uc3QgaGF2ZUZ1bGxEYXRhID0gY29tcHV0ZWRMZW5ndGggPT09IGFjdHVhbExlbmd0aDsKICAgIGxldCBkYXRhLCBpOwogICAgaWYgKGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtICYmICghaW52ZXJzZURlY29kZSB8fCBoYXZlRnVsbERhdGEpKSB7CiAgICAgIGRhdGEgPSBpbWdBcnJheTsKICAgIH0gZWxzZSBpZiAoIWludmVyc2VEZWNvZGUpIHsKICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGltZ0FycmF5KTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShjb21wdXRlZExlbmd0aCk7CiAgICAgIGRhdGEuc2V0KGltZ0FycmF5KTsKICAgICAgZGF0YS5maWxsKDB4ZmYsIGFjdHVhbExlbmd0aCk7CiAgICB9CiAgICBpZiAoaW52ZXJzZURlY29kZSkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHsKICAgICAgICBkYXRhW2ldIF49IDB4ZmY7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRhdGEsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGludGVycG9sYXRlCiAgICB9OwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTWFzayh7CiAgICBpbWdBcnJheSwKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCiAgICBpbnZlcnNlRGVjb2RlLAogICAgaW50ZXJwb2xhdGUsCiAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgY29uc3QgaXNTaW5nbGVPcGFxdWVQaXhlbCA9IHdpZHRoID09PSAxICYmIGhlaWdodCA9PT0gMSAmJiBpbnZlcnNlRGVjb2RlID09PSAoaW1nQXJyYXkubGVuZ3RoID09PSAwIHx8ICEhKGltZ0FycmF5WzBdICYgMTI4KSk7CiAgICBpZiAoaXNTaW5nbGVPcGFxdWVQaXhlbCkgewogICAgICByZXR1cm4gewogICAgICAgIGlzU2luZ2xlT3BhcXVlUGl4ZWwKICAgICAgfTsKICAgIH0KICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICBpZiAoSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQod2lkdGgsIGhlaWdodCkpIHsKICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7CiAgICAgICAgY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoewogICAgICAgICAgc3JjOiBpbWdBcnJheSwKICAgICAgICAgIGRlc3Q6IGRhdGEsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIG5vbkJsYWNrQ29sb3I6IDAsCiAgICAgICAgICBpbnZlcnNlRGVjb2RlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIEltYWdlUmVzaXplci5jcmVhdGVJbWFnZSh7CiAgICAgICAgICBraW5kOiBJbWFnZUtpbmQuUkdCQV8zMkJQUCwKICAgICAgICAgIGRhdGEsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIGludGVycG9sYXRlCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7CiAgICAgICAgc3JjOiBpbWdBcnJheSwKICAgICAgICBkZXN0OiBpbWdEYXRhLmRhdGEsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIG5vbkJsYWNrQ29sb3I6IDAsCiAgICAgICAgaW52ZXJzZURlY29kZQogICAgICB9KTsKICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTsKICAgICAgY29uc3QgYml0bWFwID0gY2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpOwogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IG51bGwsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGludGVycG9sYXRlLAogICAgICAgIGJpdG1hcAogICAgICB9OwogICAgfQogICAgcmV0dXJuIHRoaXMuY3JlYXRlUmF3TWFzayh7CiAgICAgIGltZ0FycmF5LAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBpbnZlcnNlRGVjb2RlLAogICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSwKICAgICAgaW50ZXJwb2xhdGUKICAgIH0pOwogIH0KICBnZXQgZHJhd1dpZHRoKCkgewogICAgcmV0dXJuIE1hdGgubWF4KHRoaXMud2lkdGgsIHRoaXMuc21hc2s/LndpZHRoIHx8IDAsIHRoaXMubWFzaz8ud2lkdGggfHwgMCk7CiAgfQogIGdldCBkcmF3SGVpZ2h0KCkgewogICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuaGVpZ2h0LCB0aGlzLnNtYXNrPy5oZWlnaHQgfHwgMCwgdGhpcy5tYXNrPy5oZWlnaHQgfHwgMCk7CiAgfQogIGRlY29kZUJ1ZmZlcihidWZmZXIpIHsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgY29uc3QgZGVjb2RlQWRkZW5kcyA9IHRoaXMuZGVjb2RlQWRkZW5kczsKICAgIGNvbnN0IGRlY29kZUNvZWZmaWNpZW50cyA9IHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzOwogICAgY29uc3QgbWF4ID0gKDEgPDwgYnBjKSAtIDE7CiAgICBsZXQgaSwgaWk7CiAgICBpZiAoYnBjID09PSAxKSB7CiAgICAgIGZvciAoaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBidWZmZXJbaV0gPSArIWJ1ZmZlcltpXTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgaW5kZXggPSAwOwogICAgZm9yIChpID0gMCwgaWkgPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgewogICAgICAgIGJ1ZmZlcltpbmRleF0gPSBNYXRoQ2xhbXAoZGVjb2RlQWRkZW5kc1tqXSArIGJ1ZmZlcltpbmRleF0gKiBkZWNvZGVDb2VmZmljaWVudHNbal0sIDAsIG1heCk7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgfQogIH0KICBnZXRDb21wb25lbnRzKGJ1ZmZlcikgewogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBpZiAoYnBjID09PSA4KSB7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGg7CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcHM7CiAgICBsZXQgYnVmZmVyUG9zID0gMDsKICAgIGxldCBvdXRwdXQ7CiAgICBpZiAoYnBjIDw9IDgpIHsKICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CiAgICAgIG91dHB1dCA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCk7CiAgICB9CiAgICBjb25zdCByb3dDb21wcyA9IHdpZHRoICogbnVtQ29tcHM7CiAgICBjb25zdCBtYXggPSAoMSA8PCBicGMpIC0gMTsKICAgIGxldCBpID0gMCwKICAgICAgaWksCiAgICAgIGJ1ZjsKICAgIGlmIChicGMgPT09IDEpIHsKICAgICAgbGV0IG1hc2ssIGxvb3AxRW5kLCBsb29wMkVuZDsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewogICAgICAgIGxvb3AxRW5kID0gaSArIChyb3dDb21wcyAmIH43KTsKICAgICAgICBsb29wMkVuZCA9IGkgKyByb3dDb21wczsKICAgICAgICB3aGlsZSAoaSA8IGxvb3AxRW5kKSB7CiAgICAgICAgICBidWYgPSBidWZmZXJbYnVmZmVyUG9zKytdOwogICAgICAgICAgb3V0cHV0W2ldID0gYnVmID4+IDcgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyAxXSA9IGJ1ZiA+PiA2ICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgMl0gPSBidWYgPj4gNSAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDNdID0gYnVmID4+IDQgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA0XSA9IGJ1ZiA+PiAzICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgNV0gPSBidWYgPj4gMiAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDZdID0gYnVmID4+IDEgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA3XSA9IGJ1ZiAmIDE7CiAgICAgICAgICBpICs9IDg7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgbG9vcDJFbmQpIHsKICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107CiAgICAgICAgICBtYXNrID0gMTI4OwogICAgICAgICAgd2hpbGUgKGkgPCBsb29wMkVuZCkgewogICAgICAgICAgICBvdXRwdXRbaSsrXSA9ICshIShidWYgJiBtYXNrKTsKICAgICAgICAgICAgbWFzayA+Pj0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCBiaXRzID0gMDsKICAgICAgYnVmID0gMDsKICAgICAgZm9yIChpID0gMCwgaWkgPSBsZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgaWYgKGkgJSByb3dDb21wcyA9PT0gMCkgewogICAgICAgICAgYnVmID0gMDsKICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoYml0cyA8IGJwYykgewogICAgICAgICAgYnVmID0gYnVmIDw8IDggfCBidWZmZXJbYnVmZmVyUG9zKytdOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAgICBjb25zdCByZW1haW5pbmdCaXRzID0gYml0cyAtIGJwYzsKICAgICAgICBsZXQgdmFsdWUgPSBidWYgPj4gcmVtYWluaW5nQml0czsKICAgICAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkgewogICAgICAgICAgdmFsdWUgPSBtYXg7CiAgICAgICAgfQogICAgICAgIG91dHB1dFtpXSA9IHZhbHVlOwogICAgICAgIGJ1ZiAmPSAoMSA8PCByZW1haW5pbmdCaXRzKSAtIDE7CiAgICAgICAgYml0cyA9IHJlbWFpbmluZ0JpdHM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQogIGFzeW5jIGZpbGxPcGFjaXR5KHJnYmFCdWYsIHdpZHRoLCBoZWlnaHQsIGFjdHVhbEhlaWdodCwgaW1hZ2UpIHsKICAgIGNvbnN0IHNtYXNrID0gdGhpcy5zbWFzazsKICAgIGNvbnN0IG1hc2sgPSB0aGlzLm1hc2s7CiAgICBsZXQgYWxwaGFCdWYsIHN3LCBzaCwgaSwgaWksIGo7CiAgICBpZiAoc21hc2spIHsKICAgICAgc3cgPSBzbWFzay53aWR0aDsKICAgICAgc2ggPSBzbWFzay5oZWlnaHQ7CiAgICAgIGFscGhhQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN3ICogc2gpOwogICAgICBhd2FpdCBzbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7CiAgICAgIGlmIChzdyAhPT0gd2lkdGggfHwgc2ggIT09IGhlaWdodCkgewogICAgICAgIGFscGhhQnVmID0gcmVzaXplSW1hZ2VNYXNrKGFscGhhQnVmLCBzbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWFzaykgewogICAgICBpZiAobWFzayBpbnN0YW5jZW9mIFBERkltYWdlKSB7CiAgICAgICAgc3cgPSBtYXNrLndpZHRoOwogICAgICAgIHNoID0gbWFzay5oZWlnaHQ7CiAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7CiAgICAgICAgbWFzay5udW1Db21wcyA9IDE7CiAgICAgICAgYXdhaXQgbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7CiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBzdyAqIHNoOyBpIDwgaWk7ICsraSkgewogICAgICAgICAgYWxwaGFCdWZbaV0gPSAyNTUgLSBhbHBoYUJ1ZltpXTsKICAgICAgICB9CiAgICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7CiAgICAgICAgICBhbHBoYUJ1ZiA9IHJlc2l6ZUltYWdlTWFzayhhbHBoYUJ1ZiwgbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHsKICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCk7CiAgICAgICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGggKiBoZWlnaHQ7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgICBsZXQgb3BhY2l0eSA9IDA7CiAgICAgICAgICBjb25zdCBpbWFnZU9mZnNldCA9IGkgKiBudW1Db21wczsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1Db21wczsgKytqKSB7CiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gaW1hZ2VbaW1hZ2VPZmZzZXQgKyBqXTsKICAgICAgICAgICAgY29uc3QgbWFza09mZnNldCA9IGogKiAyOwogICAgICAgICAgICBpZiAoY29sb3IgPCBtYXNrW21hc2tPZmZzZXRdIHx8IGNvbG9yID4gbWFza1ttYXNrT2Zmc2V0ICsgMV0pIHsKICAgICAgICAgICAgICBvcGFjaXR5ID0gMjU1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBhbHBoYUJ1ZltpXSA9IG9wYWNpdHk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biBtYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfQogICAgaWYgKGFscGhhQnVmKSB7CiAgICAgIGZvciAoaSA9IDAsIGogPSAzLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7ICsraSwgaiArPSA0KSB7CiAgICAgICAgcmdiYUJ1ZltqXSA9IGFscGhhQnVmW2ldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkgewogICAgICAgIHJnYmFCdWZbal0gPSAyNTU7CiAgICAgIH0KICAgIH0KICB9CiAgdW5kb1ByZWJsZW5kKGJ1ZmZlciwgd2lkdGgsIGhlaWdodCkgewogICAgY29uc3QgbWF0dGUgPSB0aGlzLnNtYXNrPy5tYXR0ZTsKICAgIGlmICghbWF0dGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWF0dGVSZ2IgPSB0aGlzLmNvbG9yU3BhY2UuZ2V0UmdiKG1hdHRlLCAwKTsKICAgIGNvbnN0IG1hdHRlUiA9IG1hdHRlUmdiWzBdOwogICAgY29uc3QgbWF0dGVHID0gbWF0dGVSZ2JbMV07CiAgICBjb25zdCBtYXR0ZUIgPSBtYXR0ZVJnYlsyXTsKICAgIGNvbnN0IGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgY29uc3QgYWxwaGEgPSBidWZmZXJbaSArIDNdOwogICAgICBpZiAoYWxwaGEgPT09IDApIHsKICAgICAgICBidWZmZXJbaV0gPSAyNTU7CiAgICAgICAgYnVmZmVyW2kgKyAxXSA9IDI1NTsKICAgICAgICBidWZmZXJbaSArIDJdID0gMjU1OwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGsgPSAyNTUgLyBhbHBoYTsKICAgICAgYnVmZmVyW2ldID0gKGJ1ZmZlcltpXSAtIG1hdHRlUikgKiBrICsgbWF0dGVSOwogICAgICBidWZmZXJbaSArIDFdID0gKGJ1ZmZlcltpICsgMV0gLSBtYXR0ZUcpICogayArIG1hdHRlRzsKICAgICAgYnVmZmVyW2kgKyAyXSA9IChidWZmZXJbaSArIDJdIC0gbWF0dGVCKSAqIGsgKyBtYXR0ZUI7CiAgICB9CiAgfQogIGFzeW5jIGNyZWF0ZUltYWdlRGF0YShmb3JjZVJHQkEgPSBmYWxzZSwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBmYWxzZSkgewogICAgY29uc3QgZHJhd1dpZHRoID0gdGhpcy5kcmF3V2lkdGg7CiAgICBjb25zdCBkcmF3SGVpZ2h0ID0gdGhpcy5kcmF3SGVpZ2h0OwogICAgY29uc3QgaW1nRGF0YSA9IHsKICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKICAgICAgaGVpZ2h0OiBkcmF3SGVpZ2h0LAogICAgICBpbnRlcnBvbGF0ZTogdGhpcy5pbnRlcnBvbGF0ZSwKICAgICAga2luZDogMCwKICAgICAgZGF0YTogbnVsbAogICAgfTsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IG9yaWdpbmFsV2lkdGggPSB0aGlzLndpZHRoOwogICAgY29uc3Qgb3JpZ2luYWxIZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3Qgcm93Qnl0ZXMgPSBvcmlnaW5hbFdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CiAgICBjb25zdCBtdXN0QmVSZXNpemVkID0gaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQoZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTsKICAgIGlmICghdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmIHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlUkdCQSIpIHsKICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICAgIGNvbnN0IGltZ0FycmF5ID0gaW1nRGF0YS5kYXRhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogb3JpZ2luYWxXaWR0aCAqIDQsIHt9KTsKICAgICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgaWYgKCFtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoSW1hZ2VLaW5kLlJHQkFfMzJCUFAsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgaW1nQXJyYXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEsIGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gaW1nRGF0YTsKICAgIH0KICAgIGlmICghZm9yY2VSR0JBKSB7CiAgICAgIGxldCBraW5kOwogICAgICBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJEZXZpY2VHcmF5IiAmJiBicGMgPT09IDEpIHsKICAgICAgICBraW5kID0gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlUkdCIiAmJiBicGMgPT09IDggJiYgIXRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICBraW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgfQogICAgICBpZiAoa2luZCAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmIGRyYXdXaWR0aCA9PT0gb3JpZ2luYWxXaWR0aCAmJiBkcmF3SGVpZ2h0ID09PSBvcmlnaW5hbEhlaWdodCkgewogICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy4jZ2V0SW1hZ2Uob3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQpOwogICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAgcmV0dXJuIGltYWdlOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMsIHt9KTsKICAgICAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICAgIGlmIChtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICAgIHJldHVybiBJbWFnZVJlc2l6ZXIuY3JlYXRlSW1hZ2UoewogICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAga2luZCwKICAgICAgICAgICAgICB3aWR0aDogZHJhd1dpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKICAgICAgICAgICAgICBpbnRlcnBvbGF0ZTogdGhpcy5pbnRlcnBvbGF0ZQogICAgICAgICAgICB9LCB0aGlzLm5lZWRzRGVjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUJpdG1hcChraW5kLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZGF0YSk7CiAgICAgICAgfQogICAgICAgIGltZ0RhdGEua2luZCA9IGtpbmQ7CiAgICAgICAgaW1nRGF0YS5kYXRhID0gZGF0YTsKICAgICAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICAgICAgYXNzZXJ0KGtpbmQgPT09IEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCwgIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLiIpOwogICAgICAgICAgY29uc3QgYnVmZmVyID0gaW1nRGF0YS5kYXRhOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgYnVmZmVyW2ldIF49IDB4ZmY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbWdEYXRhOwogICAgICB9CiAgICAgIGlmICh0aGlzLmltYWdlIGluc3RhbmNlb2YgSnBlZ1N0cmVhbSAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmICF0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgICAgbGV0IGltYWdlTGVuZ3RoID0gb3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlczsKICAgICAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgIW11c3RCZVJlc2l6ZWQpIHsKICAgICAgICAgIGxldCBpc0hhbmRsZWQgPSBmYWxzZTsKICAgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICAgICAgaW1hZ2VMZW5ndGggKj0gNDsKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgogICAgICAgICAgICAgIGltYWdlTGVuZ3RoID0gaW1hZ2VMZW5ndGggLyAzICogNDsKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzSGFuZGxlZCkgewogICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuI2dldEltYWdlKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZ2JhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKGltYWdlTGVuZ3RoLCB7CiAgICAgICAgICAgICAgZHJhd1dpZHRoLAogICAgICAgICAgICAgIGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgZm9yY2VSR0JBOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoSW1hZ2VLaW5kLlJHQkFfMzJCUFAsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgcmdiYSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICAgICAgaW1hZ2VMZW5ndGggKj0gMzsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CiAgICAgICAgICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgICAgICAgICBpbWdEYXRhLmRhdGEgPSBhd2FpdCB0aGlzLmdldEltYWdlQnl0ZXMoaW1hZ2VMZW5ndGgsIHsKICAgICAgICAgICAgICAgIGRyYXdXaWR0aCwKICAgICAgICAgICAgICAgIGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgICBmb3JjZVJHQjogdHJ1ZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmIChtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gaW1nRGF0YTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGltZ0FycmF5ID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMsIHsKICAgICAgaW50ZXJuYWw6IHRydWUKICAgIH0pOwogICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0gMCB8IGltZ0FycmF5Lmxlbmd0aCAvIHJvd0J5dGVzICogZHJhd0hlaWdodCAvIG9yaWdpbmFsSGVpZ2h0OwogICAgY29uc3QgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOwogICAgbGV0IGFscGhhMDEsIG1heWJlVW5kb1ByZWJsZW5kOwogICAgbGV0IGNhbnZhcywgY3R4LCBjYW52YXNJbWdEYXRhLCBkYXRhOwogICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmICFtdXN0QmVSZXNpemVkKSB7CiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTsKICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNhbnZhc0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgIGRhdGEgPSBjYW52YXNJbWdEYXRhLmRhdGE7CiAgICB9CiAgICBpbWdEYXRhLmtpbmQgPSBJbWFnZUtpbmQuUkdCQV8zMkJQUDsKICAgIGlmICghZm9yY2VSR0JBICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2spIHsKICAgICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCB8fCBtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiAzKTsKICAgICAgICBhbHBoYTAxID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBhcnIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIpOwogICAgICAgIGFyci5maWxsKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmYpOwogICAgICAgIGFscGhhMDEgPSAxOwogICAgICB9CiAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoIWlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIHx8IG11c3RCZVJlc2l6ZWQpIHsKICAgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiA0KTsKICAgICAgfQogICAgICBhbHBoYTAxID0gMTsKICAgICAgbWF5YmVVbmRvUHJlYmxlbmQgPSB0cnVlOwogICAgICBhd2FpdCB0aGlzLmZpbGxPcGFjaXR5KGRhdGEsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgYWN0dWFsSGVpZ2h0LCBjb21wcyk7CiAgICB9CiAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICB0aGlzLmRlY29kZUJ1ZmZlcihjb21wcyk7CiAgICB9CiAgICB0aGlzLmNvbG9yU3BhY2UuZmlsbFJnYihkYXRhLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpOwogICAgaWYgKG1heWJlVW5kb1ByZWJsZW5kKSB7CiAgICAgIHRoaXMudW5kb1ByZWJsZW5kKGRhdGEsIGRyYXdXaWR0aCwgYWN0dWFsSGVpZ2h0KTsKICAgIH0KICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJiAhbXVzdEJlUmVzaXplZCkgewogICAgICBjdHgucHV0SW1hZ2VEYXRhKGNhbnZhc0ltZ0RhdGEsIDAsIDApOwogICAgICBjb25zdCBiaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YTogbnVsbCwKICAgICAgICB3aWR0aDogZHJhd1dpZHRoLAogICAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKICAgICAgICBiaXRtYXAsCiAgICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgICAgfTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IGRhdGE7CiAgICBpZiAobXVzdEJlUmVzaXplZCkgewogICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEpOwogICAgfQogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogIGFzeW5jIGZpbGxHcmF5QnVmZmVyKGJ1ZmZlcikgewogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgaWYgKG51bUNvbXBzICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgUmVhZGluZyBncmF5IHNjYWxlIGZyb20gYSBjb2xvciBpbWFnZTogJHtudW1Db21wc31gKTsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aDsKICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBjb25zdCByb3dCeXRlcyA9IHdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CiAgICBjb25zdCBpbWdBcnJheSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VCeXRlcyhoZWlnaHQgKiByb3dCeXRlcywgewogICAgICBpbnRlcm5hbDogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7CiAgICBsZXQgaSwgbGVuZ3RoOwogICAgaWYgKGJwYyA9PT0gMSkgewogICAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IGNvbXBzW2ldIC0gMSAmIDI1NTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSAtY29tcHNbaV0gJiAyNTU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTsKICAgIH0KICAgIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OwogICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYnBjKSAtIDEpOwogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltpXSA9IHNjYWxlICogY29tcHNbaV07CiAgICB9CiAgfQogIGNyZWF0ZUJpdG1hcChraW5kLCB3aWR0aCwgaGVpZ2h0LCBzcmMpIHsKICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGxldCBpbWdEYXRhOwogICAgaWYgKGtpbmQgPT09IEltYWdlS2luZC5SR0JBXzMyQlBQKSB7CiAgICAgIGltZ0RhdGEgPSBuZXcgSW1hZ2VEYXRhKHNyYywgd2lkdGgsIGhlaWdodCk7CiAgICB9IGVsc2UgewogICAgICBpbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29udmVydFRvUkdCQSh7CiAgICAgICAga2luZCwKICAgICAgICBzcmMsCiAgICAgICAgZGVzdDogbmV3IFVpbnQzMkFycmF5KGltZ0RhdGEuZGF0YS5idWZmZXIpLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBpbnZlcnNlRGVjb2RlOiB0aGlzLm5lZWRzRGVjb2RlCiAgICAgIH0pOwogICAgfQogICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTsKICAgIGNvbnN0IGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIHJldHVybiB7CiAgICAgIGRhdGE6IG51bGwsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGJpdG1hcCwKICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgIH07CiAgfQogIGFzeW5jICNnZXRJbWFnZSh3aWR0aCwgaGVpZ2h0KSB7CiAgICBjb25zdCBiaXRtYXAgPSBhd2FpdCB0aGlzLmltYWdlLmdldFRyYW5zZmVyYWJsZUltYWdlKCk7CiAgICBpZiAoIWJpdG1hcCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRhdGE6IG51bGwsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGJpdG1hcCwKICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgIH07CiAgfQogIGFzeW5jIGdldEltYWdlQnl0ZXMobGVuZ3RoLCB7CiAgICBkcmF3V2lkdGgsCiAgICBkcmF3SGVpZ2h0LAogICAgZm9yY2VSR0JBID0gZmFsc2UsCiAgICBmb3JjZVJHQiA9IGZhbHNlLAogICAgaW50ZXJuYWwgPSBmYWxzZQogIH0pIHsKICAgIHRoaXMuaW1hZ2UucmVzZXQoKTsKICAgIHRoaXMuaW1hZ2UuZHJhd1dpZHRoID0gZHJhd1dpZHRoIHx8IHRoaXMud2lkdGg7CiAgICB0aGlzLmltYWdlLmRyYXdIZWlnaHQgPSBkcmF3SGVpZ2h0IHx8IHRoaXMuaGVpZ2h0OwogICAgdGhpcy5pbWFnZS5mb3JjZVJHQkEgPSAhIWZvcmNlUkdCQTsKICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0IgPSAhIWZvcmNlUkdCOwogICAgY29uc3QgaW1hZ2VCeXRlcyA9IGF3YWl0IHRoaXMuaW1hZ2UuZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucyk7CiAgICBpZiAoaW50ZXJuYWwgfHwgdGhpcy5pbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSkgewogICAgICByZXR1cm4gaW1hZ2VCeXRlczsKICAgIH0KICAgIGFzc2VydChpbWFnZUJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSwgJ1BERkltYWdlLmdldEltYWdlQnl0ZXM6IFVuc3VwcG9ydGVkICJpbWFnZUJ5dGVzIiB0eXBlLicpOwogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGltYWdlQnl0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZXZhbHVhdG9yLmpzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNvbnN0IERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoewogIG1heEltYWdlU2l6ZTogLTEsCiAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSwKICBpZ25vcmVFcnJvcnM6IGZhbHNlLAogIGlzRXZhbFN1cHBvcnRlZDogdHJ1ZSwKICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogZmFsc2UsCiAgaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ6IGZhbHNlLAogIGNhbnZhc01heEFyZWFJbkJ5dGVzOiAtMSwKICBmb250RXh0cmFQcm9wZXJ0aWVzOiBmYWxzZSwKICB1c2VTeXN0ZW1Gb250czogdHJ1ZSwKICB1c2VXYXNtOiB0cnVlLAogIHVzZVdvcmtlckZldGNoOiB0cnVlLAogIGNNYXBVcmw6IG51bGwsCiAgaWNjVXJsOiBudWxsLAogIHN0YW5kYXJkRm9udERhdGFVcmw6IG51bGwsCiAgd2FzbVVybDogbnVsbAp9KTsKY29uc3QgUGF0dGVyblR5cGUgPSB7CiAgVElMSU5HOiAxLAogIFNIQURJTkc6IDIKfTsKY29uc3QgVEVYVF9DSFVOS19CQVRDSF9TSVpFID0gMTA7CmNvbnN0IGRlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CmZ1bmN0aW9uIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSwgcGFyc2luZ0FycmF5ID0gZmFsc2UpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGNvbnN0IG1heWJlQk0gPSBub3JtYWxpemVCbGVuZE1vZGUodmFsLCB0cnVlKTsKICAgICAgaWYgKG1heWJlQk0pIHsKICAgICAgICByZXR1cm4gbWF5YmVCTTsKICAgICAgfQogICAgfQogICAgd2FybihgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogJHt2YWx1ZX1gKTsKICAgIHJldHVybiAic291cmNlLW92ZXIiOwogIH0KICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICBpZiAocGFyc2luZ0FycmF5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CiAgfQogIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgY2FzZSAiTm9ybWFsIjoKICAgIGNhc2UgIkNvbXBhdGlibGUiOgogICAgICByZXR1cm4gInNvdXJjZS1vdmVyIjsKICAgIGNhc2UgIk11bHRpcGx5IjoKICAgICAgcmV0dXJuICJtdWx0aXBseSI7CiAgICBjYXNlICJTY3JlZW4iOgogICAgICByZXR1cm4gInNjcmVlbiI7CiAgICBjYXNlICJPdmVybGF5IjoKICAgICAgcmV0dXJuICJvdmVybGF5IjsKICAgIGNhc2UgIkRhcmtlbiI6CiAgICAgIHJldHVybiAiZGFya2VuIjsKICAgIGNhc2UgIkxpZ2h0ZW4iOgogICAgICByZXR1cm4gImxpZ2h0ZW4iOwogICAgY2FzZSAiQ29sb3JEb2RnZSI6CiAgICAgIHJldHVybiAiY29sb3ItZG9kZ2UiOwogICAgY2FzZSAiQ29sb3JCdXJuIjoKICAgICAgcmV0dXJuICJjb2xvci1idXJuIjsKICAgIGNhc2UgIkhhcmRMaWdodCI6CiAgICAgIHJldHVybiAiaGFyZC1saWdodCI7CiAgICBjYXNlICJTb2Z0TGlnaHQiOgogICAgICByZXR1cm4gInNvZnQtbGlnaHQiOwogICAgY2FzZSAiRGlmZmVyZW5jZSI6CiAgICAgIHJldHVybiAiZGlmZmVyZW5jZSI7CiAgICBjYXNlICJFeGNsdXNpb24iOgogICAgICByZXR1cm4gImV4Y2x1c2lvbiI7CiAgICBjYXNlICJIdWUiOgogICAgICByZXR1cm4gImh1ZSI7CiAgICBjYXNlICJTYXR1cmF0aW9uIjoKICAgICAgcmV0dXJuICJzYXR1cmF0aW9uIjsKICAgIGNhc2UgIkNvbG9yIjoKICAgICAgcmV0dXJuICJjb2xvciI7CiAgICBjYXNlICJMdW1pbm9zaXR5IjoKICAgICAgcmV0dXJuICJsdW1pbm9zaXR5IjsKICB9CiAgaWYgKHBhcnNpbmdBcnJheSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHdhcm4oYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICR7dmFsdWUubmFtZX1gKTsKICByZXR1cm4gInNvdXJjZS1vdmVyIjsKfQpmdW5jdGlvbiBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BMaXN0LCBkYXRhKSB7CiAgaWYgKGRhdGEub2JqSWQpIHsKICAgIG9wTGlzdC5hZGREZXBlbmRlbmN5KGRhdGEub2JqSWQpOwogIH0KICBvcExpc3QuYWRkSW1hZ2VPcHMoZGF0YS5mbiwgZGF0YS5hcmdzLCBkYXRhLm9wdGlvbmFsQ29udGVudCwgZGF0YS5oYXNNYXNrKTsKICBpZiAoZGF0YS5mbiA9PT0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCAmJiBkYXRhLmFyZ3NbMF0/LmNvdW50ID4gMCkgewogICAgZGF0YS5hcmdzWzBdLmNvdW50Kys7CiAgfQp9CmNsYXNzIFRpbWVTbG90TWFuYWdlciB7CiAgc3RhdGljIFRJTUVfU0xPVF9EVVJBVElPTl9NUyA9IDIwOwogIHN0YXRpYyBDSEVDS19USU1FX0VWRVJZID0gMTAwOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5yZXNldCgpOwogIH0KICBjaGVjaygpIHsKICAgIGlmICgrK3RoaXMuY2hlY2tlZCA8IFRpbWVTbG90TWFuYWdlci5DSEVDS19USU1FX0VWRVJZKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuY2hlY2tlZCA9IDA7CiAgICByZXR1cm4gdGhpcy5lbmRUaW1lIDw9IERhdGUubm93KCk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5lbmRUaW1lID0gRGF0ZS5ub3coKSArIFRpbWVTbG90TWFuYWdlci5USU1FX1NMT1RfRFVSQVRJT05fTVM7CiAgICB0aGlzLmNoZWNrZWQgPSAwOwogIH0KfQpjbGFzcyBQYXJ0aWFsRXZhbHVhdG9yIHsKICBjb25zdHJ1Y3Rvcih7CiAgICB4cmVmLAogICAgaGFuZGxlciwKICAgIHBhZ2VJbmRleCwKICAgIGlkRmFjdG9yeSwKICAgIGZvbnRDYWNoZSwKICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCiAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICBnbG9iYWxJbWFnZUNhY2hlLAogICAgc3lzdGVtRm9udENhY2hlLAogICAgb3B0aW9ucyA9IG51bGwKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwogICAgdGhpcy5pZEZhY3RvcnkgPSBpZEZhY3Rvcnk7CiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSA9IHN0YW5kYXJkRm9udERhdGFDYWNoZTsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOwogICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gZ2xvYmFsSW1hZ2VDYWNoZTsKICAgIHRoaXMuc3lzdGVtRm9udENhY2hlID0gc3lzdGVtRm9udENhY2hlOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7CiAgICB0aGlzLnR5cGUzRm9udFJlZnMgPSBudWxsOwogICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlID0gbmV3IFJlZ2lvbmFsSW1hZ2VDYWNoZSgpOwogICAgdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kID0gdGhpcy5mZXRjaEJ1aWx0SW5DTWFwLmJpbmQodGhpcyk7CiAgfQogIGdldCBfcGRmRnVuY3Rpb25GYWN0b3J5KCkgewogICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLm9wdGlvbnMuaXNFdmFsU3VwcG9ydGVkCiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wZGZGdW5jdGlvbkZhY3RvcnkiLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogIH0KICBnZXQgcGFyc2luZ1R5cGUzRm9udCgpIHsKICAgIHJldHVybiAhIXRoaXMudHlwZTNGb250UmVmczsKICB9CiAgY2xvbmUobmV3T3B0aW9ucyA9IG51bGwpIHsKICAgIGNvbnN0IG5ld0V2YWx1YXRvciA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBuZXdFdmFsdWF0b3Iub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5vcHRpb25zLCBuZXdPcHRpb25zKTsKICAgIHJldHVybiBuZXdFdmFsdWF0b3I7CiAgfQogIGhhc0JsZW5kTW9kZXMocmVzb3VyY2VzLCBub25CbGVuZE1vZGVzU2V0KSB7CiAgICBpZiAoIShyZXNvdXJjZXMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocmVzb3VyY2VzLm9iaklkICYmIG5vbkJsZW5kTW9kZXNTZXQuaGFzKHJlc291cmNlcy5vYmpJZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldChub25CbGVuZE1vZGVzU2V0KTsKICAgIGlmIChyZXNvdXJjZXMub2JqSWQpIHsKICAgICAgcHJvY2Vzc2VkLnB1dChyZXNvdXJjZXMub2JqSWQpOwogICAgfQogICAgY29uc3Qgbm9kZXMgPSBbcmVzb3VyY2VzXSwKICAgICAgeHJlZiA9IHRoaXMueHJlZjsKICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHsKICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7CiAgICAgIGNvbnN0IGdyYXBoaWNTdGF0ZXMgPSBub2RlLmdldCgiRXh0R1N0YXRlIik7CiAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGZvciAobGV0IGdyYXBoaWNTdGF0ZSBvZiBncmFwaGljU3RhdGVzLmdldFJhd1ZhbHVlcygpKSB7CiAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGdyYXBoaWNTdGF0ZSkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGdyYXBoaWNTdGF0ZSA9IHhyZWYuZmV0Y2goZ3JhcGhpY1N0YXRlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZSk7CiAgICAgICAgICAgICAgaW5mbyhgaGFzQmxlbmRNb2RlcyAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlLm9iaklkKSB7CiAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoZ3JhcGhpY1N0YXRlLm9iaklkKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGJtID0gZ3JhcGhpY1N0YXRlLmdldCgiQk0iKTsKICAgICAgICAgIGlmIChibSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgaWYgKGJtLm5hbWUgIT09ICJOb3JtYWwiKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYm0gIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KGJtKSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm0pIHsKICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWUgJiYgZWxlbWVudC5uYW1lICE9PSAiTm9ybWFsIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHhPYmplY3RzID0gbm9kZS5nZXQoIlhPYmplY3QiKTsKICAgICAgaWYgKCEoeE9iamVjdHMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IHhPYmplY3Qgb2YgeE9iamVjdHMuZ2V0UmF3VmFsdWVzKCkpIHsKICAgICAgICBpZiAoeE9iamVjdCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoeE9iamVjdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB4T2JqZWN0ID0geHJlZi5mZXRjaCh4T2JqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeE9iamVjdCk7CiAgICAgICAgICAgIGluZm8oYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBYT2JqZWN0OiAiJHtleH0iLmApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEoeE9iamVjdCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHhPYmplY3QuZGljdC5vYmpJZCkgewogICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0LmRpY3Qub2JqSWQpOwogICAgICAgIH0KICAgICAgICBjb25zdCB4UmVzb3VyY2VzID0geE9iamVjdC5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgICAgaWYgKCEoeFJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHhSZXNvdXJjZXMub2JqSWQgJiYgcHJvY2Vzc2VkLmhhcyh4UmVzb3VyY2VzLm9iaklkKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIG5vZGVzLnB1c2goeFJlc291cmNlcyk7CiAgICAgICAgaWYgKHhSZXNvdXJjZXMub2JqSWQpIHsKICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeFJlc291cmNlcy5vYmpJZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlZiBvZiBwcm9jZXNzZWQpIHsKICAgICAgbm9uQmxlbmRNb2Rlc1NldC5wdXQocmVmKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZmV0Y2hCdWlsdEluQ01hcChuYW1lKSB7CiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5idWlsdEluQ01hcENhY2hlLmdldChuYW1lKTsKICAgIGlmIChjYWNoZWREYXRhKSB7CiAgICAgIHJldHVybiBjYWNoZWREYXRhOwogICAgfQogICAgbGV0IGRhdGE7CiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVdvcmtlckZldGNoKSB7CiAgICAgIGRhdGEgPSB7CiAgICAgICAgY01hcERhdGE6IGF3YWl0IGZldGNoQmluYXJ5RGF0YShgJHt0aGlzLm9wdGlvbnMuY01hcFVybH0ke25hbWV9LmJjbWFwYCksCiAgICAgICAgaXNDb21wcmVzc2VkOiB0cnVlCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gYXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCaW5hcnlEYXRhIiwgewogICAgICAgIHR5cGU6ICJjTWFwUmVhZGVyRmFjdG9yeSIsCiAgICAgICAgbmFtZQogICAgICB9KTsKICAgIH0KICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5zZXQobmFtZSwgZGF0YSk7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgYXN5bmMgZmV0Y2hTdGFuZGFyZEZvbnREYXRhKG5hbWUpIHsKICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5nZXQobmFtZSk7CiAgICBpZiAoY2FjaGVkRGF0YSkgewogICAgICByZXR1cm4gbmV3IFN0cmVhbShjYWNoZWREYXRhKTsKICAgIH0KICAgIGlmICh0aGlzLm9wdGlvbnMudXNlU3lzdGVtRm9udHMgJiYgbmFtZSAhPT0gIlN5bWJvbCIgJiYgbmFtZSAhPT0gIlphcGZEaW5nYmF0cyIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdGFuZGFyZEZvbnROYW1lVG9GaWxlTmFtZSA9IGdldEZvbnROYW1lVG9GaWxlTWFwKCksCiAgICAgIGZpbGVuYW1lID0gc3RhbmRhcmRGb250TmFtZVRvRmlsZU5hbWVbbmFtZV07CiAgICBsZXQgZGF0YTsKICAgIHRyeSB7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlV29ya2VyRmV0Y2gpIHsKICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hCaW5hcnlEYXRhKGAke3RoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsfSR7ZmlsZW5hbWV9YCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkZldGNoQmluYXJ5RGF0YSIsIHsKICAgICAgICAgIHR5cGU6ICJzdGFuZGFyZEZvbnREYXRhRmFjdG9yeSIsCiAgICAgICAgICBmaWxlbmFtZQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICB3YXJuKGV4KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5zZXQobmFtZSwgZGF0YSk7CiAgICByZXR1cm4gbmV3IFN0cmVhbShkYXRhKTsKICB9CiAgYXN5bmMgYnVpbGRGb3JtWE9iamVjdChyZXNvdXJjZXMsIHhvYmosIHNtYXNrLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIGNvbnN0IGRpY3QgPSB4b2JqLmRpY3Q7CiAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoZGljdC5nZXRBcnJheSgiTWF0cml4IiksIG51bGwpOwogICAgY29uc3QgYmJveCA9IGxvb2t1cE5vcm1hbFJlY3QoZGljdC5nZXRBcnJheSgiQkJveCIpLCBudWxsKTsKICAgIGxldCBvcHRpb25hbENvbnRlbnQsIGdyb3VwT3B0aW9uczsKICAgIGlmIChkaWN0LmhhcygiT0MiKSkgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCB0aGlzLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGRpY3QuZ2V0KCJPQyIpLCByZXNvdXJjZXMpOwogICAgfQogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBvcHRpb25hbENvbnRlbnRdKTsKICAgIH0KICAgIGNvbnN0IGdyb3VwID0gZGljdC5nZXQoIkdyb3VwIik7CiAgICBpZiAoZ3JvdXApIHsKICAgICAgZ3JvdXBPcHRpb25zID0gewogICAgICAgIG1hdHJpeCwKICAgICAgICBiYm94LAogICAgICAgIHNtYXNrLAogICAgICAgIGlzb2xhdGVkOiBmYWxzZSwKICAgICAgICBrbm9ja291dDogZmFsc2UKICAgICAgfTsKICAgICAgY29uc3QgZ3JvdXBTdWJ0eXBlID0gZ3JvdXAuZ2V0KCJTIik7CiAgICAgIGxldCBjb2xvclNwYWNlID0gbnVsbDsKICAgICAgaWYgKGlzTmFtZShncm91cFN1YnR5cGUsICJUcmFuc3BhcmVuY3kiKSkgewogICAgICAgIGdyb3VwT3B0aW9ucy5pc29sYXRlZCA9IGdyb3VwLmdldCgiSSIpIHx8IGZhbHNlOwogICAgICAgIGdyb3VwT3B0aW9ucy5rbm9ja291dCA9IGdyb3VwLmdldCgiSyIpIHx8IGZhbHNlOwogICAgICAgIGlmIChncm91cC5oYXMoIkNTIikpIHsKICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5fZ2V0Q29sb3JTcGFjZShncm91cC5nZXRSYXcoIkNTIiksIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgY29sb3JTcGFjZSA9IGNzIGluc3RhbmNlb2YgQ29sb3JTcGFjZSA/IGNzIDogYXdhaXQgdGhpcy5faGFuZGxlQ29sb3JTcGFjZShjcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzbWFzaz8uYmFja2Ryb3ApIHsKICAgICAgICBjb2xvclNwYWNlIHx8PSBDb2xvclNwYWNlVXRpbHMucmdiOwogICAgICAgIHNtYXNrLmJhY2tkcm9wID0gY29sb3JTcGFjZS5nZXRSZ2Ioc21hc2suYmFja2Ryb3AsIDApOwogICAgICB9CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5Hcm91cCwgW2dyb3VwT3B0aW9uc10pOwogICAgfQogICAgY29uc3QgYXJncyA9IGdyb3VwID8gW21hdHJpeCwgbnVsbF0gOiBbbWF0cml4LCBiYm94XTsKICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luLCBhcmdzKTsKICAgIGF3YWl0IHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgc3RyZWFtOiB4b2JqLAogICAgICB0YXNrLAogICAgICByZXNvdXJjZXM6IGRpY3QuZ2V0KCJSZXNvdXJjZXMiKSB8fCByZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgaW5pdGlhbFN0YXRlCiAgICB9KTsKICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRGb3JtWE9iamVjdEVuZCwgW10pOwogICAgaWYgKGdyb3VwKSB7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuZW5kR3JvdXAsIFtncm91cE9wdGlvbnNdKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICB9CiAgX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5ID0gZmFsc2UpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IGltZ0RhdGEgPyBbaW1nRGF0YS5iaXRtYXAgfHwgaW1nRGF0YS5kYXRhLmJ1ZmZlcl0gOiBudWxsOwogICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCB8fCBjYWNoZUdsb2JhbGx5KSB7CiAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW29iaklkLCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW29iaklkLCB0aGlzLnBhZ2VJbmRleCwgIkltYWdlIiwgaW1nRGF0YV0sIHRyYW5zZmVycyk7CiAgfQogIGFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoewogICAgcmVzb3VyY2VzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgb3BlcmF0b3JMaXN0LAogICAgY2FjaGVLZXksCiAgICBsb2NhbEltYWdlQ2FjaGUsCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIGNvbnN0IGRpY3QgPSBpbWFnZS5kaWN0OwogICAgY29uc3QgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkOwogICAgY29uc3QgdyA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBjb25zdCBoID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoISh3ICYmIHR5cGVvZiB3ID09PSAibnVtYmVyIikgfHwgIShoICYmIHR5cGVvZiBoID09PSAibnVtYmVyIikpIHsKICAgICAgd2FybigiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1heEltYWdlU2l6ZSA9IHRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7CiAgICBpZiAobWF4SW1hZ2VTaXplICE9PSAtMSAmJiB3ICogaCA+IG1heEltYWdlU2l6ZSkgewogICAgICBjb25zdCBtc2cgPSAiSW1hZ2UgZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIHNpemUgYW5kIHdhcyByZW1vdmVkLiI7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2Fybihtc2cpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKICAgIH0KICAgIGxldCBvcHRpb25hbENvbnRlbnQ7CiAgICBpZiAoZGljdC5oYXMoIk9DIikpIHsKICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhkaWN0LmdldCgiT0MiKSwgcmVzb3VyY2VzKTsKICAgIH0KICAgIGNvbnN0IGltYWdlTWFzayA9IGRpY3QuZ2V0KCJJTSIsICJJbWFnZU1hc2siKSB8fCBmYWxzZTsKICAgIGxldCBpbWdEYXRhLCBmbiwgYXJnczsKICAgIGlmIChpbWFnZU1hc2spIHsKICAgICAgY29uc3QgaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgICBjb25zdCBiaXRTdHJpZGVMZW5ndGggPSB3ICsgNyA+PiAzOwogICAgICBjb25zdCBpbWdBcnJheSA9IGltYWdlLmdldEJ5dGVzKGJpdFN0cmlkZUxlbmd0aCAqIGgpOwogICAgICBjb25zdCBkZWNvZGUgPSBkaWN0LmdldEFycmF5KCJEIiwgIkRlY29kZSIpOwogICAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgaW1nRGF0YSA9IFBERkltYWdlLmNyZWF0ZVJhd01hc2soewogICAgICAgICAgaW1nQXJyYXksCiAgICAgICAgICB3aWR0aDogdywKICAgICAgICAgIGhlaWdodDogaCwKICAgICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSwKICAgICAgICAgIGludmVyc2VEZWNvZGU6IGRlY29kZT8uWzBdID4gMCwKICAgICAgICAgIGludGVycG9sYXRlCiAgICAgICAgfSk7CiAgICAgICAgaW1nRGF0YS5jYWNoZWQgPSAhIWNhY2hlS2V5OwogICAgICAgIGZuID0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDsKICAgICAgICBhcmdzID0gW2ltZ0RhdGFdOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50KTsKICAgICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICAgIGNvbnN0IGNhY2hlRGF0YSA9IHsKICAgICAgICAgICAgZm4sCiAgICAgICAgICAgIGFyZ3MsCiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudAogICAgICAgICAgfTsKICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgICAgaWYgKGltYWdlUmVmKSB7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpbWdEYXRhID0gYXdhaXQgUERGSW1hZ2UuY3JlYXRlTWFzayh7CiAgICAgICAgaW1nQXJyYXksCiAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSwKICAgICAgICBpbnZlcnNlRGVjb2RlOiBkZWNvZGU/LlswXSA+IDAsCiAgICAgICAgaW50ZXJwb2xhdGUsCiAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZAogICAgICB9KTsKICAgICAgaWYgKGltZ0RhdGEuaXNTaW5nbGVPcGFxdWVQaXhlbCkgewogICAgICAgIGZuID0gT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazsKICAgICAgICBhcmdzID0gW107CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKGZuLCBhcmdzLCBvcHRpb25hbENvbnRlbnQpOwogICAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgICBmbiwKICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50CiAgICAgICAgICB9OwogICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG9iaklkID0gYG1hc2tfJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKICAgICAgaW1nRGF0YS5kYXRhTGVuID0gaW1nRGF0YS5iaXRtYXAgPyBpbWdEYXRhLndpZHRoICogaW1nRGF0YS5oZWlnaHQgKiA0IDogaW1nRGF0YS5kYXRhLmxlbmd0aDsKICAgICAgdGhpcy5fc2VuZEltZ0RhdGEob2JqSWQsIGltZ0RhdGEpOwogICAgICBmbiA9IE9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7CiAgICAgIGFyZ3MgPSBbewogICAgICAgIGRhdGE6IG9iaklkLAogICAgICAgIHdpZHRoOiBpbWdEYXRhLndpZHRoLAogICAgICAgIGhlaWdodDogaW1nRGF0YS5oZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGU6IGltZ0RhdGEuaW50ZXJwb2xhdGUsCiAgICAgICAgY291bnQ6IDEKICAgICAgfV07CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50KTsKICAgICAgaWYgKGNhY2hlS2V5KSB7CiAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgb2JqSWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MsCiAgICAgICAgICBvcHRpb25hbENvbnRlbnQKICAgICAgICB9OwogICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgU01BTExfSU1BR0VfRElNRU5TSU9OUyA9IDIwMDsKICAgIGNvbnN0IGhhc01hc2sgPSBkaWN0LmhhcygiU01hc2siKSB8fCBkaWN0LmhhcygiTWFzayIpOwogICAgaWYgKGlzSW5saW5lICYmIHcgKyBoIDwgU01BTExfSU1BR0VfRElNRU5TSU9OUyAmJiAhaGFzTWFzaykgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGltYWdlT2JqID0gbmV3IFBERkltYWdlKHsKICAgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgICAgIHJlczogcmVzb3VyY2VzLAogICAgICAgICAgaW1hZ2UsCiAgICAgICAgICBpc0lubGluZSwKICAgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLmdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgfSk7CiAgICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YSh0cnVlLCBmYWxzZSk7CiAgICAgICAgb3BlcmF0b3JMaXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIFtpbWdEYXRhXSwgb3B0aW9uYWxDb250ZW50KTsKICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgY29uc3QgbXNnID0gYFVuYWJsZSB0byBkZWNvZGUgaW5saW5lIGltYWdlOiAiJHtyZWFzb259Ii5gOwogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICAgICAgfQogICAgICAgIHdhcm4obXNnKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgb2JqSWQgPSBgaW1nXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gLAogICAgICBjYWNoZUdsb2JhbGx5ID0gZmFsc2U7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIG9iaklkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fdHlwZTNfJHtvYmpJZH1gOwogICAgfSBlbHNlIGlmIChjYWNoZUtleSAmJiBpbWFnZVJlZikgewogICAgICBjYWNoZUdsb2JhbGx5ID0gdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGltYWdlUmVmLCB0aGlzLnBhZ2VJbmRleCk7CiAgICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CiAgICAgICAgYXNzZXJ0KCFpc0lubGluZSwgIkNhbm5vdCBjYWNoZSBhbiBpbmxpbmUgaW1hZ2UgZ2xvYmFsbHkuIik7CiAgICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke29iaklkfWA7CiAgICAgIH0KICAgIH0KICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKICAgIGZuID0gT1BTLnBhaW50SW1hZ2VYT2JqZWN0OwogICAgYXJncyA9IFtvYmpJZCwgdywgaF07CiAgICBvcGVyYXRvckxpc3QuYWRkSW1hZ2VPcHMoZm4sIGFyZ3MsIG9wdGlvbmFsQ29udGVudCwgaGFzTWFzayk7CiAgICBpZiAoY2FjaGVHbG9iYWxseSkgewogICAgICBpZiAodGhpcy5nbG9iYWxJbWFnZUNhY2hlLmhhc0RlY29kZUZhaWxlZChpbWFnZVJlZikpIHsKICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShpbWFnZVJlZiwgewogICAgICAgICAgb2JqSWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MsCiAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICBoYXNNYXNrLAogICAgICAgICAgYnl0ZVNpemU6IDAKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh3ICogaCA+IDI1MDAwMCB8fCBoYXNNYXNrKSB7CiAgICAgICAgY29uc3QgbG9jYWxMZW5ndGggPSBhd2FpdCB0aGlzLmhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJjb21tb25vYmoiLCBbb2JqSWQsICJDb3B5TG9jYWxJbWFnZSIsIHsKICAgICAgICAgIGltYWdlUmVmCiAgICAgICAgfV0pOwogICAgICAgIGlmIChsb2NhbExlbmd0aCkgewogICAgICAgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgb2JqSWQsCiAgICAgICAgICAgIGZuLAogICAgICAgICAgICBhcmdzLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICAgIGhhc01hc2ssCiAgICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRCeXRlU2l6ZShpbWFnZVJlZiwgbG9jYWxMZW5ndGgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgUERGSW1hZ2UuYnVpbGRJbWFnZSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgcmVzOiByZXNvdXJjZXMsCiAgICAgIGltYWdlLAogICAgICBpc0lubGluZSwKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICB9KS50aGVuKGFzeW5jIGltYWdlT2JqID0+IHsKICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YShmYWxzZSwgdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgaW1nRGF0YS5kYXRhTGVuID0gaW1nRGF0YS5iaXRtYXAgPyBpbWdEYXRhLndpZHRoICogaW1nRGF0YS5oZWlnaHQgKiA0IDogaW1nRGF0YS5kYXRhLmxlbmd0aDsKICAgICAgaW1nRGF0YS5yZWYgPSBpbWFnZVJlZjsKICAgICAgaWYgKGNhY2hlR2xvYmFsbHkpIHsKICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuYWRkQnl0ZVNpemUoaW1hZ2VSZWYsIGltZ0RhdGEuZGF0YUxlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5KTsKICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYFVuYWJsZSB0byBkZWNvZGUgaW1hZ2UgIiR7b2JqSWR9IjogIiR7cmVhc29ufSIuYCk7CiAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGREZWNvZGVGYWlsZWQoaW1hZ2VSZWYpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CiAgICB9KTsKICAgIGlmIChjYWNoZUtleSkgewogICAgICBjb25zdCBjYWNoZURhdGEgPSB7CiAgICAgICAgb2JqSWQsCiAgICAgICAgZm4sCiAgICAgICAgYXJncywKICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgaGFzTWFzawogICAgICB9OwogICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgaWYgKGltYWdlUmVmKSB7CiAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICBpZiAoY2FjaGVHbG9iYWxseSkgewogICAgICAgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgb2JqSWQsCiAgICAgICAgICAgIGZuLAogICAgICAgICAgICBhcmdzLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICAgIGhhc01hc2ssCiAgICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaGFuZGxlU01hc2soc21hc2ssIHJlc291cmNlcywgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBjb25zdCBzbWFza0NvbnRlbnQgPSBzbWFzay5nZXQoIkciKTsKICAgIGNvbnN0IHNtYXNrT3B0aW9ucyA9IHsKICAgICAgc3VidHlwZTogc21hc2suZ2V0KCJTIikubmFtZSwKICAgICAgYmFja2Ryb3A6IHNtYXNrLmdldCgiQkMiKQogICAgfTsKICAgIGNvbnN0IHRyYW5zZmVyT2JqID0gc21hc2suZ2V0KCJUUiIpOwogICAgaWYgKGlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7CiAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTsKICAgICAgY29uc3QgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgICBjb25zdCB0bXAgPSBuZXcgRmxvYXQzMkFycmF5KDEpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgdG1wWzBdID0gaSAvIDI1NTsKICAgICAgICB0cmFuc2ZlckZuKHRtcCwgMCwgdG1wLCAwKTsKICAgICAgICB0cmFuc2Zlck1hcFtpXSA9IHRtcFswXSAqIDI1NSB8IDA7CiAgICAgIH0KICAgICAgc21hc2tPcHRpb25zLnRyYW5zZmVyTWFwID0gdHJhbnNmZXJNYXA7CiAgICB9CiAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgc21hc2tDb250ZW50LCBzbWFza09wdGlvbnMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKHsKICAgICAgbmV3UGF0aDogdHJ1ZQogICAgfSksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICB9CiAgaGFuZGxlVHJhbnNmZXJGdW5jdGlvbih0cikgewogICAgbGV0IHRyYW5zZmVyQXJyYXk7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh0cikpIHsKICAgICAgdHJhbnNmZXJBcnJheSA9IHRyOwogICAgfSBlbHNlIGlmIChpc1BERkZ1bmN0aW9uKHRyKSkgewogICAgICB0cmFuc2ZlckFycmF5ID0gW3RyXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgdHJhbnNmZXJNYXBzID0gW107CiAgICBsZXQgbnVtRm5zID0gMCwKICAgICAgbnVtRWZmZWN0ZnVsRm5zID0gMDsKICAgIGZvciAoY29uc3QgZW50cnkgb2YgdHJhbnNmZXJBcnJheSkgewogICAgICBjb25zdCB0cmFuc2Zlck9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGVudHJ5KTsKICAgICAgbnVtRm5zKys7CiAgICAgIGlmIChpc05hbWUodHJhbnNmZXJPYmosICJJZGVudGl0eSIpKSB7CiAgICAgICAgdHJhbnNmZXJNYXBzLnB1c2gobnVsbCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOwogICAgICBjb25zdCB0cmFuc2Zlck1hcCA9IG5ldyBVaW50OEFycmF5KDI1NiksCiAgICAgICAgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAyNTY7IGorKykgewogICAgICAgIHRtcFswXSA9IGogLyAyNTU7CiAgICAgICAgdHJhbnNmZXJGbih0bXAsIDAsIHRtcCwgMCk7CiAgICAgICAgdHJhbnNmZXJNYXBbal0gPSB0bXBbMF0gKiAyNTUgfCAwOwogICAgICB9CiAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKHRyYW5zZmVyTWFwKTsKICAgICAgbnVtRWZmZWN0ZnVsRm5zKys7CiAgICB9CiAgICBpZiAoIShudW1GbnMgPT09IDEgfHwgbnVtRm5zID09PSA0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChudW1FZmZlY3RmdWxGbnMgPT09IDApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdHJhbnNmZXJNYXBzOwogIH0KICBoYW5kbGVUaWxpbmdUeXBlKGZuLCBjb2xvciwgcmVzb3VyY2VzLCBwYXR0ZXJuLCBwYXR0ZXJuRGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSkgewogICAgY29uc3QgdGlsaW5nT3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgY29uc3QgcGF0dGVyblJlc291cmNlcyA9IERpY3QubWVyZ2UoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGRpY3RBcnJheTogW3BhdHRlcm5EaWN0LmdldCgiUmVzb3VyY2VzIiksIHJlc291cmNlc10KICAgIH0pOwogICAgcmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgc3RyZWFtOiBwYXR0ZXJuLAogICAgICB0YXNrLAogICAgICByZXNvdXJjZXM6IHBhdHRlcm5SZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdDogdGlsaW5nT3BMaXN0CiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0SVIgPSB0aWxpbmdPcExpc3QuZ2V0SVIoKTsKICAgICAgY29uc3QgdGlsaW5nUGF0dGVybklSID0gZ2V0VGlsaW5nUGF0dGVybklSKG9wZXJhdG9yTGlzdElSLCBwYXR0ZXJuRGljdCwgY29sb3IpOwogICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRpbGluZ09wTGlzdC5kZXBlbmRlbmNpZXMpOwogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CiAgICAgIGlmIChwYXR0ZXJuRGljdC5vYmpJZCkgewogICAgICAgIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLnNldChudWxsLCBwYXR0ZXJuRGljdC5vYmpJZCwgewogICAgICAgICAgb3BlcmF0b3JMaXN0SVIsCiAgICAgICAgICBkaWN0OiBwYXR0ZXJuRGljdAogICAgICAgIH0pOwogICAgICB9CiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0pOwogIH0KICBhc3luYyBoYW5kbGVTZXRGb250KHJlc291cmNlcywgZm9udEFyZ3MsIGZvbnRSZWYsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGUsIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGZvbnROYW1lID0gZm9udEFyZ3M/LlswXSBpbnN0YW5jZW9mIE5hbWUgPyBmb250QXJnc1swXS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBhd2FpdCB0aGlzLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMsIHRhc2ssIGZhbGxiYWNrRm9udERpY3QsIGNzc0ZvbnRJbmZvKTsKICAgIGlmICh0cmFuc2xhdGVkLmZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY2llcyh0cmFuc2xhdGVkLnR5cGUzRGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIHN0YXRlLmZvbnQgPSB0cmFuc2xhdGVkLmZvbnQ7CiAgICB0cmFuc2xhdGVkLnNlbmQodGhpcy5oYW5kbGVyKTsKICAgIHJldHVybiB0cmFuc2xhdGVkLmxvYWRlZE5hbWU7CiAgfQogIGhhbmRsZVRleHQoY2hhcnMsIHN0YXRlKSB7CiAgICBjb25zdCBmb250ID0gc3RhdGUuZm9udDsKICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICBpZiAoZm9udC5kYXRhKSB7CiAgICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEoc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTsKICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0IHx8IHN0YXRlLmZpbGxDb2xvclNwYWNlLm5hbWUgPT09ICJQYXR0ZXJuIiB8fCBmb250LmRpc2FibGVGb250RmFjZSkgewogICAgICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCB0aGlzLmhhbmRsZXIsIHRoaXMub3B0aW9ucyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBnbHlwaHM7CiAgfQogIGVuc3VyZVN0YXRlRm9udChzdGF0ZSkgewogICAgaWYgKHN0YXRlLmZvbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVhc29uID0gbmV3IEZvcm1hdEVycm9yKCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuIik7CiAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICB3YXJuKGBlbnN1cmVTdGF0ZUZvbnQ6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aHJvdyByZWFzb247CiAgfQogIGFzeW5jIHNldEdTdGF0ZSh7CiAgICByZXNvdXJjZXMsCiAgICBnU3RhdGUsCiAgICBvcGVyYXRvckxpc3QsCiAgICBjYWNoZUtleSwKICAgIHRhc2ssCiAgICBzdGF0ZU1hbmFnZXIsCiAgICBsb2NhbEdTdGF0ZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7CiAgICBsZXQgaXNTaW1wbGVHU3RhdGUgPSB0cnVlOwogICAgY29uc3QgZ1N0YXRlT2JqID0gW107CiAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZ1N0YXRlKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiVHlwZSI6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMVyI6CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAibnVtYmVyIikgewogICAgICAgICAgICB3YXJuKGBJbnZhbGlkIExXIChsaW5lIHdpZHRoKTogJHt2YWx1ZX1gKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBNYXRoLmFicyh2YWx1ZSldKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkxDIjoKICAgICAgICBjYXNlICJMSiI6CiAgICAgICAgY2FzZSAiTUwiOgogICAgICAgIGNhc2UgIkQiOgogICAgICAgIGNhc2UgIlJJIjoKICAgICAgICBjYXNlICJGTCI6CiAgICAgICAgY2FzZSAiQ0EiOgogICAgICAgIGNhc2UgImNhIjoKICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb250IjoKICAgICAgICAgIGlzU2ltcGxlR1N0YXRlID0gZmFsc2U7CiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHRoaXMuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIG51bGwsIHZhbHVlWzBdLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgewogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTsKICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgW2xvYWRlZE5hbWUsIHZhbHVlWzFdXV0pOwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQk0iOgogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgbm9ybWFsaXplQmxlbmRNb2RlKHZhbHVlKV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU01hc2siOgogICAgICAgICAgaWYgKGlzTmFtZSh2YWx1ZSwgIk5vbmUiKSkgewogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBmYWxzZV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTsKICAgICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB0aGlzLmhhbmRsZVNNYXNrKHZhbHVlLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkpOwogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cnVlXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUUiI6CiAgICAgICAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSB0aGlzLmhhbmRsZVRyYW5zZmVyRnVuY3Rpb24odmFsdWUpOwogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgdHJhbnNmZXJNYXBzXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPUCI6CiAgICAgICAgY2FzZSAib3AiOgogICAgICAgIGNhc2UgIk9QTSI6CiAgICAgICAgY2FzZSAiQkciOgogICAgICAgIGNhc2UgIkJHMiI6CiAgICAgICAgY2FzZSAiVUNSIjoKICAgICAgICBjYXNlICJVQ1IyIjoKICAgICAgICBjYXNlICJUUjIiOgogICAgICAgIGNhc2UgIkhUIjoKICAgICAgICBjYXNlICJTTSI6CiAgICAgICAgY2FzZSAiU0EiOgogICAgICAgIGNhc2UgIkFJUyI6CiAgICAgICAgY2FzZSAiVEsiOgogICAgICAgICAgaW5mbygiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiICsga2V5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpbmZvKCJVbmtub3duIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIiArIGtleSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgYXdhaXQgcHJvbWlzZTsKICAgIGlmIChnU3RhdGVPYmoubGVuZ3RoID4gMCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldEdTdGF0ZSwgW2dTdGF0ZU9ial0pOwogICAgfQogICAgaWYgKGlzU2ltcGxlR1N0YXRlKSB7CiAgICAgIGxvY2FsR1N0YXRlQ2FjaGUuc2V0KGNhY2hlS2V5LCBnU3RhdGVSZWYsIGdTdGF0ZU9iaik7CiAgICB9CiAgfQogIGxvYWRGb250KGZvbnROYW1lLCBmb250LCByZXNvdXJjZXMsIHRhc2ssIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGVycm9yRm9udCA9IGFzeW5jICgpID0+IG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgIGxvYWRlZE5hbWU6ICJnX2ZvbnRfZXJyb3IiLAogICAgICBmb250OiBuZXcgRXJyb3JGb250KGBGb250ICIke2ZvbnROYW1lfSIgaXMgbm90IGF2YWlsYWJsZS5gKSwKICAgICAgZGljdDogZm9udAogICAgfSk7CiAgICBsZXQgZm9udFJlZjsKICAgIGlmIChmb250KSB7CiAgICAgIGlmIChmb250IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgZm9udFJlZiA9IGZvbnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGZvbnRSZXMgPSByZXNvdXJjZXMuZ2V0KCJGb250Iik7CiAgICAgIGlmIChmb250UmVzKSB7CiAgICAgICAgZm9udFJlZiA9IGZvbnRSZXMuZ2V0UmF3KGZvbnROYW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKGZvbnRSZWYpIHsKICAgICAgaWYgKHRoaXMudHlwZTNGb250UmVmcz8uaGFzKGZvbnRSZWYpKSB7CiAgICAgICAgcmV0dXJuIGVycm9yRm9udCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmZvbnRDYWNoZS5oYXMoZm9udFJlZikpIHsKICAgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZm9udCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZvbnRSZWYpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHdhcm4oYGxvYWRGb250IC0gbG9va3VwIGZhaWxlZDogIiR7ZXh9Ii5gKTsKICAgICAgfQogICAgfQogICAgaWYgKCEoZm9udCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyAmJiAhdGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgd2FybihgRm9udCAiJHtmb250TmFtZX0iIGlzIG5vdCBhdmFpbGFibGUuYCk7CiAgICAgICAgcmV0dXJuIGVycm9yRm9udCgpOwogICAgICB9CiAgICAgIHdhcm4oYEZvbnQgIiR7Zm9udE5hbWV9IiBpcyBub3QgYXZhaWxhYmxlIC0tIGF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQuYCk7CiAgICAgIGZvbnQgPSBmYWxsYmFja0ZvbnREaWN0IHx8IFBhcnRpYWxFdmFsdWF0b3IuZmFsbGJhY2tGb250RGljdDsKICAgIH0KICAgIGlmIChmb250LmNhY2hlS2V5ICYmIHRoaXMuZm9udENhY2hlLmhhcyhmb250LmNhY2hlS2V5KSkgewogICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnQuY2FjaGVLZXkpOwogICAgfQogICAgY29uc3QgewogICAgICBwcm9taXNlLAogICAgICByZXNvbHZlCiAgICB9ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICBsZXQgcHJlRXZhbHVhdGVkRm9udDsKICAgIHRyeSB7CiAgICAgIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTsKICAgICAgcHJlRXZhbHVhdGVkRm9udC5jc3NGb250SW5mbyA9IGNzc0ZvbnRJbmZvOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYGxvYWRGb250IC0gcHJlRXZhbHVhdGVGb250IGZhaWxlZDogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybiBlcnJvckZvbnQoKTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgZGVzY3JpcHRvciwKICAgICAgaGFzaAogICAgfSA9IHByZUV2YWx1YXRlZEZvbnQ7CiAgICBjb25zdCBmb250UmVmSXNSZWYgPSBmb250UmVmIGluc3RhbmNlb2YgUmVmOwogICAgbGV0IGZvbnRJRDsKICAgIGlmIChoYXNoICYmIGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGZvbnRBbGlhc2VzID0gZGVzY3JpcHRvci5mb250QWxpYXNlcyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgaWYgKGZvbnRBbGlhc2VzW2hhc2hdKSB7CiAgICAgICAgY29uc3QgYWxpYXNGb250UmVmID0gZm9udEFsaWFzZXNbaGFzaF0uYWxpYXNSZWY7CiAgICAgICAgaWYgKGZvbnRSZWZJc1JlZiAmJiBhbGlhc0ZvbnRSZWYgJiYgdGhpcy5mb250Q2FjaGUuaGFzKGFsaWFzRm9udFJlZikpIHsKICAgICAgICAgIHRoaXMuZm9udENhY2hlLnB1dEFsaWFzKGZvbnRSZWYsIGFsaWFzRm9udFJlZik7CiAgICAgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb250QWxpYXNlc1toYXNoXSA9IHsKICAgICAgICAgIGZvbnRJRDogdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCkKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChmb250UmVmSXNSZWYpIHsKICAgICAgICBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZiA9IGZvbnRSZWY7CiAgICAgIH0KICAgICAgZm9udElEID0gZm9udEFsaWFzZXNbaGFzaF0uZm9udElEOwogICAgfSBlbHNlIHsKICAgICAgZm9udElEID0gdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCk7CiAgICB9CiAgICBhc3NlcnQoZm9udElEPy5zdGFydHNXaXRoKCJmIiksICdUaGUgImZvbnRJRCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLicpOwogICAgaWYgKGZvbnRSZWZJc1JlZikgewogICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoZm9udFJlZiwgcHJvbWlzZSk7CiAgICB9IGVsc2UgewogICAgICBmb250LmNhY2hlS2V5ID0gYGNhY2hlS2V5XyR7Zm9udElEfWA7CiAgICAgIHRoaXMuZm9udENhY2hlLnB1dChmb250LmNhY2hlS2V5LCBwcm9taXNlKTsKICAgIH0KICAgIGZvbnQubG9hZGVkTmFtZSA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7Zm9udElEfWA7CiAgICB0aGlzLnRyYW5zbGF0ZUZvbnQocHJlRXZhbHVhdGVkRm9udCkudGhlbihhc3luYyB0cmFuc2xhdGVkRm9udCA9PiB7CiAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBuZXcgVHJhbnNsYXRlZEZvbnQoewogICAgICAgIGxvYWRlZE5hbWU6IGZvbnQubG9hZGVkTmFtZSwKICAgICAgICBmb250OiB0cmFuc2xhdGVkRm9udCwKICAgICAgICBkaWN0OiBmb250CiAgICAgIH0pOwogICAgICBpZiAodHJhbnNsYXRlZEZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgdHJhbnNsYXRlZC5sb2FkVHlwZTNEYXRhKHRoaXMsIHJlc291cmNlcywgdGFzayk7CiAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGUzIGZvbnQgbG9hZCBlcnJvcjogJHtyZWFzb259YCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc29sdmUodHJhbnNsYXRlZCk7CiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICB3YXJuKGBsb2FkRm9udCAtIHRyYW5zbGF0ZUZvbnQgZmFpbGVkOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoewogICAgICAgIGxvYWRlZE5hbWU6IGZvbnQubG9hZGVkTmFtZSwKICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KHJlYXNvbj8ubWVzc2FnZSksCiAgICAgICAgZGljdDogZm9udAogICAgICB9KSk7CiAgICB9KTsKICAgIHJldHVybiBwcm9taXNlOwogIH0KICBidWlsZFBhdGgoZm4sIGFyZ3MsIHN0YXRlKSB7CiAgICBjb25zdCB7CiAgICAgIHBhdGhNaW5NYXg6IG1pbk1heCwKICAgICAgcGF0aEJ1ZmZlcgogICAgfSA9IHN0YXRlOwogICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgY2FzZSBPUFMucmVjdGFuZ2xlOgogICAgICAgIHsKICAgICAgICAgIGNvbnN0IHggPSBzdGF0ZS5jdXJyZW50UG9pbnRYID0gYXJnc1swXTsKICAgICAgICAgIGNvbnN0IHkgPSBzdGF0ZS5jdXJyZW50UG9pbnRZID0gYXJnc1sxXTsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gYXJnc1syXTsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGFyZ3NbM107CiAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDsKICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDsKICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHsKICAgICAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMubW92ZVRvLCB4LCB5LCBEcmF3T1BTLmxpbmVUbywgeHcsIHloLCBEcmF3T1BTLmNsb3NlUGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5tb3ZlVG8sIHgsIHksIERyYXdPUFMubGluZVRvLCB4dywgeSwgRHJhd09QUy5saW5lVG8sIHh3LCB5aCwgRHJhd09QUy5saW5lVG8sIHgsIHloLCBEcmF3T1BTLmNsb3NlUGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCh4LCB5LCB4dywgeWgsIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLm1vdmVUbzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCB4ID0gc3RhdGUuY3VycmVudFBvaW50WCA9IGFyZ3NbMF07CiAgICAgICAgICBjb25zdCB5ID0gc3RhdGUuY3VycmVudFBvaW50WSA9IGFyZ3NbMV07CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5tb3ZlVG8sIHgsIHkpOwogICAgICAgICAgVXRpbC5wb2ludEJvdW5kaW5nQm94KHgsIHksIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLmxpbmVUbzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCB4ID0gc3RhdGUuY3VycmVudFBvaW50WCA9IGFyZ3NbMF07CiAgICAgICAgICBjb25zdCB5ID0gc3RhdGUuY3VycmVudFBvaW50WSA9IGFyZ3NbMV07CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5saW5lVG8sIHgsIHkpOwogICAgICAgICAgVXRpbC5wb2ludEJvdW5kaW5nQm94KHgsIHksIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLmN1cnZlVG86CiAgICAgICAgewogICAgICAgICAgY29uc3Qgc3RhcnRYID0gc3RhdGUuY3VycmVudFBvaW50WDsKICAgICAgICAgIGNvbnN0IHN0YXJ0WSA9IHN0YXRlLmN1cnJlbnRQb2ludFk7CiAgICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTIsIHgsIHldID0gYXJnczsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFggPSB4OwogICAgICAgICAgc3RhdGUuY3VycmVudFBvaW50WSA9IHk7CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jdXJ2ZVRvLCB4MSwgeTEsIHgyLCB5MiwgeCwgeSk7CiAgICAgICAgICBVdGlsLmJlemllckJvdW5kaW5nQm94KHN0YXJ0WCwgc3RhcnRZLCB4MSwgeTEsIHgyLCB5MiwgeCwgeSwgbWluTWF4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBPUFMuY3VydmVUbzI6CiAgICAgICAgewogICAgICAgICAgY29uc3Qgc3RhcnRYID0gc3RhdGUuY3VycmVudFBvaW50WDsKICAgICAgICAgIGNvbnN0IHN0YXJ0WSA9IHN0YXRlLmN1cnJlbnRQb2ludFk7CiAgICAgICAgICBjb25zdCBbeDEsIHkxLCB4LCB5XSA9IGFyZ3M7CiAgICAgICAgICBzdGF0ZS5jdXJyZW50UG9pbnRYID0geDsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFkgPSB5OwogICAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMuY3VydmVUbywgc3RhcnRYLCBzdGFydFksIHgxLCB5MSwgeCwgeSk7CiAgICAgICAgICBVdGlsLmJlemllckJvdW5kaW5nQm94KHN0YXJ0WCwgc3RhcnRZLCBzdGFydFgsIHN0YXJ0WSwgeDEsIHkxLCB4LCB5LCBtaW5NYXgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIE9QUy5jdXJ2ZVRvMzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCBzdGFydFggPSBzdGF0ZS5jdXJyZW50UG9pbnRYOwogICAgICAgICAgY29uc3Qgc3RhcnRZID0gc3RhdGUuY3VycmVudFBvaW50WTsKICAgICAgICAgIGNvbnN0IFt4MSwgeTEsIHgsIHldID0gYXJnczsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFggPSB4OwogICAgICAgICAgc3RhdGUuY3VycmVudFBvaW50WSA9IHk7CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jdXJ2ZVRvLCB4MSwgeTEsIHgsIHksIHgsIHkpOwogICAgICAgICAgVXRpbC5iZXppZXJCb3VuZGluZ0JveChzdGFydFgsIHN0YXJ0WSwgeDEsIHkxLCB4LCB5LCB4LCB5LCBtaW5NYXgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6CiAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMuY2xvc2VQYXRoKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgX2dldENvbG9yU3BhY2UoY3MsIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIHJldHVybiBDb2xvclNwYWNlVXRpbHMucGFyc2UoewogICAgICBjcywKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgYXN5bmNJZk5vdENhY2hlZDogdHJ1ZQogICAgfSk7CiAgfQogIGFzeW5jIF9oYW5kbGVDb2xvclNwYWNlKGNzUHJvbWlzZSkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGF3YWl0IGNzUHJvbWlzZTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBfaGFuZGxlQ29sb3JTcGFjZSAtIGlnbm9yaW5nIENvbG9yU3BhY2U6ICIke2V4fSIuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhyb3cgZXg7CiAgICB9CiAgfQogIHBhcnNlU2hhZGluZyh7CiAgICBzaGFkaW5nLAogICAgcmVzb3VyY2VzLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsCiAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUKICB9KSB7CiAgICBsZXQgaWQgPSBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuZ2V0KHNoYWRpbmcpOwogICAgaWYgKGlkKSB7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGxldCBwYXR0ZXJuSVI7CiAgICB0cnkgewogICAgICBjb25zdCBzaGFkaW5nRmlsbCA9IFBhdHRlcm4ucGFyc2VTaGFkaW5nKHNoYWRpbmcsIHRoaXMueHJlZiwgcmVzb3VyY2VzLCB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgIHBhdHRlcm5JUiA9IHNoYWRpbmdGaWxsLmdldElSKCk7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBwYXJzZVNoYWRpbmcgLSBpZ25vcmluZyBzaGFkaW5nOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuc2V0KHNoYWRpbmcsIG51bGwpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0KICAgIGlkID0gYHBhdHRlcm5fJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIGlkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fdHlwZTNfJHtpZH1gOwogICAgfQogICAgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlLnNldChzaGFkaW5nLCBpZCk7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbaWQsICJQYXR0ZXJuIiwgcGF0dGVybklSXSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW2lkLCB0aGlzLnBhZ2VJbmRleCwgIlBhdHRlcm4iLCBwYXR0ZXJuSVJdKTsKICAgIH0KICAgIHJldHVybiBpZDsKICB9CiAgaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkgewogICAgY29uc3QgcGF0dGVybk5hbWUgPSBhcmdzLnBvcCgpOwogICAgaWYgKHBhdHRlcm5OYW1lIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCByYXdQYXR0ZXJuID0gcGF0dGVybnMuZ2V0UmF3KHBhdHRlcm5OYW1lLm5hbWUpOwogICAgICBjb25zdCBsb2NhbFRpbGluZ1BhdHRlcm4gPSByYXdQYXR0ZXJuIGluc3RhbmNlb2YgUmVmICYmIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLmdldEJ5UmVmKHJhd1BhdHRlcm4pOwogICAgICBpZiAobG9jYWxUaWxpbmdQYXR0ZXJuKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGNvbG9yID0gY3MuYmFzZSA/IGNzLmJhc2UuZ2V0UmdiKGFyZ3MsIDApIDogbnVsbDsKICAgICAgICAgIGNvbnN0IHRpbGluZ1BhdHRlcm5JUiA9IGdldFRpbGluZ1BhdHRlcm5JUihsb2NhbFRpbGluZ1BhdHRlcm4ub3BlcmF0b3JMaXN0SVIsIGxvY2FsVGlsaW5nUGF0dGVybi5kaWN0LCBjb2xvcik7CiAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0gY2F0Y2gge30KICAgICAgfQogICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy54cmVmLmZldGNoSWZSZWYocmF3UGF0dGVybik7CiAgICAgIGlmIChwYXR0ZXJuKSB7CiAgICAgICAgY29uc3QgZGljdCA9IHBhdHRlcm4gaW5zdGFuY2VvZiBCYXNlU3RyZWFtID8gcGF0dGVybi5kaWN0IDogcGF0dGVybjsKICAgICAgICBjb25zdCB0eXBlTnVtID0gZGljdC5nZXQoIlBhdHRlcm5UeXBlIik7CiAgICAgICAgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlRJTElORykgewogICAgICAgICAgY29uc3QgY29sb3IgPSBjcy5iYXNlID8gY3MuYmFzZS5nZXRSZ2IoYXJncywgMCkgOiBudWxsOwogICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlVGlsaW5nVHlwZShmbiwgY29sb3IsIHJlc291cmNlcywgcGF0dGVybiwgZGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlTnVtID09PSBQYXR0ZXJuVHlwZS5TSEFESU5HKSB7CiAgICAgICAgICBjb25zdCBzaGFkaW5nID0gZGljdC5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgIGNvbnN0IG9iaklkID0gdGhpcy5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICBzaGFkaW5nLAogICAgICAgICAgICByZXNvdXJjZXMsCiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKG9iaklkKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IGxvb2t1cE1hdHJpeChkaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgWyJTaGFkaW5nIiwgb2JqSWQsIG1hdHJpeF0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmtub3duIFBhdHRlcm5UeXBlOiAke3R5cGVOdW19YCk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtwYXR0ZXJuTmFtZX1gKTsKICB9CiAgX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oYXJyYXksIG5lc3RpbmdDb3VudGVyLCBjdXJyZW50UmVzdWx0KSB7CiAgICBjb25zdCBNQVhfTkVTVElORyA9IDEwOwogICAgaWYgKCsrbmVzdGluZ0NvdW50ZXIgPiBNQVhfTkVTVElORykgewogICAgICB3YXJuKCJWaXNpYmlsaXR5IGV4cHJlc3Npb24gaXMgdG9vIGRlZXBseSBuZXN0ZWQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgY29uc3Qgb3BlcmF0b3IgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihhcnJheVswXSk7CiAgICBpZiAobGVuZ3RoIDwgMiB8fCAhKG9wZXJhdG9yIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgd2FybigiSW52YWxpZCB2aXNpYmlsaXR5IGV4cHJlc3Npb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3dpdGNoIChvcGVyYXRvci5uYW1lKSB7CiAgICAgIGNhc2UgIkFuZCI6CiAgICAgIGNhc2UgIk9yIjoKICAgICAgY2FzZSAiTm90IjoKICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gob3BlcmF0b3IubmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgd2FybihgSW52YWxpZCBvcGVyYXRvciAke29wZXJhdG9yLm5hbWV9IGluIHZpc2liaWxpdHkgZXhwcmVzc2lvbmApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgcmF3ID0gYXJyYXlbaV07CiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHJhdyk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBbXTsKICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gobmVzdGVkUmVzdWx0KTsKICAgICAgICB0aGlzLl9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKG9iamVjdCwgbmVzdGluZ0NvdW50ZXIsIG5lc3RlZFJlc3VsdCk7CiAgICAgIH0gZWxzZSBpZiAocmF3IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKHJhdy50b1N0cmluZygpKTsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBwYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhjb250ZW50UHJvcGVydGllcywgcmVzb3VyY2VzKSB7CiAgICBsZXQgb3B0aW9uYWxDb250ZW50OwogICAgaWYgKGNvbnRlbnRQcm9wZXJ0aWVzIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2VzLmdldCgiUHJvcGVydGllcyIpOwogICAgICBvcHRpb25hbENvbnRlbnQgPSBwcm9wZXJ0aWVzLmdldChjb250ZW50UHJvcGVydGllcy5uYW1lKTsKICAgIH0gZWxzZSBpZiAoY29udGVudFByb3BlcnRpZXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGNvbnRlbnRQcm9wZXJ0aWVzOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLiIpOwogICAgfQogICAgY29uc3Qgb3B0aW9uYWxDb250ZW50VHlwZSA9IG9wdGlvbmFsQ29udGVudC5nZXQoIlR5cGUiKT8ubmFtZTsKICAgIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NHIikgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudC5vYmpJZAogICAgICB9OwogICAgfSBlbHNlIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NNRCIpIHsKICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IG9wdGlvbmFsQ29udGVudC5nZXQoIlZFIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgdGhpcy5fcGFyc2VWaXNpYmlsaXR5RXhwcmVzc2lvbihleHByZXNzaW9uLCAwLCByZXN1bHQpOwogICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogIk9DTUQiLAogICAgICAgICAgICBleHByZXNzaW9uOiByZXN1bHQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IG9wdGlvbmFsQ29udGVudEdyb3VwcyA9IG9wdGlvbmFsQ29udGVudC5nZXQoIk9DR3MiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSB8fCBvcHRpb25hbENvbnRlbnRHcm91cHMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgY29uc3QgZ3JvdXBJZHMgPSBbXTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25hbENvbnRlbnRHcm91cHMpKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IG9jZyBvZiBvcHRpb25hbENvbnRlbnRHcm91cHMpIHsKICAgICAgICAgICAgZ3JvdXBJZHMucHVzaChvY2cudG9TdHJpbmcoKSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdyb3VwSWRzLnB1c2gob3B0aW9uYWxDb250ZW50R3JvdXBzLm9iaklkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgICBpZHM6IGdyb3VwSWRzLAogICAgICAgICAgcG9saWN5OiBvcHRpb25hbENvbnRlbnQuZ2V0KCJQIikgaW5zdGFuY2VvZiBOYW1lID8gb3B0aW9uYWxDb250ZW50LmdldCgiUCIpLm5hbWUgOiBudWxsLAogICAgICAgICAgZXhwcmVzc2lvbjogbnVsbAogICAgICAgIH07CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWxDb250ZW50R3JvdXBzIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgICBpZDogb3B0aW9uYWxDb250ZW50R3JvdXBzLnRvU3RyaW5nKCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0T3BlcmF0b3JMaXN0KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBvcGVyYXRvckxpc3QsCiAgICBpbml0aWFsU3RhdGUgPSBudWxsLAogICAgZmFsbGJhY2tGb250RGljdCA9IG51bGwKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IERpY3QuZW1wdHk7CiAgICBpbml0aWFsU3RhdGUgfHw9IG5ldyBFdmFsU3RhdGUoKTsKICAgIGlmICghb3BlcmF0b3JMaXN0KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0T3BlcmF0b3JMaXN0OiBtaXNzaW5nICJvcGVyYXRvckxpc3QiIHBhcmFtZXRlcicpOwogICAgfQogICAgY29uc3Qgc2VsZiA9IHRoaXM7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgY29uc3QgbG9jYWxJbWFnZUNhY2hlID0gbmV3IExvY2FsSW1hZ2VDYWNoZSgpOwogICAgY29uc3QgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsR1N0YXRlQ2FjaGUgPSBuZXcgTG9jYWxHU3RhdGVDYWNoZSgpOwogICAgY29uc3QgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUgPSBuZXcgTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSA9IG5ldyBNYXAoKTsKICAgIGNvbnN0IHhvYmpzID0gcmVzb3VyY2VzLmdldCgiWE9iamVjdCIpIHx8IERpY3QuZW1wdHk7CiAgICBjb25zdCBwYXR0ZXJucyA9IHJlc291cmNlcy5nZXQoIlBhdHRlcm4iKSB8fCBEaWN0LmVtcHR5OwogICAgY29uc3Qgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihpbml0aWFsU3RhdGUpOwogICAgY29uc3QgcHJlcHJvY2Vzc29yID0gbmV3IEV2YWx1YXRvclByZXByb2Nlc3NvcihzdHJlYW0sIHhyZWYsIHN0YXRlTWFuYWdlcik7CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICBmdW5jdGlvbiBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKGFyZ3VtZW50KSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHByZXByb2Nlc3Nvci5zYXZlZFN0YXRlc0RlcHRoOyBpIDwgaWk7IGkrKykgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgW10pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBvcGVyYXRvckxpc3QucmVhZHldKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICByZWplY3QoZXgpOwogICAgICAgICAgfQogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH07CiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICB0aW1lU2xvdE1hbmFnZXIucmVzZXQoKTsKICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge307CiAgICAgIGxldCBzdG9wLCBpLCBpaSwgY3MsIG5hbWUsIGlzVmFsaWROYW1lOwogICAgICB3aGlsZSAoIShzdG9wID0gdGltZVNsb3RNYW5hZ2VyLmNoZWNrKCkpKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBudWxsOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxldCBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CiAgICAgICAgbGV0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5wYWludFhPYmplY3Q6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpOwogICAgICAgICAgICAgIGlmIChsb2NhbEltYWdlKSB7CiAgICAgICAgICAgICAgICBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BlcmF0b3JMaXN0LCBsb2NhbEltYWdlKTsKICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7CiAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CiAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlSZWYoeG9iaikgfHwgc2VsZi5fcmVnaW9uYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgYWRkTG9jYWxseUNhY2hlZEltYWdlT3BzKG9wZXJhdG9yTGlzdCwgbG9jYWxJbWFnZSk7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KGdsb2JhbEltYWdlLm9iaklkKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKGdsb2JhbEltYWdlLmZuLCBnbG9iYWxJbWFnZS5hcmdzLCBnbG9iYWxJbWFnZS5vcHRpb25hbENvbnRlbnQsIGdsb2JhbEltYWdlLmhhc01hc2spOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCEoeG9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4b2JqLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHR5cGUubmFtZSA9PT0gIkZvcm0iKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2F2ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgeG9iaiwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoewogICAgICAgICAgICAgICAgICBuZXdQYXRoOiB0cnVlCiAgICAgICAgICAgICAgICB9KSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09ICJJbWFnZSIpIHsKICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRQYWludEltYWdlWE9iamVjdCh7CiAgICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgICAgaW1hZ2U6IHhvYmosCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IG5hbWUsCiAgICAgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSAiUFMiKSB7CiAgICAgICAgICAgICAgICBpbmZvKCJJZ25vcmVkIFhPYmplY3Qgc3VidHlwZSBQUyIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuaGFuZGxlZCBYT2JqZWN0IHN1YnR5cGUgJHt0eXBlLm5hbWV9YCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBhcmdzWzFdOwogICAgICAgICAgICBuZXh0KHNlbGYuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGFyZ3MsIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLCBmYWxsYmFja0ZvbnREaWN0KS50aGVuKGZ1bmN0aW9uIChsb2FkZWROYW1lKSB7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kobG9hZGVkTmFtZSk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRGb250LCBbbG9hZGVkTmFtZSwgZm9udFNpemVdKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5lbmRJbmxpbmVJbWFnZToKICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBhcmdzWzBdLmNhY2hlS2V5OwogICAgICAgICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5TmFtZShjYWNoZUtleSk7CiAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgIGFkZExvY2FsbHlDYWNoZWRJbWFnZU9wcyhvcGVyYXRvckxpc3QsIGxvY2FsSW1hZ2UpOwogICAgICAgICAgICAgICAgYXJncyA9IG51bGw7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChzZWxmLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoewogICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICBpbWFnZTogYXJnc1swXSwKICAgICAgICAgICAgICBpc0lubGluZTogdHJ1ZSwKICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsCiAgICAgICAgICAgICAgY2FjaGVLZXksCiAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29tYmluZWRHbHlwaHMgPSBbXSwKICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlTWFuYWdlci5zdGF0ZTsKICAgICAgICAgICAgZm9yIChjb25zdCBhcnJJdGVtIG9mIGFyZ3NbMF0pIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyckl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBjb21iaW5lZEdseXBocy5wdXNoKC4uLnNlbGYuaGFuZGxlVGV4dChhcnJJdGVtLCBzdGF0ZSkpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyckl0ZW0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICBjb21iaW5lZEdseXBocy5wdXNoKGFyckl0ZW0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzWzBdID0gY29tYmluZWRHbHlwaHM7CiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMubmV4dExpbmUpOwogICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLm5leHRMaW5lKTsKICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRXb3JkU3BhY2luZywgW2FyZ3Muc2hpZnQoKV0pOwogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldENoYXJTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7CiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2hvd1RleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yU3BhY2U6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjb25zdCBmaWxsQ1MgPSBzZWxmLl9nZXRDb2xvclNwYWNlKGFyZ3NbMF0sIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgICAgIGlmIChmaWxsQ1MgaW5zdGFuY2VvZiBDb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBmaWxsQ1M7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbmV4dChzZWxmLl9oYW5kbGVDb2xvclNwYWNlKGZpbGxDUykudGhlbihjb2xvclNwYWNlID0+IHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2UgfHwgQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZToKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IHN0cm9rZUNTID0gc2VsZi5fZ2V0Q29sb3JTcGFjZShhcmdzWzBdLCByZXNvdXJjZXMsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgICAgICAgICBpZiAoc3Ryb2tlQ1MgaW5zdGFuY2VvZiBDb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IHN0cm9rZUNTOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5leHQoc2VsZi5faGFuZGxlQ29sb3JTcGFjZShzdHJva2VDUykudGhlbihjb2xvclNwYWNlID0+IHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBDb2xvclNwYWNlVXRpbHMuZ3JheTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBDb2xvclNwYWNlVXRpbHMuZ3JheTsKICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUdyYXk6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsUkdCQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5yZ2I7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjoKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBDb2xvclNwYWNlVXRpbHMucmdiOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLnJnYi5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVybkZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBpZiAoIWNzKSB7CiAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyQXJyYXkoYXJncywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxUcmFuc3BhcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRGaWxsQ29sb3JOLCBhcmdzLCBjcywgcGF0dGVybnMsIHJlc291cmNlcywgdGFzaywgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLCBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUpKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVyblN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGlmICghY3MpIHsKICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJBcnJheShhcmdzLCBudWxsKSkgewogICAgICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFyZ3MgPSBbXTsKICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VUcmFuc3BhcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRTdHJva2VDb2xvck4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDoKICAgICAgICAgICAgbGV0IHNoYWRpbmc7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29uc3Qgc2hhZGluZ1JlcyA9IHJlc291cmNlcy5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmdSZXMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzaGFkaW5nID0gc2hhZGluZ1Jlcy5nZXQoYXJnc1swXS5uYW1lKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmcpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBTaGFkaW5nOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGF0dGVybklkID0gc2VsZi5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICAgIHNoYWRpbmcsCiAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFwYXR0ZXJuSWQpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gW3BhdHRlcm5JZF07CiAgICAgICAgICAgIGZuID0gT1BTLnNoYWRpbmdGaWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEdTdGF0ZToKICAgICAgICAgICAgaXNWYWxpZE5hbWUgPSBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZTsKICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKICAgICAgICAgICAgaWYgKGlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgY29uc3QgbG9jYWxHU3RhdGVPYmogPSBsb2NhbEdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKTsKICAgICAgICAgICAgICBpZiAobG9jYWxHU3RhdGVPYmopIHsKICAgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iai5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2V0R1N0YXRlLCBbbG9jYWxHU3RhdGVPYmpdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNlbGYuc2V0R1N0YXRlKHsKICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgIGdTdGF0ZSwKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlciwKICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUsCiAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgT1BTLnNldExpbmVXaWR0aDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IFt0aGlja25lc3NdID0gYXJnczsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaWNrbmVzcyAhPT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgIHdhcm4oYEludmFsaWQgc2V0TGluZVdpZHRoOiAke3RoaWNrbmVzc31gKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhcmdzWzBdID0gTWF0aC5hYnModGhpY2tuZXNzKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMubW92ZVRvOgogICAgICAgICAgY2FzZSBPUFMubGluZVRvOgogICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzoKICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOgogICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzM6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6CiAgICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6CiAgICAgICAgICAgIHNlbGYuYnVpbGRQYXRoKGZuLCBhcmdzLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgT1BTLnN0cm9rZToKICAgICAgICAgIGNhc2UgT1BTLmNsb3NlU3Ryb2tlOgogICAgICAgICAgY2FzZSBPUFMuZmlsbDoKICAgICAgICAgIGNhc2UgT1BTLmVvRmlsbDoKICAgICAgICAgIGNhc2UgT1BTLmZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5lb0ZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZUZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZUVPRmlsbFN0cm9rZToKICAgICAgICAgIGNhc2UgT1BTLmVuZFBhdGg6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICBzdGF0ZTogewogICAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLAogICAgICAgICAgICAgICAgICBwYXRoTWluTWF4CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSA9IHN0YXRlTWFuYWdlcjsKICAgICAgICAgICAgICBpZiAoZm4gPT09IE9QUy5jbG9zZVN0cm9rZSB8fCBmbiA9PT0gT1BTLmNsb3NlRmlsbFN0cm9rZSB8fCBmbiA9PT0gT1BTLmNsb3NlRU9GaWxsU3Ryb2tlKSB7CiAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jbG9zZVBhdGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocGF0aEJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuY29uc3RydWN0UGF0aCwgW2ZuLCBbbnVsbF0sIG51bGxdKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5jb25zdHJ1Y3RQYXRoLCBbZm4sIFtuZXcgRmxvYXQzMkFycmF5KHBhdGhCdWZmZXIpXSwgcGF0aE1pbk1heC5zbGljZSgpXSk7CiAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICBwYXRoTWluTWF4LnNldChbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV0sIDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50OgogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50UHJvcHM6CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbkNvbXBhdDoKICAgICAgICAgIGNhc2UgT1BTLmVuZENvbXBhdDoKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczoKICAgICAgICAgICAgaWYgKCEoYXJnc1swXSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgd2FybihgRXhwZWN0ZWQgbmFtZSBmb3IgYmVnaW5NYXJrZWRDb250ZW50UHJvcHMgYXJnMD0ke2FyZ3NbMF19YCk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG51bGxdKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJnc1swXS5uYW1lID09PSAiT0MiKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcykudGhlbihkYXRhID0+IHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBkYXRhXSk7CiAgICAgICAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBudWxsXSk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lLCBhcmdzWzFdIGluc3RhbmNlb2YgRGljdCA/IGFyZ3NbMV0uZ2V0KCJNQ0lEIikgOiBudWxsXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnQ6CiAgICAgICAgICBjYXNlIE9QUy5lbmRNYXJrZWRDb250ZW50OgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaSA8IGlpKSB7CiAgICAgICAgICAgICAgICB3YXJuKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBvcGVyYXRvcjogIiArIGZuKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIGFyZ3MpOwogICAgICB9CiAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgbmV4dChkZWZlcnJlZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0YXNrLm5hbWV9IiBgICsgYHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFRleHRDb250ZW50KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBzdGF0ZU1hbmFnZXIgPSBudWxsLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQgPSBmYWxzZSwKICAgIHNpbmssCiAgICBzZWVuU3R5bGVzID0gbmV3IFNldCgpLAogICAgdmlld0JveCwKICAgIGxhbmcgPSBudWxsLAogICAgbWFya2VkQ29udGVudERhdGEgPSBudWxsLAogICAgZGlzYWJsZU5vcm1hbGl6YXRpb24gPSBmYWxzZSwKICAgIGtlZXBXaGl0ZVNwYWNlID0gZmFsc2UKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IERpY3QuZW1wdHk7CiAgICBzdGF0ZU1hbmFnZXIgfHw9IG5ldyBTdGF0ZU1hbmFnZXIobmV3IFRleHRTdGF0ZSgpKTsKICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICBtYXJrZWRDb250ZW50RGF0YSB8fD0gewogICAgICAgIGxldmVsOiAwCiAgICAgIH07CiAgICB9CiAgICBjb25zdCB0ZXh0Q29udGVudCA9IHsKICAgICAgaXRlbXM6IFtdLAogICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgIGxhbmcKICAgIH07CiAgICBjb25zdCB0ZXh0Q29udGVudEl0ZW0gPSB7CiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgc3RyOiBbXSwKICAgICAgdG90YWxXaWR0aDogMCwKICAgICAgdG90YWxIZWlnaHQ6IDAsCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHZlcnRpY2FsOiBmYWxzZSwKICAgICAgcHJldlRyYW5zZm9ybTogbnVsbCwKICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCwKICAgICAgc3BhY2VJbkZsb3dNaW46IDAsCiAgICAgIHNwYWNlSW5GbG93TWF4OiAwLAogICAgICB0cmFja2luZ1NwYWNlTWluOiBJbmZpbml0eSwKICAgICAgbmVnYXRpdmVTcGFjZU1heDogLUluZmluaXR5LAogICAgICBub3RBU3BhY2U6IC1JbmZpbml0eSwKICAgICAgdHJhbnNmb3JtOiBudWxsLAogICAgICBmb250TmFtZTogbnVsbCwKICAgICAgaGFzRU9MOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IHR3b0xhc3RDaGFycyA9IFsiICIsICIgIl07CiAgICBsZXQgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIGZ1bmN0aW9uIHNhdmVMYXN0Q2hhcihjaGFyKSB7CiAgICAgIGNvbnN0IG5leHRQb3MgPSAodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyOwogICAgICBjb25zdCByZXQgPSB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1tuZXh0UG9zXSA9PT0gIiAiOwogICAgICB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSA9IGNoYXI7CiAgICAgIHR3b0xhc3RDaGFyc1BvcyA9IG5leHRQb3M7CiAgICAgIHJldHVybiAha2VlcFdoaXRlU3BhY2UgJiYgcmV0OwogICAgfQogICAgZnVuY3Rpb24gc2hvdWxkQWRkV2hpdGVwc2FjZSgpIHsKICAgICAgcmV0dXJuICFrZWVwV2hpdGVTcGFjZSAmJiB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1sodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyXSA9PT0gIiAiOwogICAgfQogICAgZnVuY3Rpb24gcmVzZXRMYXN0Q2hhcnMoKSB7CiAgICAgIHR3b0xhc3RDaGFyc1swXSA9IHR3b0xhc3RDaGFyc1sxXSA9ICIgIjsKICAgICAgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIH0KICAgIGNvbnN0IFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUiA9IDAuMTAyOwogICAgY29uc3QgTk9UX0FfU1BBQ0VfRkFDVE9SID0gMC4wMzsKICAgIGNvbnN0IE5FR0FUSVZFX1NQQUNFX0ZBQ1RPUiA9IC0wLjI7CiAgICBjb25zdCBTUEFDRV9JTl9GTE9XX01JTl9GQUNUT1IgPSAwLjEwMjsKICAgIGNvbnN0IFNQQUNFX0lOX0ZMT1dfTUFYX0ZBQ1RPUiA9IDAuNjsKICAgIGNvbnN0IFZFUlRJQ0FMX1NISUZUX1JBVElPID0gMC4yNTsKICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGNvbnN0IHNob3dTcGFjZWRUZXh0QnVmZmVyID0gW107CiAgICBsZXQgeG9ianMgPSBudWxsOwogICAgY29uc3QgZW1wdHlYT2JqZWN0Q2FjaGUgPSBuZXcgTG9jYWxJbWFnZUNhY2hlKCk7CiAgICBjb25zdCBlbXB0eUdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTsKICAgIGNvbnN0IHByZXByb2Nlc3NvciA9IG5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIpOwogICAgbGV0IHRleHRTdGF0ZTsKICAgIGZ1bmN0aW9uIHB1c2hXaGl0ZXNwYWNlKHsKICAgICAgd2lkdGggPSAwLAogICAgICBoZWlnaHQgPSAwLAogICAgICB0cmFuc2Zvcm0gPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybSwKICAgICAgZm9udE5hbWUgPSB0ZXh0Q29udGVudEl0ZW0uZm9udE5hbWUKICAgIH0pIHsKICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgc3RyOiAiICIsCiAgICAgICAgZGlyOiAibHRyIiwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgdHJhbnNmb3JtLAogICAgICAgIGZvbnROYW1lLAogICAgICAgIGhhc0VPTDogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpIHsKICAgICAgY29uc3QgZm9udCA9IHRleHRTdGF0ZS5mb250OwogICAgICBjb25zdCB0c20gPSBbdGV4dFN0YXRlLmZvbnRTaXplICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDAsIDAsIHRleHRTdGF0ZS5mb250U2l6ZSwgMCwgdGV4dFN0YXRlLnRleHRSaXNlXTsKICAgICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQgJiYgKHRleHRTdGF0ZS5mb250U2l6ZSA8PSAxIHx8IGZvbnQuaXNDaGFyQkJveCkgJiYgIWlzQXJyYXlFcXVhbCh0ZXh0U3RhdGUuZm9udE1hdHJpeCwgRk9OVF9JREVOVElUWV9NQVRSSVgpKSB7CiAgICAgICAgY29uc3QgZ2x5cGhIZWlnaHQgPSBmb250LmJib3hbM10gLSBmb250LmJib3hbMV07CiAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkgewogICAgICAgICAgdHNtWzNdICo9IGdseXBoSGVpZ2h0ICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbM107CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUuY3RtLCBVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUudGV4dE1hdHJpeCwgdHNtKSk7CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm4gdGV4dENvbnRlbnRJdGVtOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBmb250LAogICAgICAgIGxvYWRlZE5hbWUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgaWYgKCFzZWVuU3R5bGVzLmhhcyhsb2FkZWROYW1lKSkgewogICAgICAgIHNlZW5TdHlsZXMuYWRkKGxvYWRlZE5hbWUpOwogICAgICAgIHRleHRDb250ZW50LnN0eWxlc1tsb2FkZWROYW1lXSA9IHsKICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLAogICAgICAgICAgYXNjZW50OiBmb250LmFzY2VudCwKICAgICAgICAgIGRlc2NlbnQ6IGZvbnQuZGVzY2VudCwKICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsCiAgICAgICAgfTsKICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5zeXN0ZW1Gb250SW5mbykgewogICAgICAgICAgY29uc3Qgc3R5bGUgPSB0ZXh0Q29udGVudC5zdHlsZXNbbG9hZGVkTmFtZV07CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uID0gZm9udC5zeXN0ZW1Gb250SW5mby5jc3M7CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uTG9hZGVkTmFtZSA9IGZvbnQuc3lzdGVtRm9udEluZm8ubG9hZGVkTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lID0gbG9hZGVkTmFtZTsKICAgICAgY29uc3QgdHJtID0gdGV4dENvbnRlbnRJdGVtLnRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgewogICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IHRleHRDb250ZW50SXRlbS50b3RhbFdpZHRoID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gTWF0aC5oeXBvdCh0cm1bMl0sIHRybVszXSk7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggPSBNYXRoLmh5cG90KHRybVswXSwgdHJtWzFdKTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udmVydGljYWwgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IHNjYWxlTGluZVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFswXSwgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzFdKTsKICAgICAgY29uc3Qgc2NhbGVDdG1YID0gTWF0aC5oeXBvdCh0ZXh0U3RhdGUuY3RtWzBdLCB0ZXh0U3RhdGUuY3RtWzFdKTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYOwogICAgICBjb25zdCB7CiAgICAgICAgZm9udFNpemUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRyYWNraW5nU3BhY2VNaW4gPSBmb250U2l6ZSAqIFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLm5vdEFTcGFjZSA9IGZvbnRTaXplICogTk9UX0FfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0ubmVnYXRpdmVTcGFjZU1heCA9IGZvbnRTaXplICogTkVHQVRJVkVfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNaW4gPSBmb250U2l6ZSAqIFNQQUNFX0lOX0ZMT1dfTUlOX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLnNwYWNlSW5GbG93TWF4ID0gZm9udFNpemUgKiBTUEFDRV9JTl9GTE9XX01BWF9GQUNUT1I7CiAgICAgIHRleHRDb250ZW50SXRlbS5oYXNFT0wgPSBmYWxzZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkdmFuY2VTY2FsZSgpIHsKICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgc2NhbGVMaW5lWCA9IE1hdGguaHlwb3QodGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzBdLCB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV0pOwogICAgICBjb25zdCBzY2FsZUN0bVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS5jdG1bMF0sIHRleHRTdGF0ZS5jdG1bMV0pOwogICAgICBjb25zdCBzY2FsZUZhY3RvciA9IHNjYWxlQ3RtWCAqIHNjYWxlTGluZVg7CiAgICAgIGlmIChzY2FsZUZhY3RvciA9PT0gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udG90YWxXaWR0aCArPSB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRleHRDb250ZW50SXRlbS50b3RhbEhlaWdodCArPSB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IDA7CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUZhY3RvcjsKICAgIH0KICAgIGZ1bmN0aW9uIHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENodW5rKSB7CiAgICAgIGxldCB0ZXh0ID0gdGV4dENodW5rLnN0ci5qb2luKCIiKTsKICAgICAgaWYgKCFkaXNhYmxlTm9ybWFsaXphdGlvbikgewogICAgICAgIHRleHQgPSBub3JtYWxpemVVbmljb2RlKHRleHQpOwogICAgICB9CiAgICAgIGNvbnN0IGJpZGlSZXN1bHQgPSBiaWRpKHRleHQsIC0xLCB0ZXh0Q2h1bmsudmVydGljYWwpOwogICAgICByZXR1cm4gewogICAgICAgIHN0cjogYmlkaVJlc3VsdC5zdHIsCiAgICAgICAgZGlyOiBiaWRpUmVzdWx0LmRpciwKICAgICAgICB3aWR0aDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsV2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsSGVpZ2h0KSwKICAgICAgICB0cmFuc2Zvcm06IHRleHRDaHVuay50cmFuc2Zvcm0sCiAgICAgICAgZm9udE5hbWU6IHRleHRDaHVuay5mb250TmFtZSwKICAgICAgICBoYXNFT0w6IHRleHRDaHVuay5oYXNFT0wKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNldEZvbnQoZm9udE5hbWUsIGZvbnRSZWYpIHsKICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IGF3YWl0IHNlbGYubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcywgdGFzayk7CiAgICAgIHRleHRTdGF0ZS5sb2FkZWROYW1lID0gdHJhbnNsYXRlZC5sb2FkZWROYW1lOwogICAgICB0ZXh0U3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKICAgICAgdGV4dFN0YXRlLmZvbnRNYXRyaXggPSB0cmFuc2xhdGVkLmZvbnQuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGx5SW52ZXJzZVJvdGF0aW9uKHgsIHksIG1hdHJpeCkgewogICAgICBjb25zdCBzY2FsZSA9IE1hdGguaHlwb3QobWF0cml4WzBdLCBtYXRyaXhbMV0pOwogICAgICByZXR1cm4gWyhtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzFdICogeSkgLyBzY2FsZSwgKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbM10gKiB5KSAvIHNjYWxlXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVXaXRoTGFzdFBvc2l0aW9uKGdseXBoV2lkdGgpIHsKICAgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGxldCBwb3NYID0gY3VycmVudFRyYW5zZm9ybVs0XTsKICAgICAgbGV0IHBvc1kgPSBjdXJyZW50VHJhbnNmb3JtWzVdOwogICAgICBpZiAodGV4dFN0YXRlLmZvbnQ/LnZlcnRpY2FsKSB7CiAgICAgICAgaWYgKHBvc1ggPCB2aWV3Qm94WzBdIHx8IHBvc1ggPiB2aWV3Qm94WzJdIHx8IHBvc1kgKyBnbHlwaFdpZHRoIDwgdmlld0JveFsxXSB8fCBwb3NZID4gdmlld0JveFszXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwb3NYICsgZ2x5cGhXaWR0aCA8IHZpZXdCb3hbMF0gfHwgcG9zWCA+IHZpZXdCb3hbMl0gfHwgcG9zWSA8IHZpZXdCb3hbMV0gfHwgcG9zWSA+IHZpZXdCb3hbM10pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0U3RhdGUuZm9udCB8fCAhdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbGFzdFBvc1ggPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybVs0XTsKICAgICAgbGV0IGxhc3RQb3NZID0gdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm1bNV07CiAgICAgIGlmIChsYXN0UG9zWCA9PT0gcG9zWCAmJiBsYXN0UG9zWSA9PT0gcG9zWSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCByb3RhdGUgPSAtMTsKICAgICAgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMF0gJiYgY3VycmVudFRyYW5zZm9ybVsxXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzJdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVswXSA+IDAgPyAwIDogMTgwOwogICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMV0gJiYgY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVsxXSA+IDAgPyA5MCA6IDI3MDsKICAgICAgfQogICAgICBzd2l0Y2ggKHJvdGF0ZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTA6CiAgICAgICAgICBbcG9zWCwgcG9zWV0gPSBbcG9zWSwgcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFtsYXN0UG9zWSwgbGFzdFBvc1hdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICBbcG9zWCwgcG9zWSwgbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstcG9zWCwgLXBvc1ksIC1sYXN0UG9zWCwgLWxhc3RQb3NZXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjcwOgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gWy1wb3NZLCAtcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstbGFzdFBvc1ksIC1sYXN0UG9zWF07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gYXBwbHlJbnZlcnNlUm90YXRpb24ocG9zWCwgcG9zWSwgY3VycmVudFRyYW5zZm9ybSk7CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IGFwcGx5SW52ZXJzZVJvdGF0aW9uKGxhc3RQb3NYLCBsYXN0UG9zWSwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCkgewogICAgICAgIGNvbnN0IGFkdmFuY2VZID0gKGxhc3RQb3NZIC0gcG9zWSkgLyB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICBjb25zdCBhZHZhbmNlWCA9IHBvc1ggLSBsYXN0UG9zWDsKICAgICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLmhlaWdodCk7CiAgICAgICAgaWYgKGFkdmFuY2VZIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWCkgPiAwLjUgKiB0ZXh0Q29udGVudEl0ZW0ud2lkdGgpIHsKICAgICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGFkdmFuY2VZIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgfQogICAgICAgIGlmIChhZHZhbmNlWSA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgICAgaWYgKHNob3VsZEFkZFdoaXRlcHNhY2UoKSkgewogICAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhhZHZhbmNlWSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICs9IGFkdmFuY2VZOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWFkZEZha2VTcGFjZXMoYWR2YW5jZVksIHRleHRDb250ZW50SXRlbS5wcmV2VHJhbnNmb3JtLCB0ZXh0T3JpZW50YXRpb24pKSB7CiAgICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICAgIGhlaWdodDogTWF0aC5hYnMoYWR2YW5jZVkpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhZHZhbmNlWTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCAqIFZFUlRJQ0FMX1NISUZUX1JBVElPKSB7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBhZHZhbmNlWCA9IChwb3NYIC0gbGFzdFBvc1gpIC8gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIGNvbnN0IGFkdmFuY2VZID0gcG9zWSAtIGxhc3RQb3NZOwogICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLndpZHRoKTsKICAgICAgaWYgKGFkdmFuY2VYIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICBpZiAoTWF0aC5hYnMoYWR2YW5jZVkpID4gMC41ICogdGV4dENvbnRlbnRJdGVtLmhlaWdodCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0KSB7CiAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGFkdmFuY2VYIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICB9CiAgICAgIGlmIChhZHZhbmNlWCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgIGlmIChzaG91bGRBZGRXaGl0ZXBzYWNlKCkpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICB3aWR0aDogTWF0aC5hYnMoYWR2YW5jZVgpCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IGFkdmFuY2VYOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWRkRmFrZVNwYWNlcyhhZHZhbmNlWCwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0sIHRleHRPcmllbnRhdGlvbikpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmFicyhhZHZhbmNlWCkKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gYWR2YW5jZVg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogVkVSVElDQUxfU0hJRlRfUkFUSU8pIHsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICBjaGFycywKICAgICAgZXh0cmFTcGFjaW5nCiAgICB9KSB7CiAgICAgIGNvbnN0IGZvbnQgPSB0ZXh0U3RhdGUuZm9udDsKICAgICAgaWYgKCFjaGFycykgewogICAgICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nICsgZXh0cmFTcGFjaW5nOwogICAgICAgIGlmIChjaGFyU3BhY2luZykgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KGNoYXJTcGFjaW5nICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgLWNoYXJTcGFjaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGtlZXBXaGl0ZVNwYWNlKSB7CiAgICAgICAgICBjb21wYXJlV2l0aExhc3RQb3NpdGlvbigwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICAgIGNvbnN0IHNjYWxlID0gdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF0gKiB0ZXh0U3RhdGUuZm9udFNpemU7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGdseXBocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2F0ZWdvcnkKICAgICAgICB9ID0gZ2x5cGg7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzSW52aXNpYmxlRm9ybWF0TWFyaykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCBjaGFyU3BhY2luZyA9IHRleHRTdGF0ZS5jaGFyU3BhY2luZyArIChpICsgMSA9PT0gaWkgPyBleHRyYVNwYWNpbmcgOiAwKTsKICAgICAgICBsZXQgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoOwogICAgICAgIGlmIChmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgudm1ldHJpYyA/IGdseXBoLnZtZXRyaWNbMF0gOiAtZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgICAgbGV0IHNjYWxlZERpbSA9IGdseXBoV2lkdGggKiBzY2FsZTsKICAgICAgICBpZiAoIWtlZXBXaGl0ZVNwYWNlICYmIGNhdGVnb3J5LmlzV2hpdGVzcGFjZSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIGNoYXJTcGFjaW5nICs9IHNjYWxlZERpbSArIHRleHRTdGF0ZS53b3JkU3BhY2luZzsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyU3BhY2luZyArPSAtc2NhbGVkRGltICsgdGV4dFN0YXRlLndvcmRTcGFjaW5nOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgICAgc2F2ZUxhc3RDaGFyKCIgIik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjYXRlZ29yeS5pc1plcm9XaWR0aERpYWNyaXRpYyAmJiAhY29tcGFyZVdpdGhMYXN0UG9zaXRpb24oc2NhbGVkRGltKSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIHNjYWxlZERpbSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGV4dENodW5rID0gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzWmVyb1dpZHRoRGlhY3JpdGljKSB7CiAgICAgICAgICBzY2FsZWREaW0gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgIHNjYWxlZERpbSAqPSB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSwgMCk7CiAgICAgICAgICB0ZXh0Q2h1bmsud2lkdGggKz0gc2NhbGVkRGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCBzY2FsZWREaW0pOwogICAgICAgICAgc2NhbGVkRGltID0gTWF0aC5hYnMoc2NhbGVkRGltKTsKICAgICAgICAgIHRleHRDaHVuay5oZWlnaHQgKz0gc2NhbGVkRGltOwogICAgICAgIH0KICAgICAgICBpZiAoc2NhbGVkRGltKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsucHJldlRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdseXBoVW5pY29kZSA9IGdseXBoLnVuaWNvZGU7CiAgICAgICAgaWYgKHNhdmVMYXN0Q2hhcihnbHlwaFVuaWNvZGUpKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsuc3RyLnB1c2goIiAiKTsKICAgICAgICB9CiAgICAgICAgdGV4dENodW5rLnN0ci5wdXNoKGdseXBoVW5pY29kZSk7CiAgICAgICAgaWYgKGNoYXJTcGFjaW5nKSB7CiAgICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXBwZW5kRU9MKCkgewogICAgICByZXNldExhc3RDaGFycygpOwogICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhhc0VPTCA9IHRydWU7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHsKICAgICAgICAgIHN0cjogIiIsCiAgICAgICAgICBkaXI6ICJsdHIiLAogICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICB0cmFuc2Zvcm06IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgICBmb250TmFtZTogdGV4dFN0YXRlLmxvYWRlZE5hbWUsCiAgICAgICAgICBoYXNFT0w6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyh3aWR0aCwgdHJhbnNmLCB0ZXh0T3JpZW50YXRpb24pIHsKICAgICAgaWYgKHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5zcGFjZUluRmxvd01pbiA8PSB3aWR0aCAmJiB3aWR0aCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNYXgpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLnN0ci5wdXNoKCIgIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBmb250TmFtZSA9IHRleHRDb250ZW50SXRlbS5mb250TmFtZTsKICAgICAgbGV0IGhlaWdodCA9IDA7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICBoZWlnaHQgPSB3aWR0aDsKICAgICAgICB3aWR0aCA9IDA7CiAgICAgIH0KICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgIHdpZHRoOiBNYXRoLmFicyh3aWR0aCksCiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhoZWlnaHQpLAogICAgICAgIHRyYW5zZm9ybTogdHJhbnNmIHx8IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgZm9udE5hbWUKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gZmx1c2hUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkIHx8ICF0ZXh0Q29udGVudEl0ZW0uc3RyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggKz0gdGV4dENvbnRlbnRJdGVtLndpZHRoICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ICs9IHRleHRDb250ZW50SXRlbS5oZWlnaHQgKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgfQogICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENvbnRlbnRJdGVtKSk7CiAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCA9IGZhbHNlOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLmxlbmd0aCA9IDA7CiAgICB9CiAgICBmdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoYmF0Y2ggPSBmYWxzZSkgewogICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGJhdGNoICYmIGxlbmd0aCA8IFRFWFRfQ0hVTktfQkFUQ0hfU0laRSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzaW5rLmVucXVldWUodGV4dENvbnRlbnQsIGxlbmd0aCk7CiAgICAgIHRleHRDb250ZW50Lml0ZW1zID0gW107CiAgICAgIHRleHRDb250ZW50LnN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIGVucXVldWVDaHVuayh0cnVlKTsKICAgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZSwgc2luay5yZWFkeV0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHJlamVjdChleCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgfTsKICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOwogICAgICBjb25zdCBvcGVyYXRpb24gPSB7fTsKICAgICAgbGV0IHN0b3AsCiAgICAgICAgbmFtZSwKICAgICAgICBpc1ZhbGlkTmFtZSwKICAgICAgICBhcmdzID0gW107CiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0ZXh0U3RhdGU7CiAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlOwogICAgICAgIGNvbnN0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKICAgICAgICBzd2l0Y2ggKGZuIHwgMCkgewogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udE5hbWVBcmcgPSBhcmdzWzBdLm5hbWUsCiAgICAgICAgICAgICAgZm9udFNpemVBcmcgPSBhcmdzWzFdOwogICAgICAgICAgICBpZiAodGV4dFN0YXRlLmZvbnQgJiYgZm9udE5hbWVBcmcgPT09IHRleHRTdGF0ZS5mb250TmFtZSAmJiBmb250U2l6ZUFyZyA9PT0gdGV4dFN0YXRlLmZvbnRTaXplKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnROYW1lID0gZm9udE5hbWVBcmc7CiAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnOwogICAgICAgICAgICBuZXh0KGhhbmRsZVNldEZvbnQoZm9udE5hbWVBcmcsIG51bGwpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJpc2U6CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0UmlzZSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0SFNjYWxlOgogICAgICAgICAgICB0ZXh0U3RhdGUudGV4dEhTY2FsZSA9IGFyZ3NbMF0gLyAxMDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZzoKICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm1vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZ01vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUubGVhZGluZyA9IC1hcmdzWzFdOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmU6CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6CiAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOwogICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CiAgICAgICAgICAgIHVwZGF0ZUFkdmFuY2VTY2FsZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUuY2hhclNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFdvcmRTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmJlZ2luVGV4dDoKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVguc2xpY2UoKTsKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1NwYWNlZFRleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNwYWNlRmFjdG9yID0gKHRleHRTdGF0ZS5mb250LnZlcnRpY2FsID8gMSA6IC0xKSAqIHRleHRTdGF0ZS5mb250U2l6ZSAvIDEwMDA7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXJnc1swXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50c1tpXTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBzaG93U3BhY2VkVGV4dEJ1ZmZlci5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09ICJudW1iZXIiICYmIGl0ZW0gIT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgICAgc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiBpdGVtICogc3BhY2VGYWN0b3IKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgIHNob3dTcGFjZWRUZXh0QnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgIGV4dHJhU3BhY2luZzogMAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTaG93VGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRleHRTdGF0ZS53b3JkU3BhY2luZyA9IGFyZ3NbMF07CiAgICAgICAgICAgIHRleHRTdGF0ZS5jaGFyU3BhY2luZyA9IGFyZ3NbMV07CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbSh7CiAgICAgICAgICAgICAgY2hhcnM6IGFyZ3NbMl0sCiAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiAwCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnBhaW50WE9iamVjdDoKICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgeG9ianMgPz89IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBEaWN0LmVtcHR5OwogICAgICAgICAgICBpc1ZhbGlkTmFtZSA9IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lOwogICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOwogICAgICAgICAgICBpZiAoaXNWYWxpZE5hbWUgJiYgZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpIHsKICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsZXQgeG9iaiA9IHhvYmpzLmdldFJhdyhuYW1lKTsKICAgICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgaWYgKGVtcHR5WE9iamVjdENhY2hlLmdldEJ5UmVmKHhvYmopKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhvYmogPSB4cmVmLmZldGNoKHhvYmopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoISh4b2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHhvYmouZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICAgICAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lICE9PSAiRm9ybSIpIHsKICAgICAgICAgICAgICAgIGVtcHR5WE9iamVjdENhY2hlLnNldChuYW1lLCB4b2JqLmRpY3Qub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCk7CiAgICAgICAgICAgICAgY29uc3QgeE9ialN0YXRlTWFuYWdlciA9IG5ldyBTdGF0ZU1hbmFnZXIoY3VycmVudFN0YXRlKTsKICAgICAgICAgICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoeG9iai5kaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgewogICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7CiAgICAgICAgICAgICAgY29uc3Qgc2lua1dyYXBwZXIgPSB7CiAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnF1ZXVlKGNodW5rLCBzaXplKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuZW5xdWV1ZUludm9rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICBzaW5rLmVucXVldWUoY2h1bmssIHNpemUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldCBkZXNpcmVkU2l6ZSgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmsuZGVzaXJlZFNpemU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IHJlYWR5KCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHNlbGYuZ2V0VGV4dENvbnRlbnQoewogICAgICAgICAgICAgICAgc3RyZWFtOiB4b2JqLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHJlc291cmNlczogeG9iai5kaWN0LmdldCgiUmVzb3VyY2VzIikgfHwgcmVzb3VyY2VzLAogICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLAogICAgICAgICAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlciwKICAgICAgICAgICAgICAgIHNlZW5TdHlsZXMsCiAgICAgICAgICAgICAgICB2aWV3Qm94LAogICAgICAgICAgICAgICAgbGFuZywKICAgICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLAogICAgICAgICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24sCiAgICAgICAgICAgICAgICBrZWVwV2hpdGVTcGFjZQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFzaW5rV3JhcHBlci5lbnF1ZXVlSW52b2tlZCkgewogICAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgWE9iamVjdDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSAmJiBlbXB0eUdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZUZvbnQgPSBnU3RhdGUuZ2V0KCJGb250Iik7CiAgICAgICAgICAgICAgaWYgKCFnU3RhdGVGb250KSB7CiAgICAgICAgICAgICAgICBlbXB0eUdTdGF0ZUNhY2hlLnNldChuYW1lLCBnU3RhdGUub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZUdTdGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IG51bGw7CiAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTsKICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50OgogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBpZiAoaW5jbHVkZU1hcmtlZENvbnRlbnQpIHsKICAgICAgICAgICAgICBtYXJrZWRDb250ZW50RGF0YS5sZXZlbCsrOwogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudCIsCiAgICAgICAgICAgICAgICB0YWc6IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lID8gYXJnc1swXS5uYW1lIDogbnVsbAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsKys7CiAgICAgICAgICAgICAgbGV0IG1jaWQgPSBudWxsOwogICAgICAgICAgICAgIGlmIChhcmdzWzFdIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICAgICAgbWNpZCA9IGFyZ3NbMV0uZ2V0KCJNQ0lEIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudFByb3BzIiwKICAgICAgICAgICAgICAgIGlkOiBOdW1iZXIuaXNJbnRlZ2VyKG1jaWQpID8gYCR7c2VsZi5pZEZhY3RvcnkuZ2V0UGFnZU9iaklkKCl9X21jJHttY2lkfWAgOiBudWxsLAogICAgICAgICAgICAgICAgdGFnOiBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZSA/IGFyZ3NbMF0ubmFtZSA6IG51bGwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmVuZE1hcmtlZENvbnRlbnQ6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIGlmIChtYXJrZWRDb250ZW50RGF0YS5sZXZlbCA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsLS07CiAgICAgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZW5kTWFya2VkQ29udGVudCIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnJlc3RvcmU6CiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlICYmIChwcmV2aW91c1N0YXRlLmZvbnQgIT09IHRleHRTdGF0ZS5mb250IHx8IHByZXZpb3VzU3RhdGUuZm9udFNpemUgIT09IHRleHRTdGF0ZS5mb250U2l6ZSB8fCBwcmV2aW91c1N0YXRlLmZvbnROYW1lICE9PSB0ZXh0U3RhdGUuZm9udE5hbWUpKSB7CiAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aCA+PSBzaW5rLmRlc2lyZWRTaXplKSB7CiAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RvcCkgewogICAgICAgIG5leHQoZGVmZXJyZWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke3Rhc2submFtZX0iIGAgKyBgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGFzeW5jIGV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGNpZFRvR2lkQnl0ZXM7CiAgICBjb25zdCB0b1VuaWNvZGVQcm9taXNlID0gdGhpcy5yZWFkVG9Vbmljb2RlKHByb3BlcnRpZXMudG9Vbmljb2RlKTsKICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gZGljdC5nZXQoIkNJRFN5c3RlbUluZm8iKTsKICAgICAgaWYgKGNpZFN5c3RlbUluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0gewogICAgICAgICAgcmVnaXN0cnk6IHN0cmluZ1RvUERGU3RyaW5nKGNpZFN5c3RlbUluZm8uZ2V0KCJSZWdpc3RyeSIpKSwKICAgICAgICAgIG9yZGVyaW5nOiBzdHJpbmdUb1BERlN0cmluZyhjaWRTeXN0ZW1JbmZvLmdldCgiT3JkZXJpbmciKSksCiAgICAgICAgICBzdXBwbGVtZW50OiBjaWRTeXN0ZW1JbmZvLmdldCgiU3VwcGxlbWVudCIpCiAgICAgICAgfTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gZGljdC5nZXQoIkNJRFRvR0lETWFwIik7CiAgICAgICAgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgY2lkVG9HaWRCeXRlcyA9IGNpZFRvR2lkTWFwLmdldEJ5dGVzKCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgfQogICAgICAgIHdhcm4oYGV4dHJhY3REYXRhU3RydWN0dXJlcyAtIGlnbm9yaW5nIENJRFRvR0lETWFwIGRhdGE6ICIke2V4fSIuYCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gW107CiAgICBsZXQgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICBsZXQgZW5jb2Rpbmc7CiAgICBpZiAoZGljdC5oYXMoIkVuY29kaW5nIikpIHsKICAgICAgZW5jb2RpbmcgPSBkaWN0LmdldCgiRW5jb2RpbmciKTsKICAgICAgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5nZXQoIkJhc2VFbmNvZGluZyIpOwogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lIGluc3RhbmNlb2YgTmFtZSA/IGJhc2VFbmNvZGluZ05hbWUubmFtZSA6IG51bGw7CiAgICAgICAgaWYgKGVuY29kaW5nLmhhcygiRGlmZmVyZW5jZXMiKSkgewogICAgICAgICAgY29uc3QgZGlmZkVuY29kaW5nID0gZW5jb2RpbmcuZ2V0KCJEaWZmZXJlbmNlcyIpOwogICAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGlmZkVuY29kaW5nKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB4cmVmLmZldGNoSWZSZWYoZW50cnkpOwogICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBkYXRhOwogICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgZGlmZmVyZW5jZXNbaW5kZXgrK10gPSBkYXRhLm5hbWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluICdEaWZmZXJlbmNlcycgYXJyYXk6ICR7ZGF0YX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBtc2cgPSAiRW5jb2RpbmcgaXMgbm90IGEgTmFtZSBub3IgYSBEaWN0IjsKICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogICAgICAgIH0KICAgICAgICB3YXJuKG1zZyk7CiAgICAgIH0KICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgIT09ICJNYWNSb21hbkVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjRXhwZXJ0RW5jb2RpbmciICYmIGJhc2VFbmNvZGluZ05hbWUgIT09ICJXaW5BbnNpRW5jb2RpbmciKSB7CiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG5vbkVtYmVkZGVkRm9udCA9ICFwcm9wZXJ0aWVzLmZpbGUgfHwgcHJvcGVydGllcy5pc0ludGVybmFsRm9udCwKICAgICAgaXNTeW1ib2xzRm9udE5hbWUgPSBnZXRTeW1ib2xzRm9udHMoKVtwcm9wZXJ0aWVzLm5hbWVdOwogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgbm9uRW1iZWRkZWRGb250ICYmIGlzU3ltYm9sc0ZvbnROYW1lKSB7CiAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOwogICAgfQogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUpIHsKICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICAgIGNvbnN0IGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5Ob25zeW1ib2xpYyk7CiAgICAgIGVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKICAgICAgaWYgKHByb3BlcnRpZXMudHlwZSA9PT0gIlRydWVUeXBlIiAmJiAhaXNOb25zeW1ib2xpY0ZvbnQpIHsKICAgICAgICBlbmNvZGluZyA9IFdpbkFuc2lFbmNvZGluZzsKICAgICAgfQogICAgICBpZiAoaXNTeW1ib2xpY0ZvbnQgfHwgaXNTeW1ib2xzRm9udE5hbWUpIHsKICAgICAgICBlbmNvZGluZyA9IE1hY1JvbWFuRW5jb2Rpbmc7CiAgICAgICAgaWYgKG5vbkVtYmVkZGVkRm9udCkgewogICAgICAgICAgaWYgKC9TeW1ib2wvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBTeW1ib2xTZXRFbmNvZGluZzsKICAgICAgICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChwcm9wZXJ0aWVzLm5hbWUpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gWmFwZkRpbmdiYXRzRW5jb2Rpbmc7CiAgICAgICAgICB9IGVsc2UgaWYgKC9XaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7CiAgICB9CiAgICBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzID0gZGlmZmVyZW5jZXM7CiAgICBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lOwogICAgcHJvcGVydGllcy5oYXNFbmNvZGluZyA9ICEhYmFzZUVuY29kaW5nTmFtZSB8fCBkaWZmZXJlbmNlcy5sZW5ndGggPiAwOwogICAgcHJvcGVydGllcy5kaWN0ID0gZGljdDsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYXdhaXQgdG9Vbmljb2RlUHJvbWlzZTsKICAgIGNvbnN0IGJ1aWx0VG9Vbmljb2RlID0gYXdhaXQgdGhpcy5idWlsZFRvVW5pY29kZShwcm9wZXJ0aWVzKTsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYnVpbHRUb1VuaWNvZGU7CiAgICBpZiAoY2lkVG9HaWRCeXRlcykgewogICAgICBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwID0gdGhpcy5yZWFkQ2lkVG9HaWRNYXAoY2lkVG9HaWRCeXRlcywgYnVpbHRUb1VuaWNvZGUpOwogICAgfQogICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgfQogIF9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHsKICAgIGFzc2VydCghcHJvcGVydGllcy5jb21wb3NpdGUsICJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmcuc2xpY2UoKTsKICAgIGNvbnN0IGJhc2VFbmNvZGluZ05hbWUgPSBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWU7CiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICBmb3IgKGNvbnN0IGNoYXJjb2RlIGluIGRpZmZlcmVuY2VzKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZW5jb2RpbmdbY2hhcmNvZGVdID0gZ2x5cGhOYW1lOwogICAgfQogICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZW5jb2RpbmcpIHsKICAgICAgbGV0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgICAgaWYgKHVuaWNvZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBjb2RlID0gMDsKICAgICAgc3dpdGNoIChnbHlwaE5hbWVbMF0pIHsKICAgICAgICBjYXNlICJHIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSAzKSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSA1KSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDIjoKICAgICAgICBjYXNlICJjIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID49IDMgJiYgZ2x5cGhOYW1lLmxlbmd0aCA8PSA0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvZGVTdHIgPSBnbHlwaE5hbWUuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHsKICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSArY29kZVN0cjsKICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihjb2RlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGNvZGVTdHIsIDE2KSkpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAidSI6CiAgICAgICAgICB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICAgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgICAgICAgY29kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3dpdGNoIChnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiZl9oIjoKICAgICAgICAgICAgY2FzZSAiZl90IjoKICAgICAgICAgICAgY2FzZSAiVF9oIjoKICAgICAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gZ2x5cGhOYW1lLnJlcGxhY2VBbGwoIl8iLCAiIik7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgY29kZSA9PT0gK2NoYXJjb2RlKSB7CiAgICAgICAgICBjb25zdCBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgJiYgKGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyY29kZV0pKSB7CiAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b1VuaWNvZGU7CiAgfQogIGFzeW5jIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHsKICAgIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZT8ubGVuZ3RoID4gMDsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUgJiYgcHJvcGVydGllcy5oYXNFbmNvZGluZykgewogICAgICAgIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUgPSB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wZXJ0aWVzLnRvVW5pY29kZTsKICAgIH0KICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzKSk7CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUgJiYgKHByb3BlcnRpZXMuY01hcC5idWlsdEluQ01hcCAmJiAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvPy5yZWdpc3RyeSA9PT0gIkFkb2JlIiAmJiAocHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiR0IxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJDTlMxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJKYXBhbjEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIktvcmVhMSIpKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVnaXN0cnksCiAgICAgICAgb3JkZXJpbmcKICAgICAgfSA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mbzsKICAgICAgY29uc3QgdWNzMkNNYXBOYW1lID0gTmFtZS5nZXQoYCR7cmVnaXN0cnl9LSR7b3JkZXJpbmd9LVVDUzJgKTsKICAgICAgY29uc3QgdWNzMkNNYXAgPSBhd2FpdCBDTWFwRmFjdG9yeS5jcmVhdGUoewogICAgICAgIGVuY29kaW5nOiB1Y3MyQ01hcE5hbWUsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIGNvbnN0IHRvVW5pY29kZSA9IFtdLAogICAgICAgIGJ1ZiA9IFtdOwogICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkgewogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBjb25zdCB1Y3MyID0gdWNzMkNNYXAubG9va3VwKGNpZCk7CiAgICAgICAgaWYgKHVjczIpIHsKICAgICAgICAgIGJ1Zi5sZW5ndGggPSAwOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdWNzMi5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICAgIGJ1Zi5wdXNoKCh1Y3MyLmNoYXJDb2RlQXQoaSkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoaSArIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodG9Vbmljb2RlKTsKICAgIH0KICAgIHJldHVybiBuZXcgSWRlbnRpdHlUb1VuaWNvZGVNYXAocHJvcGVydGllcy5maXJzdENoYXIsIHByb3BlcnRpZXMubGFzdENoYXIpOwogIH0KICBhc3luYyByZWFkVG9Vbmljb2RlKGNtYXBPYmopIHsKICAgIGlmICghY21hcE9iaikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjbWFwT2JqIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCiAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICB9KTsKICAgICAgaWYgKGNtYXAgaW5zdGFuY2VvZiBJZGVudGl0eUNNYXApIHsKICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAoY21hcC5nZXRNYXAoKSk7CiAgICB9CiAgICBpZiAoY21hcE9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICAgIGVuY29kaW5nOiBjbWFwT2JqLAogICAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICAgIH0pOwogICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheShjbWFwLmxlbmd0aCk7CiAgICAgICAgY21hcC5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdG9rZW4pIHsKICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCh0b2tlbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi5sZW5ndGggJSAyICE9PSAwKSB7CiAgICAgICAgICAgIHRva2VuID0gIlx1MDAwMCIgKyB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0ciA9IFtdOwogICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0b2tlbi5sZW5ndGg7IGsgKz0gMikgewogICAgICAgICAgICBjb25zdCB3MSA9IHRva2VuLmNoYXJDb2RlQXQoaykgPDwgOCB8IHRva2VuLmNoYXJDb2RlQXQoayArIDEpOwogICAgICAgICAgICBpZiAoKHcxICYgMHhmODAwKSAhPT0gMHhkODAwKSB7CiAgICAgICAgICAgICAgc3RyLnB1c2godzEpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGsgKz0gMjsKICAgICAgICAgICAgY29uc3QgdzIgPSB0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDggfCB0b2tlbi5jaGFyQ29kZUF0KGsgKyAxKTsKICAgICAgICAgICAgc3RyLnB1c2goKCh3MSAmIDB4M2ZmKSA8PCAxMCkgKyAodzIgJiAweDNmZikgKyAweDEwMDAwKTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5zdHIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB3YXJuKGByZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlYWRDaWRUb0dpZE1hcChnbHlwaHNEYXRhLCB0b1VuaWNvZGUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChsZXQgaiA9IDAsIGpqID0gZ2x5cGhzRGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIGNvbnN0IGdseXBoSUQgPSBnbHlwaHNEYXRhW2orK10gPDwgOCB8IGdseXBoc0RhdGFbal07CiAgICAgIGNvbnN0IGNvZGUgPSBqID4+IDE7CiAgICAgIGlmIChnbHlwaElEID09PSAwICYmICF0b1VuaWNvZGUuaGFzKGNvZGUpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmVzdWx0W2NvZGVdID0gZ2x5cGhJRDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgcHJvcGVydGllcykgewogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGxldCBnbHlwaHNXaWR0aHMgPSBbXTsKICAgIGxldCBkZWZhdWx0V2lkdGggPSAwOwogICAgY29uc3QgZ2x5cGhzVk1ldHJpY3MgPSBbXTsKICAgIGxldCBkZWZhdWx0Vk1ldHJpY3M7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgZHcgPSBkaWN0LmdldCgiRFciKTsKICAgICAgZGVmYXVsdFdpZHRoID0gdHlwZW9mIGR3ID09PSAibnVtYmVyIiA/IE1hdGguY2VpbChkdykgOiAxMDAwOwogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiVyIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aWR0aHMpKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGxldCBzdGFydCA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaSsrXSk7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29kZSkpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvZGUpIHsKICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHhyZWYuZmV0Y2hJZlJlZihjKTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW3N0YXJ0XSA9IHdpZHRoOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIoY29kZSkpIHsKICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzWysraV0pOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGogPSBzdGFydDsgaiA8PSBjb2RlOyBqKyspIHsKICAgICAgICAgICAgICBnbHlwaHNXaWR0aHNbal0gPSB3aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLnZlcnRpY2FsKSB7CiAgICAgICAgY29uc3QgZHcyID0gZGljdC5nZXRBcnJheSgiRFcyIik7CiAgICAgICAgbGV0IHZtZXRyaWNzID0gaXNOdW1iZXJBcnJheShkdzIsIDIpID8gZHcyIDogWzg4MCwgLTEwMDBdOwogICAgICAgIGRlZmF1bHRWTWV0cmljcyA9IFt2bWV0cmljc1sxXSwgZGVmYXVsdFdpZHRoICogMC41LCB2bWV0cmljc1swXV07CiAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldCgiVzIiKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2bWV0cmljcykpIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZtZXRyaWNzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgbGV0IHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2krK10pOwogICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpXSk7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvZGUpKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY29kZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICBjb25zdCB2bWV0cmljID0gW3hyZWYuZmV0Y2hJZlJlZihjb2RlW2orK10pLCB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbal0pXTsKICAgICAgICAgICAgICAgIGlmIChpc051bWJlckFycmF5KHZtZXRyaWMsIG51bGwpKSB7CiAgICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0XSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgICAgICAgY29uc3Qgdm1ldHJpYyA9IFt4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSwgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pXTsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyQXJyYXkodm1ldHJpYywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7CiAgICAgICAgICAgICAgICBnbHlwaHNWTWV0cmljc1tqXSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHdpZHRocykpIHsKICAgICAgICBsZXQgaiA9IHByb3BlcnRpZXMuZmlyc3RDaGFyOwogICAgICAgIGZvciAoY29uc3QgdyBvZiB3aWR0aHMpIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0geHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgaWYgKHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICB9CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1pc3NpbmdXaWR0aCA9IGRlc2NyaXB0b3IuZ2V0KCJNaXNzaW5nV2lkdGgiKTsKICAgICAgICBkZWZhdWx0V2lkdGggPSB0eXBlb2YgbWlzc2luZ1dpZHRoID09PSAibnVtYmVyIiA/IG1pc3NpbmdXaWR0aCA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKGJhc2VGb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUubmFtZSk7CiAgICAgICAgICBnbHlwaHNXaWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBwcm9wZXJ0aWVzKTsKICAgICAgICAgIGRlZmF1bHRXaWR0aCA9IG1ldHJpY3MuZGVmYXVsdFdpZHRoOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGV0IGlzTW9ub3NwYWNlID0gdHJ1ZTsKICAgIGxldCBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgZm9yIChjb25zdCBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoc1dpZHRoc1tnbHlwaF07CiAgICAgIGlmICghZ2x5cGhXaWR0aCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghZmlyc3RXaWR0aCkgewogICAgICAgIGZpcnN0V2lkdGggPSBnbHlwaFdpZHRoOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChmaXJzdFdpZHRoICE9PSBnbHlwaFdpZHRoKSB7CiAgICAgICAgaXNNb25vc3BhY2UgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGlzTW9ub3NwYWNlKSB7CiAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gRm9udEZsYWdzLkZpeGVkUGl0Y2g7CiAgICB9IGVsc2UgewogICAgICBwcm9wZXJ0aWVzLmZsYWdzICY9IH5Gb250RmxhZ3MuRml4ZWRQaXRjaDsKICAgIH0KICAgIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgcHJvcGVydGllcy53aWR0aHMgPSBnbHlwaHNXaWR0aHM7CiAgICBwcm9wZXJ0aWVzLmRlZmF1bHRWTWV0cmljcyA9IGRlZmF1bHRWTWV0cmljczsKICAgIHByb3BlcnRpZXMudm1ldHJpY3MgPSBnbHlwaHNWTWV0cmljczsKICB9CiAgaXNTZXJpZkZvbnQoYmFzZUZvbnROYW1lKSB7CiAgICBjb25zdCBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoIi0iLCAxKVswXTsKICAgIHJldHVybiBmb250TmFtZVdvU3R5bGUgaW4gZ2V0U2VyaWZGb250cygpIHx8IC9zZXJpZi9naS50ZXN0KGZvbnROYW1lV29TdHlsZSk7CiAgfQogIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7CiAgICBsZXQgZGVmYXVsdFdpZHRoID0gMDsKICAgIGxldCB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IG1vbm9zcGFjZSA9IGZhbHNlOwogICAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTsKICAgIGxldCBsb29rdXBOYW1lID0gc3RkRm9udE1hcFtuYW1lXSB8fCBuYW1lOwogICAgY29uc3QgTWV0cmljcyA9IGdldE1ldHJpY3MoKTsKICAgIGlmICghKGxvb2t1cE5hbWUgaW4gTWV0cmljcykpIHsKICAgICAgbG9va3VwTmFtZSA9IHRoaXMuaXNTZXJpZkZvbnQobmFtZSkgPyAiVGltZXMtUm9tYW4iIDogIkhlbHZldGljYSI7CiAgICB9CiAgICBjb25zdCBnbHlwaFdpZHRocyA9IE1ldHJpY3NbbG9va3VwTmFtZV07CiAgICBpZiAodHlwZW9mIGdseXBoV2lkdGhzID09PSAibnVtYmVyIikgewogICAgICBkZWZhdWx0V2lkdGggPSBnbHlwaFdpZHRoczsKICAgICAgbW9ub3NwYWNlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHdpZHRocyA9IGdseXBoV2lkdGhzKCk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBkZWZhdWx0V2lkdGgsCiAgICAgIG1vbm9zcGFjZSwKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBidWlsZENoYXJDb2RlVG9XaWR0aCh3aWR0aHNCeUdseXBoTmFtZSwgcHJvcGVydGllcykgewogICAgY29uc3Qgd2lkdGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7CiAgICBmb3IgKGxldCBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7CiAgICAgIGlmIChjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcyAmJiB3aWR0aHNCeUdseXBoTmFtZVtkaWZmZXJlbmNlc1tjaGFyQ29kZV1dKSB7CiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoYXJDb2RlIGluIGVuY29kaW5nICYmIHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV0pIHsKICAgICAgICB3aWR0aHNbY2hhckNvZGVdID0gd2lkdGhzQnlHbHlwaE5hbWVbZW5jb2RpbmdbY2hhckNvZGVdXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdpZHRoczsKICB9CiAgcHJlRXZhbHVhdGVGb250KGRpY3QpIHsKICAgIGNvbnN0IGJhc2VEaWN0ID0gZGljdDsKICAgIGxldCB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7CiAgICB9CiAgICBsZXQgY29tcG9zaXRlID0gZmFsc2U7CiAgICBsZXQgaGFzaDsKICAgIGlmICh0eXBlLm5hbWUgPT09ICJUeXBlMCIpIHsKICAgICAgY29uc3QgZGYgPSBkaWN0LmdldCgiRGVzY2VuZGFudEZvbnRzIik7CiAgICAgIGlmICghZGYpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgfQogICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjsKICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnQgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKICAgICAgfQogICAgICB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOwogICAgICB9CiAgICAgIGNvbXBvc2l0ZSA9IHRydWU7CiAgICB9CiAgICBsZXQgZmlyc3RDaGFyID0gZGljdC5nZXQoIkZpcnN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0Q2hhcikpIHsKICAgICAgZmlyc3RDaGFyID0gMDsKICAgIH0KICAgIGxldCBsYXN0Q2hhciA9IGRpY3QuZ2V0KCJMYXN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxhc3RDaGFyKSkgewogICAgICBsYXN0Q2hhciA9IGNvbXBvc2l0ZSA/IDB4ZmZmZiA6IDB4ZmY7CiAgICB9CiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGljdC5nZXQoIkZvbnREZXNjcmlwdG9yIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBkaWN0LmdldCgiVG9Vbmljb2RlIikgfHwgYmFzZURpY3QuZ2V0KCJUb1VuaWNvZGUiKTsKICAgIGlmIChkZXNjcmlwdG9yKSB7CiAgICAgIGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKTsKICAgICAgY29uc3QgZW5jb2RpbmcgPSBiYXNlRGljdC5nZXRSYXcoIkVuY29kaW5nIik7CiAgICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBoYXNoLnVwZGF0ZShlbmNvZGluZy5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLnRvU3RyaW5nKCkpOwogICAgICB9IGVsc2UgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW5jb2RpbmcuZ2V0UmF3VmFsdWVzKCkpIHsKICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkubmFtZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5LnRvU3RyaW5nKCkpOwogICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkgewogICAgICAgICAgICBjb25zdCBkaWZmTGVuZ3RoID0gZW50cnkubGVuZ3RoLAogICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGlmZkxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgZGlmZkVudHJ5ID0gZW50cnlbal07CiAgICAgICAgICAgICAgaWYgKGRpZmZFbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkubmFtZTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkaWZmRW50cnkgPT09ICJudW1iZXIiIHx8IGRpZmZFbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS50b1N0cmluZygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoYXNoLnVwZGF0ZShkaWZmQnVmLmpvaW4oKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhc2gudXBkYXRlKGAke2ZpcnN0Q2hhcn0tJHtsYXN0Q2hhcn1gKTsKICAgICAgaWYgKHRvVW5pY29kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTsKICAgICAgICBjb25zdCB1aW50OGFycmF5ID0gc3RyZWFtLmJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KHN0cmVhbS5ieXRlcy5idWZmZXIsIHN0cmVhbS5zdGFydCwgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CiAgICAgIH0gZWxzZSBpZiAodG9Vbmljb2RlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTsKICAgICAgfQogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIikgfHwgYmFzZURpY3QuZ2V0KCJXaWR0aHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgIGNvbnN0IHdpZHRoc0J1ZiA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygd2lkdGhzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAibnVtYmVyIiB8fCBlbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICB3aWR0aHNCdWYucHVzaChlbnRyeS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaGFzaC51cGRhdGUod2lkdGhzQnVmLmpvaW4oKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICAgIGhhc2gudXBkYXRlKCJjb21wb3NpdGVGb250Iik7CiAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGhzID0gZGljdC5nZXQoIlciKSB8fCBiYXNlRGljdC5nZXQoIlciKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb21wb3NpdGVXaWR0aHMpKSB7CiAgICAgICAgICBjb25zdCB3aWR0aHNCdWYgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29tcG9zaXRlV2lkdGhzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICJudW1iZXIiIHx8IGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgd2lkdGhzQnVmLnB1c2goZW50cnkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgICAgICAgICAgICBjb25zdCBzdWJXaWR0aHNCdWYgPSBbXTsKICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZW50cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gIm51bWJlciIgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgICBzdWJXaWR0aHNCdWYucHVzaChlbGVtZW50LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB3aWR0aHNCdWYucHVzaChgWyR7c3ViV2lkdGhzQnVmLmpvaW4oKX1dYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGhhc2gudXBkYXRlKHdpZHRoc0J1Zi5qb2luKCkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IGRpY3QuZ2V0UmF3KCJDSURUb0dJRE1hcCIpIHx8IGJhc2VEaWN0LmdldFJhdygiQ0lEVG9HSURNYXAiKTsKICAgICAgICBpZiAoY2lkVG9HaWRNYXAgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC5uYW1lKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC50b1N0cmluZygpKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgaGFzaC51cGRhdGUoY2lkVG9HaWRNYXAucGVla0J5dGVzKCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgZGVzY3JpcHRvciwKICAgICAgZGljdCwKICAgICAgYmFzZURpY3QsCiAgICAgIGNvbXBvc2l0ZSwKICAgICAgdHlwZTogdHlwZS5uYW1lLAogICAgICBmaXJzdENoYXIsCiAgICAgIGxhc3RDaGFyLAogICAgICB0b1VuaWNvZGUsCiAgICAgIGhhc2g6IGhhc2ggPyBoYXNoLmhleGRpZ2VzdCgpIDogIiIKICAgIH07CiAgfQogIGFzeW5jIHRyYW5zbGF0ZUZvbnQoewogICAgZGVzY3JpcHRvciwKICAgIGRpY3QsCiAgICBiYXNlRGljdCwKICAgIGNvbXBvc2l0ZSwKICAgIHR5cGUsCiAgICBmaXJzdENoYXIsCiAgICBsYXN0Q2hhciwKICAgIHRvVW5pY29kZSwKICAgIGNzc0ZvbnRJbmZvCiAgfSkgewogICAgY29uc3QgaXNUeXBlM0ZvbnQgPSB0eXBlID09PSAiVHlwZTMiOwogICAgaWYgKCFkZXNjcmlwdG9yKSB7CiAgICAgIGlmIChpc1R5cGUzRm9udCkgewogICAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IiksIFswLCAwLCAwLCAwXSk7CiAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBEaWN0KG51bGwpOwogICAgICAgIGRlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIE5hbWUuZ2V0KHR5cGUpKTsKICAgICAgICBkZXNjcmlwdG9yLnNldCgiRm9udEJCb3giLCBiYm94KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKCEoYmFzZUZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFzZSBmb250IGlzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9CiAgICAgICAgYmFzZUZvbnROYW1lID0gYmFzZUZvbnROYW1lLm5hbWUucmVwbGFjZUFsbCgvWyxfXS9nLCAiLSIpOwogICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUpOwogICAgICAgIGNvbnN0IGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdCgiLSIsIDEpWzBdOwogICAgICAgIGNvbnN0IGZsYWdzID0gKHRoaXMuaXNTZXJpZkZvbnQoZm9udE5hbWVXb1N0eWxlKSA/IEZvbnRGbGFncy5TZXJpZiA6IDApIHwgKG1ldHJpY3MubW9ub3NwYWNlID8gRm9udEZsYWdzLkZpeGVkUGl0Y2ggOiAwKSB8IChnZXRTeW1ib2xzRm9udHMoKVtmb250TmFtZVdvU3R5bGVdID8gRm9udEZsYWdzLlN5bWJvbGljIDogRm9udEZsYWdzLk5vbnN5bWJvbGljKTsKICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgICAgICAgdHlwZSwKICAgICAgICAgIG5hbWU6IGJhc2VGb250TmFtZSwKICAgICAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgICAgICBzeXN0ZW1Gb250SW5mbzogbnVsbCwKICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsCiAgICAgICAgICBkZWZhdWx0V2lkdGg6IG1ldHJpY3MuZGVmYXVsdFdpZHRoLAogICAgICAgICAgaXNTaW11bGF0ZWRGbGFnczogdHJ1ZSwKICAgICAgICAgIGZsYWdzLAogICAgICAgICAgZmlyc3RDaGFyLAogICAgICAgICAgbGFzdENoYXIsCiAgICAgICAgICB0b1VuaWNvZGUsCiAgICAgICAgICB4SGVpZ2h0OiAwLAogICAgICAgICAgY2FwSGVpZ2h0OiAwLAogICAgICAgICAgaXRhbGljQW5nbGU6IDAsCiAgICAgICAgICBpc1R5cGUzRm9udAogICAgICAgIH07CiAgICAgICAgY29uc3Qgd2lkdGhzID0gZGljdC5nZXQoIldpZHRocyIpOwogICAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSBnZXRTdGFuZGFyZEZvbnROYW1lKGJhc2VGb250TmFtZSk7CiAgICAgICAgbGV0IGZpbGUgPSBudWxsOwogICAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgICBmaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250ID0gISFmaWxlOwogICAgICAgIH0KICAgICAgICBpZiAoIXByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQgJiYgdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzKSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLnN5c3RlbUZvbnRJbmZvID0gZ2V0Rm9udFN1YnN0aXR1dGlvbih0aGlzLnN5c3RlbUZvbnRDYWNoZSwgdGhpcy5pZEZhY3RvcnksIHRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsLCBiYXNlRm9udE5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgcHJvcGVydGllcyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBbXTsKICAgICAgICAgIGxldCBqID0gZmlyc3RDaGFyOwogICAgICAgICAgZm9yIChjb25zdCB3IG9mIHdpZHRocykgewogICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGdseXBoV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaisrOwogICAgICAgICAgfQogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRoczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBuZXdQcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBGb250KGJhc2VGb250TmFtZSwgZmlsZSwgbmV3UHJvcGVydGllcywgdGhpcy5vcHRpb25zKTsKICAgICAgfQogICAgfQogICAgbGV0IGZvbnROYW1lID0gZGVzY3JpcHRvci5nZXQoIkZvbnROYW1lIik7CiAgICBsZXQgYmFzZUZvbnQgPSBkaWN0LmdldCgiQmFzZUZvbnQiKTsKICAgIGlmICh0eXBlb2YgZm9udE5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIGZvbnROYW1lID0gTmFtZS5nZXQoZm9udE5hbWUpOwogICAgfQogICAgaWYgKHR5cGVvZiBiYXNlRm9udCA9PT0gInN0cmluZyIpIHsKICAgICAgYmFzZUZvbnQgPSBOYW1lLmdldChiYXNlRm9udCk7CiAgICB9CiAgICBjb25zdCBmb250TmFtZVN0ciA9IGZvbnROYW1lPy5uYW1lOwogICAgY29uc3QgYmFzZUZvbnRTdHIgPSBiYXNlRm9udD8ubmFtZTsKICAgIGlmICghaXNUeXBlM0ZvbnQgJiYgZm9udE5hbWVTdHIgIT09IGJhc2VGb250U3RyKSB7CiAgICAgIGluZm8oYFRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzICIke2ZvbnROYW1lU3RyfSIgYnV0IGAgKyBgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250J3MgQmFzZUZvbnQgIiR7YmFzZUZvbnRTdHJ9Ii5gKTsKICAgICAgaWYgKGZvbnROYW1lU3RyICYmIGJhc2VGb250U3RyICYmIChiYXNlRm9udFN0ci5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSB8fCAhaXNLbm93bkZvbnROYW1lKGZvbnROYW1lU3RyKSAmJiBpc0tub3duRm9udE5hbWUoYmFzZUZvbnRTdHIpKSkgewogICAgICAgIGZvbnROYW1lID0gbnVsbDsKICAgICAgfQogICAgfQogICAgZm9udE5hbWUgfHw9IGJhc2VGb250OwogICAgaWYgKCEoZm9udE5hbWUgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBuYW1lIik7CiAgICB9CiAgICBsZXQgZm9udEZpbGUsIHN1YnR5cGUsIGxlbmd0aDEsIGxlbmd0aDIsIGxlbmd0aDM7CiAgICB0cnkgewogICAgICBmb250RmlsZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250RmlsZSIsICJGb250RmlsZTIiLCAiRm9udEZpbGUzIik7CiAgICAgIGlmIChmb250RmlsZSkgewogICAgICAgIGlmICghKGZvbnRGaWxlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRm9udEZpbGUgc2hvdWxkIGJlIGEgc3RyZWFtIik7CiAgICAgICAgfSBlbHNlIGlmIChmb250RmlsZS5pc0VtcHR5KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkZvbnRGaWxlIGlzIGVtcHR5Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGB0cmFuc2xhdGVGb250IC0gZmV0Y2hpbmcgIiR7Zm9udE5hbWUubmFtZX0iIGZvbnQgZmlsZTogIiR7ZXh9Ii5gKTsKICAgICAgZm9udEZpbGUgPSBudWxsOwogICAgfQogICAgbGV0IGlzSW50ZXJuYWxGb250ID0gZmFsc2U7CiAgICBsZXQgZ2x5cGhTY2FsZUZhY3RvcnMgPSBudWxsOwogICAgbGV0IHN5c3RlbUZvbnRJbmZvID0gbnVsbDsKICAgIGlmIChmb250RmlsZSkgewogICAgICBpZiAoZm9udEZpbGUuZGljdCkgewogICAgICAgIGNvbnN0IHN1YnR5cGVFbnRyeSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgaWYgKHN1YnR5cGVFbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIHN1YnR5cGUgPSBzdWJ0eXBlRW50cnkubmFtZTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoMSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgxIik7CiAgICAgICAgbGVuZ3RoMiA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgyIik7CiAgICAgICAgbGVuZ3RoMyA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgzIik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY3NzRm9udEluZm8pIHsKICAgICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZSA9IGdldFhmYUZvbnROYW1lKGZvbnROYW1lLm5hbWUpOwogICAgICBpZiAoc3RhbmRhcmRGb250TmFtZSkgewogICAgICAgIGNzc0ZvbnRJbmZvLmZvbnRGYW1pbHkgPSBgJHtjc3NGb250SW5mby5mb250RmFtaWx5fS1QZGZKUy1YRkFgOwogICAgICAgIGNzc0ZvbnRJbmZvLm1ldHJpY3MgPSBzdGFuZGFyZEZvbnROYW1lLm1ldHJpY3MgfHwgbnVsbDsKICAgICAgICBnbHlwaFNjYWxlRmFjdG9ycyA9IHN0YW5kYXJkRm9udE5hbWUuZmFjdG9ycyB8fCBudWxsOwogICAgICAgIGZvbnRGaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZS5uYW1lKTsKICAgICAgICBpc0ludGVybmFsRm9udCA9ICEhZm9udEZpbGU7CiAgICAgICAgYmFzZURpY3QgPSBkaWN0ID0gZ2V0WGZhRm9udERpY3QoZm9udE5hbWUubmFtZSk7CiAgICAgICAgY29tcG9zaXRlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmICghaXNUeXBlM0ZvbnQpIHsKICAgICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZSA9IGdldFN0YW5kYXJkRm9udE5hbWUoZm9udE5hbWUubmFtZSk7CiAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgZm9udEZpbGUgPSBhd2FpdCB0aGlzLmZldGNoU3RhbmRhcmRGb250RGF0YShzdGFuZGFyZEZvbnROYW1lKTsKICAgICAgICBpc0ludGVybmFsRm9udCA9ICEhZm9udEZpbGU7CiAgICAgIH0KICAgICAgaWYgKCFpc0ludGVybmFsRm9udCAmJiB0aGlzLm9wdGlvbnMudXNlU3lzdGVtRm9udHMpIHsKICAgICAgICBzeXN0ZW1Gb250SW5mbyA9IGdldEZvbnRTdWJzdGl0dXRpb24odGhpcy5zeXN0ZW1Gb250Q2FjaGUsIHRoaXMuaWRGYWN0b3J5LCB0aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCwgZm9udE5hbWUubmFtZSwgc3RhbmRhcmRGb250TmFtZSwgdHlwZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZvbnRNYXRyaXggPSBsb29rdXBNYXRyaXgoZGljdC5nZXRBcnJheSgiRm9udE1hdHJpeCIpLCBGT05UX0lERU5USVRZX01BVFJJWCk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChkZXNjcmlwdG9yLmdldEFycmF5KCJGb250QkJveCIpIHx8IGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IiksIHVuZGVmaW5lZCk7CiAgICBsZXQgYXNjZW50ID0gZGVzY3JpcHRvci5nZXQoIkFzY2VudCIpOwogICAgaWYgKHR5cGVvZiBhc2NlbnQgIT09ICJudW1iZXIiKSB7CiAgICAgIGFzY2VudCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGxldCBkZXNjZW50ID0gZGVzY3JpcHRvci5nZXQoIkRlc2NlbnQiKTsKICAgIGlmICh0eXBlb2YgZGVzY2VudCAhPT0gIm51bWJlciIpIHsKICAgICAgZGVzY2VudCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGxldCB4SGVpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIlhIZWlnaHQiKTsKICAgIGlmICh0eXBlb2YgeEhlaWdodCAhPT0gIm51bWJlciIpIHsKICAgICAgeEhlaWdodCA9IDA7CiAgICB9CiAgICBsZXQgY2FwSGVpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIkNhcEhlaWdodCIpOwogICAgaWYgKHR5cGVvZiBjYXBIZWlnaHQgIT09ICJudW1iZXIiKSB7CiAgICAgIGNhcEhlaWdodCA9IDA7CiAgICB9CiAgICBsZXQgZmxhZ3MgPSBkZXNjcmlwdG9yLmdldCgiRmxhZ3MiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmbGFncykpIHsKICAgICAgZmxhZ3MgPSAwOwogICAgfQogICAgbGV0IGl0YWxpY0FuZ2xlID0gZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIik7CiAgICBpZiAodHlwZW9mIGl0YWxpY0FuZ2xlICE9PSAibnVtYmVyIikgewogICAgICBpdGFsaWNBbmdsZSA9IDA7CiAgICB9CiAgICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgICB0eXBlLAogICAgICBuYW1lOiBmb250TmFtZS5uYW1lLAogICAgICBzdWJ0eXBlLAogICAgICBmaWxlOiBmb250RmlsZSwKICAgICAgbGVuZ3RoMSwKICAgICAgbGVuZ3RoMiwKICAgICAgbGVuZ3RoMywKICAgICAgaXNJbnRlcm5hbEZvbnQsCiAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgIGNvbXBvc2l0ZSwKICAgICAgZml4ZWRQaXRjaDogZmFsc2UsCiAgICAgIGZvbnRNYXRyaXgsCiAgICAgIGZpcnN0Q2hhciwKICAgICAgbGFzdENoYXIsCiAgICAgIHRvVW5pY29kZSwKICAgICAgYmJveCwKICAgICAgYXNjZW50LAogICAgICBkZXNjZW50LAogICAgICB4SGVpZ2h0LAogICAgICBjYXBIZWlnaHQsCiAgICAgIGZsYWdzLAogICAgICBpdGFsaWNBbmdsZSwKICAgICAgaXNUeXBlM0ZvbnQsCiAgICAgIGNzc0ZvbnRJbmZvLAogICAgICBzY2FsZUZhY3RvcnM6IGdseXBoU2NhbGVGYWN0b3JzLAogICAgICBzeXN0ZW1Gb250SW5mbwogICAgfTsKICAgIGlmIChjb21wb3NpdGUpIHsKICAgICAgY29uc3QgY2lkRW5jb2RpbmcgPSBiYXNlRGljdC5nZXQoIkVuY29kaW5nIik7CiAgICAgIGlmIChjaWRFbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBwcm9wZXJ0aWVzLmNpZEVuY29kaW5nID0gY2lkRW5jb2RpbmcubmFtZTsKICAgICAgfQogICAgICBjb25zdCBjTWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICBlbmNvZGluZzogY2lkRW5jb2RpbmcsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIHByb3BlcnRpZXMuY01hcCA9IGNNYXA7CiAgICAgIHByb3BlcnRpZXMudmVydGljYWwgPSBwcm9wZXJ0aWVzLmNNYXAudmVydGljYWw7CiAgICB9CiAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgcHJvcGVydGllcyk7CiAgICB0aGlzLmV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgbmV3UHJvcGVydGllcyk7CiAgICByZXR1cm4gbmV3IEZvbnQoZm9udE5hbWUubmFtZSwgZm9udEZpbGUsIG5ld1Byb3BlcnRpZXMsIHRoaXMub3B0aW9ucyk7CiAgfQogIHN0YXRpYyBidWlsZEZvbnRQYXRocyhmb250LCBnbHlwaHMsIGhhbmRsZXIsIGV2YWx1YXRvck9wdGlvbnMpIHsKICAgIGZ1bmN0aW9uIGJ1aWxkUGF0aChmb250Q2hhcikgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSBgJHtmb250LmxvYWRlZE5hbWV9X3BhdGhfJHtmb250Q2hhcn1gOwogICAgICB0cnkgewogICAgICAgIGlmIChmb250LnJlbmRlcmVyLmhhc0J1aWx0UGF0aChmb250Q2hhcikpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbZ2x5cGhOYW1lLCAiRm9udFBhdGgiLCBmb250LnJlbmRlcmVyLmdldFBhdGhKcyhmb250Q2hhcildKTsKICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgaWYgKGV2YWx1YXRvck9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB3YXJuKGBidWlsZEZvbnRQYXRocyAtIGlnbm9yaW5nICR7Z2x5cGhOYW1lfSBnbHlwaDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKICAgICAgYnVpbGRQYXRoKGdseXBoLmZvbnRDaGFyKTsKICAgICAgY29uc3QgYWNjZW50ID0gZ2x5cGguYWNjZW50OwogICAgICBpZiAoYWNjZW50Py5mb250Q2hhcikgewogICAgICAgIGJ1aWxkUGF0aChhY2NlbnQuZm9udENoYXIpOwogICAgICB9CiAgICB9CiAgfQogIHN0YXRpYyBnZXQgZmFsbGJhY2tGb250RGljdCgpIHsKICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCgpOwogICAgZGljdC5zZXQoIkJhc2VGb250IiwgTmFtZS5nZXQoIkhlbHZldGljYSIpKTsKICAgIGRpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJFbmNvZGluZyIsIE5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmYWxsYmFja0ZvbnREaWN0IiwgZGljdCk7CiAgfQp9CmNsYXNzIFRyYW5zbGF0ZWRGb250IHsKICAjc2VudCA9IGZhbHNlOwogICN0eXBlM0xvYWRlZCA9IG51bGw7CiAgY29uc3RydWN0b3IoewogICAgbG9hZGVkTmFtZSwKICAgIGZvbnQsCiAgICBkaWN0CiAgfSkgewogICAgdGhpcy5sb2FkZWROYW1lID0gbG9hZGVkTmFtZTsKICAgIHRoaXMuZm9udCA9IGZvbnQ7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy50eXBlM0RlcGVuZGVuY2llcyA9IGZvbnQuaXNUeXBlM0ZvbnQgPyBuZXcgU2V0KCkgOiBudWxsOwogIH0KICBzZW5kKGhhbmRsZXIpIHsKICAgIGlmICh0aGlzLiNzZW50KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuI3NlbnQgPSB0cnVlOwogICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbdGhpcy5sb2FkZWROYW1lLCAiRm9udCIsIHRoaXMuZm9udC5leHBvcnREYXRhKCldKTsKICB9CiAgZmFsbGJhY2soaGFuZGxlciwgZXZhbHVhdG9yT3B0aW9ucykgewogICAgaWYgKCF0aGlzLmZvbnQuZGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmZvbnQuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTsKICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHModGhpcy5mb250LCB0aGlzLmZvbnQuZ2x5cGhDYWNoZVZhbHVlcywgaGFuZGxlciwgZXZhbHVhdG9yT3B0aW9ucyk7CiAgfQogIGxvYWRUeXBlM0RhdGEoZXZhbHVhdG9yLCByZXNvdXJjZXMsIHRhc2spIHsKICAgIGlmICh0aGlzLiN0eXBlM0xvYWRlZCkgewogICAgICByZXR1cm4gdGhpcy4jdHlwZTNMb2FkZWQ7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIGZvbnQsCiAgICAgIHR5cGUzRGVwZW5kZW5jaWVzCiAgICB9ID0gdGhpczsKICAgIGFzc2VydChmb250LmlzVHlwZTNGb250LCAiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7CiAgICBjb25zdCB0eXBlM0V2YWx1YXRvciA9IGV2YWx1YXRvci5jbG9uZSh7CiAgICAgIGlnbm9yZUVycm9yczogZmFsc2UKICAgIH0pOwogICAgY29uc3QgdHlwZTNGb250UmVmcyA9IG5ldyBSZWZTZXQoZXZhbHVhdG9yLnR5cGUzRm9udFJlZnMpOwogICAgaWYgKHRoaXMuZGljdC5vYmpJZCAmJiAhdHlwZTNGb250UmVmcy5oYXModGhpcy5kaWN0Lm9iaklkKSkgewogICAgICB0eXBlM0ZvbnRSZWZzLnB1dCh0aGlzLmRpY3Qub2JqSWQpOwogICAgfQogICAgdHlwZTNFdmFsdWF0b3IudHlwZTNGb250UmVmcyA9IHR5cGUzRm9udFJlZnM7CiAgICBsZXQgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgIGNvbnN0IGNoYXJQcm9jcyA9IHRoaXMuZGljdC5nZXQoIkNoYXJQcm9jcyIpOwogICAgY29uc3QgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlczsKICAgIGNvbnN0IGNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGZvbnRCQm94ID0gVXRpbC5ub3JtYWxpemVSZWN0KGZvbnQuYmJveCB8fCBbMCwgMCwgMCwgMF0pLAogICAgICB3aWR0aCA9IGZvbnRCQm94WzJdIC0gZm9udEJCb3hbMF0sCiAgICAgIGhlaWdodCA9IGZvbnRCQm94WzNdIC0gZm9udEJCb3hbMV07CiAgICBjb25zdCBmb250QkJveFNpemUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpOwogICAgZm9yIChjb25zdCBrZXkgb2YgY2hhclByb2NzLmdldEtleXMoKSkgewogICAgICBsb2FkQ2hhclByb2NzUHJvbWlzZSA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICAgIGNvbnN0IGdseXBoU3RyZWFtID0gY2hhclByb2NzLmdldChrZXkpOwogICAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgICAgICByZXR1cm4gdHlwZTNFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIHN0cmVhbTogZ2x5cGhTdHJlYW0sCiAgICAgICAgICB0YXNrLAogICAgICAgICAgcmVzb3VyY2VzOiBmb250UmVzb3VyY2VzLAogICAgICAgICAgb3BlcmF0b3JMaXN0CiAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yTGlzdC5mbkFycmF5WzBdKSB7CiAgICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kczoKICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVUeXBlM0NvbG9yT3BlcmF0b3JzKG9wZXJhdG9yTGlzdCwgZm9udEJCb3hTaXplKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBPUFMuc2V0Q2hhcldpZHRoOgogICAgICAgICAgICAgIGlmICghZm9udEJCb3hTaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNndWVzc1R5cGUzRm9udEJCb3gob3BlcmF0b3JMaXN0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gb3BlcmF0b3JMaXN0LmdldElSKCk7CiAgICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb3BlcmF0b3JMaXN0LmRlcGVuZGVuY2llcykgewogICAgICAgICAgICB0eXBlM0RlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CiAgICAgICAgICB9CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgd2FybihgVHlwZTMgZm9udCByZXNvdXJjZSAiJHtrZXl9IiBpcyBub3QgYXZhaWxhYmxlLmApOwogICAgICAgICAgY29uc3QgZHVtbXlPcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gZHVtbXlPcGVyYXRvckxpc3QuZ2V0SVIoKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICB0aGlzLiN0eXBlM0xvYWRlZCA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICBmb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gY2hhclByb2NPcGVyYXRvckxpc3Q7CiAgICAgIGlmICh0aGlzLl9iYm94KSB7CiAgICAgICAgZm9udC5pc0NoYXJCQm94ID0gdHJ1ZTsKICAgICAgICBmb250LmJib3ggPSB0aGlzLl9iYm94OwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0aGlzLiN0eXBlM0xvYWRlZDsKICB9CiAgI3JlbW92ZVR5cGUzQ29sb3JPcGVyYXRvcnMob3BlcmF0b3JMaXN0LCBmb250QkJveFNpemUgPSBOYU4pIHsKICAgIGNvbnN0IGNoYXJCQm94ID0gVXRpbC5ub3JtYWxpemVSZWN0KG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbMF0uc2xpY2UoMikpLAogICAgICB3aWR0aCA9IGNoYXJCQm94WzJdIC0gY2hhckJCb3hbMF0sCiAgICAgIGhlaWdodCA9IGNoYXJCQm94WzNdIC0gY2hhckJCb3hbMV07CiAgICBjb25zdCBjaGFyQkJveFNpemUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpOwogICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkgewogICAgICBvcGVyYXRvckxpc3QuZm5BcnJheS5zcGxpY2UoMCwgMSk7CiAgICAgIG9wZXJhdG9yTGlzdC5hcmdzQXJyYXkuc3BsaWNlKDAsIDEpOwogICAgfSBlbHNlIGlmIChmb250QkJveFNpemUgPT09IDAgfHwgTWF0aC5yb3VuZChjaGFyQkJveFNpemUgLyBmb250QkJveFNpemUpID49IDEwKSB7CiAgICAgIHRoaXMuX2Jib3ggPz89IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgICAgVXRpbC5yZWN0Qm91bmRpbmdCb3goLi4uY2hhckJCb3gsIHRoaXMuX2Jib3gpOwogICAgfQogICAgbGV0IGkgPSAwLAogICAgICBpaSA9IG9wZXJhdG9yTGlzdC5sZW5ndGg7CiAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgIHN3aXRjaCAob3BlcmF0b3JMaXN0LmZuQXJyYXlbaV0pIHsKICAgICAgICBjYXNlIE9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHM6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvclNwYWNlOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvclNwYWNlOgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjoKICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yTjoKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VHcmF5OgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZVJHQkNvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDTVlLQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDoKICAgICAgICBjYXNlIE9QUy5zZXRSZW5kZXJpbmdJbnRlbnQ6CiAgICAgICAgICBvcGVyYXRvckxpc3QuZm5BcnJheS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICBvcGVyYXRvckxpc3QuYXJnc0FycmF5LnNwbGljZShpLCAxKTsKICAgICAgICAgIGlpLS07CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6CiAgICAgICAgICBjb25zdCBbZ1N0YXRlT2JqXSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbaV07CiAgICAgICAgICBsZXQgaiA9IDAsCiAgICAgICAgICAgIGpqID0gZ1N0YXRlT2JqLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChqIDwgamopIHsKICAgICAgICAgICAgY29uc3QgW2dTdGF0ZUtleV0gPSBnU3RhdGVPYmpbal07CiAgICAgICAgICAgIHN3aXRjaCAoZ1N0YXRlS2V5KSB7CiAgICAgICAgICAgICAgY2FzZSAiVFIiOgogICAgICAgICAgICAgIGNhc2UgIlRSMiI6CiAgICAgICAgICAgICAgY2FzZSAiSFQiOgogICAgICAgICAgICAgIGNhc2UgIkJHIjoKICAgICAgICAgICAgICBjYXNlICJCRzIiOgogICAgICAgICAgICAgIGNhc2UgIlVDUiI6CiAgICAgICAgICAgICAgY2FzZSAiVUNSMiI6CiAgICAgICAgICAgICAgICBnU3RhdGVPYmouc3BsaWNlKGosIDEpOwogICAgICAgICAgICAgICAgamotLTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGorKzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICB9CiAgI2d1ZXNzVHlwZTNGb250QkJveChvcGVyYXRvckxpc3QpIHsKICAgIGxldCBpID0gMTsKICAgIGNvbnN0IGlpID0gb3BlcmF0b3JMaXN0Lmxlbmd0aDsKICAgIHdoaWxlIChpIDwgaWkpIHsKICAgICAgc3dpdGNoIChvcGVyYXRvckxpc3QuZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgT1BTLmNvbnN0cnVjdFBhdGg6CiAgICAgICAgICBjb25zdCBtaW5NYXggPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2ldWzJdOwogICAgICAgICAgdGhpcy5fYmJveCA/Pz0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldOwogICAgICAgICAgVXRpbC5yZWN0Qm91bmRpbmdCb3goLi4ubWluTWF4LCB0aGlzLl9iYm94KTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICB9Cn0KY2xhc3MgU3RhdGVNYW5hZ2VyIHsKICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUgPSBuZXcgRXZhbFN0YXRlKCkpIHsKICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7CiAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTsKICB9CiAgc2F2ZSgpIHsKICAgIGNvbnN0IG9sZCA9IHRoaXMuc3RhdGU7CiAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0aGlzLnN0YXRlKTsKICAgIHRoaXMuc3RhdGUgPSBvbGQuY2xvbmUoKTsKICB9CiAgcmVzdG9yZSgpIHsKICAgIGNvbnN0IHByZXYgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7CiAgICBpZiAocHJldikgewogICAgICB0aGlzLnN0YXRlID0gcHJldjsKICAgIH0KICB9CiAgdHJhbnNmb3JtKGFyZ3MpIHsKICAgIHRoaXMuc3RhdGUuY3RtID0gVXRpbC50cmFuc2Zvcm0odGhpcy5zdGF0ZS5jdG0sIGFyZ3MpOwogIH0KfQpjbGFzcyBUZXh0U3RhdGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KElERU5USVRZX01BVFJJWCk7CiAgICB0aGlzLmZvbnROYW1lID0gbnVsbDsKICAgIHRoaXMuZm9udFNpemUgPSAwOwogICAgdGhpcy5sb2FkZWROYW1lID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBGT05UX0lERU5USVRZX01BVFJJWDsKICAgIHRoaXMudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpOwogICAgdGhpcy50ZXh0TGluZU1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpOwogICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7CiAgICB0aGlzLndvcmRTcGFjaW5nID0gMDsKICAgIHRoaXMubGVhZGluZyA9IDA7CiAgICB0aGlzLnRleHRIU2NhbGUgPSAxOwogICAgdGhpcy50ZXh0UmlzZSA9IDA7CiAgfQogIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgewogICAgY29uc3QgbSA9IHRoaXMudGV4dE1hdHJpeDsKICAgIG1bMF0gPSBhOwogICAgbVsxXSA9IGI7CiAgICBtWzJdID0gYzsKICAgIG1bM10gPSBkOwogICAgbVs0XSA9IGU7CiAgICBtWzVdID0gZjsKICB9CiAgc2V0VGV4dExpbmVNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgewogICAgY29uc3QgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7CiAgICBtWzBdID0gYTsKICAgIG1bMV0gPSBiOwogICAgbVsyXSA9IGM7CiAgICBtWzNdID0gZDsKICAgIG1bNF0gPSBlOwogICAgbVs1XSA9IGY7CiAgfQogIHRyYW5zbGF0ZVRleHRNYXRyaXgoeCwgeSkgewogICAgY29uc3QgbSA9IHRoaXMudGV4dE1hdHJpeDsKICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTsKICAgIG1bNV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTsKICB9CiAgdHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoeCwgeSkgewogICAgY29uc3QgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7CiAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CiAgfQogIGNhcnJpYWdlUmV0dXJuKCkgewogICAgdGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLCAtdGhpcy5sZWFkaW5nKTsKICAgIHRoaXMudGV4dE1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKICB9CiAgY2xvbmUoKSB7CiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBjbG9uZS50ZXh0TWF0cml4ID0gdGhpcy50ZXh0TWF0cml4LnNsaWNlKCk7CiAgICBjbG9uZS50ZXh0TGluZU1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKICAgIGNsb25lLmZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXguc2xpY2UoKTsKICAgIHJldHVybiBjbG9uZTsKICB9Cn0KY2xhc3MgRXZhbFN0YXRlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShJREVOVElUWV9NQVRSSVgpOwogICAgdGhpcy5mb250ID0gbnVsbDsKICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMOwogICAgdGhpcy5fZmlsbENvbG9yU3BhY2UgPSB0aGlzLl9zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IG51bGw7CiAgICB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gbnVsbDsKICAgIHRoaXMuY3VycmVudFBvaW50WCA9IHRoaXMuY3VycmVudFBvaW50WSA9IDA7CiAgICB0aGlzLnBhdGhNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XSk7CiAgICB0aGlzLnBhdGhCdWZmZXIgPSBbXTsKICB9CiAgZ2V0IGZpbGxDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX2ZpbGxDb2xvclNwYWNlOwogIH0KICBzZXQgZmlsbENvbG9yU3BhY2UoY29sb3JTcGFjZSkgewogICAgdGhpcy5fZmlsbENvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CiAgfQogIGdldCBzdHJva2VDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2U7CiAgfQogIHNldCBzdHJva2VDb2xvclNwYWNlKGNvbG9yU3BhY2UpIHsKICAgIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZTsKICB9CiAgY2xvbmUoewogICAgbmV3UGF0aCA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBpZiAobmV3UGF0aCkgewogICAgICBjbG9uZS5wYXRoQnVmZmVyID0gW107CiAgICAgIGNsb25lLnBhdGhNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XSk7CiAgICB9CiAgICByZXR1cm4gY2xvbmU7CiAgfQp9CmNsYXNzIEV2YWx1YXRvclByZXByb2Nlc3NvciB7CiAgc3RhdGljIGdldCBvcE1hcCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wTWFwIiwgT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB7CiAgICAgIHc6IHsKICAgICAgICBpZDogT1BTLnNldExpbmVXaWR0aCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgSjogewogICAgICAgIGlkOiBPUFMuc2V0TGluZUNhcCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgajogewogICAgICAgIGlkOiBPUFMuc2V0TGluZUpvaW4sCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIE06IHsKICAgICAgICBpZDogT1BTLnNldE1pdGVyTGltaXQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQ6IHsKICAgICAgICBpZDogT1BTLnNldERhc2gsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJpOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRSZW5kZXJpbmdJbnRlbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGk6IHsKICAgICAgICBpZDogT1BTLnNldEZsYXRuZXNzLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBnczogewogICAgICAgIGlkOiBPUFMuc2V0R1N0YXRlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBxOiB7CiAgICAgICAgaWQ6IE9QUy5zYXZlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBROiB7CiAgICAgICAgaWQ6IE9QUy5yZXN0b3JlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBjbTogewogICAgICAgIGlkOiBPUFMudHJhbnNmb3JtLAogICAgICAgIG51bUFyZ3M6IDYsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBtOiB7CiAgICAgICAgaWQ6IE9QUy5tb3ZlVG8sCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGw6IHsKICAgICAgICBpZDogT1BTLmxpbmVUbywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgYzogewogICAgICAgIGlkOiBPUFMuY3VydmVUbywKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgdjogewogICAgICAgIGlkOiBPUFMuY3VydmVUbzIsCiAgICAgICAgbnVtQXJnczogNCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHk6IHsKICAgICAgICBpZDogT1BTLmN1cnZlVG8zLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBoOiB7CiAgICAgICAgaWQ6IE9QUy5jbG9zZVBhdGgsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJlOiB7CiAgICAgICAgaWQ6IE9QUy5yZWN0YW5nbGUsCiAgICAgICAgbnVtQXJnczogNCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFM6IHsKICAgICAgICBpZDogT1BTLnN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgczogewogICAgICAgIGlkOiBPUFMuY2xvc2VTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGY6IHsKICAgICAgICBpZDogT1BTLmZpbGwsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEY6IHsKICAgICAgICBpZDogT1BTLmZpbGwsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICJmKiI6IHsKICAgICAgICBpZDogT1BTLmVvRmlsbCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQjogewogICAgICAgIGlkOiBPUFMuZmlsbFN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgIkIqIjogewogICAgICAgIGlkOiBPUFMuZW9GaWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBiOiB7CiAgICAgICAgaWQ6IE9QUy5jbG9zZUZpbGxTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICJiKiI6IHsKICAgICAgICBpZDogT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBuOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRQYXRoLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBXOiB7CiAgICAgICAgaWQ6IE9QUy5jbGlwLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiVyoiOiB7CiAgICAgICAgaWQ6IE9QUy5lb0NsaXAsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJUOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpblRleHQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVUOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRUZXh0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUYzogewogICAgICAgIGlkOiBPUFMuc2V0Q2hhclNwYWNpbmcsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFR3OiB7CiAgICAgICAgaWQ6IE9QUy5zZXRXb3JkU3BhY2luZywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVHo6IHsKICAgICAgICBpZDogT1BTLnNldEhTY2FsZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVEw6IHsKICAgICAgICBpZDogT1BTLnNldExlYWRpbmcsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRmOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGb250LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUcjogewogICAgICAgIGlkOiBPUFMuc2V0VGV4dFJlbmRlcmluZ01vZGUsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRzOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRUZXh0UmlzZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVGQ6IHsKICAgICAgICBpZDogT1BTLm1vdmVUZXh0LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBURDogewogICAgICAgIGlkOiBPUFMuc2V0TGVhZGluZ01vdmVUZXh0LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUbTogewogICAgICAgIGlkOiBPUFMuc2V0VGV4dE1hdHJpeCwKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgIlQqIjogewogICAgICAgIGlkOiBPUFMubmV4dExpbmUsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRqOiB7CiAgICAgICAgaWQ6IE9QUy5zaG93VGV4dCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVEo6IHsKICAgICAgICBpZDogT1BTLnNob3dTcGFjZWRUZXh0LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiJyI6IHsKICAgICAgICBpZDogT1BTLm5leHRMaW5lU2hvd1RleHQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICciJzogewogICAgICAgIGlkOiBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQwOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRDaGFyV2lkdGgsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQxOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHMsCiAgICAgICAgbnVtQXJnczogNiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIENTOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRTdHJva2VDb2xvclNwYWNlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBjczogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENvbG9yU3BhY2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFNDOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRTdHJva2VDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9LAogICAgICBTQ046IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNvbG9yTiwKICAgICAgICBudW1BcmdzOiAzMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKICAgICAgfSwKICAgICAgc2M6IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9LAogICAgICBzY246IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxDb2xvck4sCiAgICAgICAgbnVtQXJnczogMzMsCiAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCiAgICAgIH0sCiAgICAgIEc6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUdyYXksCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGc6IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxHcmF5LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBSRzogewogICAgICAgIGlkOiBPUFMuc2V0U3Ryb2tlUkdCQ29sb3IsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJnOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGaWxsUkdCQ29sb3IsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEs6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNNWUtDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgazogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENNWUtDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgc2g6IHsKICAgICAgICBpZDogT1BTLnNoYWRpbmdGaWxsLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCSTogewogICAgICAgIGlkOiBPUFMuYmVnaW5JbmxpbmVJbWFnZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgSUQ6IHsKICAgICAgICBpZDogT1BTLmJlZ2luSW1hZ2VEYXRhLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBFSTogewogICAgICAgIGlkOiBPUFMuZW5kSW5saW5lSW1hZ2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIERvOiB7CiAgICAgICAgaWQ6IE9QUy5wYWludFhPYmplY3QsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIE1QOiB7CiAgICAgICAgaWQ6IE9QUy5tYXJrUG9pbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIERQOiB7CiAgICAgICAgaWQ6IE9QUy5tYXJrUG9pbnRQcm9wcywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQk1DOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpbk1hcmtlZENvbnRlbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJEQzogewogICAgICAgIGlkOiBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVNQzogewogICAgICAgIGlkOiBPUFMuZW5kTWFya2VkQ29udGVudCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQlg6IHsKICAgICAgICBpZDogT1BTLmJlZ2luQ29tcGF0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBFWDogewogICAgICAgIGlkOiBPUFMuZW5kQ29tcGF0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCTTogbnVsbCwKICAgICAgQkQ6IG51bGwsCiAgICAgIHRydWU6IG51bGwsCiAgICAgIGZhOiBudWxsLAogICAgICBmYWw6IG51bGwsCiAgICAgIGZhbHM6IG51bGwsCiAgICAgIGZhbHNlOiBudWxsLAogICAgICBudTogbnVsbCwKICAgICAgbnVsOiBudWxsLAogICAgICBudWxsOiBudWxsCiAgICB9KSk7CiAgfQogIHN0YXRpYyBNQVhfSU5WQUxJRF9QQVRIX09QUyA9IDEwOwogIGNvbnN0cnVjdG9yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcigpKSB7CiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSwKICAgICAgeHJlZgogICAgfSk7CiAgICB0aGlzLnN0YXRlTWFuYWdlciA9IHN0YXRlTWFuYWdlcjsKICAgIHRoaXMubm9uUHJvY2Vzc2VkQXJncyA9IFtdOwogICAgdGhpcy5faXNQYXRoT3AgPSBmYWxzZTsKICAgIHRoaXMuX251bUludmFsaWRQYXRoT1BTID0gMDsKICB9CiAgZ2V0IHNhdmVkU3RhdGVzRGVwdGgoKSB7CiAgICByZXR1cm4gdGhpcy5zdGF0ZU1hbmFnZXIuc3RhdGVTdGFjay5sZW5ndGg7CiAgfQogIHJlYWQob3BlcmF0aW9uKSB7CiAgICBsZXQgYXJncyA9IG9wZXJhdGlvbi5hcmdzOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5wYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDbWQpIHsKICAgICAgICBjb25zdCBjbWQgPSBvYmouY21kOwogICAgICAgIGNvbnN0IG9wU3BlYyA9IEV2YWx1YXRvclByZXByb2Nlc3Nvci5vcE1hcFtjbWRdOwogICAgICAgIGlmICghb3BTcGVjKSB7CiAgICAgICAgICB3YXJuKGBVbmtub3duIGNvbW1hbmQgIiR7Y21kfSIuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZm4gPSBvcFNwZWMuaWQ7CiAgICAgICAgY29uc3QgbnVtQXJncyA9IG9wU3BlYy5udW1BcmdzOwogICAgICAgIGxldCBhcmdzTGVuZ3RoID0gYXJncyAhPT0gbnVsbCA/IGFyZ3MubGVuZ3RoIDogMDsKICAgICAgICBpZiAoIXRoaXMuX2lzUGF0aE9wKSB7CiAgICAgICAgICB0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA9IDA7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lzUGF0aE9wID0gZm4gPj0gT1BTLm1vdmVUbyAmJiBmbiA8PSBPUFMuZW5kUGF0aDsKICAgICAgICBpZiAoIW9wU3BlYy52YXJpYWJsZUFyZ3MpIHsKICAgICAgICAgIGlmIChhcmdzTGVuZ3RoICE9PSBudW1BcmdzKSB7CiAgICAgICAgICAgIGNvbnN0IG5vblByb2Nlc3NlZEFyZ3MgPSB0aGlzLm5vblByb2Nlc3NlZEFyZ3M7CiAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoID4gbnVtQXJncykgewogICAgICAgICAgICAgIG5vblByb2Nlc3NlZEFyZ3MucHVzaChhcmdzLnNoaWZ0KCkpOwogICAgICAgICAgICAgIGFyZ3NMZW5ndGgtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoYXJnc0xlbmd0aCA8IG51bUFyZ3MgJiYgbm9uUHJvY2Vzc2VkQXJncy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICBpZiAoYXJncyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhcmdzLnVuc2hpZnQobm9uUHJvY2Vzc2VkQXJncy5wb3AoKSk7CiAgICAgICAgICAgICAgYXJnc0xlbmd0aCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXJnc0xlbmd0aCA8IG51bUFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgcGFydGlhbE1zZyA9IGBjb21tYW5kICR7Y21kfTogZXhwZWN0ZWQgJHtudW1BcmdzfSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYDsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzUGF0aE9wICYmICsrdGhpcy5fbnVtSW52YWxpZFBhdGhPUFMgPiBFdmFsdWF0b3JQcmVwcm9jZXNzb3IuTUFYX0lOVkFMSURfUEFUSF9PUFMpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgJHtwYXJ0aWFsTXNnfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdhcm4oYFNraXBwaW5nICR7cGFydGlhbE1zZ31gKTsKICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhcmdzTGVuZ3RoID4gbnVtQXJncykgewogICAgICAgICAgaW5mbyhgQ29tbWFuZCAke2NtZH06IGV4cGVjdGVkIFswLCAke251bUFyZ3N9XSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucHJlcHJvY2Vzc0NvbW1hbmQoZm4sIGFyZ3MpOwogICAgICAgIG9wZXJhdGlvbi5mbiA9IGZuOwogICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJnczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKG9iaiAhPT0gbnVsbCkgewogICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CiAgICAgICAgICBhcmdzID0gW107CiAgICAgICAgfQogICAgICAgIGFyZ3MucHVzaChvYmopOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBwcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncykgewogICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgY2FzZSBPUFMuc2F2ZToKICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT1BTLnJlc3RvcmU6CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE9QUy50cmFuc2Zvcm06CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKGFyZ3MpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZGVmYXVsdF9hcHBlYXJhbmNlLmpzCgoKCgoKCgoKY2xhc3MgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIobmV3IFN0cmluZ1N0cmVhbShzdHIpKTsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBvcGVyYXRpb24gPSB7CiAgICAgIGZuOiAwLAogICAgICBhcmdzOiBbXQogICAgfTsKICAgIGNvbnN0IHJlc3VsdCA9IHsKICAgICAgZm9udFNpemU6IDAsCiAgICAgIGZvbnROYW1lOiAiIiwKICAgICAgZm9udENvbG9yOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMykKICAgIH07CiAgICB0cnkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG9wZXJhdGlvbi5hcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgaWYgKCF0aGlzLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNhdmVkU3RhdGVzRGVwdGggIT09IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB7CiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MKICAgICAgICB9ID0gb3BlcmF0aW9uOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGb250OgogICAgICAgICAgICBjb25zdCBbZm9udE5hbWUsIGZvbnRTaXplXSA9IGFyZ3M7CiAgICAgICAgICAgIGlmIChmb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICByZXN1bHQuZm9udE5hbWUgPSBmb250TmFtZS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9udFNpemUgPT09ICJudW1iZXIiICYmIGZvbnRTaXplID4gMCkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250U2l6ZSA9IGZvbnRTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbFJHQkNvbG9yOgogICAgICAgICAgICBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbEdyYXk6CiAgICAgICAgICAgIENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICAgICAgQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSAtIGlnbm9yaW5nIGVycm9yczogIiR7cmVhc29ufSIuYCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpmdW5jdGlvbiBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHN0cikgewogIHJldHVybiBuZXcgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3Ioc3RyKS5wYXJzZSgpOwp9CmNsYXNzIEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZiwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcihzdHJlYW0pOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBldmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOwogICAgdGhpcy5yZXNvdXJjZXMgPSBzdHJlYW0uZGljdD8uZ2V0KCJSZXNvdXJjZXMiKTsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBvcGVyYXRpb24gPSB7CiAgICAgIGZuOiAwLAogICAgICBhcmdzOiBbXQogICAgfTsKICAgIGxldCByZXN1bHQgPSB7CiAgICAgIHNjYWxlRmFjdG9yOiAxLAogICAgICBmb250U2l6ZTogMCwKICAgICAgZm9udE5hbWU6ICIiLAogICAgICBmb250Q29sb3I6IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKSwKICAgICAgZmlsbENvbG9yU3BhY2U6IENvbG9yU3BhY2VVdGlscy5ncmF5CiAgICB9OwogICAgbGV0IGJyZWFrTG9vcCA9IGZhbHNlOwogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIHRyeSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MubGVuZ3RoID0gMDsKICAgICAgICBpZiAoYnJlYWtMb29wIHx8ICF0aGlzLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGZuLAogICAgICAgICAgYXJncwogICAgICAgIH0gPSBvcGVyYXRpb247CiAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgICAgIGNhc2UgT1BTLnNhdmU6CiAgICAgICAgICAgIHN0YWNrLnB1c2goewogICAgICAgICAgICAgIHNjYWxlRmFjdG9yOiByZXN1bHQuc2NhbGVGYWN0b3IsCiAgICAgICAgICAgICAgZm9udFNpemU6IHJlc3VsdC5mb250U2l6ZSwKICAgICAgICAgICAgICBmb250TmFtZTogcmVzdWx0LmZvbnROYW1lLAogICAgICAgICAgICAgIGZvbnRDb2xvcjogcmVzdWx0LmZvbnRDb2xvci5zbGljZSgpLAogICAgICAgICAgICAgIGZpbGxDb2xvclNwYWNlOiByZXN1bHQuZmlsbENvbG9yU3BhY2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMucmVzdG9yZToKICAgICAgICAgICAgcmVzdWx0ID0gc3RhY2sucG9wKCkgfHwgcmVzdWx0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6CiAgICAgICAgICAgIHJlc3VsdC5zY2FsZUZhY3RvciAqPSBNYXRoLmh5cG90KGFyZ3NbMF0sIGFyZ3NbMV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZvbnQ6CiAgICAgICAgICAgIGNvbnN0IFtmb250TmFtZSwgZm9udFNpemVdID0gYXJnczsKICAgICAgICAgICAgaWYgKGZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250TmFtZSA9IGZvbnROYW1lLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBmb250U2l6ZSA9PT0gIm51bWJlciIgJiYgZm9udFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgcmVzdWx0LmZvbnRTaXplID0gZm9udFNpemUgKiByZXN1bHQuc2NhbGVGYWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3JTcGFjZToKICAgICAgICAgICAgcmVzdWx0LmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLnBhcnNlKHsKICAgICAgICAgICAgICBjczogYXJnc1swXSwKICAgICAgICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLl9sb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgICAgIGNvbnN0IGNzID0gcmVzdWx0LmZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBjcy5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjoKICAgICAgICAgICAgQ29sb3JTcGFjZVV0aWxzLnJnYi5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgICAgICBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgICAgIENvbG9yU3BhY2VVdGlscy5jbXlrLmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDoKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6CiAgICAgICAgICBjYXNlIE9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDoKICAgICAgICAgICAgYnJlYWtMb29wID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgcGFyc2VBcHBlYXJhbmNlU3RyZWFtIC0gaWdub3JpbmcgZXJyb3JzOiAiJHtyZWFzb259Ii5gKTsKICAgIH0KICAgIHRoaXMuc3RyZWFtLnJlc2V0KCk7CiAgICBkZWxldGUgcmVzdWx0LnNjYWxlRmFjdG9yOwogICAgZGVsZXRlIHJlc3VsdC5maWxsQ29sb3JTcGFjZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGdldCBfbG9jYWxDb2xvclNwYWNlQ2FjaGUoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJfbG9jYWxDb2xvclNwYWNlQ2FjaGUiLCBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKSk7CiAgfQogIGdldCBfcGRmRnVuY3Rpb25GYWN0b3J5KCkgewogICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMuaXNFdmFsU3VwcG9ydGVkCiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wZGZGdW5jdGlvbkZhY3RvcnkiLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUFwcGVhcmFuY2VTdHJlYW0oc3RyZWFtLCBldmFsdWF0b3JPcHRpb25zLCB4cmVmLCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUpIHsKICByZXR1cm4gbmV3IEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3Ioc3RyZWFtLCBldmFsdWF0b3JPcHRpb25zLCB4cmVmLCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUpLnBhcnNlKCk7Cn0KZnVuY3Rpb24gZ2V0UGRmQ29sb3IoY29sb3IsIGlzRmlsbCkgewogIGlmIChjb2xvclswXSA9PT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT09IGNvbG9yWzJdKSB7CiAgICBjb25zdCBncmF5ID0gY29sb3JbMF0gLyAyNTU7CiAgICByZXR1cm4gYCR7bnVtYmVyVG9TdHJpbmcoZ3JheSl9ICR7aXNGaWxsID8gImciIDogIkcifWA7CiAgfQogIHJldHVybiBBcnJheS5mcm9tKGNvbG9yLCBjID0+IG51bWJlclRvU3RyaW5nKGMgLyAyNTUpKS5qb2luKCIgIikgKyBgICR7aXNGaWxsID8gInJnIiA6ICJSRyJ9YDsKfQpmdW5jdGlvbiBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSh7CiAgZm9udFNpemUsCiAgZm9udE5hbWUsCiAgZm9udENvbG9yCn0pIHsKICByZXR1cm4gYC8ke2VzY2FwZVBERk5hbWUoZm9udE5hbWUpfSAke2ZvbnRTaXplfSBUZiAke2dldFBkZkNvbG9yKGZvbnRDb2xvciwgdHJ1ZSl9YDsKfQpjbGFzcyBGYWtlVW5pY29kZUZvbnQgewogIGNvbnN0cnVjdG9yKHhyZWYsIGZvbnRGYW1pbHkpIHsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLndpZHRocyA9IG51bGw7CiAgICB0aGlzLmZpcnN0Q2hhciA9IEluZmluaXR5OwogICAgdGhpcy5sYXN0Q2hhciA9IC1JbmZpbml0eTsKICAgIHRoaXMuZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpOwogICAgdGhpcy5jdHhNZWFzdXJlID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgewogICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUKICAgIH0pOwogICAgaWYgKCFGYWtlVW5pY29kZUZvbnQuX2ZvbnROYW1lSWQpIHsKICAgICAgRmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkID0gMTsKICAgIH0KICAgIHRoaXMuZm9udE5hbWUgPSBOYW1lLmdldChgSW52YWxpZFBERmpzRm9udF8ke2ZvbnRGYW1pbHl9XyR7RmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkKyt9YCk7CiAgfQogIGdldCBmb250RGVzY3JpcHRvclJlZigpIHsKICAgIGlmICghRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZikgewogICAgICBjb25zdCBmb250RGVzY3JpcHRvciA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250RGVzY3JpcHRvciIpKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIHRoaXMuZm9udE5hbWUpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRGYW1pbHkiLCAiTXlyaWFkUHJvIFJlZ3VsYXIiKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250QkJveCIsIFswLCAwLCAwLCAwXSk7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiRm9udFN0cmV0Y2giLCBOYW1lLmdldCgiTm9ybWFsIikpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRXZWlnaHQiLCA0MDApOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkl0YWxpY0FuZ2xlIiwgMCk7CiAgICAgIEZha2VVbmljb2RlRm9udC5fZm9udERlc2NyaXB0b3JSZWYgPSB0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihmb250RGVzY3JpcHRvcik7CiAgICB9CiAgICByZXR1cm4gRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZjsKICB9CiAgZ2V0IGRlc2NlbmRhbnRGb250UmVmKCkgewogICAgY29uc3QgZGVzY2VuZGFudEZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJCYXNlRm9udCIsIHRoaXMuZm9udE5hbWUpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZvbnQiKSk7CiAgICBkZXNjZW5kYW50Rm9udC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiQ0lERm9udFR5cGUwIikpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURUb0dJRE1hcCIsIE5hbWUuZ2V0KCJJZGVudGl0eSIpKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiRmlyc3RDaGFyIiwgdGhpcy5maXJzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJMYXN0Q2hhciIsIHRoaXMubGFzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJGb250RGVzY3JpcHRvciIsIHRoaXMuZm9udERlc2NyaXB0b3JSZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJEVyIsIDEwMDApOwogICAgY29uc3Qgd2lkdGhzID0gW107CiAgICBjb25zdCBjaGFycyA9IFsuLi50aGlzLndpZHRocy5lbnRyaWVzKCldLnNvcnQoKTsKICAgIGxldCBjdXJyZW50Q2hhciA9IG51bGw7CiAgICBsZXQgY3VycmVudFdpZHRocyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IFtjaGFyLCB3aWR0aF0gb2YgY2hhcnMpIHsKICAgICAgaWYgKCFjdXJyZW50Q2hhcikgewogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoY2hhciA9PT0gY3VycmVudENoYXIgKyBjdXJyZW50V2lkdGhzLmxlbmd0aCkgewogICAgICAgIGN1cnJlbnRXaWR0aHMucHVzaCh3aWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGhzLnB1c2goY3VycmVudENoYXIsIGN1cnJlbnRXaWR0aHMpOwogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRDaGFyKSB7CiAgICAgIHdpZHRocy5wdXNoKGN1cnJlbnRDaGFyLCBjdXJyZW50V2lkdGhzKTsKICAgIH0KICAgIGRlc2NlbmRhbnRGb250LnNldCgiVyIsIHdpZHRocyk7CiAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNpZFN5c3RlbUluZm8uc2V0KCJPcmRlcmluZyIsICJJZGVudGl0eSIpOwogICAgY2lkU3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgICBjaWRTeXN0ZW1JbmZvLnNldCgiU3VwcGxlbWVudCIsIDApOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURTeXN0ZW1JbmZvIiwgY2lkU3lzdGVtSW5mbyk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoZGVzY2VuZGFudEZvbnQpOwogIH0KICBnZXQgYmFzZUZvbnRSZWYoKSB7CiAgICBjb25zdCBiYXNlRm9udCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICBiYXNlRm9udC5zZXQoIkJhc2VGb250IiwgdGhpcy5mb250TmFtZSk7CiAgICBiYXNlRm9udC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRm9udCIpKTsKICAgIGJhc2VGb250LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJUeXBlMCIpKTsKICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICAgIGJhc2VGb250LnNldCgiRGVzY2VuZGFudEZvbnRzIiwgW3RoaXMuZGVzY2VuZGFudEZvbnRSZWZdKTsKICAgIGJhc2VGb250LnNldCgiVG9Vbmljb2RlIiwgTmFtZS5nZXQoIklkZW50aXR5LUgiKSk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoYmFzZUZvbnQpOwogIH0KICBnZXQgcmVzb3VyY2VzKCkgewogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZm9udC5zZXQodGhpcy5mb250TmFtZS5uYW1lLCB0aGlzLmJhc2VGb250UmVmKTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIHJldHVybiByZXNvdXJjZXM7CiAgfQogIF9jcmVhdGVDb250ZXh0KCkgewogICAgdGhpcy53aWR0aHMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLmN0eE1lYXN1cmUuZm9udCA9IGAxMDAwcHggJHt0aGlzLmZvbnRGYW1pbHl9YDsKICAgIHJldHVybiB0aGlzLmN0eE1lYXN1cmU7CiAgfQogIGNyZWF0ZUZvbnRSZXNvdXJjZXModGV4dCkgewogICAgY29uc3QgY3R4ID0gdGhpcy5fY3JlYXRlQ29udGV4dCgpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTsKICAgICAgICBpZiAodGhpcy53aWR0aHMuaGFzKGNvZGUpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChjaGFyKTsKICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICB0aGlzLndpZHRocy5zZXQoY29kZSwgd2lkdGgpOwogICAgICAgIHRoaXMuZmlyc3RDaGFyID0gTWF0aC5taW4oY29kZSwgdGhpcy5maXJzdENoYXIpOwogICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzOwogIH0KICBzdGF0aWMgZ2V0Rmlyc3RQb3NpdGlvbkluZm8ocmVjdCwgcm90YXRpb24sIGZvbnRTaXplKSB7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDsKICAgIGxldCB3ID0geDIgLSB4MTsKICAgIGxldCBoID0geTIgLSB5MTsKICAgIGlmIChyb3RhdGlvbiAlIDE4MCAhPT0gMCkgewogICAgICBbdywgaF0gPSBbaCwgd107CiAgICB9CiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTElORV9GQUNUT1IgKiBmb250U2l6ZTsKICAgIGNvbnN0IGxpbmVEZXNjZW50ID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgcmV0dXJuIHsKICAgICAgY29vcmRzOiBbMCwgaCArIGxpbmVEZXNjZW50IC0gbGluZUhlaWdodF0sCiAgICAgIGJib3g6IFswLCAwLCB3LCBoXSwKICAgICAgbWF0cml4OiByb3RhdGlvbiAhPT0gMCA/IGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCBoLCBsaW5lSGVpZ2h0KSA6IHVuZGVmaW5lZAogICAgfTsKICB9CiAgY3JlYXRlQXBwZWFyYW5jZSh0ZXh0LCByZWN0LCByb3RhdGlvbiwgZm9udFNpemUsIGJnQ29sb3IsIHN0cm9rZUFscGhhKSB7CiAgICBjb25zdCBjdHggPSB0aGlzLl9jcmVhdGVDb250ZXh0KCk7CiAgICBjb25zdCBsaW5lcyA9IFtdOwogICAgbGV0IG1heFdpZHRoID0gLUluZmluaXR5OwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgY29uc3QgbGluZVdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoOwogICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBsaW5lV2lkdGgpOwogICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZVBvaW50SXRlcihsaW5lKSkgewogICAgICAgIGNvbnN0IGNoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKTsKICAgICAgICBsZXQgd2lkdGggPSB0aGlzLndpZHRocy5nZXQoY29kZSk7CiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoY2hhcik7CiAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICAgIHRoaXMud2lkdGhzLnNldChjb2RlLCB3aWR0aCk7CiAgICAgICAgICB0aGlzLmZpcnN0Q2hhciA9IE1hdGgubWluKGNvZGUsIHRoaXMuZmlyc3RDaGFyKTsKICAgICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1heFdpZHRoICo9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0OwogICAgbGV0IHcgPSB4MiAtIHgxOwogICAgbGV0IGggPSB5MiAtIHkxOwogICAgaWYgKHJvdGF0aW9uICUgMTgwICE9PSAwKSB7CiAgICAgIFt3LCBoXSA9IFtoLCB3XTsKICAgIH0KICAgIGxldCBoc2NhbGUgPSAxOwogICAgaWYgKG1heFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gbWF4V2lkdGg7CiAgICB9CiAgICBsZXQgdnNjYWxlID0gMTsKICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBMSU5FX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgY29uc3QgbGluZURlc2NlbnQgPSBMSU5FX0RFU0NFTlRfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBtYXhIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoOwogICAgaWYgKG1heEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIG1heEhlaWdodDsKICAgIH0KICAgIGNvbnN0IGZzY2FsZSA9IE1hdGgubWluKGhzY2FsZSwgdnNjYWxlKTsKICAgIGNvbnN0IG5ld0ZvbnRTaXplID0gZm9udFNpemUgKiBmc2NhbGU7CiAgICBjb25zdCBidWZmZXIgPSBbInEiLCBgMCAwICR7bnVtYmVyVG9TdHJpbmcodyl9ICR7bnVtYmVyVG9TdHJpbmcoaCl9IHJlIFcgbmAsIGBCVGAsIGAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoICsgbGluZURlc2NlbnQpfSBUbSAwIFRjICR7Z2V0UGRmQ29sb3IoYmdDb2xvciwgdHJ1ZSl9YCwgYC8ke3RoaXMuZm9udE5hbWUubmFtZX0gJHtudW1iZXJUb1N0cmluZyhuZXdGb250U2l6ZSl9IFRmYF07CiAgICBjb25zdCB7CiAgICAgIHJlc291cmNlcwogICAgfSA9IHRoaXM7CiAgICBzdHJva2VBbHBoYSA9IHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIgJiYgc3Ryb2tlQWxwaGEgPj0gMCAmJiBzdHJva2VBbHBoYSA8PSAxID8gc3Ryb2tlQWxwaGEgOiAxOwogICAgaWYgKHN0cm9rZUFscGhhICE9PSAxKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCIvUjAgZ3MiKTsKICAgICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgY29uc3QgcjAgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICByMC5zZXQoImNhIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIkNBIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgICBleHRHU3RhdGUuc2V0KCJSMCIsIHIwKTsKICAgICAgcmVzb3VyY2VzLnNldCgiRXh0R1N0YXRlIiwgZXh0R1N0YXRlKTsKICAgIH0KICAgIGNvbnN0IHZTaGlmdCA9IG51bWJlclRvU3RyaW5nKGxpbmVIZWlnaHQpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwIC0ke3ZTaGlmdH0gVGQgPCR7c3RyaW5nVG9VVEYxNkhleFN0cmluZyhsaW5lKX0+IFRqYCk7CiAgICB9CiAgICBidWZmZXIucHVzaCgiRVQiLCAiUSIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIFswLCAwLCB3LCBoXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgdywgaCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL25hbWVfbnVtYmVyX3RyZWUuanMKCgpjbGFzcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmLCB0eXBlKSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuX3R5cGUgPSB0eXBlOwogIH0KICBnZXRBbGwoKSB7CiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICBpZiAoIXRoaXMucm9vdCkgewogICAgICByZXR1cm4gbWFwOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBSZWZTZXQoKTsKICAgIHByb2Nlc3NlZC5wdXQodGhpcy5yb290KTsKICAgIGNvbnN0IHF1ZXVlID0gW3RoaXMucm9vdF07CiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBvYmogPSB4cmVmLmZldGNoSWZSZWYocXVldWUuc2hpZnQoKSk7CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGNvbnN0IGtpZHMgPSBvYmouZ2V0KCJLaWRzIik7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoa2lkKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYER1cGxpY2F0ZSBlbnRyeSBpbiAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKICAgICAgICAgIH0KICAgICAgICAgIHF1ZXVlLnB1c2goa2lkKTsKICAgICAgICAgIHByb2Nlc3NlZC5wdXQoa2lkKTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgZW50cmllcyA9IG9iai5nZXQodGhpcy5fdHlwZSk7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGVudHJpZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIG1hcC5zZXQoeHJlZi5mZXRjaElmUmVmKGVudHJpZXNbaV0pLCB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tpICsgMV0pKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UmF3KGtleSkgewogICAgaWYgKCF0aGlzLnJvb3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGtpZHNPckVudHJpZXMgPSB4cmVmLmZldGNoSWZSZWYodGhpcy5yb290KTsKICAgIGxldCBsb29wQ291bnQgPSAwOwogICAgY29uc3QgTUFYX0xFVkVMUyA9IDEwOwogICAgd2hpbGUgKGtpZHNPckVudHJpZXMuaGFzKCJLaWRzIikpIHsKICAgICAgaWYgKCsrbG9vcENvdW50ID4gTUFYX0xFVkVMUykgewogICAgICAgIHdhcm4oYFNlYXJjaCBkZXB0aCBsaW1pdCByZWFjaGVkIGZvciAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRzID0ga2lkc09yRW50cmllcy5nZXQoIktpZHMiKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgbGV0IGwgPSAwLAogICAgICAgIHIgPSBraWRzLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChsIDw9IHIpIHsKICAgICAgICBjb25zdCBtID0gbCArIHIgPj4gMTsKICAgICAgICBjb25zdCBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkc1ttXSk7CiAgICAgICAgY29uc3QgbGltaXRzID0ga2lkLmdldCgiTGltaXRzIik7CiAgICAgICAgaWYgKGtleSA8IHhyZWYuZmV0Y2hJZlJlZihsaW1pdHNbMF0pKSB7CiAgICAgICAgICByID0gbSAtIDE7CiAgICAgICAgfSBlbHNlIGlmIChrZXkgPiB4cmVmLmZldGNoSWZSZWYobGltaXRzWzFdKSkgewogICAgICAgICAgbCA9IG0gKyAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBraWRzT3JFbnRyaWVzID0ga2lkOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsID4gcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBjb25zdCBlbnRyaWVzID0ga2lkc09yRW50cmllcy5nZXQodGhpcy5fdHlwZSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgewogICAgICBsZXQgbCA9IDAsCiAgICAgICAgciA9IGVudHJpZXMubGVuZ3RoIC0gMjsKICAgICAgd2hpbGUgKGwgPD0gcikgewogICAgICAgIGNvbnN0IHRtcCA9IGwgKyByID4+IDEsCiAgICAgICAgICBtID0gdG1wICsgKHRtcCAmIDEpOwogICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttXSk7CiAgICAgICAgaWYgKGtleSA8IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIHIgPSBtIC0gMjsKICAgICAgICB9IGVsc2UgaWYgKGtleSA+IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIGwgPSBtICsgMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGVudHJpZXNbbSArIDFdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldChrZXkpIHsKICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2hJZlJlZih0aGlzLmdldFJhdyhrZXkpKTsKICB9Cn0KY2xhc3MgTmFtZVRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmKSB7CiAgICBzdXBlcihyb290LCB4cmVmLCAiTmFtZXMiKTsKICB9Cn0KY2xhc3MgTnVtYmVyVHJlZSBleHRlbmRzIE5hbWVPck51bWJlclRyZWUgewogIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYpIHsKICAgIHN1cGVyKHJvb3QsIHhyZWYsICJOdW1zIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jbGVhbnVwX2hlbHBlci5qcwoKCgoKZnVuY3Rpb24gY2xlYXJHbG9iYWxDYWNoZXMoKSB7CiAgY2xlYXJQYXR0ZXJuQ2FjaGVzKCk7CiAgY2xlYXJQcmltaXRpdmVDYWNoZXMoKTsKICBjbGVhclVuaWNvZGVDYWNoZXMoKTsKICBKcHhJbWFnZS5jbGVhbnVwKCk7Cn0KCjsvLyAuL3NyYy9jb3JlL2ZpbGVfc3BlYy5qcwoKCgpmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGRpY3QpIHsKICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoZGljdC5oYXMoIlVGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiVUYiKTsKICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRiIpOwogIH0gZWxzZSBpZiAoZGljdC5oYXMoIlVuaXgiKSkgewogICAgcmV0dXJuIGRpY3QuZ2V0KCJVbml4Iik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiTWFjIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiTWFjIik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiRE9TIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRE9TIik7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHN0cmlwUGF0aChzdHIpIHsKICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGFzdEluZGV4T2YoIi8iKSArIDEpOwp9CmNsYXNzIEZpbGVTcGVjIHsKICAjY29udGVudEF2YWlsYWJsZSA9IGZhbHNlOwogIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYsIHNraXBDb250ZW50ID0gZmFsc2UpIHsKICAgIGlmICghKHJvb3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIGlmIChyb290LmhhcygiRlMiKSkgewogICAgICB0aGlzLmZzID0gcm9vdC5nZXQoIkZTIik7CiAgICB9CiAgICBpZiAocm9vdC5oYXMoIlJGIikpIHsKICAgICAgd2FybigiUmVsYXRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgICBpZiAoIXNraXBDb250ZW50KSB7CiAgICAgIGlmIChyb290LmhhcygiRUYiKSkgewogICAgICAgIHRoaXMuI2NvbnRlbnRBdmFpbGFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIk5vbi1lbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0IGZpbGVuYW1lKCkgewogICAgbGV0IGZpbGVuYW1lID0gIiI7CiAgICBjb25zdCBpdGVtID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QpOwogICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgIGZpbGVuYW1lID0gc3RyaW5nVG9QREZTdHJpbmcoaXRlbSkucmVwbGFjZUFsbCgiXFxcXCIsICJcXCIpLnJlcGxhY2VBbGwoIlxcLyIsICIvIikucmVwbGFjZUFsbCgiXFwiLCAiLyIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZmlsZW5hbWUiLCBmaWxlbmFtZSB8fCAidW5uYW1lZCIpOwogIH0KICBnZXQgY29udGVudCgpIHsKICAgIGlmICghdGhpcy4jY29udGVudEF2YWlsYWJsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRoaXMuX2NvbnRlbnRSZWYgfHw9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290Py5nZXQoIkVGIikpOwogICAgbGV0IGNvbnRlbnQgPSBudWxsOwogICAgaWYgKHRoaXMuX2NvbnRlbnRSZWYpIHsKICAgICAgY29uc3QgZmlsZU9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHRoaXMuX2NvbnRlbnRSZWYpOwogICAgICBpZiAoZmlsZU9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb250ZW50ID0gZmlsZU9iai5nZXRCeXRlcygpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIkVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbiBwb2ludHMgdG8gbm9uLWV4aXN0aW5nL2ludmFsaWQgY29udGVudCIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudCIpOwogICAgfQogICAgcmV0dXJuIGNvbnRlbnQ7CiAgfQogIGdldCBkZXNjcmlwdGlvbigpIHsKICAgIGxldCBkZXNjcmlwdGlvbiA9ICIiOwogICAgY29uc3QgZGVzYyA9IHRoaXMucm9vdD8uZ2V0KCJEZXNjIik7CiAgICBpZiAoZGVzYyAmJiB0eXBlb2YgZGVzYyA9PT0gInN0cmluZyIpIHsKICAgICAgZGVzY3JpcHRpb24gPSBzdHJpbmdUb1BERlN0cmluZyhkZXNjKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOwogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcmF3RmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsCiAgICAgIGZpbGVuYW1lOiBzdHJpcFBhdGgodGhpcy5maWxlbmFtZSksCiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCwKICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24KICAgIH07CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94bWxfcGFyc2VyLmpzCgpjb25zdCBYTUxQYXJzZXJFcnJvckNvZGUgPSB7CiAgTm9FcnJvcjogMCwKICBFbmRPZkRvY3VtZW50OiAtMSwKICBVbnRlcm1pbmF0ZWRDZGF0OiAtMiwKICBVbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbjogLTMsCiAgVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uOiAtNCwKICBVbnRlcm1pbmF0ZWRDb21tZW50OiAtNSwKICBNYWxmb3JtZWRFbGVtZW50OiAtNiwKICBPdXRPZk1lbW9yeTogLTcsCiAgVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6IC04LAogIFVudGVybWluYXRlZEVsZW1lbnQ6IC05LAogIEVsZW1lbnROZXZlckJlZ3VuOiAtMTAKfTsKZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHMsIGluZGV4KSB7CiAgY29uc3QgY2ggPSBzW2luZGV4XTsKICByZXR1cm4gY2ggPT09ICIgIiB8fCBjaCA9PT0gIlxuIiB8fCBjaCA9PT0gIlxyIiB8fCBjaCA9PT0gIlx0IjsKfQpmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcocykgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKCFpc1doaXRlc3BhY2UocywgaSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpjbGFzcyBYTUxQYXJzZXJCYXNlIHsKICBfcmVzb2x2ZUVudGl0aWVzKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2VBbGwoLyYoW147XSspOy9nLCAoYWxsLCBlbnRpdHkpID0+IHsKICAgICAgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMikgPT09ICIjeCIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTsKICAgICAgfSBlbHNlIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDEpID09PSAiIyIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygxKSwgMTApKTsKICAgICAgfQogICAgICBzd2l0Y2ggKGVudGl0eSkgewogICAgICAgIGNhc2UgImx0IjoKICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgcmV0dXJuICI+IjsKICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgcmV0dXJuICImIjsKICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICByZXR1cm4gIiciOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm9uUmVzb2x2ZUVudGl0eShlbnRpdHkpOwogICAgfSk7CiAgfQogIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTsKICAgIGxldCBwb3MgPSBzdGFydDsKICAgIGZ1bmN0aW9uIHNraXBXcygpIHsKICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIpIHsKICAgICAgKytwb3M7CiAgICB9CiAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICBza2lwV3MoKTsKICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIiAmJiBzW3Bvc10gIT09ICI/IikgewogICAgICBza2lwV3MoKTsKICAgICAgbGV0IGF0dHJOYW1lID0gIiIsCiAgICAgICAgYXR0clZhbHVlID0gIiI7CiAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPSIpIHsKICAgICAgICBhdHRyTmFtZSArPSBzW3Bvc107CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgICAgc2tpcFdzKCk7CiAgICAgIGlmIChzW3Bvc10gIT09ICI9IikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgICsrcG9zOwogICAgICBza2lwV3MoKTsKICAgICAgY29uc3QgYXR0ckVuZENoYXIgPSBzW3Bvc107CiAgICAgIGlmIChhdHRyRW5kQ2hhciAhPT0gJyInICYmIGF0dHJFbmRDaGFyICE9PSAiJyIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBhdHRyRW5kSW5kZXggPSBzLmluZGV4T2YoYXR0ckVuZENoYXIsICsrcG9zKTsKICAgICAgaWYgKGF0dHJFbmRJbmRleCA8IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBhdHRyVmFsdWUgPSBzLnN1YnN0cmluZyhwb3MsIGF0dHJFbmRJbmRleCk7CiAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CiAgICAgICAgbmFtZTogYXR0ck5hbWUsCiAgICAgICAgdmFsdWU6IHRoaXMuX3Jlc29sdmVFbnRpdGllcyhhdHRyVmFsdWUpCiAgICAgIH0pOwogICAgICBwb3MgPSBhdHRyRW5kSW5kZXggKyAxOwogICAgICBza2lwV3MoKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIHBhcnNlZDogcG9zIC0gc3RhcnQKICAgIH07CiAgfQogIF9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzLCBzdGFydCkgewogICAgbGV0IHBvcyA9IHN0YXJ0OwogICAgZnVuY3Rpb24gc2tpcFdzKCkgewogICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHsKICAgICAgICArK3BvczsKICAgICAgfQogICAgfQogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICI/IiAmJiBzW3Bvc10gIT09ICIvIikgewogICAgICArK3BvczsKICAgIH0KICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgIHNraXBXcygpOwogICAgY29uc3QgYXR0clN0YXJ0ID0gcG9zOwogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIChzW3Bvc10gIT09ICI/IiB8fCBzW3BvcyArIDFdICE9PSAiPiIpKSB7CiAgICAgICsrcG9zOwogICAgfQogICAgY29uc3QgdmFsdWUgPSBzLnN1YnN0cmluZyhhdHRyU3RhcnQsIHBvcyk7CiAgICByZXR1cm4gewogICAgICBuYW1lLAogICAgICB2YWx1ZSwKICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAogICAgfTsKICB9CiAgcGFyc2VYbWwocykgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkgewogICAgICBjb25zdCBjaCA9IHNbaV07CiAgICAgIGxldCBqID0gaTsKICAgICAgaWYgKGNoID09PSAiPCIpIHsKICAgICAgICArK2o7CiAgICAgICAgY29uc3QgY2gyID0gc1tqXTsKICAgICAgICBsZXQgcTsKICAgICAgICBzd2l0Y2ggKGNoMikgewogICAgICAgICAgY2FzZSAiLyI6CiAgICAgICAgICAgICsrajsKICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGopOwogICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uRW5kRWxlbWVudChzLnN1YnN0cmluZyhqLCBxKSk7CiAgICAgICAgICAgIGogPSBxICsgMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICI/IjoKICAgICAgICAgICAgKytqOwogICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIHBpLnBhcnNlZCwgaiArIHBpLnBhcnNlZCArIDIpICE9PSAiPz4iKSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25QaShwaS5uYW1lLCBwaS52YWx1ZSk7CiAgICAgICAgICAgIGogKz0gcGkucGFyc2VkICsgMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICIhIjoKICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09ICItLSIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCItLT4iLCBqICsgMyk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENvbW1lbnQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ29tbWVudChzLnN1YnN0cmluZyhqICsgMywgcSkpOwogICAgICAgICAgICAgIGogPSBxICsgMzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSAiW0NEQVRBWyIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCJdXT4iLCBqICsgOCk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENkYXQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ2RhdGEocy5zdWJzdHJpbmcoaiArIDgsIHEpKTsKICAgICAgICAgICAgICBqID0gcSArIDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIkRPQ1RZUEUiKSB7CiAgICAgICAgICAgICAgY29uc3QgcTIgPSBzLmluZGV4T2YoIlsiLCBqICsgOCk7CiAgICAgICAgICAgICAgbGV0IGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7CiAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGogKyA4KTsKICAgICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHEyID4gMCAmJiBxID4gcTIpIHsKICAgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIl0+IiwgaiArIDgpOwogICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcGxleERvY3R5cGUgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBkb2N0eXBlQ29udGVudCA9IHMuc3Vic3RyaW5nKGogKyA4LCBxICsgKGNvbXBsZXhEb2N0eXBlID8gMSA6IDApKTsKICAgICAgICAgICAgICB0aGlzLm9uRG9jdHlwZShkb2N0eXBlQ29udGVudCk7CiAgICAgICAgICAgICAgaiA9IHEgKyAoY29tcGxleERvY3R5cGUgPyAyIDogMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcGFyc2VDb250ZW50KHMsIGopOwogICAgICAgICAgICBpZiAoY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIGNvbnRlbnQucGFyc2VkLCBqICsgY29udGVudC5wYXJzZWQgKyAyKSA9PT0gIi8+IikgewogICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDEpICE9PSAiPiIpIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uQmVnaW5FbGVtZW50KGNvbnRlbnQubmFtZSwgY29udGVudC5hdHRyaWJ1dGVzLCBpc0Nsb3NlZCk7CiAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoICYmIHNbal0gIT09ICI8IikgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBjb25zdCB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7CiAgICAgICAgdGhpcy5vblRleHQodGhpcy5fcmVzb2x2ZUVudGl0aWVzKHRleHQpKTsKICAgICAgfQogICAgICBpID0gajsKICAgIH0KICB9CiAgb25SZXNvbHZlRW50aXR5KG5hbWUpIHsKICAgIHJldHVybiBgJiR7bmFtZX07YDsKICB9CiAgb25QaShuYW1lLCB2YWx1ZSkge30KICBvbkNvbW1lbnQodGV4dCkge30KICBvbkNkYXRhKHRleHQpIHt9CiAgb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fQogIG9uVGV4dCh0ZXh0KSB7fQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9CiAgb25FbmRFbGVtZW50KG5hbWUpIHt9CiAgb25FcnJvcihjb2RlKSB7fQp9CmNsYXNzIFNpbXBsZURPTU5vZGUgewogIGNvbnN0cnVjdG9yKG5vZGVOYW1lLCBub2RlVmFsdWUpIHsKICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKICAgIHRoaXMubm9kZVZhbHVlID0gbm9kZVZhbHVlOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJwYXJlbnROb2RlIiwgewogICAgICB2YWx1ZTogbnVsbCwKICAgICAgd3JpdGFibGU6IHRydWUKICAgIH0pOwogIH0KICBnZXQgZmlyc3RDaGlsZCgpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/LlswXTsKICB9CiAgZ2V0IG5leHRTaWJsaW5nKCkgewogICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzOwogICAgaWYgKCFjaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBjb25zdCBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTsKICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBjaGlsZE5vZGVzW2luZGV4ICsgMV07CiAgfQogIGdldCB0ZXh0Q29udGVudCgpIHsKICAgIGlmICghdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSB8fCAiIjsKICAgIH0KICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMubWFwKGNoaWxkID0+IGNoaWxkLnRleHRDb250ZW50KS5qb2luKCIiKTsKICB9CiAgZ2V0IGNoaWxkcmVuKCkgewogICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyB8fCBbXTsKICB9CiAgaGFzQ2hpbGROb2RlcygpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDA7CiAgfQogIHNlYXJjaE5vZGUocGF0aHMsIHBvcykgewogICAgaWYgKHBvcyA+PSBwYXRocy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoc1twb3NdOwogICAgaWYgKGNvbXBvbmVudC5uYW1lLnN0YXJ0c1dpdGgoIiMiKSAmJiBwb3MgPCBwYXRocy5sZW5ndGggLSAxKSB7CiAgICAgIHJldHVybiB0aGlzLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgfQogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIGxldCBub2RlID0gdGhpczsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjb21wb25lbnQubmFtZSA9PT0gbm9kZS5ub2RlTmFtZSkgewogICAgICAgIGlmIChjb21wb25lbnQucG9zID09PSAwKSB7CiAgICAgICAgICBjb25zdCByZXMgPSBub2RlLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgICAgICAgaWYgKHJlcyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW3BhcmVudF0gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGxldCBzaWJsaW5nUG9zID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFyZW50LmNoaWxkTm9kZXMpIHsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSBjaGlsZC5ub2RlTmFtZSkgewogICAgICAgICAgICAgIGlmIChzaWJsaW5nUG9zID09PSBjb21wb25lbnQucG9zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNpYmxpbmdQb3MrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vZGUuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChub2RlLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDApIHsKICAgICAgICBzdGFjay5wdXNoKFtub2RlLCAwXSk7CiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1swXTsKICAgICAgfSBlbHNlIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBbcGFyZW50LCBjdXJyZW50UG9zXSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgY29uc3QgbmV3UG9zID0gY3VycmVudFBvcyArIDE7CiAgICAgICAgICBpZiAobmV3UG9zIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goW3BhcmVudCwgbmV3UG9zXSk7CiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tuZXdQb3NdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGR1bXAoYnVmZmVyKSB7CiAgICBpZiAodGhpcy5ub2RlTmFtZSA9PT0gIiN0ZXh0IikgewogICAgICBidWZmZXIucHVzaChlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBidWZmZXIucHVzaChgPCR7dGhpcy5ub2RlTmFtZX1gKTsKICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMpIHsKICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgdGhpcy5hdHRyaWJ1dGVzKSB7CiAgICAgICAgYnVmZmVyLnB1c2goYCAke2F0dHJpYnV0ZS5uYW1lfT0iJHtlbmNvZGVUb1htbFN0cmluZyhhdHRyaWJ1dGUudmFsdWUpfSJgKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuaGFzQ2hpbGROb2RlcygpKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCI+Iik7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgICAgY2hpbGQuZHVtcChidWZmZXIpOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKGA8LyR7dGhpcy5ub2RlTmFtZX0+YCk7CiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZVZhbHVlKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGA+JHtlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSl9PC8ke3RoaXMubm9kZU5hbWV9PmApOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLnB1c2goIi8+Iik7CiAgICB9CiAgfQp9CmNsYXNzIFNpbXBsZVhNTFBhcnNlciBleHRlbmRzIFhNTFBhcnNlckJhc2UgewogIGNvbnN0cnVjdG9yKHsKICAgIGhhc0F0dHJpYnV0ZXMgPSBmYWxzZSwKICAgIGxvd2VyQ2FzZU5hbWUgPSBmYWxzZQogIH0pIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBudWxsOwogICAgdGhpcy5fc3RhY2sgPSBudWxsOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLl9oYXNBdHRyaWJ1dGVzID0gaGFzQXR0cmlidXRlczsKICAgIHRoaXMuX2xvd2VyQ2FzZU5hbWUgPSBsb3dlckNhc2VOYW1lOwogIH0KICBwYXJzZUZyb21TdHJpbmcoZGF0YSkgewogICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gW107CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLnBhcnNlWG1sKGRhdGEpOwogICAgaWYgKHRoaXMuX2Vycm9yQ29kZSAhPT0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3IpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IFtkb2N1bWVudEVsZW1lbnRdID0gdGhpcy5fY3VycmVudEZyYWdtZW50OwogICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRvY3VtZW50RWxlbWVudAogICAgfTsKICB9CiAgb25UZXh0KHRleHQpIHsKICAgIGlmIChpc1doaXRlc3BhY2VTdHJpbmcodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHsKICAgIGlmICh0aGlzLl9sb3dlckNhc2VOYW1lKSB7CiAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUobmFtZSk7CiAgICBub2RlLmNoaWxkTm9kZXMgPSBbXTsKICAgIGlmICh0aGlzLl9oYXNBdHRyaWJ1dGVzKSB7CiAgICAgIG5vZGUuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICB9CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG5vZGUuY2hpbGROb2RlczsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IHRoaXMuX3N0YWNrLnBvcCgpIHx8IFtdOwogICAgY29uc3QgbGFzdEVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpOwogICAgaWYgKCFsYXN0RWxlbWVudCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIGxhc3RFbGVtZW50LmNoaWxkTm9kZXMpIHsKICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSBsYXN0RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBsYXN0RWxlbWVudDsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvbWV0YWRhdGFfcGFyc2VyLmpzCgpjbGFzcyBNZXRhZGF0YVBhcnNlciB7CiAgY29uc3RydWN0b3IoZGF0YSkgewogICAgZGF0YSA9IHRoaXMuX3JlcGFpcihkYXRhKTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTaW1wbGVYTUxQYXJzZXIoewogICAgICBsb3dlckNhc2VOYW1lOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IHhtbERvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhKTsKICAgIHRoaXMuX21ldGFkYXRhTWFwID0gbmV3IE1hcCgpOwogICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICBpZiAoeG1sRG9jdW1lbnQpIHsKICAgICAgdGhpcy5fcGFyc2UoeG1sRG9jdW1lbnQpOwogICAgfQogIH0KICBfcmVwYWlyKGRhdGEpIHsKICAgIHJldHVybiBkYXRhLnJlcGxhY2UoL15bXjxdKy8sICIiKS5yZXBsYWNlQWxsKC8+XFwzNzZcXDM3NyhbXjxdKykvZywgZnVuY3Rpb24gKGFsbCwgY29kZXMpIHsKICAgICAgY29uc3QgYnl0ZXMgPSBjb2Rlcy5yZXBsYWNlQWxsKC9cXChbMC0zXSkoWzAtN10pKFswLTddKS9nLCBmdW5jdGlvbiAoY29kZSwgZDEsIGQyLCBkMykgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGQxICogNjQgKyBkMiAqIDggKyBkMyAqIDEpOwogICAgICB9KS5yZXBsYWNlQWxsKC8mKGFtcHxhcG9zfGd0fGx0fHF1b3QpOy9nLCBmdW5jdGlvbiAoc3RyLCBuYW1lKSB7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgICByZXR1cm4gIiYiOwogICAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICAgIHJldHVybiAiJyI7CiAgICAgICAgICBjYXNlICJndCI6CiAgICAgICAgICAgIHJldHVybiAiPiI7CiAgICAgICAgICBjYXNlICJsdCI6CiAgICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgICAgcmV0dXJuICciJzsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfcmVwYWlyOiAke25hbWV9IGlzbid0IGRlZmluZWQuYCk7CiAgICAgIH0pOwogICAgICBjb25zdCBjaGFyQnVmID0gWyI+Il07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBjb25zdCBjb2RlID0gYnl0ZXMuY2hhckNvZGVBdChpKSAqIDI1NiArIGJ5dGVzLmNoYXJDb2RlQXQoaSArIDEpOwogICAgICAgIGlmIChjb2RlID49IDMyICYmIGNvZGUgPCAxMjcgJiYgY29kZSAhPT0gNjAgJiYgY29kZSAhPT0gNjIgJiYgY29kZSAhPT0gMzgpIHsKICAgICAgICAgIGNoYXJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hhckJ1Zi5wdXNoKCImI3giICsgKDB4MTAwMDAgKyBjb2RlKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpICsgIjsiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJCdWYuam9pbigiIik7CiAgICB9KTsKICB9CiAgX2dldFNlcXVlbmNlKGVudHJ5KSB7CiAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWU7CiAgICBpZiAobmFtZSAhPT0gInJkZjpiYWciICYmIG5hbWUgIT09ICJyZGY6c2VxIiAmJiBuYW1lICE9PSAicmRmOmFsdCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gZW50cnkuY2hpbGROb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLm5vZGVOYW1lID09PSAicmRmOmxpIik7CiAgfQogIF9wYXJzZUFycmF5KGVudHJ5KSB7CiAgICBpZiAoIWVudHJ5Lmhhc0NoaWxkTm9kZXMoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBbc2VxTm9kZV0gPSBlbnRyeS5jaGlsZE5vZGVzOwogICAgY29uc3Qgc2VxdWVuY2UgPSB0aGlzLl9nZXRTZXF1ZW5jZShzZXFOb2RlKSB8fCBbXTsKICAgIHRoaXMuX21ldGFkYXRhTWFwLnNldChlbnRyeS5ub2RlTmFtZSwgc2VxdWVuY2UubWFwKG5vZGUgPT4gbm9kZS50ZXh0Q29udGVudC50cmltKCkpKTsKICB9CiAgX3BhcnNlKHhtbERvY3VtZW50KSB7CiAgICBsZXQgcmRmID0geG1sRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgaWYgKHJkZi5ub2RlTmFtZSAhPT0gInJkZjpyZGYiKSB7CiAgICAgIHJkZiA9IHJkZi5maXJzdENoaWxkOwogICAgICB3aGlsZSAocmRmICYmIHJkZi5ub2RlTmFtZSAhPT0gInJkZjpyZGYiKSB7CiAgICAgICAgcmRmID0gcmRmLm5leHRTaWJsaW5nOwogICAgICB9CiAgICB9CiAgICBpZiAoIXJkZiB8fCByZGYubm9kZU5hbWUgIT09ICJyZGY6cmRmIiB8fCAhcmRmLmhhc0NoaWxkTm9kZXMoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGRlc2Mgb2YgcmRmLmNoaWxkTm9kZXMpIHsKICAgICAgaWYgKGRlc2Mubm9kZU5hbWUgIT09ICJyZGY6ZGVzY3JpcHRpb24iKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBkZXNjLmNoaWxkTm9kZXMpIHsKICAgICAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWU7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICBjYXNlICIjdGV4dCI6CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY2FzZSAiZGM6Y3JlYXRvciI6CiAgICAgICAgICBjYXNlICJkYzpzdWJqZWN0IjoKICAgICAgICAgICAgdGhpcy5fcGFyc2VBcnJheShlbnRyeSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tZXRhZGF0YU1hcC5zZXQobmFtZSwgZW50cnkudGV4dENvbnRlbnQudHJpbSgpKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcGFyc2VkRGF0YTogdGhpcy5fbWV0YWRhdGFNYXAsCiAgICAgIHJhd0RhdGE6IHRoaXMuX2RhdGEKICAgIH07CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9zdHJ1Y3RfdHJlZS5qcwoKCgoKY29uc3QgTUFYX0RFUFRIID0gNDA7CmNvbnN0IFN0cnVjdEVsZW1lbnRUeXBlID0gewogIFBBR0VfQ09OVEVOVDogMSwKICBTVFJFQU1fQ09OVEVOVDogMiwKICBPQkpFQ1Q6IDMsCiAgQU5OT1RBVElPTjogNCwKICBFTEVNRU5UOiA1Cn07CmNsYXNzIFN0cnVjdFRyZWVSb290IHsKICBjb25zdHJ1Y3Rvcih4cmVmLCByb290RGljdCwgcm9vdFJlZikgewogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuZGljdCA9IHJvb3REaWN0OwogICAgdGhpcy5yZWYgPSByb290UmVmIGluc3RhbmNlb2YgUmVmID8gcm9vdFJlZiA6IG51bGw7CiAgICB0aGlzLnJvbGVNYXAgPSBuZXcgTWFwKCk7CiAgICB0aGlzLnN0cnVjdFBhcmVudElkcyA9IG51bGw7CiAgfQogIGluaXQoKSB7CiAgICB0aGlzLnJlYWRSb2xlTWFwKCk7CiAgfQogICNhZGRJZFRvUGFnZShwYWdlUmVmLCBpZCwgdHlwZSkgewogICAgaWYgKCEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgfHwgaWQgPCAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuc3RydWN0UGFyZW50SWRzIHx8PSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIGxldCBpZHMgPSB0aGlzLnN0cnVjdFBhcmVudElkcy5nZXQocGFnZVJlZik7CiAgICBpZiAoIWlkcykgewogICAgICBpZHMgPSBbXTsKICAgICAgdGhpcy5zdHJ1Y3RQYXJlbnRJZHMucHV0KHBhZ2VSZWYsIGlkcyk7CiAgICB9CiAgICBpZHMucHVzaChbaWQsIHR5cGVdKTsKICB9CiAgYWRkQW5ub3RhdGlvbklkVG9QYWdlKHBhZ2VSZWYsIGlkKSB7CiAgICB0aGlzLiNhZGRJZFRvUGFnZShwYWdlUmVmLCBpZCwgU3RydWN0RWxlbWVudFR5cGUuQU5OT1RBVElPTik7CiAgfQogIHJlYWRSb2xlTWFwKCkgewogICAgY29uc3Qgcm9sZU1hcERpY3QgPSB0aGlzLmRpY3QuZ2V0KCJSb2xlTWFwIik7CiAgICBpZiAoIShyb2xlTWFwRGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJvbGVNYXBEaWN0KSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICB0aGlzLnJvbGVNYXAuc2V0KGtleSwgdmFsdWUubmFtZSk7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIGNhbkNyZWF0ZVN0cnVjdHVyZVRyZWUoewogICAgY2F0YWxvZ1JlZiwKICAgIHBkZk1hbmFnZXIsCiAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZQogIH0pIHsKICAgIGlmICghKGNhdGFsb2dSZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgIHdhcm4oIkNhbm5vdCBzYXZlIHRoZSBzdHJ1Y3QgdHJlZTogbm8gY2F0YWxvZyByZWZlcmVuY2UuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGxldCBuZXh0S2V5ID0gMDsKICAgIGxldCBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHJlZjogcGFnZVJlZgogICAgICB9ID0gYXdhaXQgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCk7CiAgICAgIGlmICghKHBhZ2VSZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgICAgd2FybihgQ2Fubm90IHNhdmUgdGhlIHN0cnVjdCB0cmVlOiBwYWdlICR7cGFnZUluZGV4fSBoYXMgbm8gcmVmLmApOwogICAgICAgIGhhc05vdGhpbmdUb1VwZGF0ZSA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGVsZW1lbnQucGFyZW50VHJlZUlkID0gbmV4dEtleSsrOwogICAgICAgICAgaGFzTm90aGluZ1RvVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaGFzTm90aGluZ1RvVXBkYXRlKSB7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UudmFsdWVzKCkpIHsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnBhcmVudFRyZWVJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgeHJlZiwKICAgIGNhdGFsb2dSZWYsCiAgICBwZGZNYW5hZ2VyLAogICAgY2hhbmdlcwogIH0pIHsKICAgIGNvbnN0IHJvb3QgPSBwZGZNYW5hZ2VyLmNhdGFsb2cuY2xvbmVEaWN0KCk7CiAgICBjb25zdCBjYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgY2FjaGUucHV0KGNhdGFsb2dSZWYsIHJvb3QpOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3RSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgcm9vdC5zZXQoIlN0cnVjdFRyZWVSb290Iiwgc3RydWN0VHJlZVJvb3RSZWYpOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIHN0cnVjdFRyZWVSb290LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJTdHJ1Y3RUcmVlUm9vdCIpKTsKICAgIGNvbnN0IHBhcmVudFRyZWVSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgc3RydWN0VHJlZVJvb3Quc2V0KCJQYXJlbnRUcmVlIiwgcGFyZW50VHJlZVJlZik7CiAgICBjb25zdCBraWRzID0gW107CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIksiLCBraWRzKTsKICAgIGNhY2hlLnB1dChzdHJ1Y3RUcmVlUm9vdFJlZiwgc3RydWN0VHJlZVJvb3QpOwogICAgY29uc3QgcGFyZW50VHJlZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgbnVtcyA9IFtdOwogICAgcGFyZW50VHJlZS5zZXQoIk51bXMiLCBudW1zKTsKICAgIGNvbnN0IG5leHRLZXkgPSBhd2FpdCB0aGlzLiN3cml0ZUtpZHMoewogICAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgICAgc3RydWN0VHJlZVJvb3RSZWYsCiAgICAgIHN0cnVjdFRyZWVSb290OiBudWxsLAogICAgICBraWRzLAogICAgICBudW1zLAogICAgICB4cmVmLAogICAgICBwZGZNYW5hZ2VyLAogICAgICBjaGFuZ2VzLAogICAgICBjYWNoZQogICAgfSk7CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWVOZXh0S2V5IiwgbmV4dEtleSk7CiAgICBjYWNoZS5wdXQocGFyZW50VHJlZVJlZiwgcGFyZW50VHJlZSk7CiAgICBmb3IgKGNvbnN0IFtyZWYsIG9ial0gb2YgY2FjaGUuaXRlbXMoKSkgewogICAgICBjaGFuZ2VzLnB1dChyZWYsIHsKICAgICAgICBkYXRhOiBvYmoKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIGNhblVwZGF0ZVN0cnVjdFRyZWUoewogICAgcGRmTWFuYWdlciwKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlCiAgfSkgewogICAgaWYgKCF0aGlzLnJlZikgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogbm8gcm9vdCByZWZlcmVuY2UuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGxldCBuZXh0S2V5ID0gdGhpcy5kaWN0LmdldCgiUGFyZW50VHJlZU5leHRLZXkiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihuZXh0S2V5KSB8fCBuZXh0S2V5IDwgMCkgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogaW52YWxpZCBuZXh0IGtleS4iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcGFyZW50VHJlZSA9IHRoaXMuZGljdC5nZXQoIlBhcmVudFRyZWUiKTsKICAgIGlmICghKHBhcmVudFRyZWUgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogUGFyZW50VHJlZSBpc24ndCBhIGRpY3QuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IG51bXMgPSBwYXJlbnRUcmVlLmdldCgiTnVtcyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KG51bXMpKSB7CiAgICAgIHdhcm4oIkNhbm5vdCB1cGRhdGUgdGhlIHN0cnVjdCB0cmVlOiBudW1zIGlzbid0IGFuIGFycmF5LiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUocGFyZW50VHJlZSwgdGhpcy54cmVmKTsKICAgIGZvciAoY29uc3QgcGFnZUluZGV4IG9mIG5ld0Fubm90YXRpb25zQnlQYWdlLmtleXMoKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcGFnZURpY3QKICAgICAgfSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBpZiAoIXBhZ2VEaWN0LmhhcygiU3RydWN0UGFyZW50cyIpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaWQgPSBwYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSB8fCAhQXJyYXkuaXNBcnJheShudW1iZXJUcmVlLmdldChpZCkpKSB7CiAgICAgICAgd2FybihgQ2Fubm90IHNhdmUgdGhlIHN0cnVjdCB0cmVlOiBwYWdlICR7cGFnZUluZGV4fSBoYXMgYSB3cm9uZyBpZC5gKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGxldCBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHBhZ2VEaWN0CiAgICAgIH0gPSBhd2FpdCBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KTsKICAgICAgU3RydWN0VHJlZVJvb3QuI2NvbGxlY3RQYXJlbnRzKHsKICAgICAgICBlbGVtZW50cywKICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgcGFnZURpY3QsCiAgICAgICAgbnVtYmVyVHJlZQogICAgICB9KTsKICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGlmICghKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGEuc3RydWN0UGFyZW50ID49IDApKSB7CiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50VHJlZUlkID0gbmV4dEtleSsrOwogICAgICAgICAgfQogICAgICAgICAgaGFzTm90aGluZ1RvVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaGFzTm90aGluZ1RvVXBkYXRlKSB7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UudmFsdWVzKCkpIHsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnBhcmVudFRyZWVJZDsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnN0cnVjdFRyZWVQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhc3luYyB1cGRhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgcGRmTWFuYWdlciwKICAgIGNoYW5nZXMKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIHJlZjogc3RydWN0VHJlZVJvb3RSZWYsCiAgICAgIHhyZWYKICAgIH0gPSB0aGlzOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSB0aGlzLmRpY3QuY2xvbmUoKTsKICAgIGNvbnN0IGNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICBjYWNoZS5wdXQoc3RydWN0VHJlZVJvb3RSZWYsIHN0cnVjdFRyZWVSb290KTsKICAgIGxldCBwYXJlbnRUcmVlUmVmID0gc3RydWN0VHJlZVJvb3QuZ2V0UmF3KCJQYXJlbnRUcmVlIik7CiAgICBsZXQgcGFyZW50VHJlZTsKICAgIGlmIChwYXJlbnRUcmVlUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHBhcmVudFRyZWUgPSB4cmVmLmZldGNoKHBhcmVudFRyZWVSZWYpOwogICAgfSBlbHNlIHsKICAgICAgcGFyZW50VHJlZSA9IHBhcmVudFRyZWVSZWY7CiAgICAgIHBhcmVudFRyZWVSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWUiLCBwYXJlbnRUcmVlUmVmKTsKICAgIH0KICAgIHBhcmVudFRyZWUgPSBwYXJlbnRUcmVlLmNsb25lKCk7CiAgICBjYWNoZS5wdXQocGFyZW50VHJlZVJlZiwgcGFyZW50VHJlZSk7CiAgICBsZXQgbnVtcyA9IHBhcmVudFRyZWUuZ2V0UmF3KCJOdW1zIik7CiAgICBsZXQgbnVtc1JlZiA9IG51bGw7CiAgICBpZiAobnVtcyBpbnN0YW5jZW9mIFJlZikgewogICAgICBudW1zUmVmID0gbnVtczsKICAgICAgbnVtcyA9IHhyZWYuZmV0Y2gobnVtc1JlZik7CiAgICB9CiAgICBudW1zID0gbnVtcy5zbGljZSgpOwogICAgaWYgKCFudW1zUmVmKSB7CiAgICAgIHBhcmVudFRyZWUuc2V0KCJOdW1zIiwgbnVtcyk7CiAgICB9CiAgICBjb25zdCBuZXdOZXh0S2V5ID0gYXdhaXQgU3RydWN0VHJlZVJvb3QuI3dyaXRlS2lkcyh7CiAgICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgICBzdHJ1Y3RUcmVlUm9vdFJlZiwKICAgICAgc3RydWN0VHJlZVJvb3Q6IHRoaXMsCiAgICAgIGtpZHM6IG51bGwsCiAgICAgIG51bXMsCiAgICAgIHhyZWYsCiAgICAgIHBkZk1hbmFnZXIsCiAgICAgIGNoYW5nZXMsCiAgICAgIGNhY2hlCiAgICB9KTsKICAgIGlmIChuZXdOZXh0S2V5ID09PSAtMSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWVOZXh0S2V5IiwgbmV3TmV4dEtleSk7CiAgICBpZiAobnVtc1JlZikgewogICAgICBjYWNoZS5wdXQobnVtc1JlZiwgbnVtcyk7CiAgICB9CiAgICBmb3IgKGNvbnN0IFtyZWYsIG9ial0gb2YgY2FjaGUuaXRlbXMoKSkgewogICAgICBjaGFuZ2VzLnB1dChyZWYsIHsKICAgICAgICBkYXRhOiBvYmoKICAgICAgfSk7CiAgICB9CiAgfQogIHN0YXRpYyBhc3luYyAjd3JpdGVLaWRzKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgc3RydWN0VHJlZVJvb3RSZWYsCiAgICBzdHJ1Y3RUcmVlUm9vdCwKICAgIGtpZHMsCiAgICBudW1zLAogICAgeHJlZiwKICAgIHBkZk1hbmFnZXIsCiAgICBjaGFuZ2VzLAogICAgY2FjaGUKICB9KSB7CiAgICBjb25zdCBvYmpyID0gTmFtZS5nZXQoIk9CSlIiKTsKICAgIGxldCBuZXh0S2V5ID0gLTE7CiAgICBsZXQgc3RydWN0VHJlZVBhZ2VPYmpzOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBjb25zdCB7CiAgICAgICAgcmVmOiBwYWdlUmVmCiAgICAgIH0gPSBwYWdlOwogICAgICBjb25zdCBpc1BhZ2VSZWYgPSBwYWdlUmVmIGluc3RhbmNlb2YgUmVmOwogICAgICBmb3IgKGNvbnN0IHsKICAgICAgICBhY2Nlc3NpYmlsaXR5RGF0YSwKICAgICAgICByZWYsCiAgICAgICAgcGFyZW50VHJlZUlkLAogICAgICAgIHN0cnVjdFRyZWVQYXJlbnQKICAgICAgfSBvZiBlbGVtZW50cykgewogICAgICAgIGlmICghYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB7CiAgICAgICAgICBzdHJ1Y3RQYXJlbnQKICAgICAgICB9ID0gYWNjZXNzaWJpbGl0eURhdGE7CiAgICAgICAgaWYgKHN0cnVjdFRyZWVSb290ICYmIE51bWJlci5pc0ludGVnZXIoc3RydWN0UGFyZW50KSAmJiBzdHJ1Y3RQYXJlbnQgPj0gMCkgewogICAgICAgICAgbGV0IG9ianMgPSAoc3RydWN0VHJlZVBhZ2VPYmpzIHx8PSBuZXcgTWFwKCkpLmdldChwYWdlSW5kZXgpOwogICAgICAgICAgaWYgKG9ianMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb25zdCBzdHJ1Y3RUcmVlUGFnZSA9IG5ldyBTdHJ1Y3RUcmVlUGFnZShzdHJ1Y3RUcmVlUm9vdCwgcGFnZS5wYWdlRGljdCk7CiAgICAgICAgICAgIG9ianMgPSBzdHJ1Y3RUcmVlUGFnZS5jb2xsZWN0T2JqZWN0cyhwYWdlUmVmKTsKICAgICAgICAgICAgc3RydWN0VHJlZVBhZ2VPYmpzLnNldChwYWdlSW5kZXgsIG9ianMpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgb2JqUmVmID0gb2Jqcz8uZ2V0KHN0cnVjdFBhcmVudCk7CiAgICAgICAgICBpZiAob2JqUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IHRhZ0RpY3QgPSB4cmVmLmZldGNoKG9ialJlZikuY2xvbmUoKTsKICAgICAgICAgICAgU3RydWN0VHJlZVJvb3QuI3dyaXRlUHJvcGVydGllcyh0YWdEaWN0LCBhY2Nlc3NpYmlsaXR5RGF0YSk7CiAgICAgICAgICAgIGNoYW5nZXMucHV0KG9ialJlZiwgewogICAgICAgICAgICAgIGRhdGE6IHRhZ0RpY3QKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXh0S2V5ID0gTWF0aC5tYXgobmV4dEtleSwgcGFyZW50VHJlZUlkKTsKICAgICAgICBjb25zdCB0YWdSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgIGNvbnN0IHRhZ0RpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgICBTdHJ1Y3RUcmVlUm9vdC4jd3JpdGVQcm9wZXJ0aWVzKHRhZ0RpY3QsIGFjY2Vzc2liaWxpdHlEYXRhKTsKICAgICAgICBhd2FpdCB0aGlzLiN1cGRhdGVQYXJlbnRUYWcoewogICAgICAgICAgc3RydWN0VHJlZVBhcmVudCwKICAgICAgICAgIHRhZ0RpY3QsCiAgICAgICAgICBuZXdUYWdSZWY6IHRhZ1JlZiwKICAgICAgICAgIHN0cnVjdFRyZWVSb290UmVmLAogICAgICAgICAgZmFsbGJhY2tLaWRzOiBraWRzLAogICAgICAgICAgeHJlZiwKICAgICAgICAgIGNhY2hlCiAgICAgICAgfSk7CiAgICAgICAgY29uc3Qgb2JqRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICAgIHRhZ0RpY3Quc2V0KCJLIiwgb2JqRGljdCk7CiAgICAgICAgb2JqRGljdC5zZXQoIlR5cGUiLCBvYmpyKTsKICAgICAgICBpZiAoaXNQYWdlUmVmKSB7CiAgICAgICAgICBvYmpEaWN0LnNldCgiUGciLCBwYWdlUmVmKTsKICAgICAgICB9CiAgICAgICAgb2JqRGljdC5zZXQoIk9iaiIsIHJlZik7CiAgICAgICAgY2FjaGUucHV0KHRhZ1JlZiwgdGFnRGljdCk7CiAgICAgICAgbnVtcy5wdXNoKHBhcmVudFRyZWVJZCwgdGFnUmVmKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHRLZXkgKyAxOwogIH0KICBzdGF0aWMgI3dyaXRlUHJvcGVydGllcyh0YWdEaWN0LCB7CiAgICB0eXBlLAogICAgdGl0bGUsCiAgICBsYW5nLAogICAgYWx0LAogICAgZXhwYW5kZWQsCiAgICBhY3R1YWxUZXh0CiAgfSkgewogICAgdGFnRGljdC5zZXQoIlMiLCBOYW1lLmdldCh0eXBlKSk7CiAgICBpZiAodGl0bGUpIHsKICAgICAgdGFnRGljdC5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHRpdGxlKSk7CiAgICB9CiAgICBpZiAobGFuZykgewogICAgICB0YWdEaWN0LnNldCgiTGFuZyIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUobGFuZykpOwogICAgfQogICAgaWYgKGFsdCkgewogICAgICB0YWdEaWN0LnNldCgiQWx0Iiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShhbHQpKTsKICAgIH0KICAgIGlmIChleHBhbmRlZCkgewogICAgICB0YWdEaWN0LnNldCgiRSIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUoZXhwYW5kZWQpKTsKICAgIH0KICAgIGlmIChhY3R1YWxUZXh0KSB7CiAgICAgIHRhZ0RpY3Quc2V0KCJBY3R1YWxUZXh0Iiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShhY3R1YWxUZXh0KSk7CiAgICB9CiAgfQogIHN0YXRpYyAjY29sbGVjdFBhcmVudHMoewogICAgZWxlbWVudHMsCiAgICB4cmVmLAogICAgcGFnZURpY3QsCiAgICBudW1iZXJUcmVlCiAgfSkgewogICAgY29uc3QgaWRUb0VsZW1lbnRzID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgIGlmIChlbGVtZW50LnN0cnVjdFRyZWVQYXJlbnRJZCkgewogICAgICAgIGNvbnN0IGlkID0gcGFyc2VJbnQoZWxlbWVudC5zdHJ1Y3RUcmVlUGFyZW50SWQuc3BsaXQoIl9tYyIpWzFdLCAxMCk7CiAgICAgICAgbGV0IGVsZW1zID0gaWRUb0VsZW1lbnRzLmdldChpZCk7CiAgICAgICAgaWYgKCFlbGVtcykgewogICAgICAgICAgZWxlbXMgPSBbXTsKICAgICAgICAgIGlkVG9FbGVtZW50cy5zZXQoaWQsIGVsZW1zKTsKICAgICAgICB9CiAgICAgICAgZWxlbXMucHVzaChlbGVtZW50KTsKICAgICAgfQogICAgfQogICAgY29uc3QgaWQgPSBwYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50QXJyYXkgPSBudW1iZXJUcmVlLmdldChpZCk7CiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gKGtpZCwgcGFnZUtpZCwga2lkUmVmKSA9PiB7CiAgICAgIGNvbnN0IGVsZW1zID0gaWRUb0VsZW1lbnRzLmdldChraWQpOwogICAgICBpZiAoZWxlbXMpIHsKICAgICAgICBjb25zdCBwYXJlbnRSZWYgPSBwYWdlS2lkLmdldFJhdygiUCIpOwogICAgICAgIGNvbnN0IHBhcmVudERpY3QgPSB4cmVmLmZldGNoSWZSZWYocGFyZW50UmVmKTsKICAgICAgICBpZiAocGFyZW50UmVmIGluc3RhbmNlb2YgUmVmICYmIHBhcmVudERpY3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgICAgICAgIHJlZjoga2lkUmVmLAogICAgICAgICAgICBkaWN0OiBwYWdlS2lkCiAgICAgICAgICB9OwogICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1zKSB7CiAgICAgICAgICAgIGVsZW1lbnQuc3RydWN0VHJlZVBhcmVudCA9IHBhcmFtczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIGZvciAoY29uc3Qga2lkUmVmIG9mIHBhcmVudEFycmF5KSB7CiAgICAgIGlmICghKGtpZFJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBwYWdlS2lkID0geHJlZi5mZXRjaChraWRSZWYpOwogICAgICBjb25zdCBrID0gcGFnZUtpZC5nZXQoIksiKTsKICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaykpIHsKICAgICAgICB1cGRhdGVFbGVtZW50KGssIHBhZ2VLaWQsIGtpZFJlZik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGspKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChsZXQga2lkIG9mIGspIHsKICAgICAgICBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihraWQpICYmIHVwZGF0ZUVsZW1lbnQoa2lkLCBwYWdlS2lkLCBraWRSZWYpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2lkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzTmFtZShraWQuZ2V0KCJUeXBlIiksICJNQ1IiKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1jaWQgPSBraWQuZ2V0KCJNQ0lEIik7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobWNpZCkgJiYgdXBkYXRlRWxlbWVudChtY2lkLCBwYWdlS2lkLCBraWRSZWYpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGFzeW5jICN1cGRhdGVQYXJlbnRUYWcoewogICAgc3RydWN0VHJlZVBhcmVudCwKICAgIHRhZ0RpY3QsCiAgICBuZXdUYWdSZWYsCiAgICBzdHJ1Y3RUcmVlUm9vdFJlZiwKICAgIGZhbGxiYWNrS2lkcywKICAgIHhyZWYsCiAgICBjYWNoZQogIH0pIHsKICAgIGxldCByZWYgPSBudWxsOwogICAgbGV0IHBhcmVudFJlZjsKICAgIGlmIChzdHJ1Y3RUcmVlUGFyZW50KSB7CiAgICAgICh7CiAgICAgICAgcmVmCiAgICAgIH0gPSBzdHJ1Y3RUcmVlUGFyZW50KTsKICAgICAgcGFyZW50UmVmID0gc3RydWN0VHJlZVBhcmVudC5kaWN0LmdldFJhdygiUCIpIHx8IHN0cnVjdFRyZWVSb290UmVmOwogICAgfSBlbHNlIHsKICAgICAgcGFyZW50UmVmID0gc3RydWN0VHJlZVJvb3RSZWY7CiAgICB9CiAgICB0YWdEaWN0LnNldCgiUCIsIHBhcmVudFJlZik7CiAgICBjb25zdCBwYXJlbnREaWN0ID0geHJlZi5mZXRjaElmUmVmKHBhcmVudFJlZik7CiAgICBpZiAoIXBhcmVudERpY3QpIHsKICAgICAgZmFsbGJhY2tLaWRzLnB1c2gobmV3VGFnUmVmKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGNhY2hlZFBhcmVudERpY3QgPSBjYWNoZS5nZXQocGFyZW50UmVmKTsKICAgIGlmICghY2FjaGVkUGFyZW50RGljdCkgewogICAgICBjYWNoZWRQYXJlbnREaWN0ID0gcGFyZW50RGljdC5jbG9uZSgpOwogICAgICBjYWNoZS5wdXQocGFyZW50UmVmLCBjYWNoZWRQYXJlbnREaWN0KTsKICAgIH0KICAgIGNvbnN0IHBhcmVudEtpZHNSYXcgPSBjYWNoZWRQYXJlbnREaWN0LmdldFJhdygiSyIpOwogICAgbGV0IGNhY2hlZFBhcmVudEtpZHMgPSBwYXJlbnRLaWRzUmF3IGluc3RhbmNlb2YgUmVmID8gY2FjaGUuZ2V0KHBhcmVudEtpZHNSYXcpIDogbnVsbDsKICAgIGlmICghY2FjaGVkUGFyZW50S2lkcykgewogICAgICBjYWNoZWRQYXJlbnRLaWRzID0geHJlZi5mZXRjaElmUmVmKHBhcmVudEtpZHNSYXcpOwogICAgICBjYWNoZWRQYXJlbnRLaWRzID0gQXJyYXkuaXNBcnJheShjYWNoZWRQYXJlbnRLaWRzKSA/IGNhY2hlZFBhcmVudEtpZHMuc2xpY2UoKSA6IFtwYXJlbnRLaWRzUmF3XTsKICAgICAgY29uc3QgcGFyZW50S2lkc1JlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIGNhY2hlZFBhcmVudERpY3Quc2V0KCJLIiwgcGFyZW50S2lkc1JlZik7CiAgICAgIGNhY2hlLnB1dChwYXJlbnRLaWRzUmVmLCBjYWNoZWRQYXJlbnRLaWRzKTsKICAgIH0KICAgIGNvbnN0IGluZGV4ID0gY2FjaGVkUGFyZW50S2lkcy5pbmRleE9mKHJlZik7CiAgICBjYWNoZWRQYXJlbnRLaWRzLnNwbGljZShpbmRleCA+PSAwID8gaW5kZXggKyAxIDogY2FjaGVkUGFyZW50S2lkcy5sZW5ndGgsIDAsIG5ld1RhZ1JlZik7CiAgfQp9CmNsYXNzIFN0cnVjdEVsZW1lbnROb2RlIHsKICBjb25zdHJ1Y3Rvcih0cmVlLCBkaWN0KSB7CiAgICB0aGlzLnRyZWUgPSB0cmVlOwogICAgdGhpcy54cmVmID0gdHJlZS54cmVmOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICAgIHRoaXMua2lkcyA9IFtdOwogICAgdGhpcy5wYXJzZUtpZHMoKTsKICB9CiAgZ2V0IHJvbGUoKSB7CiAgICBjb25zdCBuYW1lT2JqID0gdGhpcy5kaWN0LmdldCgiUyIpOwogICAgY29uc3QgbmFtZSA9IG5hbWVPYmogaW5zdGFuY2VvZiBOYW1lID8gbmFtZU9iai5uYW1lIDogIiI7CiAgICBjb25zdCB7CiAgICAgIHJvb3QKICAgIH0gPSB0aGlzLnRyZWU7CiAgICByZXR1cm4gcm9vdC5yb2xlTWFwLmdldChuYW1lKSA/PyBuYW1lOwogIH0KICBwYXJzZUtpZHMoKSB7CiAgICBsZXQgcGFnZU9iaklkID0gbnVsbDsKICAgIGNvbnN0IG9ialJlZiA9IHRoaXMuZGljdC5nZXRSYXcoIlBnIik7CiAgICBpZiAob2JqUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHBhZ2VPYmpJZCA9IG9ialJlZi50b1N0cmluZygpOwogICAgfQogICAgY29uc3Qga2lkcyA9IHRoaXMuZGljdC5nZXQoIksiKTsKICAgIGlmIChBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgIGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHsKICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUtpZChwYWdlT2JqSWQsIHRoaXMueHJlZi5mZXRjaElmUmVmKGtpZCkpOwogICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICB0aGlzLmtpZHMucHVzaChlbGVtZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlS2lkKHBhZ2VPYmpJZCwga2lkcyk7CiAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgdGhpcy5raWRzLnB1c2goZWxlbWVudCk7CiAgICAgIH0KICAgIH0KICB9CiAgcGFyc2VLaWQocGFnZU9iaklkLCBraWQpIHsKICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGtpZCkpIHsKICAgICAgaWYgKHRoaXMudHJlZS5wYWdlRGljdC5vYmpJZCAhPT0gcGFnZU9iaklkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5QQUdFX0NPTlRFTlQsCiAgICAgICAgbWNpZDoga2lkLAogICAgICAgIHBhZ2VPYmpJZAogICAgICB9KTsKICAgIH0KICAgIGlmICghKGtpZCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcGFnZVJlZiA9IGtpZC5nZXRSYXcoIlBnIik7CiAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICBwYWdlT2JqSWQgPSBwYWdlUmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICBjb25zdCB0eXBlID0ga2lkLmdldCgiVHlwZSIpIGluc3RhbmNlb2YgTmFtZSA/IGtpZC5nZXQoIlR5cGUiKS5uYW1lIDogbnVsbDsKICAgIGlmICh0eXBlID09PSAiTUNSIikgewogICAgICBpZiAodGhpcy50cmVlLnBhZ2VEaWN0Lm9iaklkICE9PSBwYWdlT2JqSWQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRSZWYgPSBraWQuZ2V0UmF3KCJTdG0iKTsKICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5TVFJFQU1fQ09OVEVOVCwKICAgICAgICByZWZPYmpJZDoga2lkUmVmIGluc3RhbmNlb2YgUmVmID8ga2lkUmVmLnRvU3RyaW5nKCkgOiBudWxsLAogICAgICAgIHBhZ2VPYmpJZCwKICAgICAgICBtY2lkOiBraWQuZ2V0KCJNQ0lEIikKICAgICAgfSk7CiAgICB9CiAgICBpZiAodHlwZSA9PT0gIk9CSlIiKSB7CiAgICAgIGlmICh0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQgIT09IHBhZ2VPYmpJZCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGtpZFJlZiA9IGtpZC5nZXRSYXcoIk9iaiIpOwogICAgICByZXR1cm4gbmV3IFN0cnVjdEVsZW1lbnQoewogICAgICAgIHR5cGU6IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCwKICAgICAgICByZWZPYmpJZDoga2lkUmVmIGluc3RhbmNlb2YgUmVmID8ga2lkUmVmLnRvU3RyaW5nKCkgOiBudWxsLAogICAgICAgIHBhZ2VPYmpJZAogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXcgU3RydWN0RWxlbWVudCh7CiAgICAgIHR5cGU6IFN0cnVjdEVsZW1lbnRUeXBlLkVMRU1FTlQsCiAgICAgIGRpY3Q6IGtpZAogICAgfSk7CiAgfQp9CmNsYXNzIFN0cnVjdEVsZW1lbnQgewogIGNvbnN0cnVjdG9yKHsKICAgIHR5cGUsCiAgICBkaWN0ID0gbnVsbCwKICAgIG1jaWQgPSBudWxsLAogICAgcGFnZU9iaklkID0gbnVsbCwKICAgIHJlZk9iaklkID0gbnVsbAogIH0pIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5tY2lkID0gbWNpZDsKICAgIHRoaXMucGFnZU9iaklkID0gcGFnZU9iaklkOwogICAgdGhpcy5yZWZPYmpJZCA9IHJlZk9iaklkOwogICAgdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKICB9Cn0KY2xhc3MgU3RydWN0VHJlZVBhZ2UgewogIGNvbnN0cnVjdG9yKHN0cnVjdFRyZWVSb290LCBwYWdlRGljdCkgewogICAgdGhpcy5yb290ID0gc3RydWN0VHJlZVJvb3Q7CiAgICB0aGlzLnhyZWYgPSBzdHJ1Y3RUcmVlUm9vdD8ueHJlZiA/PyBudWxsOwogICAgdGhpcy5yb290RGljdCA9IHN0cnVjdFRyZWVSb290Py5kaWN0ID8/IG51bGw7CiAgICB0aGlzLnBhZ2VEaWN0ID0gcGFnZURpY3Q7CiAgICB0aGlzLm5vZGVzID0gW107CiAgfQogIGNvbGxlY3RPYmplY3RzKHBhZ2VSZWYpIHsKICAgIGlmICghdGhpcy5yb290IHx8ICF0aGlzLnJvb3REaWN0IHx8ICEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYXJlbnRUcmVlID0gdGhpcy5yb290RGljdC5nZXQoIlBhcmVudFRyZWUiKTsKICAgIGlmICghcGFyZW50VHJlZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGlkcyA9IHRoaXMucm9vdC5zdHJ1Y3RQYXJlbnRJZHM/LmdldChwYWdlUmVmKTsKICAgIGlmICghaWRzKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBOdW1iZXJUcmVlKHBhcmVudFRyZWUsIHRoaXMueHJlZik7CiAgICBmb3IgKGNvbnN0IFtlbGVtSWRdIG9mIGlkcykgewogICAgICBjb25zdCBvYmogPSBudW1iZXJUcmVlLmdldFJhdyhlbGVtSWQpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgbWFwLnNldChlbGVtSWQsIG9iaik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQogIHBhcnNlKHBhZ2VSZWYpIHsKICAgIGlmICghdGhpcy5yb290IHx8ICF0aGlzLnJvb3REaWN0IHx8ICEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50VHJlZSA9IHRoaXMucm9vdERpY3QuZ2V0KCJQYXJlbnRUcmVlIik7CiAgICBpZiAoIXBhcmVudFRyZWUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgaWQgPSB0aGlzLnBhZ2VEaWN0LmdldCgiU3RydWN0UGFyZW50cyIpOwogICAgY29uc3QgaWRzID0gdGhpcy5yb290LnN0cnVjdFBhcmVudElkcz8uZ2V0KHBhZ2VSZWYpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSAmJiAhaWRzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICAgIGNvbnN0IG51bWJlclRyZWUgPSBuZXcgTnVtYmVyVHJlZShwYXJlbnRUcmVlLCB0aGlzLnhyZWYpOwogICAgaWYgKE51bWJlci5pc0ludGVnZXIoaWQpKSB7CiAgICAgIGNvbnN0IHBhcmVudEFycmF5ID0gbnVtYmVyVHJlZS5nZXQoaWQpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnRBcnJheSkpIHsKICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBwYXJlbnRBcnJheSkgewogICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICB0aGlzLmFkZE5vZGUodGhpcy54cmVmLmZldGNoKHJlZiksIG1hcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIWlkcykgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IFtlbGVtSWQsIHR5cGVdIG9mIGlkcykgewogICAgICBjb25zdCBvYmogPSBudW1iZXJUcmVlLmdldChlbGVtSWQpOwogICAgICBpZiAob2JqKSB7CiAgICAgICAgY29uc3QgZWxlbSA9IHRoaXMuYWRkTm9kZSh0aGlzLnhyZWYuZmV0Y2hJZlJlZihvYmopLCBtYXApOwogICAgICAgIGlmIChlbGVtPy5raWRzPy5sZW5ndGggPT09IDEgJiYgZWxlbS5raWRzWzBdLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCkgewogICAgICAgICAgZWxlbS5raWRzWzBdLnR5cGUgPSB0eXBlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBhZGROb2RlKGRpY3QsIG1hcCwgbGV2ZWwgPSAwKSB7CiAgICBpZiAobGV2ZWwgPiBNQVhfREVQVEgpIHsKICAgICAgd2FybigiU3RydWN0VHJlZSBNQVhfREVQVEggcmVhY2hlZC4iKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAobWFwLmhhcyhkaWN0KSkgewogICAgICByZXR1cm4gbWFwLmdldChkaWN0KTsKICAgIH0KICAgIGNvbnN0IGVsZW1lbnQgPSBuZXcgU3RydWN0RWxlbWVudE5vZGUodGhpcywgZGljdCk7CiAgICBtYXAuc2V0KGRpY3QsIGVsZW1lbnQpOwogICAgY29uc3QgcGFyZW50ID0gZGljdC5nZXQoIlAiKTsKICAgIGlmICghcGFyZW50IHx8IGlzTmFtZShwYXJlbnQuZ2V0KCJUeXBlIiksICJTdHJ1Y3RUcmVlUm9vdCIpKSB7CiAgICAgIGlmICghdGhpcy5hZGRUb3BMZXZlbE5vZGUoZGljdCwgZWxlbWVudCkpIHsKICAgICAgICBtYXAuZGVsZXRlKGRpY3QpOwogICAgICB9CiAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQogICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXJlbnQsIG1hcCwgbGV2ZWwgKyAxKTsKICAgIGlmICghcGFyZW50Tm9kZSkgewogICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGxldCBzYXZlID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGtpZCBvZiBwYXJlbnROb2RlLmtpZHMpIHsKICAgICAgaWYgKGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5FTEVNRU5UICYmIGtpZC5kaWN0ID09PSBkaWN0KSB7CiAgICAgICAga2lkLnBhcmVudE5vZGUgPSBlbGVtZW50OwogICAgICAgIHNhdmUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNhdmUpIHsKICAgICAgbWFwLmRlbGV0ZShkaWN0KTsKICAgIH0KICAgIHJldHVybiBlbGVtZW50OwogIH0KICBhZGRUb3BMZXZlbE5vZGUoZGljdCwgZWxlbWVudCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5yb290RGljdC5nZXQoIksiKTsKICAgIGlmICghb2JqKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGlmIChvYmoub2JqSWQgIT09IGRpY3Qub2JqSWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy5ub2Rlc1swXSA9IGVsZW1lbnQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCFBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBsZXQgc2F2ZSA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3Qga2lkUmVmID0gb2JqW2ldOwogICAgICBpZiAoa2lkUmVmPy50b1N0cmluZygpID09PSBkaWN0Lm9iaklkKSB7CiAgICAgICAgdGhpcy5ub2Rlc1tpXSA9IGVsZW1lbnQ7CiAgICAgICAgc2F2ZSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzYXZlOwogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgZnVuY3Rpb24gbm9kZVRvU2VyaWFsaXphYmxlKG5vZGUsIHBhcmVudCwgbGV2ZWwgPSAwKSB7CiAgICAgIGlmIChsZXZlbCA+IE1BWF9ERVBUSCkgewogICAgICAgIHdhcm4oIlN0cnVjdFRyZWUgdG9vIGRlZXAgdG8gYmUgZnVsbHkgc2VyaWFsaXplZC4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgb2JqLnJvbGUgPSBub2RlLnJvbGU7CiAgICAgIG9iai5jaGlsZHJlbiA9IFtdOwogICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChvYmopOwogICAgICBsZXQgYWx0ID0gbm9kZS5kaWN0LmdldCgiQWx0Iik7CiAgICAgIGlmICh0eXBlb2YgYWx0ICE9PSAic3RyaW5nIikgewogICAgICAgIGFsdCA9IG5vZGUuZGljdC5nZXQoIkFjdHVhbFRleHQiKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGFsdCA9PT0gInN0cmluZyIpIHsKICAgICAgICBvYmouYWx0ID0gc3RyaW5nVG9QREZTdHJpbmcoYWx0KTsKICAgICAgfQogICAgICBjb25zdCBhID0gbm9kZS5kaWN0LmdldCgiQSIpOwogICAgICBpZiAoYSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChhLmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgICAgIGlmIChiYm94KSB7CiAgICAgICAgICBvYmouYmJveCA9IGJib3g7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gYS5nZXQoIldpZHRoIik7CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhLmdldCgiSGVpZ2h0Iik7CiAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIiAmJiB3aWR0aCA+IDAgJiYgdHlwZW9mIGhlaWdodCA9PT0gIm51bWJlciIgJiYgaGVpZ2h0ID4gMCkgewogICAgICAgICAgICBvYmouYmJveCA9IFswLCAwLCB3aWR0aCwgaGVpZ2h0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgbGFuZyA9IG5vZGUuZGljdC5nZXQoIkxhbmciKTsKICAgICAgaWYgKHR5cGVvZiBsYW5nID09PSAic3RyaW5nIikgewogICAgICAgIG9iai5sYW5nID0gc3RyaW5nVG9QREZTdHJpbmcobGFuZyk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBraWQgb2Ygbm9kZS5raWRzKSB7CiAgICAgICAgY29uc3Qga2lkRWxlbWVudCA9IGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5FTEVNRU5UID8ga2lkLnBhcmVudE5vZGUgOiBudWxsOwogICAgICAgIGlmIChraWRFbGVtZW50KSB7CiAgICAgICAgICBub2RlVG9TZXJpYWxpemFibGUoa2lkRWxlbWVudCwgb2JqLCBsZXZlbCArIDEpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuUEFHRV9DT05URU5UIHx8IGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5TVFJFQU1fQ09OVEVOVCkgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAiY29udGVudCIsCiAgICAgICAgICAgIGlkOiBgcCR7a2lkLnBhZ2VPYmpJZH1fbWMke2tpZC5tY2lkfWAKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoa2lkLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCkgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAib2JqZWN0IiwKICAgICAgICAgICAgaWQ6IGtpZC5yZWZPYmpJZAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuQU5OT1RBVElPTikgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAiYW5ub3RhdGlvbiIsCiAgICAgICAgICAgIGlkOiBgJHtBbm5vdGF0aW9uUHJlZml4fSR7a2lkLnJlZk9iaklkfWAKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3Qgcm9vdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICByb290LmNoaWxkcmVuID0gW107CiAgICByb290LnJvbGUgPSAiUm9vdCI7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMubm9kZXMpIHsKICAgICAgaWYgKCFjaGlsZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG5vZGVUb1NlcmlhbGl6YWJsZShjaGlsZCwgcm9vdCk7CiAgICB9CiAgICByZXR1cm4gcm9vdDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NhdGFsb2cuanMKCgoKCgoKCgoKCgpjb25zdCBpc1JlZiA9IHYgPT4gdiBpbnN0YW5jZW9mIFJlZjsKY29uc3QgaXNWYWxpZEV4cGxpY2l0RGVzdCA9IF9pc1ZhbGlkRXhwbGljaXREZXN0LmJpbmQobnVsbCwgaXNSZWYsIGlzTmFtZSk7CmZ1bmN0aW9uIGZldGNoRGVzdChkZXN0KSB7CiAgaWYgKGRlc3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBkZXN0ID0gZGVzdC5nZXQoIkQiKTsKICB9CiAgcmV0dXJuIGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkgPyBkZXN0IDogbnVsbDsKfQpmdW5jdGlvbiBmZXRjaFJlbW90ZURlc3QoYWN0aW9uKSB7CiAgbGV0IGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgaWYgKGRlc3QpIHsKICAgIGlmIChkZXN0IGluc3RhbmNlb2YgTmFtZSkgewogICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgfQogICAgaWYgKHR5cGVvZiBkZXN0ID09PSAic3RyaW5nIikgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGVzdCk7CiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRlc3QpOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBDYXRhbG9nIHsKICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCB4cmVmKSB7CiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuX2NhdERpY3QgPSB4cmVmLmdldENhdGFsb2dPYmooKTsKICAgIGlmICghKHRoaXMuX2NhdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkNhdGFsb2cgb2JqZWN0IGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICB9CiAgICB0aGlzLnRvcGxldmVsUGFnZXNEaWN0OwogICAgdGhpcy5fYWN0dWFsTnVtUGFnZXMgPSBudWxsOwogICAgdGhpcy5mb250Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlID0gbmV3IE1hcCgpOwogICAgdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgR2xvYmFsQ29sb3JTcGFjZUNhY2hlKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBuZXcgR2xvYmFsSW1hZ2VDYWNoZSgpOwogICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMucGFnZUluZGV4Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMucGFnZURpY3RDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0ID0gbmV3IFJlZlNldCgpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUgPSBuZXcgTWFwKCk7CiAgfQogIGNsb25lRGljdCgpIHsKICAgIHJldHVybiB0aGlzLl9jYXREaWN0LmNsb25lKCk7CiAgfQogIGdldCB2ZXJzaW9uKCkgewogICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWZXJzaW9uIik7CiAgICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgaWYgKFBERl9WRVJTSU9OX1JFR0VYUC50ZXN0KHZlcnNpb24ubmFtZSkpIHsKICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2ZXJzaW9uIiwgdmVyc2lvbi5uYW1lKTsKICAgICAgfQogICAgICB3YXJuKGBJbnZhbGlkIFBERiBjYXRhbG9nIHZlcnNpb246ICR7dmVyc2lvbi5uYW1lfWApOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmVyc2lvbiIsIG51bGwpOwogIH0KICBnZXQgbGFuZygpIHsKICAgIGNvbnN0IGxhbmcgPSB0aGlzLl9jYXREaWN0LmdldCgiTGFuZyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibGFuZyIsIGxhbmcgJiYgdHlwZW9mIGxhbmcgPT09ICJzdHJpbmciID8gc3RyaW5nVG9QREZTdHJpbmcobGFuZykgOiBudWxsKTsKICB9CiAgZ2V0IG5lZWRzUmVuZGVyaW5nKCkgewogICAgY29uc3QgbmVlZHNSZW5kZXJpbmcgPSB0aGlzLl9jYXREaWN0LmdldCgiTmVlZHNSZW5kZXJpbmciKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIm5lZWRzUmVuZGVyaW5nIiwgdHlwZW9mIG5lZWRzUmVuZGVyaW5nID09PSAiYm9vbGVhbiIgPyBuZWVkc1JlbmRlcmluZyA6IGZhbHNlKTsKICB9CiAgZ2V0IGNvbGxlY3Rpb24oKSB7CiAgICBsZXQgY29sbGVjdGlvbiA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQ29sbGVjdGlvbiIpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouc2l6ZSA+IDApIHsKICAgICAgICBjb2xsZWN0aW9uID0gb2JqOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGluZm8oIkNhbm5vdCBmZXRjaCBDb2xsZWN0aW9uIGVudHJ5OyBhc3N1bWluZyBubyBjb2xsZWN0aW9uIGlzIHByZXNlbnQuIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjb2xsZWN0aW9uIiwgY29sbGVjdGlvbik7CiAgfQogIGdldCBhY3JvRm9ybSgpIHsKICAgIGxldCBhY3JvRm9ybSA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQWNyb0Zvcm0iKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QgJiYgb2JqLnNpemUgPiAwKSB7CiAgICAgICAgYWNyb0Zvcm0gPSBvYmo7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgaW5mbygiQ2Fubm90IGZldGNoIEFjcm9Gb3JtIGVudHJ5OyBhc3N1bWluZyBubyBmb3JtcyBhcmUgcHJlc2VudC4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImFjcm9Gb3JtIiwgYWNyb0Zvcm0pOwogIH0KICBnZXQgYWNyb0Zvcm1SZWYoKSB7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJBY3JvRm9ybSIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYWNyb0Zvcm1SZWYiLCB2YWx1ZSBpbnN0YW5jZW9mIFJlZiA/IHZhbHVlIDogbnVsbCk7CiAgfQogIGdldCBtZXRhZGF0YSgpIHsKICAgIGNvbnN0IHN0cmVhbVJlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJNZXRhZGF0YSIpOwogICAgaWYgKCEoc3RyZWFtUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJtZXRhZGF0YSIsIG51bGwpOwogICAgfQogICAgbGV0IG1ldGFkYXRhID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMueHJlZi5mZXRjaChzdHJlYW1SZWYsICF0aGlzLnhyZWYuZW5jcnlwdD8uZW5jcnlwdE1ldGFkYXRhKTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gJiYgc3RyZWFtLmRpY3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5kaWN0LmdldCgiVHlwZSIpOwogICAgICAgIGNvbnN0IHN1YnR5cGUgPSBzdHJlYW0uZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICBpZiAoaXNOYW1lKHR5cGUsICJNZXRhZGF0YSIpICYmIGlzTmFtZShzdWJ0eXBlLCAiWE1MIikpIHsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBzdHJpbmdUb1VURjhTdHJpbmcoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhUGFyc2VyKGRhdGEpLnNlcmlhbGl6YWJsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgaW5mbyhgU2tpcHBpbmcgaW52YWxpZCBNZXRhZGF0YTogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIm1ldGFkYXRhIiwgbWV0YWRhdGEpOwogIH0KICBnZXQgbWFya0luZm8oKSB7CiAgICBsZXQgbWFya0luZm8gPSBudWxsOwogICAgdHJ5IHsKICAgICAgbWFya0luZm8gPSB0aGlzLl9yZWFkTWFya0luZm8oKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybigiVW5hYmxlIHRvIHJlYWQgbWFyayBpbmZvLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWFya0luZm8iLCBtYXJrSW5mbyk7CiAgfQogIF9yZWFkTWFya0luZm8oKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTWFya0luZm8iKTsKICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWFya0luZm8gPSB7CiAgICAgIE1hcmtlZDogZmFsc2UsCiAgICAgIFVzZXJQcm9wZXJ0aWVzOiBmYWxzZSwKICAgICAgU3VzcGVjdHM6IGZhbHNlCiAgICB9OwogICAgZm9yIChjb25zdCBrZXkgaW4gbWFya0luZm8pIHsKICAgICAgY29uc3QgdmFsdWUgPSBvYmouZ2V0KGtleSk7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJib29sZWFuIikgewogICAgICAgIG1hcmtJbmZvW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hcmtJbmZvOwogIH0KICBnZXQgc3RydWN0VHJlZVJvb3QoKSB7CiAgICBsZXQgc3RydWN0VHJlZSA9IG51bGw7CiAgICB0cnkgewogICAgICBzdHJ1Y3RUcmVlID0gdGhpcy4jcmVhZFN0cnVjdFRyZWVSb290KCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oIlVuYWJsZSByZWFkIHRvIHN0cnVjdFRyZWVSb290IGluZm8uIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJzdHJ1Y3RUcmVlUm9vdCIsIHN0cnVjdFRyZWUpOwogIH0KICAjcmVhZFN0cnVjdFRyZWVSb290KCkgewogICAgY29uc3QgcmF3T2JqID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIlN0cnVjdFRyZWVSb290Iik7CiAgICBjb25zdCBvYmogPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihyYXdPYmopOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCByb290ID0gbmV3IFN0cnVjdFRyZWVSb290KHRoaXMueHJlZiwgb2JqLCByYXdPYmopOwogICAgcm9vdC5pbml0KCk7CiAgICByZXR1cm4gcm9vdDsKICB9CiAgZ2V0IHRvcGxldmVsUGFnZXNEaWN0KCkgewogICAgY29uc3QgcGFnZXNPYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZXMiKTsKICAgIGlmICghKHBhZ2VzT2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5LiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidG9wbGV2ZWxQYWdlc0RpY3QiLCBwYWdlc09iaik7CiAgfQogIGdldCBkb2N1bWVudE91dGxpbmUoKSB7CiAgICBsZXQgb2JqID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG9iaiA9IHRoaXMuX3JlYWREb2N1bWVudE91dGxpbmUoKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybigiVW5hYmxlIHRvIHJlYWQgZG9jdW1lbnQgb3V0bGluZS4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImRvY3VtZW50T3V0bGluZSIsIG9iaik7CiAgfQogIF9yZWFkRG9jdW1lbnRPdXRsaW5lKCkgewogICAgbGV0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPdXRsaW5lcyIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBvYmogPSBvYmouZ2V0UmF3KCJGaXJzdCIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSB7CiAgICAgIGl0ZW1zOiBbXQogICAgfTsKICAgIGNvbnN0IHF1ZXVlID0gW3sKICAgICAgb2JqLAogICAgICBwYXJlbnQ6IHJvb3QKICAgIH1dOwogICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldCgpOwogICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgYmxhY2tDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGkgPSBxdWV1ZS5zaGlmdCgpOwogICAgICBjb25zdCBvdXRsaW5lRGljdCA9IHhyZWYuZmV0Y2hJZlJlZihpLm9iaik7CiAgICAgIGlmIChvdXRsaW5lRGljdCA9PT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghb3V0bGluZURpY3QuaGFzKCJUaXRsZSIpKSB7CiAgICAgICAgd2FybigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7CiAgICAgIH0KICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgZGVzdDogbnVsbCwKICAgICAgICBhY3Rpb246IG51bGwKICAgICAgfTsKICAgICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgICBkZXN0RGljdDogb3V0bGluZURpY3QsCiAgICAgICAgcmVzdWx0T2JqOiBkYXRhLAogICAgICAgIGRvY0Jhc2VVcmw6IHRoaXMuYmFzZVVybCwKICAgICAgICBkb2NBdHRhY2htZW50czogdGhpcy5hdHRhY2htZW50cwogICAgICB9KTsKICAgICAgY29uc3QgdGl0bGUgPSBvdXRsaW5lRGljdC5nZXQoIlRpdGxlIik7CiAgICAgIGNvbnN0IGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KCJGIikgfHwgMDsKICAgICAgY29uc3QgY29sb3IgPSBvdXRsaW5lRGljdC5nZXRBcnJheSgiQyIpOwogICAgICBjb25zdCBjb3VudCA9IG91dGxpbmVEaWN0LmdldCgiQ291bnQiKTsKICAgICAgbGV0IHJnYkNvbG9yID0gYmxhY2tDb2xvcjsKICAgICAgaWYgKGlzTnVtYmVyQXJyYXkoY29sb3IsIDMpICYmIChjb2xvclswXSAhPT0gMCB8fCBjb2xvclsxXSAhPT0gMCB8fCBjb2xvclsyXSAhPT0gMCkpIHsKICAgICAgICByZ2JDb2xvciA9IENvbG9yU3BhY2VVdGlscy5yZ2IuZ2V0UmdiKGNvbG9yLCAwKTsKICAgICAgfQogICAgICBjb25zdCBvdXRsaW5lSXRlbSA9IHsKICAgICAgICBhY3Rpb246IGRhdGEuYWN0aW9uLAogICAgICAgIGF0dGFjaG1lbnQ6IGRhdGEuYXR0YWNobWVudCwKICAgICAgICBkZXN0OiBkYXRhLmRlc3QsCiAgICAgICAgdXJsOiBkYXRhLnVybCwKICAgICAgICB1bnNhZmVVcmw6IGRhdGEudW5zYWZlVXJsLAogICAgICAgIG5ld1dpbmRvdzogZGF0YS5uZXdXaW5kb3csCiAgICAgICAgc2V0T0NHU3RhdGU6IGRhdGEuc2V0T0NHU3RhdGUsCiAgICAgICAgdGl0bGU6IHR5cGVvZiB0aXRsZSA9PT0gInN0cmluZyIgPyBzdHJpbmdUb1BERlN0cmluZyh0aXRsZSkgOiAiIiwKICAgICAgICBjb2xvcjogcmdiQ29sb3IsCiAgICAgICAgY291bnQ6IE51bWJlci5pc0ludGVnZXIoY291bnQpID8gY291bnQgOiB1bmRlZmluZWQsCiAgICAgICAgYm9sZDogISEoZmxhZ3MgJiAyKSwKICAgICAgICBpdGFsaWM6ICEhKGZsYWdzICYgMSksCiAgICAgICAgaXRlbXM6IFtdCiAgICAgIH07CiAgICAgIGkucGFyZW50Lml0ZW1zLnB1c2gob3V0bGluZUl0ZW0pOwogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIkZpcnN0Iik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkgewogICAgICAgIHF1ZXVlLnB1c2goewogICAgICAgICAgb2JqLAogICAgICAgICAgcGFyZW50OiBvdXRsaW5lSXRlbQogICAgICAgIH0pOwogICAgICAgIHByb2Nlc3NlZC5wdXQob2JqKTsKICAgICAgfQogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIk5leHQiKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZiAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBvYmosCiAgICAgICAgICBwYXJlbnQ6IGkucGFyZW50CiAgICAgICAgfSk7CiAgICAgICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcm9vdC5pdGVtcy5sZW5ndGggPiAwID8gcm9vdC5pdGVtcyA6IG51bGw7CiAgfQogIGdldCBwZXJtaXNzaW9ucygpIHsKICAgIGxldCBwZXJtaXNzaW9ucyA9IG51bGw7CiAgICB0cnkgewogICAgICBwZXJtaXNzaW9ucyA9IHRoaXMuX3JlYWRQZXJtaXNzaW9ucygpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgdG8gcmVhZCBwZXJtaXNzaW9ucy4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInBlcm1pc3Npb25zIiwgcGVybWlzc2lvbnMpOwogIH0KICBfcmVhZFBlcm1pc3Npb25zKCkgewogICAgY29uc3QgZW5jcnlwdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldCgiRW5jcnlwdCIpOwogICAgaWYgKCEoZW5jcnlwdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGZsYWdzID0gZW5jcnlwdC5nZXQoIlAiKTsKICAgIGlmICh0eXBlb2YgZmxhZ3MgIT09ICJudW1iZXIiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZmxhZ3MgKz0gMiAqKiAzMjsKICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107CiAgICBmb3IgKGNvbnN0IGtleSBpbiBQZXJtaXNzaW9uRmxhZykgewogICAgICBjb25zdCB2YWx1ZSA9IFBlcm1pc3Npb25GbGFnW2tleV07CiAgICAgIGlmIChmbGFncyAmIHZhbHVlKSB7CiAgICAgICAgcGVybWlzc2lvbnMucHVzaCh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwZXJtaXNzaW9uczsKICB9CiAgZ2V0IG9wdGlvbmFsQ29udGVudENvbmZpZygpIHsKICAgIGxldCBjb25maWcgPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPQ1Byb3BlcnRpZXMiKTsKICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHByb3BlcnRpZXMuZ2V0KCJEIik7CiAgICAgIGlmICghZGVmYXVsdENvbmZpZykgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpOwogICAgICB9CiAgICAgIGNvbnN0IGdyb3Vwc0RhdGEgPSBwcm9wZXJ0aWVzLmdldCgiT0NHcyIpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ3JvdXBzRGF0YSkpIHsKICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKTsKICAgICAgfQogICAgICBjb25zdCBncm91cFJlZkNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICAgIGZvciAoY29uc3QgZ3JvdXBSZWYgb2YgZ3JvdXBzRGF0YSkgewogICAgICAgIGlmICghKGdyb3VwUmVmIGluc3RhbmNlb2YgUmVmKSB8fCBncm91cFJlZkNhY2hlLmhhcyhncm91cFJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBncm91cFJlZkNhY2hlLnB1dChncm91cFJlZiwgdGhpcy4jcmVhZE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwUmVmKSk7CiAgICAgIH0KICAgICAgY29uZmlnID0gdGhpcy4jcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhkZWZhdWx0Q29uZmlnLCBncm91cFJlZkNhY2hlKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgVW5hYmxlIHRvIHJlYWQgb3B0aW9uYWwgY29udGVudCBjb25maWc6ICR7ZXh9YCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBjb25maWcpOwogIH0KICAjcmVhZE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwUmVmKSB7CiAgICBjb25zdCBncm91cCA9IHRoaXMueHJlZi5mZXRjaChncm91cFJlZik7CiAgICBjb25zdCBvYmogPSB7CiAgICAgIGlkOiBncm91cFJlZi50b1N0cmluZygpLAogICAgICBuYW1lOiBudWxsLAogICAgICBpbnRlbnQ6IG51bGwsCiAgICAgIHVzYWdlOiB7CiAgICAgICAgcHJpbnQ6IG51bGwsCiAgICAgICAgdmlldzogbnVsbAogICAgICB9LAogICAgICByYkdyb3VwczogW10KICAgIH07CiAgICBjb25zdCBuYW1lID0gZ3JvdXAuZ2V0KCJOYW1lIik7CiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIG9iai5uYW1lID0gc3RyaW5nVG9QREZTdHJpbmcobmFtZSk7CiAgICB9CiAgICBsZXQgaW50ZW50ID0gZ3JvdXAuZ2V0QXJyYXkoIkludGVudCIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGludGVudCkpIHsKICAgICAgaW50ZW50ID0gW2ludGVudF07CiAgICB9CiAgICBpZiAoaW50ZW50LmV2ZXJ5KGkgPT4gaSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIG9iai5pbnRlbnQgPSBpbnRlbnQubWFwKGkgPT4gaS5uYW1lKTsKICAgIH0KICAgIGNvbnN0IHVzYWdlID0gZ3JvdXAuZ2V0KCJVc2FnZSIpOwogICAgaWYgKCEodXNhZ2UgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gb2JqOwogICAgfQogICAgY29uc3QgdXNhZ2VPYmogPSBvYmoudXNhZ2U7CiAgICBjb25zdCBwcmludCA9IHVzYWdlLmdldCgiUHJpbnQiKTsKICAgIGlmIChwcmludCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgcHJpbnRTdGF0ZSA9IHByaW50LmdldCgiUHJpbnRTdGF0ZSIpOwogICAgICBpZiAocHJpbnRTdGF0ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBzd2l0Y2ggKHByaW50U3RhdGUubmFtZSkgewogICAgICAgICAgY2FzZSAiT04iOgogICAgICAgICAgY2FzZSAiT0ZGIjoKICAgICAgICAgICAgdXNhZ2VPYmoucHJpbnQgPSB7CiAgICAgICAgICAgICAgcHJpbnRTdGF0ZTogcHJpbnRTdGF0ZS5uYW1lCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB2aWV3ID0gdXNhZ2UuZ2V0KCJWaWV3Iik7CiAgICBpZiAodmlldyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3Qgdmlld1N0YXRlID0gdmlldy5nZXQoIlZpZXdTdGF0ZSIpOwogICAgICBpZiAodmlld1N0YXRlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIHN3aXRjaCAodmlld1N0YXRlLm5hbWUpIHsKICAgICAgICAgIGNhc2UgIk9OIjoKICAgICAgICAgIGNhc2UgIk9GRiI6CiAgICAgICAgICAgIHVzYWdlT2JqLnZpZXcgPSB7CiAgICAgICAgICAgICAgdmlld1N0YXRlOiB2aWV3U3RhdGUubmFtZQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgI3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoY29uZmlnLCBncm91cFJlZkNhY2hlKSB7CiAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHsKICAgICAgY29uc3Qgb25QYXJzZWQgPSBbXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVmcykpIHsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMpIHsKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiBncm91cFJlZkNhY2hlLmhhcyh2YWx1ZSkpIHsKICAgICAgICAgICAgb25QYXJzZWQucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9uUGFyc2VkOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VPcmRlcihyZWZzLCBuZXN0ZWRMZXZlbHMgPSAwKSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWZzKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IG9yZGVyID0gW107CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykgewogICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiBncm91cFJlZkNhY2hlLmhhcyh2YWx1ZSkpIHsKICAgICAgICAgIHBhcnNlZE9yZGVyUmVmcy5wdXQodmFsdWUpOwogICAgICAgICAgb3JkZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXN0ZWRPcmRlciA9IHBhcnNlTmVzdGVkT3JkZXIodmFsdWUsIG5lc3RlZExldmVscyk7CiAgICAgICAgaWYgKG5lc3RlZE9yZGVyKSB7CiAgICAgICAgICBvcmRlci5wdXNoKG5lc3RlZE9yZGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG5lc3RlZExldmVscyA+IDApIHsKICAgICAgICByZXR1cm4gb3JkZXI7CiAgICAgIH0KICAgICAgY29uc3QgaGlkZGVuR3JvdXBzID0gW107CiAgICAgIGZvciAoY29uc3QgW2dyb3VwUmVmXSBvZiBncm91cFJlZkNhY2hlLml0ZW1zKCkpIHsKICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBoaWRkZW5Hcm91cHMucHVzaChncm91cFJlZi50b1N0cmluZygpKTsKICAgICAgfQogICAgICBpZiAoaGlkZGVuR3JvdXBzLmxlbmd0aCkgewogICAgICAgIG9yZGVyLnB1c2goewogICAgICAgICAgbmFtZTogbnVsbCwKICAgICAgICAgIG9yZGVyOiBoaWRkZW5Hcm91cHMKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gb3JkZXI7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU5lc3RlZE9yZGVyKHJlZiwgbmVzdGVkTGV2ZWxzKSB7CiAgICAgIGlmICgrK25lc3RlZExldmVscyA+IE1BWF9ORVNURURfTEVWRUxTKSB7CiAgICAgICAgd2FybigicGFyc2VOZXN0ZWRPcmRlciAtIHJlYWNoZWQgTUFYX05FU1RFRF9MRVZFTFMuIik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWUgPSB4cmVmLmZldGNoSWZSZWYocmVmKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IG5lc3RlZE5hbWUgPSB4cmVmLmZldGNoSWZSZWYodmFsdWVbMF0pOwogICAgICBpZiAodHlwZW9mIG5lc3RlZE5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU9yZGVyKHZhbHVlLnNsaWNlKDEpLCBuZXN0ZWRMZXZlbHMpOwogICAgICBpZiAoIW5lc3RlZE9yZGVyPy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIG5hbWU6IHN0cmluZ1RvUERGU3RyaW5nKG5lc3RlZE5hbWUpLAogICAgICAgIG9yZGVyOiBuZXN0ZWRPcmRlcgogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VSQkdyb3VwcyhyYkdyb3VwcykgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmJHcm91cHMpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmJHcm91cHMpIHsKICAgICAgICBjb25zdCByYkdyb3VwID0geHJlZi5mZXRjaElmUmVmKHZhbHVlKTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmJHcm91cCkgfHwgIXJiR3JvdXAubGVuZ3RoKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGFyc2VkUmJHcm91cCA9IG5ldyBTZXQoKTsKICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiByYkdyb3VwKSB7CiAgICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgUmVmICYmIGdyb3VwUmVmQ2FjaGUuaGFzKHJlZikgJiYgIXBhcnNlZFJiR3JvdXAuaGFzKHJlZi50b1N0cmluZygpKSkgewogICAgICAgICAgICBwYXJzZWRSYkdyb3VwLmFkZChyZWYudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIGdyb3VwUmVmQ2FjaGUuZ2V0KHJlZikucmJHcm91cHMucHVzaChwYXJzZWRSYkdyb3VwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWYsCiAgICAgIHBhcnNlZE9yZGVyUmVmcyA9IG5ldyBSZWZTZXQoKSwKICAgICAgTUFYX05FU1RFRF9MRVZFTFMgPSAxMDsKICAgIHBhcnNlUkJHcm91cHMoY29uZmlnLmdldCgiUkJHcm91cHMiKSk7CiAgICByZXR1cm4gewogICAgICBuYW1lOiB0eXBlb2YgY29uZmlnLmdldCgiTmFtZSIpID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoIk5hbWUiKSkgOiBudWxsLAogICAgICBjcmVhdG9yOiB0eXBlb2YgY29uZmlnLmdldCgiQ3JlYXRvciIpID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgOiBudWxsLAogICAgICBiYXNlU3RhdGU6IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpIGluc3RhbmNlb2YgTmFtZSA/IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpLm5hbWUgOiBudWxsLAogICAgICBvbjogcGFyc2VPbk9mZihjb25maWcuZ2V0KCJPTiIpKSwKICAgICAgb2ZmOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9GRiIpKSwKICAgICAgb3JkZXI6IHBhcnNlT3JkZXIoY29uZmlnLmdldCgiT3JkZXIiKSksCiAgICAgIGdyb3VwczogWy4uLmdyb3VwUmVmQ2FjaGVdCiAgICB9OwogIH0KICBzZXRBY3R1YWxOdW1QYWdlcyhudW0gPSBudWxsKSB7CiAgICB0aGlzLl9hY3R1YWxOdW1QYWdlcyA9IG51bTsKICB9CiAgZ2V0IGhhc0FjdHVhbE51bVBhZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuX2FjdHVhbE51bVBhZ2VzICE9PSBudWxsOwogIH0KICBnZXQgX3BhZ2VzQ291bnQoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldCgiQ291bnQiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wYWdlc0NvdW50Iiwgb2JqKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuaGFzQWN0dWFsTnVtUGFnZXMgPyB0aGlzLl9hY3R1YWxOdW1QYWdlcyA6IHRoaXMuX3BhZ2VzQ291bnQ7CiAgfQogIGdldCBkZXN0aW5hdGlvbnMoKSB7CiAgICBjb25zdCByYXdEZXN0cyA9IHRoaXMuI3JlYWREZXN0cygpLAogICAgICBkZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKGNvbnN0IG9iaiBvZiByYXdEZXN0cykgewogICAgICBpZiAob2JqIGluc3RhbmNlb2YgTmFtZVRyZWUpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmouZ2V0QWxsKCkpIHsKICAgICAgICAgIGNvbnN0IGRlc3QgPSBmZXRjaERlc3QodmFsdWUpOwogICAgICAgICAgaWYgKGRlc3QpIHsKICAgICAgICAgICAgZGVzdHNbc3RyaW5nVG9QREZTdHJpbmcoa2V5KV0gPSBkZXN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqKSB7CiAgICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KHZhbHVlKTsKICAgICAgICAgIGlmIChkZXN0KSB7CiAgICAgICAgICAgIGRlc3RzW2tleV0gfHw9IGRlc3Q7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJkZXN0aW5hdGlvbnMiLCBkZXN0cyk7CiAgfQogIGdldERlc3RpbmF0aW9uKGlkKSB7CiAgICBjb25zdCByYXdEZXN0cyA9IHRoaXMuI3JlYWREZXN0cygpOwogICAgZm9yIChjb25zdCBvYmogb2YgcmF3RGVzdHMpIHsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVUcmVlIHx8IG9iaiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KG9iai5nZXQoaWQpKTsKICAgICAgICBpZiAoZGVzdCkgewogICAgICAgICAgcmV0dXJuIGRlc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAocmF3RGVzdHNbMF0gaW5zdGFuY2VvZiBOYW1lVHJlZSkgewogICAgICBjb25zdCBkZXN0ID0gdGhpcy5kZXN0aW5hdGlvbnNbaWRdOwogICAgICBpZiAoZGVzdCkgewogICAgICAgIHdhcm4oYEZvdW5kICIke2lkfSIgYXQgYW4gaW5jb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBOYW1lVHJlZS5gKTsKICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogICNyZWFkRGVzdHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKICAgIGNvbnN0IHJhd0Rlc3RzID0gW107CiAgICBpZiAob2JqPy5oYXMoIkRlc3RzIikpIHsKICAgICAgcmF3RGVzdHMucHVzaChuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiRGVzdHMiKSwgdGhpcy54cmVmKSk7CiAgICB9CiAgICBpZiAodGhpcy5fY2F0RGljdC5oYXMoIkRlc3RzIikpIHsKICAgICAgcmF3RGVzdHMucHVzaCh0aGlzLl9jYXREaWN0LmdldCgiRGVzdHMiKSk7CiAgICB9CiAgICByZXR1cm4gcmF3RGVzdHM7CiAgfQogIGdldCBwYWdlTGFiZWxzKCkgewogICAgbGV0IG9iaiA9IG51bGw7CiAgICB0cnkgewogICAgICBvYmogPSB0aGlzLl9yZWFkUGFnZUxhYmVscygpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgdG8gcmVhZCBwYWdlIGxhYmVscy4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInBhZ2VMYWJlbHMiLCBvYmopOwogIH0KICBfcmVhZFBhZ2VMYWJlbHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZUxhYmVscyIpOwogICAgaWYgKCFvYmopIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYWdlTGFiZWxzID0gbmV3IEFycmF5KHRoaXMubnVtUGFnZXMpOwogICAgbGV0IHN0eWxlID0gbnVsbCwKICAgICAgcHJlZml4ID0gIiI7CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUob2JqLCB0aGlzLnhyZWYpOwogICAgY29uc3QgbnVtcyA9IG51bWJlclRyZWUuZ2V0QWxsKCk7CiAgICBsZXQgY3VycmVudExhYmVsID0gIiIsCiAgICAgIGN1cnJlbnRJbmRleCA9IDE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLm51bVBhZ2VzOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsYWJlbERpY3QgPSBudW1zLmdldChpKTsKICAgICAgaWYgKGxhYmVsRGljdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKCEobGFiZWxEaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUGFnZUxhYmVsIGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJUeXBlIikgJiYgIWlzTmFtZShsYWJlbERpY3QuZ2V0KCJUeXBlIiksICJQYWdlTGFiZWwiKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHR5cGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJTIikpIHsKICAgICAgICAgIGNvbnN0IHMgPSBsYWJlbERpY3QuZ2V0KCJTIik7CiAgICAgICAgICBpZiAoIShzIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHN0eWxlIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGUgPSBzLm5hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0eWxlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlAiKSkgewogICAgICAgICAgY29uc3QgcCA9IGxhYmVsRGljdC5nZXQoIlAiKTsKICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHByZWZpeCA9IHN0cmluZ1RvUERGU3RyaW5nKHApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmVmaXggPSAiIjsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlN0IikpIHsKICAgICAgICAgIGNvbnN0IHN0ID0gbGFiZWxEaWN0LmdldCgiU3QiKTsKICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoc3QpICYmIHN0ID49IDEpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBzdGFydCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHN0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50SW5kZXggPSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBzd2l0Y2ggKHN0eWxlKSB7CiAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjdXJyZW50SW5kZXg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSIjoKICAgICAgICBjYXNlICJyIjoKICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IHRvUm9tYW5OdW1lcmFscyhjdXJyZW50SW5kZXgsIHN0eWxlID09PSAiciIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgY2FzZSAiYSI6CiAgICAgICAgICBjb25zdCBMSU1JVCA9IDI2OwogICAgICAgICAgY29uc3QgQV9VUFBFUl9DQVNFID0gMHg0MSwKICAgICAgICAgICAgQV9MT1dFUl9DQVNFID0gMHg2MTsKICAgICAgICAgIGNvbnN0IGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSAiYSIgPyBBX0xPV0VSX0NBU0UgOiBBX1VQUEVSX0NBU0U7CiAgICAgICAgICBjb25zdCBsZXR0ZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7CiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJhc2VDaGFyQ29kZSArIGxldHRlckluZGV4ICUgTElNSVQpOwogICAgICAgICAgY3VycmVudExhYmVsID0gY2hhcmFjdGVyLnJlcGVhdChNYXRoLmZsb29yKGxldHRlckluZGV4IC8gTElNSVQpICsgMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHN0eWxlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBzdHlsZSAiJHtzdHlsZX0iIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmApOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudExhYmVsID0gIiI7CiAgICAgIH0KICAgICAgcGFnZUxhYmVsc1tpXSA9IHByZWZpeCArIGN1cnJlbnRMYWJlbDsKICAgICAgY3VycmVudEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gcGFnZUxhYmVsczsKICB9CiAgZ2V0IHBhZ2VMYXlvdXQoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpOwogICAgbGV0IHBhZ2VMYXlvdXQgPSAiIjsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICBjYXNlICJTaW5nbGVQYWdlIjoKICAgICAgICBjYXNlICJPbmVDb2x1bW4iOgogICAgICAgIGNhc2UgIlR3b0NvbHVtbkxlZnQiOgogICAgICAgIGNhc2UgIlR3b0NvbHVtblJpZ2h0IjoKICAgICAgICBjYXNlICJUd29QYWdlTGVmdCI6CiAgICAgICAgY2FzZSAiVHdvUGFnZVJpZ2h0IjoKICAgICAgICAgIHBhZ2VMYXlvdXQgPSBvYmoubmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGFnZUxheW91dCIsIHBhZ2VMYXlvdXQpOwogIH0KICBnZXQgcGFnZU1vZGUoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZU1vZGUiKTsKICAgIGxldCBwYWdlTW9kZSA9ICJVc2VOb25lIjsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICBjYXNlICJVc2VOb25lIjoKICAgICAgICBjYXNlICJVc2VPdXRsaW5lcyI6CiAgICAgICAgY2FzZSAiVXNlVGh1bWJzIjoKICAgICAgICBjYXNlICJGdWxsU2NyZWVuIjoKICAgICAgICBjYXNlICJVc2VPQyI6CiAgICAgICAgY2FzZSAiVXNlQXR0YWNobWVudHMiOgogICAgICAgICAgcGFnZU1vZGUgPSBvYmoubmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGFnZU1vZGUiLCBwYWdlTW9kZSk7CiAgfQogIGdldCB2aWV3ZXJQcmVmZXJlbmNlcygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWaWV3ZXJQcmVmZXJlbmNlcyIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmlld2VyUHJlZmVyZW5jZXMiLCBudWxsKTsKICAgIH0KICAgIGxldCBwcmVmcyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmopIHsKICAgICAgbGV0IHByZWZWYWx1ZTsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICJIaWRlVG9vbGJhciI6CiAgICAgICAgY2FzZSAiSGlkZU1lbnViYXIiOgogICAgICAgIGNhc2UgIkhpZGVXaW5kb3dVSSI6CiAgICAgICAgY2FzZSAiRml0V2luZG93IjoKICAgICAgICBjYXNlICJDZW50ZXJXaW5kb3ciOgogICAgICAgIGNhc2UgIkRpc3BsYXlEb2NUaXRsZSI6CiAgICAgICAgY2FzZSAiUGlja1RyYXlCeVBERlNpemUiOgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiTm9uRnVsbFNjcmVlblBhZ2VNb2RlIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiVXNlTm9uZSI6CiAgICAgICAgICAgICAgY2FzZSAiVXNlT3V0bGluZXMiOgogICAgICAgICAgICAgIGNhc2UgIlVzZVRodW1icyI6CiAgICAgICAgICAgICAgY2FzZSAiVXNlT0MiOgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiVXNlTm9uZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkRpcmVjdGlvbiI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgICAgICAgICAgIGNhc2UgIkwyUiI6CiAgICAgICAgICAgICAgY2FzZSAiUjJMIjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkwyUiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlZpZXdBcmVhIjoKICAgICAgICBjYXNlICJWaWV3Q2xpcCI6CiAgICAgICAgY2FzZSAiUHJpbnRBcmVhIjoKICAgICAgICBjYXNlICJQcmludENsaXAiOgogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKICAgICAgICAgICAgICBjYXNlICJNZWRpYUJveCI6CiAgICAgICAgICAgICAgY2FzZSAiQ3JvcEJveCI6CiAgICAgICAgICAgICAgY2FzZSAiQmxlZWRCb3giOgogICAgICAgICAgICAgIGNhc2UgIlRyaW1Cb3giOgogICAgICAgICAgICAgIGNhc2UgIkFydEJveCI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJDcm9wQm94IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUHJpbnRTY2FsaW5nIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiTm9uZSI6CiAgICAgICAgICAgICAgY2FzZSAiQXBwRGVmYXVsdCI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJBcHBEZWZhdWx0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRHVwbGV4IjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiU2ltcGxleCI6CiAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcFNob3J0RWRnZSI6CiAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcExvbmdFZGdlIjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIk5vbmUiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQcmludFBhZ2VSYW5nZSI6CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoICUgMiA9PT0gMCkgewogICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsdWUuZXZlcnkoKHBhZ2UsIGksIGFycikgPT4gTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID4gMCAmJiAoaSA9PT0gMCB8fCBwYWdlID49IGFycltpIC0gMV0pICYmIHBhZ2UgPD0gdGhpcy5udW1QYWdlcyk7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk51bUNvcGllcyI6CiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHdhcm4oYElnbm9yaW5nIG5vbi1zdGFuZGFyZCBrZXkgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICR7a2V5fS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChwcmVmVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHdhcm4oYEJhZCB2YWx1ZSwgZm9yIGtleSAiJHtrZXl9IiwgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICR7dmFsdWV9LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghcHJlZnMpIHsKICAgICAgICBwcmVmcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIH0KICAgICAgcHJlZnNba2V5XSA9IHByZWZWYWx1ZTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInZpZXdlclByZWZlcmVuY2VzIiwgcHJlZnMpOwogIH0KICBnZXQgb3BlbkFjdGlvbigpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIik7CiAgICBjb25zdCBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGRlc3REaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgZGVzdERpY3Quc2V0KCJBIiwgb2JqKTsKICAgICAgY29uc3QgcmVzdWx0T2JqID0gewogICAgICAgIHVybDogbnVsbCwKICAgICAgICBkZXN0OiBudWxsLAogICAgICAgIGFjdGlvbjogbnVsbAogICAgICB9OwogICAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgICAgIGRlc3REaWN0LAogICAgICAgIHJlc3VsdE9iagogICAgICB9KTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0T2JqLmRlc3QpKSB7CiAgICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gcmVzdWx0T2JqLmRlc3Q7CiAgICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqLmFjdGlvbikgewogICAgICAgIG9wZW5BY3Rpb24uYWN0aW9uID0gcmVzdWx0T2JqLmFjdGlvbjsKICAgICAgfQogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gb2JqOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3BlbkFjdGlvbiIsIG9iamVjdFNpemUob3BlbkFjdGlvbikgPiAwID8gb3BlbkFjdGlvbiA6IG51bGwpOwogIH0KICBnZXQgYXR0YWNobWVudHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKICAgIGxldCBhdHRhY2htZW50cyA9IG51bGw7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJFbWJlZGRlZEZpbGVzIikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiRW1iZWRkZWRGaWxlcyIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTcGVjKHZhbHVlLCB0aGlzLnhyZWYpOwogICAgICAgIGlmICghYXR0YWNobWVudHMpIHsKICAgICAgICAgIGF0dGFjaG1lbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB9CiAgICAgICAgYXR0YWNobWVudHNbc3RyaW5nVG9QREZTdHJpbmcoa2V5KV0gPSBmcy5zZXJpYWxpemFibGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImF0dGFjaG1lbnRzIiwgYXR0YWNobWVudHMpOwogIH0KICBnZXQgeGZhSW1hZ2VzKCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgeGZhSW1hZ2VzID0gbnVsbDsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0ICYmIG9iai5oYXMoIlhGQUltYWdlcyIpKSB7CiAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIlhGQUltYWdlcyIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGlmICgheGZhSW1hZ2VzKSB7CiAgICAgICAgICB4ZmFJbWFnZXMgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICAgIH0KICAgICAgICB4ZmFJbWFnZXMuc2V0KHN0cmluZ1RvUERGU3RyaW5nKGtleSksIHZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhSW1hZ2VzIiwgeGZhSW1hZ2VzKTsKICB9CiAgX2NvbGxlY3RKYXZhU2NyaXB0KCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgamF2YVNjcmlwdCA9IG51bGw7CiAgICBmdW5jdGlvbiBhcHBlbmRJZkphdmFTY3JpcHREaWN0KG5hbWUsIGpzRGljdCkgewogICAgICBpZiAoIShqc0RpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWlzTmFtZShqc0RpY3QuZ2V0KCJTIiksICJKYXZhU2NyaXB0IikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGpzID0ganNEaWN0LmdldCgiSlMiKTsKICAgICAgaWYgKGpzIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGpzID0ganMuZ2V0U3RyaW5nKCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpzICE9PSAic3RyaW5nIikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBqcyA9IHN0cmluZ1RvUERGU3RyaW5nKGpzKS5yZXBsYWNlQWxsKCJceDAwIiwgIiIpOwogICAgICBpZiAoanMpIHsKICAgICAgICAoamF2YVNjcmlwdCB8fD0gbmV3IE1hcCgpKS5zZXQobmFtZSwganMpOwogICAgICB9CiAgICB9CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJKYXZhU2NyaXB0IikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiSmF2YVNjcmlwdCIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3Qoc3RyaW5nVG9QREZTdHJpbmcoa2V5KSwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBvcGVuQWN0aW9uID0gdGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsKICAgIGlmIChvcGVuQWN0aW9uKSB7CiAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoIk9wZW5BY3Rpb24iLCBvcGVuQWN0aW9uKTsKICAgIH0KICAgIHJldHVybiBqYXZhU2NyaXB0OwogIH0KICBnZXQganNBY3Rpb25zKCkgewogICAgY29uc3QgamF2YVNjcmlwdCA9IHRoaXMuX2NvbGxlY3RKYXZhU2NyaXB0KCk7CiAgICBsZXQgYWN0aW9ucyA9IGNvbGxlY3RBY3Rpb25zKHRoaXMueHJlZiwgdGhpcy5fY2F0RGljdCwgRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUpOwogICAgaWYgKGphdmFTY3JpcHQpIHsKICAgICAgYWN0aW9ucyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIGphdmFTY3JpcHQpIHsKICAgICAgICBpZiAoa2V5IGluIGFjdGlvbnMpIHsKICAgICAgICAgIGFjdGlvbnNba2V5XS5wdXNoKHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFjdGlvbnNba2V5XSA9IFt2YWxdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAianNBY3Rpb25zIiwgYWN0aW9ucyk7CiAgfQogIGFzeW5jIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgewogICAgY2xlYXJHbG9iYWxDYWNoZXMoKTsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmNsZWFyKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIobWFudWFsbHlUcmlnZ2VyZWQpOwogICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZUluZGV4Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZURpY3RDYWNoZS5jbGVhcigpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0LmNsZWFyKCk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZGljdAogICAgfSBvZiBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZvbnRDYWNoZSkpIHsKICAgICAgZGVsZXRlIGRpY3QuY2FjaGVLZXk7CiAgICB9CiAgICB0aGlzLmZvbnRDYWNoZS5jbGVhcigpOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlLmNsZWFyKCk7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5jbGVhcigpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUuY2xlYXIoKTsKICB9CiAgYXN5bmMgZ2V0UGFnZURpY3QocGFnZUluZGV4KSB7CiAgICBjb25zdCBub2Rlc1RvVmlzaXQgPSBbdGhpcy50b3BsZXZlbFBhZ2VzRGljdF07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgcGFnZUtpZHNDb3VudENhY2hlID0gdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsCiAgICAgIHBhZ2VJbmRleENhY2hlID0gdGhpcy5wYWdlSW5kZXhDYWNoZSwKICAgICAgcGFnZURpY3RDYWNoZSA9IHRoaXMucGFnZURpY3RDYWNoZTsKICAgIGxldCBjdXJyZW50UGFnZUluZGV4ID0gMDsKICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBjb25zdCBjb3VudCA9IHBhZ2VLaWRzQ291bnRDYWNoZS5nZXQoY3VycmVudE5vZGUpOwogICAgICAgIGlmIChjb3VudCA+PSAwICYmIGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkTm9kZXMucHV0KGN1cnJlbnROb2RlKTsKICAgICAgICBjb25zdCBvYmogPSBhd2FpdCAocGFnZURpY3RDYWNoZS5nZXQoY3VycmVudE5vZGUpIHx8IHhyZWYuZmV0Y2hBc3luYyhjdXJyZW50Tm9kZSkpOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgICAgICBpZiAoIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUtpZHNDb3VudENhY2hlLnB1dChjdXJyZW50Tm9kZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwYWdlSW5kZXhDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUluZGV4Q2FjaGUucHV0KGN1cnJlbnROb2RlLCBjdXJyZW50UGFnZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtvYmosIGN1cnJlbnROb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChvYmopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC4iKTsKICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgb2JqSWQKICAgICAgfSA9IGN1cnJlbnROb2RlOwogICAgICBsZXQgY291bnQgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIkNvdW50Iik7CiAgICAgIGlmIChjb3VudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGNvdW50ID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGNvdW50KTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgJiYgY291bnQgPj0gMCkgewogICAgICAgIGlmIChvYmpJZCAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhvYmpJZCkpIHsKICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQob2JqSWQsIGNvdW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBraWRzID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZHMpOwogICAgICB9CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgIGxldCB0eXBlID0gY3VycmVudE5vZGUuZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hbWUodHlwZSwgIlBhZ2UiKSB8fCAhY3VycmVudE5vZGUuaGFzKCJLaWRzIikpIHsKICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ID09PSBwYWdlSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIFtjdXJyZW50Tm9kZSwgbnVsbF07CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGxhc3QgPSBraWRzLmxlbmd0aCAtIDE7IGxhc3QgPj0gMDsgbGFzdC0tKSB7CiAgICAgICAgY29uc3QgbGFzdEtpZCA9IGtpZHNbbGFzdF07CiAgICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gobGFzdEtpZCk7CiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09PSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0ICYmIGxhc3RLaWQgaW5zdGFuY2VvZiBSZWYgJiYgIXBhZ2VEaWN0Q2FjaGUuaGFzKGxhc3RLaWQpKSB7CiAgICAgICAgICBwYWdlRGljdENhY2hlLnB1dChsYXN0S2lkLCB4cmVmLmZldGNoQXN5bmMobGFzdEtpZCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBQYWdlIGluZGV4ICR7cGFnZUluZGV4fSBub3QgZm91bmQuYCk7CiAgfQogIGFzeW5jIGdldEFsbFBhZ2VEaWN0cyhyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3QgewogICAgICBpZ25vcmVFcnJvcnMKICAgIH0gPSB0aGlzLnBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9uczsKICAgIGNvbnN0IHF1ZXVlID0gW3sKICAgICAgY3VycmVudE5vZGU6IHRoaXMudG9wbGV2ZWxQYWdlc0RpY3QsCiAgICAgIHBvc0luS2lkczogMAogICAgfV07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpLAogICAgICB4cmVmID0gdGhpcy54cmVmLAogICAgICBwYWdlSW5kZXhDYWNoZSA9IHRoaXMucGFnZUluZGV4Q2FjaGU7CiAgICBsZXQgcGFnZUluZGV4ID0gMDsKICAgIGZ1bmN0aW9uIGFkZFBhZ2VEaWN0KHBhZ2VEaWN0LCBwYWdlUmVmKSB7CiAgICAgIGlmIChwYWdlUmVmICYmICFwYWdlSW5kZXhDYWNoZS5oYXMocGFnZVJlZikpIHsKICAgICAgICBwYWdlSW5kZXhDYWNoZS5wdXQocGFnZVJlZiwgcGFnZUluZGV4KTsKICAgICAgfQogICAgICBtYXAuc2V0KHBhZ2VJbmRleCsrLCBbcGFnZURpY3QsIHBhZ2VSZWZdKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFBhZ2VFcnJvcihlcnJvcikgewogICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24gJiYgIXJlY292ZXJ5TW9kZSkgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICAgIGlmIChyZWNvdmVyeU1vZGUgJiYgaWdub3JlRXJyb3JzICYmIHBhZ2VJbmRleCA9PT0gMCkgewogICAgICAgIHdhcm4oYGdldEFsbFBhZ2VEaWN0cyAtIFNraXBwaW5nIGludmFsaWQgZmlyc3QgcGFnZTogIiR7ZXJyb3J9Ii5gKTsKICAgICAgICBlcnJvciA9IERpY3QuZW1wdHk7CiAgICAgIH0KICAgICAgbWFwLnNldChwYWdlSW5kZXgrKywgW2Vycm9yLCBudWxsXSk7CiAgICB9CiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBxdWV1ZS5hdCgtMSk7CiAgICAgIGNvbnN0IHsKICAgICAgICBjdXJyZW50Tm9kZSwKICAgICAgICBwb3NJbktpZHMKICAgICAgfSA9IHF1ZXVlSXRlbTsKICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAga2lkcyA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhraWRzKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBhZGRQYWdlRXJyb3IobmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocG9zSW5LaWRzID49IGtpZHMubGVuZ3RoKSB7CiAgICAgICAgcXVldWUucG9wKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qga2lkT2JqID0ga2lkc1twb3NJbktpZHNdOwogICAgICBsZXQgb2JqOwogICAgICBpZiAoa2lkT2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoa2lkT2JqKSkgewogICAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZXMgdHJlZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2UuIikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZpc2l0ZWROb2Rlcy5wdXQoa2lkT2JqKTsKICAgICAgICB0cnkgewogICAgICAgICAgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZE9iaik7CiAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgIGFkZFBhZ2VFcnJvcihleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqID0ga2lkT2JqOwogICAgICB9CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdHlwZSA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyh0eXBlKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGFkZFBhZ2VEaWN0KG9iaiwga2lkT2JqIGluc3RhbmNlb2YgUmVmID8ga2lkT2JqIDogbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBjdXJyZW50Tm9kZTogb2JqLAogICAgICAgICAgcG9zSW5LaWRzOiAwCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcXVldWVJdGVtLnBvc0luS2lkcysrOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UGFnZUluZGV4KHBhZ2VSZWYpIHsKICAgIGNvbnN0IGNhY2hlZFBhZ2VJbmRleCA9IHRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KHBhZ2VSZWYpOwogICAgaWYgKGNhY2hlZFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkUGFnZUluZGV4KTsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZihraWRSZWYpIHsKICAgICAgbGV0IHRvdGFsID0gMCwKICAgICAgICBwYXJlbnRSZWY7CiAgICAgIHJldHVybiB4cmVmLmZldGNoQXN5bmMoa2lkUmVmKS50aGVuKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZFJlZiwgcGFnZVJlZikgJiYgIWlzRGljdChub2RlLCAiUGFnZSIpICYmICEobm9kZSBpbnN0YW5jZW9mIERpY3QgJiYgIW5vZGUuaGFzKCJUeXBlIikgJiYgbm9kZS5oYXMoIkNvbnRlbnRzIikpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlRoZSByZWZlcmVuY2UgZG9lcyBub3QgcG9pbnQgdG8gYSAvUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50UmVmID0gbm9kZS5nZXRSYXcoIlBhcmVudCIpOwogICAgICAgIHJldHVybiBub2RlLmdldEFzeW5jKCJQYXJlbnQiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAocGFyZW50KSB7CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYXJlbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QXN5bmMoIktpZHMiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoa2lkcykgewogICAgICAgIGlmICgha2lkcykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGtpZFByb21pc2VzID0gW107CiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgICAgaWYgKCEoa2lkIGluc3RhbmNlb2YgUmVmKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZCwga2lkUmVmKSkgewogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAga2lkUHJvbWlzZXMucHVzaCh4cmVmLmZldGNoQXN5bmMoa2lkKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmouaGFzKCJDb3VudCIpKSB7CiAgICAgICAgICAgICAgdG90YWwgKz0gb2JqLmdldCgiQ291bnQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0b3RhbCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiS2lkIHJlZmVyZW5jZSBub3QgZm91bmQgaW4gcGFyZW50J3Mga2lkcy4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKCgpID0+IFt0b3RhbCwgcGFyZW50UmVmXSk7CiAgICAgIH0pOwogICAgfQogICAgbGV0IHRvdGFsID0gMDsKICAgIGNvbnN0IG5leHQgPSByZWYgPT4gcGFnZXNCZWZvcmVSZWYocmVmKS50aGVuKGFyZ3MgPT4gewogICAgICBpZiAoIWFyZ3MpIHsKICAgICAgICB0aGlzLnBhZ2VJbmRleENhY2hlLnB1dChwYWdlUmVmLCB0b3RhbCk7CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgICB9CiAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7CiAgICAgIHRvdGFsICs9IGNvdW50OwogICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpOwogICAgfSk7CiAgICByZXR1cm4gbmV4dChwYWdlUmVmKTsKICB9CiAgZ2V0IGJhc2VVcmwoKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLl9jYXREaWN0LmdldCgiVVJJIik7CiAgICBpZiAodXJpIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBiYXNlID0gdXJpLmdldCgiQmFzZSIpOwogICAgICBpZiAodHlwZW9mIGJhc2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKGJhc2UsIG51bGwsIHsKICAgICAgICAgIHRyeUNvbnZlcnRFbmNvZGluZzogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIGFic29sdXRlVXJsLmhyZWYpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIHRoaXMucGRmTWFuYWdlci5kb2NCYXNlVXJsKTsKICB9CiAgc3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgZGVzdERpY3QsCiAgICByZXN1bHRPYmosCiAgICBkb2NCYXNlVXJsID0gbnVsbCwKICAgIGRvY0F0dGFjaG1lbnRzID0gbnVsbAogIH0pIHsKICAgIGlmICghKGRlc3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGFjdGlvbiA9IGRlc3REaWN0LmdldCgiQSIpLAogICAgICB1cmwsCiAgICAgIGRlc3Q7CiAgICBpZiAoIShhY3Rpb24gaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICBpZiAoZGVzdERpY3QuaGFzKCJEZXN0IikpIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkFBIik7CiAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgIGlmIChhY3Rpb24uaGFzKCJEIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiRCIpOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaGFzKCJVIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiVSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbi5nZXQoIlMiKTsKICAgICAgaWYgKCEoYWN0aW9uVHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogSW52YWxpZCB0eXBlIGluIEFjdGlvbiBkaWN0aW9uYXJ5LiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBhY3Rpb25OYW1lID0gYWN0aW9uVHlwZS5uYW1lOwogICAgICBzd2l0Y2ggKGFjdGlvbk5hbWUpIHsKICAgICAgICBjYXNlICJSZXNldEZvcm0iOgogICAgICAgICAgY29uc3QgZmxhZ3MgPSBhY3Rpb24uZ2V0KCJGbGFncyIpOwogICAgICAgICAgY29uc3QgaW5jbHVkZSA9ICgodHlwZW9mIGZsYWdzID09PSAibnVtYmVyIiA/IGZsYWdzIDogMCkgJiAxKSA9PT0gMDsKICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFtdOwogICAgICAgICAgY29uc3QgcmVmcyA9IFtdOwogICAgICAgICAgZm9yIChjb25zdCBvYmogb2YgYWN0aW9uLmdldCgiRmllbGRzIikgfHwgW10pIHsKICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgIHJlZnMucHVzaChvYmoudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBmaWVsZHMucHVzaChzdHJpbmdUb1BERlN0cmluZyhvYmopKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0T2JqLnJlc2V0Rm9ybSA9IHsKICAgICAgICAgICAgZmllbGRzLAogICAgICAgICAgICByZWZzLAogICAgICAgICAgICBpbmNsdWRlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVVJJIjoKICAgICAgICAgIHVybCA9IGFjdGlvbi5nZXQoIlVSSSIpOwogICAgICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgdXJsID0gIi8iICsgdXJsLm5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJHb1RvIjoKICAgICAgICAgIGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMYXVuY2giOgogICAgICAgIGNhc2UgIkdvVG9SIjoKICAgICAgICAgIGNvbnN0IHVybERpY3QgPSBhY3Rpb24uZ2V0KCJGIik7CiAgICAgICAgICBpZiAodXJsRGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgZnMgPSBuZXcgRmlsZVNwZWModXJsRGljdCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICByYXdGaWxlbmFtZQogICAgICAgICAgICB9ID0gZnMuc2VyaWFsaXphYmxlOwogICAgICAgICAgICB1cmwgPSByYXdGaWxlbmFtZTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybERpY3QgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHVybCA9IHVybERpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZW1vdGVEZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICBpZiAocmVtb3RlRGVzdCAmJiB0eXBlb2YgdXJsID09PSAic3RyaW5nIikgewogICAgICAgICAgICB1cmwgPSB1cmwuc3BsaXQoIiMiLCAxKVswXSArICIjIiArIHJlbW90ZURlc3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSBhY3Rpb24uZ2V0KCJOZXdXaW5kb3ciKTsKICAgICAgICAgIGlmICh0eXBlb2YgbmV3V2luZG93ID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcmVzdWx0T2JqLm5ld1dpbmRvdyA9IG5ld1dpbmRvdzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkdvVG9FIjoKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGFjdGlvbi5nZXQoIlQiKTsKICAgICAgICAgIGxldCBhdHRhY2htZW50OwogICAgICAgICAgaWYgKGRvY0F0dGFjaG1lbnRzICYmIHRhcmdldCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gdGFyZ2V0LmdldCgiUiIpOwogICAgICAgICAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmdldCgiTiIpOwogICAgICAgICAgICBpZiAoaXNOYW1lKHJlbGF0aW9uc2hpcCwgIkMiKSAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBhdHRhY2htZW50ID0gZG9jQXR0YWNobWVudHNbc3RyaW5nVG9QREZTdHJpbmcobmFtZSldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXR0YWNobWVudCkgewogICAgICAgICAgICByZXN1bHRPYmouYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7CiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnREZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzdCkgewogICAgICAgICAgICAgIHJlc3VsdE9iai5hdHRhY2htZW50RGVzdCA9IGF0dGFjaG1lbnREZXN0OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5pbXBsZW1lbnRlZCAiR29Ub0UiIGFjdGlvbi5gKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk5hbWVkIjoKICAgICAgICAgIGNvbnN0IG5hbWVkQWN0aW9uID0gYWN0aW9uLmdldCgiTiIpOwogICAgICAgICAgaWYgKG5hbWVkQWN0aW9uIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICByZXN1bHRPYmouYWN0aW9uID0gbmFtZWRBY3Rpb24ubmFtZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlNldE9DR1N0YXRlIjoKICAgICAgICAgIGNvbnN0IHN0YXRlID0gYWN0aW9uLmdldCgiU3RhdGUiKTsKICAgICAgICAgIGNvbnN0IHByZXNlcnZlUkIgPSBhY3Rpb24uZ2V0KCJQcmVzZXJ2ZVJCIik7CiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGUpIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YXRlQXJyID0gW107CiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygc3RhdGUpIHsKICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtLm5hbWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgIk9OIjoKICAgICAgICAgICAgICAgIGNhc2UgIk9GRiI6CiAgICAgICAgICAgICAgICBjYXNlICJUb2dnbGUiOgogICAgICAgICAgICAgICAgICBzdGF0ZUFyci5wdXNoKGVsZW0ubmFtZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgc3RhdGVBcnIucHVzaChlbGVtLnRvU3RyaW5nKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGVBcnIubGVuZ3RoICE9PSBzdGF0ZS5sZW5ndGgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHRPYmouc2V0T0NHU3RhdGUgPSB7CiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZUFyciwKICAgICAgICAgICAgcHJlc2VydmVSQjogdHlwZW9mIHByZXNlcnZlUkIgPT09ICJib29sZWFuIiA/IHByZXNlcnZlUkIgOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiSmF2YVNjcmlwdCI6CiAgICAgICAgICBjb25zdCBqc0FjdGlvbiA9IGFjdGlvbi5nZXQoIkpTIik7CiAgICAgICAgICBsZXQganM7CiAgICAgICAgICBpZiAoanNBY3Rpb24gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgICAgIGpzID0ganNBY3Rpb24uZ2V0U3RyaW5nKCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBqc0FjdGlvbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAganMgPSBqc0FjdGlvbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGpzVVJMID0ganMgJiYgcmVjb3ZlckpzVVJMKHN0cmluZ1RvUERGU3RyaW5nKGpzKSk7CiAgICAgICAgICBpZiAoanNVUkwpIHsKICAgICAgICAgICAgdXJsID0ganNVUkwudXJsOwogICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0ganNVUkwubmV3V2luZG93OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICJKYXZhU2NyaXB0IiB8fCBhY3Rpb25OYW1lID09PSAiU3VibWl0Rm9ybSIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5zdXBwb3J0ZWQgYWN0aW9uOiAiJHthY3Rpb25OYW1lfSIuYCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZXN0RGljdC5oYXMoIkRlc3QiKSkgewogICAgICBkZXN0ID0gZGVzdERpY3QuZ2V0KCJEZXN0Iik7CiAgICB9CiAgICBpZiAodHlwZW9mIHVybCA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgZG9jQmFzZVVybCwgewogICAgICAgIGFkZERlZmF1bHRQcm90b2NvbDogdHJ1ZSwKICAgICAgICB0cnlDb252ZXJ0RW5jb2Rpbmc6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgIHJlc3VsdE9iai51cmwgPSBhYnNvbHV0ZVVybC5ocmVmOwogICAgICB9CiAgICAgIHJlc3VsdE9iai51bnNhZmVVcmwgPSB1cmw7CiAgICB9CiAgICBpZiAoZGVzdCkgewogICAgICBpZiAoZGVzdCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IHN0cmluZ1RvUERGU3RyaW5nKGRlc3QpOwogICAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IGRlc3Q7CiAgICAgIH0KICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL29iamVjdF9sb2FkZXIuanMKCgoKCmZ1bmN0aW9uIG1heUhhdmVDaGlsZHJlbih2YWx1ZSkgewogIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFJlZiB8fCB2YWx1ZSBpbnN0YW5jZW9mIERpY3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBCYXNlU3RyZWFtIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpOwp9CmZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUsIG5vZGVzVG9WaXNpdCkgewogIGlmIChub2RlIGluc3RhbmNlb2YgRGljdCkgewogICAgbm9kZSA9IG5vZGUuZ2V0UmF3VmFsdWVzKCk7CiAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgbm9kZSA9IG5vZGUuZGljdC5nZXRSYXdWYWx1ZXMoKTsKICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoY29uc3QgcmF3VmFsdWUgb2Ygbm9kZSkgewogICAgaWYgKG1heUhhdmVDaGlsZHJlbihyYXdWYWx1ZSkpIHsKICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gocmF3VmFsdWUpOwogICAgfQogIH0KfQpjbGFzcyBPYmplY3RMb2FkZXIgewogIGNvbnN0cnVjdG9yKGRpY3QsIGtleXMsIHhyZWYpIHsKICAgIHRoaXMuZGljdCA9IGRpY3Q7CiAgICB0aGlzLmtleXMgPSBrZXlzOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMucmVmU2V0ID0gbnVsbDsKICB9CiAgYXN5bmMgbG9hZCgpIHsKICAgIGlmICh0aGlzLnhyZWYuc3RyZWFtLmlzRGF0YUxvYWRlZCkgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgY29uc3QgewogICAgICBrZXlzLAogICAgICBkaWN0CiAgICB9ID0gdGhpczsKICAgIHRoaXMucmVmU2V0ID0gbmV3IFJlZlNldCgpOwogICAgY29uc3Qgbm9kZXNUb1Zpc2l0ID0gW107CiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7CiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gZGljdC5nZXRSYXcoa2V5KTsKICAgICAgaWYgKHJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChyYXdWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9WaXNpdCk7CiAgfQogIGFzeW5jIF93YWxrKG5vZGVzVG9WaXNpdCkgewogICAgY29uc3Qgbm9kZXNUb1JldmlzaXQgPSBbXTsKICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0cyA9IFtdOwogICAgd2hpbGUgKG5vZGVzVG9WaXNpdC5sZW5ndGgpIHsKICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBpZiAodGhpcy5yZWZTZXQuaGFzKGN1cnJlbnROb2RlKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLnJlZlNldC5wdXQoY3VycmVudE5vZGUpOwogICAgICAgICAgY3VycmVudE5vZGUgPSB0aGlzLnhyZWYuZmV0Y2goY3VycmVudE5vZGUpOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgICAgICB3YXJuKGBPYmplY3RMb2FkZXIuX3dhbGsgLSByZXF1ZXN0aW5nIGFsbCBkYXRhOiAiJHtleH0iLmApOwogICAgICAgICAgICB0aGlzLnJlZlNldCA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBtYW5hZ2VyCiAgICAgICAgICAgIH0gPSB0aGlzLnhyZWYuc3RyZWFtOwogICAgICAgICAgICByZXR1cm4gbWFuYWdlci5yZXF1ZXN0QWxsQ2h1bmtzKCk7CiAgICAgICAgICB9CiAgICAgICAgICBub2Rlc1RvUmV2aXNpdC5wdXNoKGN1cnJlbnROb2RlKTsKICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKICAgICAgICAgICAgYmVnaW46IGV4LmJlZ2luLAogICAgICAgICAgICBlbmQ6IGV4LmVuZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IGN1cnJlbnROb2RlLmdldEJhc2VTdHJlYW1zKCk7CiAgICAgICAgaWYgKGJhc2VTdHJlYW1zKSB7CiAgICAgICAgICBsZXQgZm91bmRNaXNzaW5nRGF0YSA9IGZhbHNlOwogICAgICAgICAgZm9yIChjb25zdCBzdHJlYW0gb2YgYmFzZVN0cmVhbXMpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5pc0RhdGFMb2FkZWQpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3VuZE1pc3NpbmdEYXRhID0gdHJ1ZTsKICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RzLnB1c2goewogICAgICAgICAgICAgIGJlZ2luOiBzdHJlYW0uc3RhcnQsCiAgICAgICAgICAgICAgZW5kOiBzdHJlYW0uZW5kCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGZvdW5kTWlzc2luZ0RhdGEpIHsKICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZENoaWxkcmVuKGN1cnJlbnROb2RlLCBub2Rlc1RvVmlzaXQpOwogICAgfQogICAgaWYgKHBlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpIHsKICAgICAgYXdhaXQgdGhpcy54cmVmLnN0cmVhbS5tYW5hZ2VyLnJlcXVlc3RSYW5nZXMocGVuZGluZ1JlcXVlc3RzKTsKICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzVG9SZXZpc2l0KSB7CiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHRoaXMucmVmU2V0LnJlbW92ZShub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3dhbGsobm9kZXNUb1JldmlzaXQpOwogICAgfQogICAgdGhpcy5yZWZTZXQgPSBudWxsOwogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zeW1ib2xfdXRpbHMuanMKY29uc3QgJGFjY2VwdFdoaXRlc3BhY2UgPSBTeW1ib2woKTsKY29uc3QgJGFkZEhUTUwgPSBTeW1ib2woKTsKY29uc3QgJGFwcGVuZENoaWxkID0gU3ltYm9sKCk7CmNvbnN0ICRjaGlsZHJlblRvSFRNTCA9IFN5bWJvbCgpOwpjb25zdCAkY2xlYW4gPSBTeW1ib2woKTsKY29uc3QgJGNsZWFuUGFnZSA9IFN5bWJvbCgpOwpjb25zdCAkY2xlYW51cCA9IFN5bWJvbCgpOwpjb25zdCAkY2xvbmUgPSBTeW1ib2woKTsKY29uc3QgJGNvbnN1bWVkID0gU3ltYm9sKCk7CmNvbnN0ICRjb250ZW50ID0gU3ltYm9sKCJjb250ZW50Iik7CmNvbnN0ICRkYXRhID0gU3ltYm9sKCJkYXRhIik7CmNvbnN0ICRkdW1wID0gU3ltYm9sKCk7CmNvbnN0ICRleHRyYSA9IFN5bWJvbCgiZXh0cmEiKTsKY29uc3QgJGZpbmFsaXplID0gU3ltYm9sKCk7CmNvbnN0ICRmbHVzaEhUTUwgPSBTeW1ib2woKTsKY29uc3QgJGdldEF0dHJpYnV0ZUl0ID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRBdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRBdmFpbGFibGVTcGFjZSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeUNsYXNzID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRDaGlsZHJlbkJ5TmFtZSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeU5hbWVJdCA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0RGF0YVZhbHVlID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRFeHRyYSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXQgPSBTeW1ib2woKTsKY29uc3QgJGdldENoaWxkcmVuID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRDb250YWluZWRDaGlsZHJlbiA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0TmV4dFBhZ2UgPSBTeW1ib2woKTsKY29uc3QgJGdldFN1YmZvcm1QYXJlbnQgPSBTeW1ib2woKTsKY29uc3QgJGdldFBhcmVudCA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0VGVtcGxhdGVSb290ID0gU3ltYm9sKCk7CmNvbnN0ICRnbG9iYWxEYXRhID0gU3ltYm9sKCk7CmNvbnN0ICRoYXNTZXR0YWJsZVZhbHVlID0gU3ltYm9sKCk7CmNvbnN0ICRpZHMgPSBTeW1ib2woKTsKY29uc3QgJGluZGV4T2YgPSBTeW1ib2woKTsKY29uc3QgJGluc2VydEF0ID0gU3ltYm9sKCk7CmNvbnN0ICRpc0NEQVRBWG1sID0gU3ltYm9sKCk7CmNvbnN0ICRpc0JpbmRhYmxlID0gU3ltYm9sKCk7CmNvbnN0ICRpc0RhdGFWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCAkaXNEZXNjZW5kZW50ID0gU3ltYm9sKCk7CmNvbnN0ICRpc05zQWdub3N0aWMgPSBTeW1ib2woKTsKY29uc3QgJGlzU3BsaXR0YWJsZSA9IFN5bWJvbCgpOwpjb25zdCAkaXNUaGVyZU1vcmVXaWR0aCA9IFN5bWJvbCgpOwpjb25zdCAkaXNUcmFuc3BhcmVudCA9IFN5bWJvbCgpOwpjb25zdCAkaXNVc2FibGUgPSBTeW1ib2woKTsKY29uc3QgJGxhc3RBdHRyaWJ1dGUgPSBTeW1ib2woKTsKY29uc3QgJG5hbWVzcGFjZUlkID0gU3ltYm9sKCJuYW1lc3BhY2VJZCIpOwpjb25zdCAkbm9kZU5hbWUgPSBTeW1ib2woIm5vZGVOYW1lIik7CmNvbnN0ICRuc0F0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgJG9uQ2hpbGQgPSBTeW1ib2woKTsKY29uc3QgJG9uQ2hpbGRDaGVjayA9IFN5bWJvbCgpOwpjb25zdCAkb25UZXh0ID0gU3ltYm9sKCk7CmNvbnN0ICRwdXNoR2x5cGhzID0gU3ltYm9sKCk7CmNvbnN0ICRwb3BQYXJhID0gU3ltYm9sKCk7CmNvbnN0ICRwdXNoUGFyYSA9IFN5bWJvbCgpOwpjb25zdCAkcmVtb3ZlQ2hpbGQgPSBTeW1ib2woKTsKY29uc3QgJHJvb3QgPSBTeW1ib2woInJvb3QiKTsKY29uc3QgJHJlc29sdmVQcm90b3R5cGVzID0gU3ltYm9sKCk7CmNvbnN0ICRzZWFyY2hOb2RlID0gU3ltYm9sKCk7CmNvbnN0ICRzZXRJZCA9IFN5bWJvbCgpOwpjb25zdCAkc2V0U2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCAkc2V0VmFsdWUgPSBTeW1ib2woKTsKY29uc3QgJHRhYkluZGV4ID0gU3ltYm9sKCk7CmNvbnN0ICR0ZXh0ID0gU3ltYm9sKCk7CmNvbnN0ICR0b1BhZ2VzID0gU3ltYm9sKCk7CmNvbnN0ICR0b0hUTUwgPSBTeW1ib2woKTsKY29uc3QgJHRvU3RyaW5nID0gU3ltYm9sKCk7CmNvbnN0ICR0b1N0eWxlID0gU3ltYm9sKCk7CmNvbnN0ICR1aWQgPSBTeW1ib2woInVpZCIpOwoKOy8vIC4vc3JjL2NvcmUveGZhL25hbWVzcGFjZXMuanMKY29uc3QgJGJ1aWxkWEZBT2JqZWN0ID0gU3ltYm9sKCk7CmNvbnN0IE5hbWVzcGFjZUlkcyA9IHsKICBjb25maWc6IHsKICAgIGlkOiAwLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGNpLyIpCiAgfSwKICBjb25uZWN0aW9uU2V0OiB7CiAgICBpZDogMSwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1jb25uZWN0aW9uLXNldC8iKQogIH0sCiAgZGF0YXNldHM6IHsKICAgIGlkOiAyLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvIikKICB9LAogIGZvcm06IHsKICAgIGlkOiAzLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vIikKICB9LAogIGxvY2FsZVNldDogewogICAgaWQ6IDQsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtbG9jYWxlLXNldC8iKQogIH0sCiAgcGRmOiB7CiAgICBpZDogNSwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi8iCiAgfSwKICBzaWduYXR1cmU6IHsKICAgIGlkOiA2LAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKICB9LAogIHNvdXJjZVNldDogewogICAgaWQ6IDcsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtc291cmNlLXNldC8iKQogIH0sCiAgc3R5bGVzaGVldDogewogICAgaWQ6IDgsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCiAgfSwKICB0ZW1wbGF0ZTogewogICAgaWQ6IDksCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtdGVtcGxhdGUvIikKICB9LAogIHhkYzogewogICAgaWQ6IDEwLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGRjLyIpCiAgfSwKICB4ZHA6IHsKICAgIGlkOiAxMSwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwLyIKICB9LAogIHhmZGY6IHsKICAgIGlkOiAxMiwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGZkZi8iCiAgfSwKICB4aHRtbDogewogICAgaWQ6IDEzLAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKICB9LAogIHhtcG1ldGE6IHsKICAgIGlkOiAxNCwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iCiAgfQp9OwoKOy8vIC4vc3JjL2NvcmUveGZhL3V0aWxzLmpzCgpjb25zdCBkaW1Db252ZXJ0ZXJzID0gewogIHB0OiB4ID0+IHgsCiAgY206IHggPT4geCAvIDIuNTQgKiA3MiwKICBtbTogeCA9PiB4IC8gKDEwICogMi41NCkgKiA3MiwKICBpbjogeCA9PiB4ICogNzIsCiAgcHg6IHggPT4geAp9Owpjb25zdCBtZWFzdXJlbWVudFBhdHRlcm4gPSAvKFsrLV0/XGQrXC4/XGQqKSguKikvOwpmdW5jdGlvbiBzdHJpcFF1b3RlcyhzdHIpIHsKICBpZiAoc3RyLnN0YXJ0c1dpdGgoIiciKSB8fCBzdHIuc3RhcnRzV2l0aCgnIicpKSB7CiAgICByZXR1cm4gc3RyLnNsaWNlKDEsIC0xKTsKICB9CiAgcmV0dXJuIHN0cjsKfQpmdW5jdGlvbiBnZXRJbnRlZ2VyKHsKICBkYXRhLAogIGRlZmF1bHRWYWx1ZSwKICB2YWxpZGF0ZQp9KSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogIH0KICBkYXRhID0gZGF0YS50cmltKCk7CiAgY29uc3QgbiA9IHBhcnNlSW50KGRhdGEsIDEwKTsKICBpZiAoIWlzTmFOKG4pICYmIHZhbGlkYXRlKG4pKSB7CiAgICByZXR1cm4gbjsKICB9CiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKfQpmdW5jdGlvbiBnZXRGbG9hdCh7CiAgZGF0YSwKICBkZWZhdWx0VmFsdWUsCiAgdmFsaWRhdGUKfSkgewogIGlmICghZGF0YSkgewogICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICB9CiAgZGF0YSA9IGRhdGEudHJpbSgpOwogIGNvbnN0IG4gPSBwYXJzZUZsb2F0KGRhdGEpOwogIGlmICghaXNOYU4obikgJiYgdmFsaWRhdGUobikpIHsKICAgIHJldHVybiBuOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldEtleXdvcmQoewogIGRhdGEsCiAgZGVmYXVsdFZhbHVlLAogIHZhbGlkYXRlCn0pIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgfQogIGRhdGEgPSBkYXRhLnRyaW0oKTsKICBpZiAodmFsaWRhdGUoZGF0YSkpIHsKICAgIHJldHVybiBkYXRhOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldFN0cmluZ09wdGlvbihkYXRhLCBvcHRpb25zKSB7CiAgcmV0dXJuIGdldEtleXdvcmQoewogICAgZGF0YSwKICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9uc1swXSwKICAgIHZhbGlkYXRlOiBrID0+IG9wdGlvbnMuaW5jbHVkZXMoaykKICB9KTsKfQpmdW5jdGlvbiBnZXRNZWFzdXJlbWVudChzdHIsIGRlZiA9ICIwIikgewogIGRlZiB8fD0gIjAiOwogIGlmICghc3RyKSB7CiAgICByZXR1cm4gZ2V0TWVhc3VyZW1lbnQoZGVmKTsKICB9CiAgY29uc3QgbWF0Y2ggPSBzdHIudHJpbSgpLm1hdGNoKG1lYXN1cmVtZW50UGF0dGVybik7CiAgaWYgKCFtYXRjaCkgewogICAgcmV0dXJuIGdldE1lYXN1cmVtZW50KGRlZik7CiAgfQogIGNvbnN0IFssIHZhbHVlU3RyLCB1bml0XSA9IG1hdGNoOwogIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZVN0cik7CiAgaWYgKGlzTmFOKHZhbHVlKSkgewogICAgcmV0dXJuIGdldE1lYXN1cmVtZW50KGRlZik7CiAgfQogIGlmICh2YWx1ZSA9PT0gMCkgewogICAgcmV0dXJuIDA7CiAgfQogIGNvbnN0IGNvbnYgPSBkaW1Db252ZXJ0ZXJzW3VuaXRdOwogIGlmIChjb252KSB7CiAgICByZXR1cm4gY29udih2YWx1ZSk7CiAgfQogIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBnZXRSYXRpbyhkYXRhKSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gewogICAgICBudW06IDEsCiAgICAgIGRlbjogMQogICAgfTsKICB9CiAgY29uc3QgcmF0aW8gPSBkYXRhLnNwbGl0KCI6IiwgMikubWFwKHggPT4gcGFyc2VGbG9hdCh4LnRyaW0oKSkpLmZpbHRlcih4ID0+ICFpc05hTih4KSk7CiAgaWYgKHJhdGlvLmxlbmd0aCA9PT0gMSkgewogICAgcmF0aW8ucHVzaCgxKTsKICB9CiAgaWYgKHJhdGlvLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHsKICAgICAgbnVtOiAxLAogICAgICBkZW46IDEKICAgIH07CiAgfQogIGNvbnN0IFtudW0sIGRlbl0gPSByYXRpbzsKICByZXR1cm4gewogICAgbnVtLAogICAgZGVuCiAgfTsKfQpmdW5jdGlvbiBnZXRSZWxldmFudChkYXRhKSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gW107CiAgfQogIHJldHVybiBkYXRhLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKGUgPT4gKHsKICAgIGV4Y2x1ZGVkOiBlWzBdID09PSAiLSIsCiAgICB2aWV3bmFtZTogZS5zdWJzdHJpbmcoMSkKICB9KSk7Cn0KZnVuY3Rpb24gZ2V0Q29sb3IoZGF0YSwgZGVmID0gWzAsIDAsIDBdKSB7CiAgbGV0IFtyLCBnLCBiXSA9IGRlZjsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIHIsCiAgICAgIGcsCiAgICAgIGIKICAgIH07CiAgfQogIGNvbnN0IGNvbG9yID0gZGF0YS5zcGxpdCgiLCIsIDMpLm1hcChjID0+IE1hdGhDbGFtcChwYXJzZUludChjLnRyaW0oKSwgMTApLCAwLCAyNTUpKS5tYXAoYyA9PiBpc05hTihjKSA/IDAgOiBjKTsKICBpZiAoY29sb3IubGVuZ3RoIDwgMykgewogICAgcmV0dXJuIHsKICAgICAgciwKICAgICAgZywKICAgICAgYgogICAgfTsKICB9CiAgW3IsIGcsIGJdID0gY29sb3I7CiAgcmV0dXJuIHsKICAgIHIsCiAgICBnLAogICAgYgogIH07Cn0KZnVuY3Rpb24gZ2V0QkJveChkYXRhKSB7CiAgY29uc3QgZGVmID0gLTE7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IGJib3ggPSBkYXRhLnNwbGl0KCIsIiwgNCkubWFwKG0gPT4gZ2V0TWVhc3VyZW1lbnQobS50cmltKCksICItMSIpKTsKICBpZiAoYmJveC5sZW5ndGggPCA0IHx8IGJib3hbMl0gPCAwIHx8IGJib3hbM10gPCAwKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGJib3g7CiAgcmV0dXJuIHsKICAgIHgsCiAgICB5LAogICAgd2lkdGgsCiAgICBoZWlnaHQKICB9Owp9CmNsYXNzIEhUTUxSZXN1bHQgewogIHN0YXRpYyBnZXQgRkFJTFVSRSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIkZBSUxVUkUiLCBuZXcgSFRNTFJlc3VsdChmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwogIH0KICBzdGF0aWMgZ2V0IEVNUFRZKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRU1QVFkiLCBuZXcgSFRNTFJlc3VsdCh0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7CiAgfQogIGNvbnN0cnVjdG9yKHN1Y2Nlc3MsIGh0bWwsIGJib3gsIGJyZWFrTm9kZSkgewogICAgdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKICAgIHRoaXMuaHRtbCA9IGh0bWw7CiAgICB0aGlzLmJib3ggPSBiYm94OwogICAgdGhpcy5icmVha05vZGUgPSBicmVha05vZGU7CiAgfQogIGlzQnJlYWsoKSB7CiAgICByZXR1cm4gISF0aGlzLmJyZWFrTm9kZTsKICB9CiAgc3RhdGljIGJyZWFrTm9kZShub2RlKSB7CiAgICByZXR1cm4gbmV3IEhUTUxSZXN1bHQoZmFsc2UsIG51bGwsIG51bGwsIG5vZGUpOwogIH0KICBzdGF0aWMgc3VjY2VzcyhodG1sLCBiYm94ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBIVE1MUmVzdWx0KHRydWUsIGh0bWwsIGJib3gsIG51bGwpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZvbnRzLmpzCgoKCmNsYXNzIEZvbnRGaW5kZXIgewogIGNvbnN0cnVjdG9yKHBkZkZvbnRzKSB7CiAgICB0aGlzLmZvbnRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMud2FybmVkID0gbmV3IFNldCgpOwogICAgdGhpcy5kZWZhdWx0Rm9udCA9IG51bGw7CiAgICB0aGlzLmFkZChwZGZGb250cyk7CiAgfQogIGFkZChwZGZGb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzID0gbnVsbCkgewogICAgZm9yIChjb25zdCBwZGZGb250IG9mIHBkZkZvbnRzKSB7CiAgICAgIHRoaXMuYWRkUGRmRm9udChwZGZGb250KTsKICAgIH0KICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgIGlmICghcGRmRm9udC5yZWd1bGFyKSB7CiAgICAgICAgcGRmRm9udC5yZWd1bGFyID0gcGRmRm9udC5pdGFsaWMgfHwgcGRmRm9udC5ib2xkIHx8IHBkZkZvbnQuYm9sZGl0YWxpYzsKICAgICAgfQogICAgfQogICAgaWYgKCFyZWFsbHlNaXNzaW5nRm9udHMgfHwgcmVhbGx5TWlzc2luZ0ZvbnRzLnNpemUgPT09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbXlyaWFkID0gdGhpcy5mb250cy5nZXQoIlBkZkpTLUZhbGxiYWNrLVBkZkpTLVhGQSIpOwogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIHJlYWxseU1pc3NpbmdGb250cykgewogICAgICB0aGlzLmZvbnRzLnNldChtaXNzaW5nLCBteXJpYWQpOwogICAgfQogIH0KICBhZGRQZGZGb250KHBkZkZvbnQpIHsKICAgIGNvbnN0IGNzc0ZvbnRJbmZvID0gcGRmRm9udC5jc3NGb250SW5mbzsKICAgIGNvbnN0IG5hbWUgPSBjc3NGb250SW5mby5mb250RmFtaWx5OwogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmICghZm9udCkgewogICAgICBmb250ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdGhpcy5mb250cy5zZXQobmFtZSwgZm9udCk7CiAgICAgIGlmICghdGhpcy5kZWZhdWx0Rm9udCkgewogICAgICAgIHRoaXMuZGVmYXVsdEZvbnQgPSBmb250OwogICAgICB9CiAgICB9CiAgICBsZXQgcHJvcGVydHkgPSAiIjsKICAgIGNvbnN0IGZvbnRXZWlnaHQgPSBwYXJzZUZsb2F0KGNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQpOwogICAgaWYgKHBhcnNlRmxvYXQoY3NzRm9udEluZm8uaXRhbGljQW5nbGUpICE9PSAwKSB7CiAgICAgIHByb3BlcnR5ID0gZm9udFdlaWdodCA+PSA3MDAgPyAiYm9sZGl0YWxpYyIgOiAiaXRhbGljIjsKICAgIH0gZWxzZSBpZiAoZm9udFdlaWdodCA+PSA3MDApIHsKICAgICAgcHJvcGVydHkgPSAiYm9sZCI7CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkJvbGQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkJvbGQiKSkgewogICAgICAgIHByb3BlcnR5ID0gImJvbGQiOwogICAgICB9CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQubmFtZS5lbmRzV2l0aCgiSXQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQucHNOYW1lPy5lbmRzV2l0aCgiSXQiKSkgewogICAgICAgIHByb3BlcnR5ICs9ICJpdGFsaWMiOwogICAgICB9CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIHByb3BlcnR5ID0gInJlZ3VsYXIiOwogICAgfQogICAgZm9udFtwcm9wZXJ0eV0gPSBwZGZGb250OwogIH0KICBnZXREZWZhdWx0KCkgewogICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZvbnQ7CiAgfQogIGZpbmQoZm9udE5hbWUsIG11c3RXYXJuID0gdHJ1ZSkgewogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChmb250TmFtZSkgfHwgdGhpcy5jYWNoZS5nZXQoZm9udE5hbWUpOwogICAgaWYgKGZvbnQpIHsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBjb25zdCBwYXR0ZXJuID0gLyx8LXxffCB8Ym9sZGl0YWxpY3xib2xkfGl0YWxpY3xyZWd1bGFyfGl0L2dpOwogICAgbGV0IG5hbWUgPSBmb250TmFtZS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKTsKICAgIGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmIChmb250KSB7CiAgICAgIHRoaXMuY2FjaGUuc2V0KGZvbnROYW1lLCBmb250KTsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgbWF5YmUgPSBbXTsKICAgIGZvciAoY29uc3QgW2ZhbWlseSwgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICBtYXliZS5wdXNoKHBkZkZvbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgWywgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgICBpZiAocGRmRm9udC5yZWd1bGFyLm5hbWU/LnJlcGxhY2VBbGwocGF0dGVybiwgIiIpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChuYW1lKSkgewogICAgICAgICAgbWF5YmUucHVzaChwZGZGb250KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXliZS5sZW5ndGggPT09IDApIHsKICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgvcHNtdHxtdC9naSwgIiIpOwogICAgICBmb3IgKGNvbnN0IFtmYW1pbHksIHBkZkZvbnRdIG9mIHRoaXMuZm9udHMuZW50cmllcygpKSB7CiAgICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgICAgaWYgKHBkZkZvbnQucmVndWxhci5uYW1lPy5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID49IDEpIHsKICAgICAgaWYgKG1heWJlLmxlbmd0aCAhPT0gMSAmJiBtdXN0V2FybikgewogICAgICAgIHdhcm4oYFhGQSAtIFRvbyBtYW55IGNob2ljZXMgdG8gZ3Vlc3MgdGhlIGNvcnJlY3QgZm9udDogJHtmb250TmFtZX1gKTsKICAgICAgfQogICAgICB0aGlzLmNhY2hlLnNldChmb250TmFtZSwgbWF5YmVbMF0pOwogICAgICByZXR1cm4gbWF5YmVbMF07CiAgICB9CiAgICBpZiAobXVzdFdhcm4gJiYgIXRoaXMud2FybmVkLmhhcyhmb250TmFtZSkpIHsKICAgICAgdGhpcy53YXJuZWQuYWRkKGZvbnROYW1lKTsKICAgICAgd2FybihgWEZBIC0gQ2Fubm90IGZpbmQgdGhlIGZvbnQ6ICR7Zm9udE5hbWV9YCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc2VsZWN0Rm9udCh4ZmFGb250LCB0eXBlZmFjZSkgewogIGlmICh4ZmFGb250LnBvc3R1cmUgPT09ICJpdGFsaWMiKSB7CiAgICBpZiAoeGZhRm9udC53ZWlnaHQgPT09ICJib2xkIikgewogICAgICByZXR1cm4gdHlwZWZhY2UuYm9sZGl0YWxpYzsKICAgIH0KICAgIHJldHVybiB0eXBlZmFjZS5pdGFsaWM7CiAgfSBlbHNlIGlmICh4ZmFGb250LndlaWdodCA9PT0gImJvbGQiKSB7CiAgICByZXR1cm4gdHlwZWZhY2UuYm9sZDsKICB9CiAgcmV0dXJuIHR5cGVmYWNlLnJlZ3VsYXI7Cn0KZnVuY3Rpb24gZm9udHNfZ2V0TWV0cmljcyh4ZmFGb250LCByZWFsID0gZmFsc2UpIHsKICBsZXQgcGRmRm9udCA9IG51bGw7CiAgaWYgKHhmYUZvbnQpIHsKICAgIGNvbnN0IG5hbWUgPSBzdHJpcFF1b3Rlcyh4ZmFGb250LnR5cGVmYWNlKTsKICAgIGNvbnN0IHR5cGVmYWNlID0geGZhRm9udFskZ2xvYmFsRGF0YV0uZm9udEZpbmRlci5maW5kKG5hbWUpOwogICAgcGRmRm9udCA9IHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpOwogIH0KICBpZiAoIXBkZkZvbnQpIHsKICAgIHJldHVybiB7CiAgICAgIGxpbmVIZWlnaHQ6IDEyLAogICAgICBsaW5lR2FwOiAyLAogICAgICBsaW5lTm9HYXA6IDEwCiAgICB9OwogIH0KICBjb25zdCBzaXplID0geGZhRm9udC5zaXplIHx8IDEwOwogIGNvbnN0IGxpbmVIZWlnaHQgPSBwZGZGb250LmxpbmVIZWlnaHQgPyBNYXRoLm1heChyZWFsID8gMCA6IDEuMiwgcGRmRm9udC5saW5lSGVpZ2h0KSA6IDEuMjsKICBjb25zdCBsaW5lR2FwID0gcGRmRm9udC5saW5lR2FwID09PSB1bmRlZmluZWQgPyAwLjIgOiBwZGZGb250LmxpbmVHYXA7CiAgcmV0dXJuIHsKICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHQgKiBzaXplLAogICAgbGluZUdhcDogbGluZUdhcCAqIHNpemUsCiAgICBsaW5lTm9HYXA6IE1hdGgubWF4KDEsIGxpbmVIZWlnaHQgLSBsaW5lR2FwKSAqIHNpemUKICB9Owp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvdGV4dC5qcwoKY29uc3QgV0lEVEhfRkFDVE9SID0gMS4wMjsKY2xhc3MgRm9udEluZm8gewogIGNvbnN0cnVjdG9yKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5saW5lSGVpZ2h0ID0gbGluZUhlaWdodDsKICAgIHRoaXMucGFyYU1hcmdpbiA9IG1hcmdpbiB8fCB7CiAgICAgIHRvcDogMCwKICAgICAgYm90dG9tOiAwLAogICAgICBsZWZ0OiAwLAogICAgICByaWdodDogMAogICAgfTsKICAgIGlmICgheGZhRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy54ZmFGb250ID0gewogICAgICB0eXBlZmFjZTogeGZhRm9udC50eXBlZmFjZSwKICAgICAgcG9zdHVyZTogeGZhRm9udC5wb3N0dXJlLAogICAgICB3ZWlnaHQ6IHhmYUZvbnQud2VpZ2h0LAogICAgICBzaXplOiB4ZmFGb250LnNpemUsCiAgICAgIGxldHRlclNwYWNpbmc6IHhmYUZvbnQubGV0dGVyU3BhY2luZwogICAgfTsKICAgIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKHhmYUZvbnQudHlwZWZhY2UpOwogICAgaWYgKCF0eXBlZmFjZSkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5wZGZGb250ID0gc2VsZWN0Rm9udCh4ZmFGb250LCB0eXBlZmFjZSk7CiAgICBpZiAoIXRoaXMucGRmRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgIH0KICB9CiAgZGVmYXVsdEZvbnQoZm9udEZpbmRlcikgewogICAgY29uc3QgZm9udCA9IGZvbnRGaW5kZXIuZmluZCgiSGVsdmV0aWNhIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZmluZCgiTXlyaWFkIFBybyIsIGZhbHNlKSB8fCBmb250RmluZGVyLmZpbmQoIkFyaWFsIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZ2V0RGVmYXVsdCgpOwogICAgaWYgKGZvbnQ/LnJlZ3VsYXIpIHsKICAgICAgY29uc3QgcGRmRm9udCA9IGZvbnQucmVndWxhcjsKICAgICAgY29uc3QgaW5mbyA9IHBkZkZvbnQuY3NzRm9udEluZm87CiAgICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgICAgdHlwZWZhY2U6IGluZm8uZm9udEZhbWlseSwKICAgICAgICBwb3N0dXJlOiAibm9ybWFsIiwKICAgICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICAgIHNpemU6IDEwLAogICAgICAgIGxldHRlclNwYWNpbmc6IDAKICAgICAgfTsKICAgICAgcmV0dXJuIFtwZGZGb250LCB4ZmFGb250XTsKICAgIH0KICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgIHR5cGVmYWNlOiAiQ291cmllciIsCiAgICAgIHBvc3R1cmU6ICJub3JtYWwiLAogICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICBzaXplOiAxMCwKICAgICAgbGV0dGVyU3BhY2luZzogMAogICAgfTsKICAgIHJldHVybiBbbnVsbCwgeGZhRm9udF07CiAgfQp9CmNsYXNzIEZvbnRTZWxlY3RvciB7CiAgY29uc3RydWN0b3IoZGVmYXVsdFhmYUZvbnQsIGRlZmF1bHRQYXJhTWFyZ2luLCBkZWZhdWx0TGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5mb250RmluZGVyID0gZm9udEZpbmRlcjsKICAgIHRoaXMuc3RhY2sgPSBbbmV3IEZvbnRJbmZvKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRGaW5kZXIpXTsKICB9CiAgcHVzaERhdGEoeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0KSB7CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuc3RhY2suYXQoLTEpOwogICAgZm9yIChjb25zdCBuYW1lIG9mIFsidHlwZWZhY2UiLCAicG9zdHVyZSIsICJ3ZWlnaHQiLCAic2l6ZSIsICJsZXR0ZXJTcGFjaW5nIl0pIHsKICAgICAgaWYgKCF4ZmFGb250W25hbWVdKSB7CiAgICAgICAgeGZhRm9udFtuYW1lXSA9IGxhc3RGb250LnhmYUZvbnRbbmFtZV07CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBbInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCJdKSB7CiAgICAgIGlmIChpc05hTihtYXJnaW5bbmFtZV0pKSB7CiAgICAgICAgbWFyZ2luW25hbWVdID0gbGFzdEZvbnQucGFyYU1hcmdpbltuYW1lXTsKICAgICAgfQogICAgfQogICAgY29uc3QgZm9udEluZm8gPSBuZXcgRm9udEluZm8oeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0IHx8IGxhc3RGb250LmxpbmVIZWlnaHQsIHRoaXMuZm9udEZpbmRlcik7CiAgICBpZiAoIWZvbnRJbmZvLnBkZkZvbnQpIHsKICAgICAgZm9udEluZm8ucGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2goZm9udEluZm8pOwogIH0KICBwb3BGb250KCkgewogICAgdGhpcy5zdGFjay5wb3AoKTsKICB9CiAgdG9wRm9udCgpIHsKICAgIHJldHVybiB0aGlzLnN0YWNrLmF0KC0xKTsKICB9Cn0KY2xhc3MgVGV4dE1lYXN1cmUgewogIGNvbnN0cnVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKSB7CiAgICB0aGlzLmdseXBocyA9IFtdOwogICAgdGhpcy5mb250U2VsZWN0b3IgPSBuZXcgRm9udFNlbGVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKTsKICAgIHRoaXMuZXh0cmFIZWlnaHQgPSAwOwogIH0KICBwdXNoRGF0YSh4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQpIHsKICAgIHRoaXMuZm9udFNlbGVjdG9yLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgfQogIHBvcEZvbnQoeGZhRm9udCkgewogICAgcmV0dXJuIHRoaXMuZm9udFNlbGVjdG9yLnBvcEZvbnQoKTsKICB9CiAgYWRkUGFyYSgpIHsKICAgIGNvbnN0IGxhc3RGb250ID0gdGhpcy5mb250U2VsZWN0b3IudG9wRm9udCgpOwogICAgdGhpcy5leHRyYUhlaWdodCArPSBsYXN0Rm9udC5wYXJhTWFyZ2luLnRvcCArIGxhc3RGb250LnBhcmFNYXJnaW4uYm90dG9tOwogIH0KICBhZGRTdHJpbmcoc3RyKSB7CiAgICBpZiAoIXN0cikgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuZm9udFNlbGVjdG9yLnRvcEZvbnQoKTsKICAgIGNvbnN0IGZvbnRTaXplID0gbGFzdEZvbnQueGZhRm9udC5zaXplOwogICAgaWYgKGxhc3RGb250LnBkZkZvbnQpIHsKICAgICAgY29uc3QgbGV0dGVyU3BhY2luZyA9IGxhc3RGb250LnhmYUZvbnQubGV0dGVyU3BhY2luZzsKICAgICAgY29uc3QgcGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICAgIGNvbnN0IGZvbnRMaW5lSGVpZ2h0ID0gcGRmRm9udC5saW5lSGVpZ2h0IHx8IDEuMjsKICAgICAgY29uc3QgbGluZUhlaWdodCA9IGxhc3RGb250LmxpbmVIZWlnaHQgfHwgTWF0aC5tYXgoMS4yLCBmb250TGluZUhlaWdodCkgKiBmb250U2l6ZTsKICAgICAgY29uc3QgbGluZUdhcCA9IHBkZkZvbnQubGluZUdhcCA9PT0gdW5kZWZpbmVkID8gMC4yIDogcGRmRm9udC5saW5lR2FwOwogICAgICBjb25zdCBub0dhcCA9IGZvbnRMaW5lSGVpZ2h0IC0gbGluZUdhcDsKICAgICAgY29uc3QgZmlyc3RMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoMSwgbm9HYXApICogZm9udFNpemU7CiAgICAgIGNvbnN0IHNjYWxlID0gZm9udFNpemUgLyAxMDAwOwogICAgICBjb25zdCBmYWxsYmFja1dpZHRoID0gcGRmRm9udC5kZWZhdWx0V2lkdGggfHwgcGRmRm9udC5jaGFyc1RvR2x5cGhzKCIgIilbMF0ud2lkdGg7CiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzdHIuc3BsaXQoL1tcdTIwMjlcbl0vKSkgewogICAgICAgIGNvbnN0IGVuY29kZWRMaW5lID0gcGRmRm9udC5lbmNvZGVTdHJpbmcobGluZSkuam9pbigiIik7CiAgICAgICAgY29uc3QgZ2x5cGhzID0gcGRmRm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWRMaW5lKTsKICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgewogICAgICAgICAgY29uc3Qgd2lkdGggPSBnbHlwaC53aWR0aCB8fCBmYWxsYmFja1dpZHRoOwogICAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbd2lkdGggKiBzY2FsZSArIGxldHRlclNwYWNpbmcsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgZ2x5cGgudW5pY29kZSwgZmFsc2VdKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbMCwgMCwgMCwgIlxuIiwgdHJ1ZV0pOwogICAgICB9CiAgICAgIHRoaXMuZ2x5cGhzLnBvcCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyLnNwbGl0KC9bXHUyMDI5XG5dLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbZm9udFNpemUsIDEuMiAqIGZvbnRTaXplLCBmb250U2l6ZSwgY2hhciwgZmFsc2VdKTsKICAgICAgfQogICAgICB0aGlzLmdseXBocy5wdXNoKFswLCAwLCAwLCAiXG4iLCB0cnVlXSk7CiAgICB9CiAgICB0aGlzLmdseXBocy5wb3AoKTsKICB9CiAgY29tcHV0ZShtYXhXaWR0aCkgewogICAgbGV0IGxhc3RTcGFjZVBvcyA9IC0xLAogICAgICBsYXN0U3BhY2VXaWR0aCA9IDAsCiAgICAgIHdpZHRoID0gMCwKICAgICAgaGVpZ2h0ID0gMCwKICAgICAgY3VycmVudExpbmVXaWR0aCA9IDAsCiAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gMDsKICAgIGxldCBpc0Jyb2tlbiA9IGZhbHNlOwogICAgbGV0IGlzRmlyc3RMaW5lID0gdHJ1ZTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW2dseXBoV2lkdGgsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgY2hhciwgaXNFT0xdID0gdGhpcy5nbHlwaHNbaV07CiAgICAgIGNvbnN0IGlzU3BhY2UgPSBjaGFyID09PSAiICI7CiAgICAgIGNvbnN0IGdseXBoSGVpZ2h0ID0gaXNGaXJzdExpbmUgPyBmaXJzdExpbmVIZWlnaHQgOiBsaW5lSGVpZ2h0OwogICAgICBpZiAoaXNFT0wpIHsKICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICBjdXJyZW50TGluZVdpZHRoID0gMDsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaXNTcGFjZSkgewogICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoICsgZ2x5cGhXaWR0aCA+IG1heFdpZHRoKSB7CiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgaGVpZ2h0ICs9IGN1cnJlbnRMaW5lSGVpZ2h0OwogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSAwOwogICAgICAgICAgaXNCcm9rZW4gPSB0cnVlOwogICAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSBjdXJyZW50TGluZVdpZHRoOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCArPSBnbHlwaFdpZHRoOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggKyBnbHlwaFdpZHRoID4gbWF4V2lkdGgpIHsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBpZiAobGFzdFNwYWNlUG9zICE9PSAtMSkgewogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvczsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGxhc3RTcGFjZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gLTE7CiAgICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN1cnJlbnRMaW5lV2lkdGgpOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IGdseXBoV2lkdGg7CiAgICAgICAgfQogICAgICAgIGlzQnJva2VuID0gdHJ1ZTsKICAgICAgICBpc0ZpcnN0TGluZSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGN1cnJlbnRMaW5lV2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgfQogICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3VycmVudExpbmVXaWR0aCk7CiAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQgKyB0aGlzLmV4dHJhSGVpZ2h0OwogICAgcmV0dXJuIHsKICAgICAgd2lkdGg6IFdJRFRIX0ZBQ1RPUiAqIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGlzQnJva2VuCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3NvbS5qcwoKCmNvbnN0IG5hbWVQYXR0ZXJuID0gL15bXi5bXSsvOwpjb25zdCBpbmRleFBhdHRlcm4gPSAvXlteXF1dKy87CmNvbnN0IG9wZXJhdG9ycyA9IHsKICBkb3Q6IDAsCiAgZG90RG90OiAxLAogIGRvdEhhc2g6IDIsCiAgZG90QnJhY2tldDogMywKICBkb3RQYXJlbjogNAp9Owpjb25zdCBzaG9ydGN1dHMgPSBuZXcgTWFwKFtbIiRkYXRhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuZGF0YXNldHMgPyByb290LmRhdGFzZXRzLmRhdGEgOiByb290XSwgWyIkcmVjb3JkIiwgKHJvb3QsIGN1cnJlbnQpID0+IChyb290LmRhdGFzZXRzID8gcm9vdC5kYXRhc2V0cy5kYXRhIDogcm9vdClbJGdldENoaWxkcmVuXSgpWzBdXSwgWyIkdGVtcGxhdGUiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC50ZW1wbGF0ZV0sIFsiJGNvbm5lY3Rpb25TZXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5jb25uZWN0aW9uU2V0XSwgWyIkZm9ybSIsIChyb290LCBjdXJyZW50KSA9PiByb290LmZvcm1dLCBbIiRsYXlvdXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5sYXlvdXRdLCBbIiRob3N0IiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuaG9zdF0sIFsiJGRhdGFXaW5kb3ciLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5kYXRhV2luZG93XSwgWyIkZXZlbnQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5ldmVudF0sIFsiISIsIChyb290LCBjdXJyZW50KSA9PiByb290LmRhdGFzZXRzXSwgWyIkeGZhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3RdLCBbInhmYSIsIChyb290LCBjdXJyZW50KSA9PiByb290XSwgWyIkIiwgKHJvb3QsIGN1cnJlbnQpID0+IGN1cnJlbnRdXSk7CmNvbnN0IHNvbUNhY2hlID0gbmV3IFdlYWtNYXAoKTsKZnVuY3Rpb24gcGFyc2VJbmRleChpbmRleCkgewogIGluZGV4ID0gaW5kZXgudHJpbSgpOwogIGlmIChpbmRleCA9PT0gIioiKSB7CiAgICByZXR1cm4gSW5maW5pdHk7CiAgfQogIHJldHVybiBwYXJzZUludChpbmRleCwgMTApIHx8IDA7Cn0KZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHIsIGRvdERvdEFsbG93ZWQsIG5vRXhwciA9IHRydWUpIHsKICBsZXQgbWF0Y2ggPSBleHByLm1hdGNoKG5hbWVQYXR0ZXJuKTsKICBpZiAoIW1hdGNoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgbGV0IFtuYW1lXSA9IG1hdGNoOwogIGNvbnN0IHBhcnNlZCA9IFt7CiAgICBuYW1lLAogICAgY2FjaGVOYW1lOiAiLiIgKyBuYW1lLAogICAgaW5kZXg6IDAsCiAgICBqczogbnVsbCwKICAgIGZvcm1DYWxjOiBudWxsLAogICAgb3BlcmF0b3I6IG9wZXJhdG9ycy5kb3QKICB9XTsKICBsZXQgcG9zID0gbmFtZS5sZW5ndGg7CiAgd2hpbGUgKHBvcyA8IGV4cHIubGVuZ3RoKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgY29uc3QgY2hhciA9IGV4cHIuY2hhckF0KHBvcysrKTsKICAgIGlmIChjaGFyID09PSAiWyIpIHsKICAgICAgbWF0Y2ggPSBleHByLnNsaWNlKHBvcykubWF0Y2goaW5kZXhQYXR0ZXJuKTsKICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgIHdhcm4oIlhGQSAtIEludmFsaWQgaW5kZXggaW4gU09NIGV4cHJlc3Npb24iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBwYXJzZWQuYXQoLTEpLmluZGV4ID0gcGFyc2VJbmRleChtYXRjaFswXSk7CiAgICAgIHBvcyArPSBtYXRjaFswXS5sZW5ndGggKyAxOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGxldCBvcGVyYXRvcjsKICAgIHN3aXRjaCAoZXhwci5jaGFyQXQocG9zKSkgewogICAgICBjYXNlICIuIjoKICAgICAgICBpZiAoIWRvdERvdEFsbG93ZWQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBwb3MrKzsKICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3REb3Q7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIiMiOgogICAgICAgIHBvcysrOwogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdEhhc2g7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIlsiOgogICAgICAgIGlmIChub0V4cHIpIHsKICAgICAgICAgIHdhcm4oIlhGQSAtIFNPTSBleHByZXNzaW9uIGNvbnRhaW5zIGEgRm9ybUNhbGMgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIik7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnMuZG90QnJhY2tldDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiKCI6CiAgICAgICAgaWYgKG5vRXhwcikgewogICAgICAgICAgd2FybigiWEZBIC0gU09NIGV4cHJlc3Npb24gY29udGFpbnMgYSBKYXZhU2NyaXB0IHN1YmV4cHJlc3Npb24gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93LiIpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdFBhcmVuOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdDsKICAgICAgICBicmVhazsKICAgIH0KICAgIG1hdGNoID0gZXhwci5zbGljZShwb3MpLm1hdGNoKG5hbWVQYXR0ZXJuKTsKICAgIGlmICghbWF0Y2gpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBbbmFtZV0gPSBtYXRjaDsKICAgIHBvcyArPSBuYW1lLmxlbmd0aDsKICAgIHBhcnNlZC5wdXNoKHsKICAgICAgbmFtZSwKICAgICAgY2FjaGVOYW1lOiBleHByLnNsaWNlKHNwb3MsIHBvcyksCiAgICAgIG9wZXJhdG9yLAogICAgICBpbmRleDogMCwKICAgICAganM6IG51bGwsCiAgICAgIGZvcm1DYWxjOiBudWxsCiAgICB9KTsKICB9CiAgcmV0dXJuIHBhcnNlZDsKfQpmdW5jdGlvbiBzZWFyY2hOb2RlKHJvb3QsIGNvbnRhaW5lciwgZXhwciwgZG90RG90QWxsb3dlZCA9IHRydWUsIHVzZUNhY2hlID0gdHJ1ZSkgewogIGNvbnN0IHBhcnNlZCA9IHBhcnNlRXhwcmVzc2lvbihleHByLCBkb3REb3RBbGxvd2VkKTsKICBpZiAoIXBhcnNlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGZuID0gc2hvcnRjdXRzLmdldChwYXJzZWRbMF0ubmFtZSk7CiAgbGV0IGkgPSAwOwogIGxldCBpc1F1YWxpZmllZDsKICBpZiAoZm4pIHsKICAgIGlzUXVhbGlmaWVkID0gdHJ1ZTsKICAgIHJvb3QgPSBbZm4ocm9vdCwgY29udGFpbmVyKV07CiAgICBpID0gMTsKICB9IGVsc2UgewogICAgaXNRdWFsaWZpZWQgPSBjb250YWluZXIgPT09IG51bGw7CiAgICByb290ID0gW2NvbnRhaW5lciB8fCByb290XTsKICB9CiAgZm9yIChsZXQgaWkgPSBwYXJzZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICBjYWNoZU5hbWUsCiAgICAgIG9wZXJhdG9yLAogICAgICBpbmRleAogICAgfSA9IHBhcnNlZFtpXTsKICAgIGNvbnN0IG5vZGVzID0gW107CiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygcm9vdCkgewogICAgICBpZiAoIW5vZGUuaXNYRkFPYmplY3QpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgY2hpbGRyZW4sIGNhY2hlZDsKICAgICAgaWYgKHVzZUNhY2hlKSB7CiAgICAgICAgY2FjaGVkID0gc29tQ2FjaGUuZ2V0KG5vZGUpOwogICAgICAgIGlmICghY2FjaGVkKSB7CiAgICAgICAgICBjYWNoZWQgPSBuZXcgTWFwKCk7CiAgICAgICAgICBzb21DYWNoZS5zZXQobm9kZSwgY2FjaGVkKTsKICAgICAgICB9CiAgICAgICAgY2hpbGRyZW4gPSBjYWNoZWQuZ2V0KGNhY2hlTmFtZSk7CiAgICAgIH0KICAgICAgaWYgKCFjaGlsZHJlbikgewogICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgZmFsc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdERvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBvcGVyYXRvcnMuZG90SGFzaDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5Q2xhc3NdKG5hbWUpOwogICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmlzWEZBT2JqZWN0QXJyYXkgPyBjaGlsZHJlbi5jaGlsZHJlbiA6IFtjaGlsZHJlbl07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh1c2VDYWNoZSkgewogICAgICAgICAgY2FjaGVkLnNldChjYWNoZU5hbWUsIGNoaWxkcmVuKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCAmJiAhaXNRdWFsaWZpZWQgJiYgaSA9PT0gMCkgewogICAgICBjb25zdCBwYXJlbnQgPSBjb250YWluZXJbJGdldFBhcmVudF0oKTsKICAgICAgY29udGFpbmVyID0gcGFyZW50OwogICAgICBpZiAoIWNvbnRhaW5lcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGkgPSAtMTsKICAgICAgcm9vdCA9IFtjb250YWluZXJdOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHJvb3QgPSBpc0Zpbml0ZShpbmRleCkgPyBub2Rlcy5maWx0ZXIobm9kZSA9PiBpbmRleCA8IG5vZGUubGVuZ3RoKS5tYXAobm9kZSA9PiBub2RlW2luZGV4XSkgOiBub2Rlcy5mbGF0KCk7CiAgfQogIGlmIChyb290Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiByb290Owp9CmZ1bmN0aW9uIGNyZWF0ZURhdGFOb2RlKHJvb3QsIGNvbnRhaW5lciwgZXhwcikgewogIGNvbnN0IHBhcnNlZCA9IHBhcnNlRXhwcmVzc2lvbihleHByKTsKICBpZiAoIXBhcnNlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChwYXJzZWQuc29tZSh4ID0+IHgub3BlcmF0b3IgPT09IG9wZXJhdG9ycy5kb3REb3QpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgZm4gPSBzaG9ydGN1dHMuZ2V0KHBhcnNlZFswXS5uYW1lKTsKICBsZXQgaSA9IDA7CiAgaWYgKGZuKSB7CiAgICByb290ID0gZm4ocm9vdCwgY29udGFpbmVyKTsKICAgIGkgPSAxOwogIH0gZWxzZSB7CiAgICByb290ID0gY29udGFpbmVyIHx8IHJvb3Q7CiAgfQogIGZvciAobGV0IGlpID0gcGFyc2VkLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHsKICAgICAgbmFtZSwKICAgICAgb3BlcmF0b3IsCiAgICAgIGluZGV4CiAgICB9ID0gcGFyc2VkW2ldOwogICAgaWYgKCFpc0Zpbml0ZShpbmRleCkpIHsKICAgICAgcGFyc2VkW2ldLmluZGV4ID0gMDsKICAgICAgcmV0dXJuIHJvb3QuY3JlYXRlTm9kZXMocGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICAgIGxldCBjaGlsZHJlbjsKICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgY2FzZSBvcGVyYXRvcnMuZG90OgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeU5hbWVdKG5hbWUsIGZhbHNlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBvcGVyYXRvcnMuZG90RG90OgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeU5hbWVdKG5hbWUsIHRydWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIG9wZXJhdG9ycy5kb3RIYXNoOgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeUNsYXNzXShuYW1lKTsKICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmlzWEZBT2JqZWN0QXJyYXkgPyBjaGlsZHJlbi5jaGlsZHJlbiA6IFtjaGlsZHJlbl07CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiByb290LmNyZWF0ZU5vZGVzKHBhcnNlZC5zbGljZShpKSk7CiAgICB9CiAgICBpZiAoaW5kZXggPCBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07CiAgICAgIGlmICghY2hpbGQuaXNYRkFPYmplY3QpIHsKICAgICAgICB3YXJuKGBYRkEgLSBDYW5ub3QgY3JlYXRlIGEgbm9kZS5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByb290ID0gY2hpbGQ7CiAgICB9IGVsc2UgewogICAgICBwYXJzZWRbaV0uaW5kZXggPSBpbmRleCAtIGNoaWxkcmVuLmxlbmd0aDsKICAgICAgcmV0dXJuIHJvb3QuY3JlYXRlTm9kZXMocGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS94ZmFfb2JqZWN0LmpzCgoKCgoKCmNvbnN0IF9hcHBseVByb3RvdHlwZSA9IFN5bWJvbCgpOwpjb25zdCBfYXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCBfYXR0cmlidXRlTmFtZXMgPSBTeW1ib2woKTsKY29uc3QgX2NoaWxkcmVuID0gU3ltYm9sKCJfY2hpbGRyZW4iKTsKY29uc3QgX2Nsb25lQXR0cmlidXRlID0gU3ltYm9sKCk7CmNvbnN0IF9kYXRhVmFsdWUgPSBTeW1ib2woKTsKY29uc3QgX2RlZmF1bHRWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCBfZmlsdGVyZWRDaGlsZHJlbkdlbmVyYXRvciA9IFN5bWJvbCgpOwpjb25zdCBfZ2V0UHJvdG90eXBlID0gU3ltYm9sKCk7CmNvbnN0IF9nZXRVbnNldEF0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgX2hhc0NoaWxkcmVuID0gU3ltYm9sKCk7CmNvbnN0IF9tYXggPSBTeW1ib2woKTsKY29uc3QgX29wdGlvbnMgPSBTeW1ib2woKTsKY29uc3QgX3BhcmVudCA9IFN5bWJvbCgicGFyZW50Iik7CmNvbnN0IF9yZXNvbHZlUHJvdG90eXBlc0hlbHBlciA9IFN5bWJvbCgpOwpjb25zdCBfc2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCBfdmFsaWRhdG9yID0gU3ltYm9sKCk7CmxldCB1aWQgPSAwOwpjb25zdCBOU19EQVRBU0VUUyA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKY2xhc3MgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBoYXNDaGlsZHJlbiA9IGZhbHNlKSB7CiAgICB0aGlzWyRuYW1lc3BhY2VJZF0gPSBuc0lkOwogICAgdGhpc1skbm9kZU5hbWVdID0gbmFtZTsKICAgIHRoaXNbX2hhc0NoaWxkcmVuXSA9IGhhc0NoaWxkcmVuOwogICAgdGhpc1tfcGFyZW50XSA9IG51bGw7CiAgICB0aGlzW19jaGlsZHJlbl0gPSBbXTsKICAgIHRoaXNbJHVpZF0gPSBgJHtuYW1lfSR7dWlkKyt9YDsKICAgIHRoaXNbJGdsb2JhbERhdGFdID0gbnVsbDsKICB9CiAgZ2V0IGlzWEZBT2JqZWN0KCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGdldCBpc1hGQU9iamVjdEFycmF5KCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjcmVhdGVOb2RlcyhwYXRoKSB7CiAgICBsZXQgcm9vdCA9IHRoaXMsCiAgICAgIG5vZGUgPSBudWxsOwogICAgZm9yIChjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIGluZGV4CiAgICB9IG9mIHBhdGgpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaXNGaW5pdGUoaW5kZXgpID8gaW5kZXggOiAwOyBpIDw9IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBuc0lkID0gcm9vdFskbmFtZXNwYWNlSWRdID09PSBOU19EQVRBU0VUUyA/IC0xIDogcm9vdFskbmFtZXNwYWNlSWRdOwogICAgICAgIG5vZGUgPSBuZXcgWG1sT2JqZWN0KG5zSWQsIG5hbWUpOwogICAgICAgIHJvb3RbJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgfQogICAgICByb290ID0gbm9kZTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KICBbJG9uQ2hpbGRdKGNoaWxkKSB7CiAgICBpZiAoIXRoaXNbX2hhc0NoaWxkcmVuXSB8fCAhdGhpc1skb25DaGlsZENoZWNrXShjaGlsZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICBjb25zdCBub2RlID0gdGhpc1tuYW1lXTsKICAgIGlmIChub2RlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgaWYgKG5vZGUucHVzaChjaGlsZCkpIHsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobm9kZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXNbJHJlbW92ZUNoaWxkXShub2RlKTsKICAgICAgfQogICAgICB0aGlzW25hbWVdID0gY2hpbGQ7CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXShjaGlsZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgbGV0IGlkID0gIiI7CiAgICBpZiAodGhpcy5pZCkgewogICAgICBpZCA9IGAgKGlkOiAke3RoaXMuaWR9KWA7CiAgICB9IGVsc2UgaWYgKHRoaXMubmFtZSkgewogICAgICBpZCA9IGAgKG5hbWU6ICR7dGhpcy5uYW1lfSAke3RoaXMuaC52YWx1ZX0pYDsKICAgIH0KICAgIHdhcm4oYFhGQSAtIG5vZGUgIiR7dGhpc1skbm9kZU5hbWVdfSIke2lkfSBoYXMgYWxyZWFkeSBlbm91Z2ggIiR7bmFtZX0iIWApOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJG9uQ2hpbGRDaGVja10oY2hpbGQpIHsKICAgIHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KGNoaWxkWyRub2RlTmFtZV0pICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IHRoaXNbJG5hbWVzcGFjZUlkXTsKICB9CiAgWyRpc05zQWdub3N0aWNdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGlzQ0RBVEFYbWxdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJHBvcFBhcmFdKCkgewogICAgaWYgKHRoaXMucGFyYSkgewogICAgICB0aGlzWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5wYXJhU3RhY2sucG9wKCk7CiAgICB9CiAgfQogIFskcHVzaFBhcmFdKCkgewogICAgdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFyYVN0YWNrLnB1c2godGhpcy5wYXJhKTsKICB9CiAgWyRzZXRJZF0oaWRzKSB7CiAgICBpZiAodGhpcy5pZCAmJiB0aGlzWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy50ZW1wbGF0ZS5pZCkgewogICAgICBpZHMuc2V0KHRoaXMuaWQsIHRoaXMpOwogICAgfQogIH0KICBbJGdldFRlbXBsYXRlUm9vdF0oKSB7CiAgICByZXR1cm4gdGhpc1skZ2xvYmFsRGF0YV0udGVtcGxhdGU7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRpc1RoZXJlTW9yZVdpZHRoXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRhcHBlbmRDaGlsZF0oY2hpbGQpIHsKICAgIGNoaWxkW19wYXJlbnRdID0gdGhpczsKICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgIGlmICghY2hpbGRbJGdsb2JhbERhdGFdICYmIHRoaXNbJGdsb2JhbERhdGFdKSB7CiAgICAgIGNoaWxkWyRnbG9iYWxEYXRhXSA9IHRoaXNbJGdsb2JhbERhdGFdOwogICAgfQogIH0KICBbJHJlbW92ZUNoaWxkXShjaGlsZCkgewogICAgY29uc3QgaSA9IHRoaXNbX2NoaWxkcmVuXS5pbmRleE9mKGNoaWxkKTsKICAgIHRoaXNbX2NoaWxkcmVuXS5zcGxpY2UoaSwgMSk7CiAgfQogIFskaGFzU2V0dGFibGVWYWx1ZV0oKSB7CiAgICByZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKTsKICB9CiAgWyRzZXRWYWx1ZV0oXykge30KICBbJG9uVGV4dF0oXykge30KICBbJGZpbmFsaXplXSgpIHt9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgZGVsZXRlIHRoaXNbX2hhc0NoaWxkcmVuXTsKICAgIGlmICh0aGlzWyRjbGVhbnVwXSkgewogICAgICBidWlsZGVyLmNsZWFuKHRoaXNbJGNsZWFudXBdKTsKICAgICAgZGVsZXRlIHRoaXNbJGNsZWFudXBdOwogICAgfQogIH0KICBbJGluZGV4T2ZdKGNoaWxkKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmluZGV4T2YoY2hpbGQpOwogIH0KICBbJGluc2VydEF0XShpLCBjaGlsZCkgewogICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgdGhpc1tfY2hpbGRyZW5dLnNwbGljZShpLCAwLCBjaGlsZCk7CiAgICBpZiAoIWNoaWxkWyRnbG9iYWxEYXRhXSAmJiB0aGlzWyRnbG9iYWxEYXRhXSkgewogICAgICBjaGlsZFskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgIH0KICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiAhdGhpcy5uYW1lOwogIH0KICBbJGxhc3RBdHRyaWJ1dGVdKCkgewogICAgcmV0dXJuICIiOwogIH0KICBbJHRleHRdKCkgewogICAgaWYgKHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5tYXAoYyA9PiBjWyR0ZXh0XSgpKS5qb2luKCIiKTsKICB9CiAgZ2V0IFtfYXR0cmlidXRlTmFtZXNdKCkgewogICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICBpZiAoIXByb3RvLl9hdHRyaWJ1dGVzKSB7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwcm90by5fYXR0cmlidXRlcyA9IG5ldyBTZXQoKTsKICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgICAgaWYgKHRoaXNbbmFtZV0gPT09IG51bGwgfHwgdGhpc1tuYW1lXSBpbnN0YW5jZW9mIFhGQU9iamVjdCB8fCB0aGlzW25hbWVdIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBfYXR0cmlidXRlTmFtZXMsIHByb3RvLl9hdHRyaWJ1dGVzKTsKICB9CiAgWyRpc0Rlc2NlbmRlbnRdKHBhcmVudCkgewogICAgbGV0IG5vZGUgPSB0aGlzOwogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgaWYgKG5vZGUgPT09IHBhcmVudCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIG5vZGUgPSBub2RlWyRnZXRQYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskZ2V0UGFyZW50XSgpIHsKICAgIHJldHVybiB0aGlzW19wYXJlbnRdOwogIH0KICBbJGdldFN1YmZvcm1QYXJlbnRdKCkgewogICAgcmV0dXJuIHRoaXNbJGdldFBhcmVudF0oKTsKICB9CiAgWyRnZXRDaGlsZHJlbl0obmFtZSA9IG51bGwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogICAgfQogICAgcmV0dXJuIHRoaXNbbmFtZV07CiAgfQogIFskZHVtcF0oKSB7CiAgICBjb25zdCBkdW1wZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIGR1bXBlZC4kY29udGVudCA9IHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgZHVtcGVkW25hbWVdID0gdmFsdWVbJGR1bXBdKCk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICBkdW1wZWRbbmFtZV0gPSB2YWx1ZS5kdW1wKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGR1bXBlZFtuYW1lXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZHVtcGVkOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KICAqWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpc1skZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgeWllbGQgbm9kZTsKICAgIH0KICB9CiAgKltfZmlsdGVyZWRDaGlsZHJlbkdlbmVyYXRvcl0oZmlsdGVyLCBpbmNsdWRlKSB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpc1skZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkpIHsKICAgICAgaWYgKCFmaWx0ZXIgfHwgaW5jbHVkZSA9PT0gZmlsdGVyLmhhcyhub2RlWyRub2RlTmFtZV0pKSB7CiAgICAgICAgY29uc3QgYXZhaWxhYmxlU3BhY2UgPSB0aGlzWyRnZXRBdmFpbGFibGVTcGFjZV0oKTsKICAgICAgICBjb25zdCByZXMgPSBub2RlWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgICB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGUgPSBub2RlOwogICAgICAgIH0KICAgICAgICB5aWVsZCByZXM7CiAgICAgIH0KICAgIH0KICB9CiAgWyRmbHVzaEhUTUxdKCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgdGhpc1skZXh0cmFdLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkge30KICBbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICBmaWx0ZXIgPSBudWxsLAogICAgaW5jbHVkZSA9IHRydWUKICB9KSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXS5nZW5lcmF0b3IpIHsKICAgICAgdGhpc1skZXh0cmFdLmdlbmVyYXRvciA9IHRoaXNbX2ZpbHRlcmVkQ2hpbGRyZW5HZW5lcmF0b3JdKGZpbHRlciwgaW5jbHVkZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBhdmFpbGFibGVTcGFjZSA9IHRoaXNbJGdldEF2YWlsYWJsZVNwYWNlXSgpOwogICAgICBjb25zdCByZXMgPSB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfQogICAgICBpZiAocmVzLmh0bWwpIHsKICAgICAgICB0aGlzWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGU7CiAgICB9CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBjb25zdCBnZW4gPSB0aGlzWyRleHRyYV0uZ2VuZXJhdG9yLm5leHQoKTsKICAgICAgaWYgKGdlbi5kb25lKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29uc3QgcmVzID0gZ2VuLnZhbHVlOwogICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfQogICAgICBpZiAocmVzLmh0bWwpIHsKICAgICAgICB0aGlzWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRleHRyYV0uZ2VuZXJhdG9yID0gbnVsbDsKICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KICBbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpIHsKICAgIHRoaXNbX3NldEF0dHJpYnV0ZXNdID0gbmV3IFNldChPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSk7CiAgfQogIFtfZ2V0VW5zZXRBdHRyaWJ1dGVzXShwcm90b0F0dHJpYnV0ZXMpIHsKICAgIGNvbnN0IGFsbEF0dHIgPSB0aGlzW19hdHRyaWJ1dGVOYW1lc107CiAgICBjb25zdCBzZXRBdHRyID0gdGhpc1tfc2V0QXR0cmlidXRlc107CiAgICByZXR1cm4gWy4uLnByb3RvQXR0cmlidXRlc10uZmlsdGVyKHggPT4gYWxsQXR0ci5oYXMoeCkgJiYgIXNldEF0dHIuaGFzKHgpKTsKICB9CiAgWyRyZXNvbHZlUHJvdG90eXBlc10oaWRzLCBhbmNlc3RvcnMgPSBuZXcgU2V0KCkpIHsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIGNoaWxkW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpOwogICAgfQogIH0KICBbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgcHJvdG8gPSB0aGlzW19nZXRQcm90b3R5cGVdKGlkcywgYW5jZXN0b3JzKTsKICAgIGlmIChwcm90bykgewogICAgICB0aGlzW19hcHBseVByb3RvdHlwZV0ocHJvdG8sIGlkcywgYW5jZXN0b3JzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICB9CiAgfQogIFtfZ2V0UHJvdG90eXBlXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgewogICAgICB1c2UsCiAgICAgIHVzZWhyZWYKICAgIH0gPSB0aGlzOwogICAgaWYgKCF1c2UgJiYgIXVzZWhyZWYpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgcHJvdG8gPSBudWxsOwogICAgbGV0IHNvbUV4cHJlc3Npb24gPSBudWxsOwogICAgbGV0IGlkID0gbnVsbDsKICAgIGxldCByZWYgPSB1c2U7CiAgICBpZiAodXNlaHJlZikgewogICAgICByZWYgPSB1c2VocmVmOwogICAgICBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIjc29tKCIpICYmIHVzZWhyZWYuZW5kc1dpdGgoIikiKSkgewogICAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2VocmVmLnNsaWNlKCIjc29tKCIubGVuZ3RoLCAtMSk7CiAgICAgIH0gZWxzZSBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIuI3NvbSgiKSAmJiB1c2VocmVmLmVuZHNXaXRoKCIpIikpIHsKICAgICAgICBzb21FeHByZXNzaW9uID0gdXNlaHJlZi5zbGljZSgiLiNzb20oIi5sZW5ndGgsIC0xKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICAgIGlkID0gdXNlaHJlZi5zbGljZSgxKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIi4jIikpIHsKICAgICAgICBpZCA9IHVzZWhyZWYuc2xpY2UoMik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodXNlLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICBpZCA9IHVzZS5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2U7CiAgICB9CiAgICB0aGlzLnVzZSA9IHRoaXMudXNlaHJlZiA9ICIiOwogICAgaWYgKGlkKSB7CiAgICAgIHByb3RvID0gaWRzLmdldChpZCk7CiAgICB9IGVsc2UgewogICAgICBwcm90byA9IHNlYXJjaE5vZGUoaWRzLmdldCgkcm9vdCksIHRoaXMsIHNvbUV4cHJlc3Npb24sIHRydWUsIGZhbHNlKTsKICAgICAgaWYgKHByb3RvKSB7CiAgICAgICAgcHJvdG8gPSBwcm90b1swXTsKICAgICAgfQogICAgfQogICAgaWYgKCFwcm90bykgewogICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHByb3RvdHlwZSByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocHJvdG9bJG5vZGVOYW1lXSAhPT0gdGhpc1skbm9kZU5hbWVdKSB7CiAgICAgIHdhcm4oYFhGQSAtIEluY29tcGF0aWJsZSBwcm90b3R5cGU6ICR7cHJvdG9bJG5vZGVOYW1lXX0gIT09ICR7dGhpc1skbm9kZU5hbWVdfS5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoYW5jZXN0b3JzLmhhcyhwcm90bykpIHsKICAgICAgd2FybihgWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYW5jZXN0b3JzLmFkZChwcm90byk7CiAgICBjb25zdCBwcm90b1Byb3RvID0gcHJvdG9bX2dldFByb3RvdHlwZV0oaWRzLCBhbmNlc3RvcnMpOwogICAgaWYgKHByb3RvUHJvdG8pIHsKICAgICAgcHJvdG9bX2FwcGx5UHJvdG90eXBlXShwcm90b1Byb3RvLCBpZHMsIGFuY2VzdG9ycyk7CiAgICB9CiAgICBwcm90b1skcmVzb2x2ZVByb3RvdHlwZXNdKGlkcywgYW5jZXN0b3JzKTsKICAgIGFuY2VzdG9ycy5kZWxldGUocHJvdG8pOwogICAgcmV0dXJuIHByb3RvOwogIH0KICBbX2FwcGx5UHJvdG90eXBlXShwcm90bywgaWRzLCBhbmNlc3RvcnMpIHsKICAgIGlmIChhbmNlc3RvcnMuaGFzKHByb3RvKSkgewogICAgICB3YXJuKGBYRkEgLSBDeWNsZSBkZXRlY3RlZCBpbiBwcm90b3R5cGVzIHVzZS5gKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCF0aGlzWyRjb250ZW50XSAmJiBwcm90b1skY29udGVudF0pIHsKICAgICAgdGhpc1skY29udGVudF0gPSBwcm90b1skY29udGVudF07CiAgICB9CiAgICBjb25zdCBuZXdBbmNlc3RvcnMgPSBuZXcgU2V0KGFuY2VzdG9ycyk7CiAgICBuZXdBbmNlc3RvcnMuYWRkKHByb3RvKTsKICAgIGZvciAoY29uc3QgdW5zZXRBdHRyTmFtZSBvZiB0aGlzW19nZXRVbnNldEF0dHJpYnV0ZXNdKHByb3RvW19zZXRBdHRyaWJ1dGVzXSkpIHsKICAgICAgdGhpc1t1bnNldEF0dHJOYW1lXSA9IHByb3RvW3Vuc2V0QXR0ck5hbWVdOwogICAgICBpZiAodGhpc1tfc2V0QXR0cmlidXRlc10pIHsKICAgICAgICB0aGlzW19zZXRBdHRyaWJ1dGVzXS5hZGQodW5zZXRBdHRyTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBpZiAodGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgY29uc3QgcHJvdG9WYWx1ZSA9IHByb3RvW25hbWVdOwogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWVbX2NoaWxkcmVuXSkgewogICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSB2YWx1ZVtfY2hpbGRyZW5dLmxlbmd0aCwgaWkgPSBwcm90b1ZhbHVlW19jaGlsZHJlbl0ubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgY29uc3QgY2hpbGQgPSBwcm90b1tfY2hpbGRyZW5dW2ldWyRjbG9uZV0oKTsKICAgICAgICAgIGlmICh2YWx1ZS5wdXNoKGNoaWxkKSkgewogICAgICAgICAgICBjaGlsZFtfcGFyZW50XSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgdmFsdWVbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgaWYgKHByb3RvVmFsdWUpIHsKICAgICAgICAgIHZhbHVlW19hcHBseVByb3RvdHlwZV0ocHJvdG9WYWx1ZSwgaWRzLCBhbmNlc3RvcnMpOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAocHJvdG9WYWx1ZSAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGNoaWxkID0gcHJvdG9WYWx1ZVskY2xvbmVdKCk7CiAgICAgICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgICAgIHRoaXNbbmFtZV0gPSBjaGlsZDsKICAgICAgICB0aGlzW19jaGlsZHJlbl0ucHVzaChjaGlsZCk7CiAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIFtfY2xvbmVBdHRyaWJ1dGVdKG9iaikgewogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICByZXR1cm4gb2JqLm1hcCh4ID0+IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHgpKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygb2JqID09PSAib2JqZWN0IiAmJiBvYmogIT09IG51bGwpIHsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBbJGNsb25lXSgpIHsKICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpOwogICAgZm9yIChjb25zdCAkc3ltYm9sIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpIHsKICAgICAgdHJ5IHsKICAgICAgICBjbG9uZVskc3ltYm9sXSA9IHRoaXNbJHN5bWJvbF07CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHNoYWRvdyhjbG9uZSwgJHN5bWJvbCwgdGhpc1skc3ltYm9sXSk7CiAgICAgIH0KICAgIH0KICAgIGNsb25lWyR1aWRdID0gYCR7Y2xvbmVbJG5vZGVOYW1lXX0ke3VpZCsrfWA7CiAgICBjbG9uZVtfY2hpbGRyZW5dID0gW107CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKHRoaXNbX2F0dHJpYnV0ZU5hbWVzXS5oYXMobmFtZSkpIHsKICAgICAgICBjbG9uZVtuYW1lXSA9IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHRoaXNbbmFtZV0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgY2xvbmVbbmFtZV0gPSB2YWx1ZSBpbnN0YW5jZW9mIFhGQU9iamVjdEFycmF5ID8gbmV3IFhGQU9iamVjdEFycmF5KHZhbHVlW19tYXhdKSA6IG51bGw7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBjb25zdCBuYW1lID0gY2hpbGRbJG5vZGVOYW1lXTsKICAgICAgY29uc3QgY2xvbmVkQ2hpbGQgPSBjaGlsZFskY2xvbmVdKCk7CiAgICAgIGNsb25lW19jaGlsZHJlbl0ucHVzaChjbG9uZWRDaGlsZCk7CiAgICAgIGNsb25lZENoaWxkW19wYXJlbnRdID0gY2xvbmU7CiAgICAgIGlmIChjbG9uZVtuYW1lXSA9PT0gbnVsbCkgewogICAgICAgIGNsb25lW25hbWVdID0gY2xvbmVkQ2hpbGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xvbmVbbmFtZV1bX2NoaWxkcmVuXS5wdXNoKGNsb25lZENoaWxkKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KICBbJGdldENoaWxkcmVuXShuYW1lID0gbnVsbCkgewogICAgaWYgKCFuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl07CiAgICB9CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmZpbHRlcihjID0+IGNbJG5vZGVOYW1lXSA9PT0gbmFtZSk7CiAgfQogIFskZ2V0Q2hpbGRyZW5CeUNsYXNzXShuYW1lKSB7CiAgICByZXR1cm4gdGhpc1tuYW1lXTsKICB9CiAgWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0ID0gdHJ1ZSkgewogICAgcmV0dXJuIEFycmF5LmZyb20odGhpc1skZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0KSk7CiAgfQogICpbJGdldENoaWxkcmVuQnlOYW1lSXRdKG5hbWUsIGFsbFRyYW5zcGFyZW50LCBmaXJzdCA9IHRydWUpIHsKICAgIGlmIChuYW1lID09PSAicGFyZW50IikgewogICAgICB5aWVsZCB0aGlzW19wYXJlbnRdOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgeWllbGQgY2hpbGQ7CiAgICAgIH0KICAgICAgaWYgKGFsbFRyYW5zcGFyZW50IHx8IGNoaWxkWyRpc1RyYW5zcGFyZW50XSgpKSB7CiAgICAgICAgeWllbGQqIGNoaWxkWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3QgJiYgdGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICB5aWVsZCBuZXcgWEZBQXR0cmlidXRlKHRoaXMsIG5hbWUsIHRoaXNbbmFtZV0pOwogICAgfQogIH0KfQpjbGFzcyBYRkFPYmplY3RBcnJheSB7CiAgY29uc3RydWN0b3IobWF4ID0gSW5maW5pdHkpIHsKICAgIHRoaXNbX21heF0gPSBtYXg7CiAgICB0aGlzW19jaGlsZHJlbl0gPSBbXTsKICB9CiAgZ2V0IGlzWEZBT2JqZWN0KCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBnZXQgaXNYRkFPYmplY3RBcnJheSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBwdXNoKGNoaWxkKSB7CiAgICBjb25zdCBsZW4gPSB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoOwogICAgaWYgKGxlbiA8PSB0aGlzW19tYXhdKSB7CiAgICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB3YXJuKGBYRkEgLSBub2RlICIke2NoaWxkWyRub2RlTmFtZV19IiBhY2NlcHRzIG5vIG1vcmUgdGhhbiAke3RoaXNbX21heF19IGNoaWxkcmVuYCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMDsKICB9CiAgZHVtcCgpIHsKICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAxID8gdGhpc1tfY2hpbGRyZW5dWzBdWyRkdW1wXSgpIDogdGhpc1tfY2hpbGRyZW5dLm1hcCh4ID0+IHhbJGR1bXBdKCkpOwogIH0KICBbJGNsb25lXSgpIHsKICAgIGNvbnN0IGNsb25lID0gbmV3IFhGQU9iamVjdEFycmF5KHRoaXNbX21heF0pOwogICAgY2xvbmVbX2NoaWxkcmVuXSA9IHRoaXNbX2NoaWxkcmVuXS5tYXAoYyA9PiBjWyRjbG9uZV0oKSk7CiAgICByZXR1cm4gY2xvbmU7CiAgfQogIGdldCBjaGlsZHJlbigpIHsKICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl07CiAgfQogIGNsZWFyKCkgewogICAgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9IDA7CiAgfQp9CmNsYXNzIFhGQUF0dHJpYnV0ZSB7CiAgY29uc3RydWN0b3Iobm9kZSwgbmFtZSwgdmFsdWUpIHsKICAgIHRoaXNbX3BhcmVudF0gPSBub2RlOwogICAgdGhpc1skbm9kZU5hbWVdID0gbmFtZTsKICAgIHRoaXNbJGNvbnRlbnRdID0gdmFsdWU7CiAgICB0aGlzWyRjb25zdW1lZF0gPSBmYWxzZTsKICAgIHRoaXNbJHVpZF0gPSBgYXR0cmlidXRlJHt1aWQrK31gOwogIH0KICBbJGdldFBhcmVudF0oKSB7CiAgICByZXR1cm4gdGhpc1tfcGFyZW50XTsKICB9CiAgWyRpc0RhdGFWYWx1ZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRnZXREYXRhVmFsdWVdKCkgewogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIHZhbHVlID0gdmFsdWUudmFsdWUgfHwgIiI7CiAgICB0aGlzWyRjb250ZW50XSA9IHZhbHVlLnRvU3RyaW5nKCk7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gdGhpc1skY29udGVudF07CiAgfQogIFskaXNEZXNjZW5kZW50XShwYXJlbnQpIHsKICAgIHJldHVybiB0aGlzW19wYXJlbnRdID09PSBwYXJlbnQgfHwgdGhpc1tfcGFyZW50XVskaXNEZXNjZW5kZW50XShwYXJlbnQpOwogIH0KfQpjbGFzcyBYbWxPYmplY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzWyRjb250ZW50XSA9ICIiOwogICAgdGhpc1tfZGF0YVZhbHVlXSA9IG51bGw7CiAgICBpZiAobmFtZSAhPT0gIiN0ZXh0IikgewogICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICAgIHRoaXNbX2F0dHJpYnV0ZXNdID0gbWFwOwogICAgICBmb3IgKGNvbnN0IFthdHRyTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7CiAgICAgICAgbWFwLnNldChhdHRyTmFtZSwgbmV3IFhGQUF0dHJpYnV0ZSh0aGlzLCBhdHRyTmFtZSwgdmFsdWUpKTsKICAgICAgfQogICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eSgkbnNBdHRyaWJ1dGVzKSkgewogICAgICAgIGNvbnN0IGRhdGFOb2RlID0gYXR0cmlidXRlc1skbnNBdHRyaWJ1dGVzXS54ZmEuZGF0YU5vZGU7CiAgICAgICAgaWYgKGRhdGFOb2RlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmIChkYXRhTm9kZSA9PT0gImRhdGFHcm91cCIpIHsKICAgICAgICAgICAgdGhpc1tfZGF0YVZhbHVlXSA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIGlmIChkYXRhTm9kZSA9PT0gImRhdGFWYWx1ZSIpIHsKICAgICAgICAgICAgdGhpc1tfZGF0YVZhbHVlXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzWyRjb25zdW1lZF0gPSBmYWxzZTsKICB9CiAgWyR0b1N0cmluZ10oYnVmKSB7CiAgICBjb25zdCB0YWdOYW1lID0gdGhpc1skbm9kZU5hbWVdOwogICAgaWYgKHRhZ05hbWUgPT09ICIjdGV4dCIpIHsKICAgICAgYnVmLnB1c2goZW5jb2RlVG9YbWxTdHJpbmcodGhpc1skY29udGVudF0pKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdXRmOFRhZ05hbWUgPSB1dGY4U3RyaW5nVG9TdHJpbmcodGFnTmFtZSk7CiAgICBjb25zdCBwcmVmaXggPSB0aGlzWyRuYW1lc3BhY2VJZF0gPT09IE5TX0RBVEFTRVRTID8gInhmYToiIDogIiI7CiAgICBidWYucHVzaChgPCR7cHJlZml4fSR7dXRmOFRhZ05hbWV9YCk7CiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdGhpc1tfYXR0cmlidXRlc10uZW50cmllcygpKSB7CiAgICAgIGNvbnN0IHV0ZjhOYW1lID0gdXRmOFN0cmluZ1RvU3RyaW5nKG5hbWUpOwogICAgICBidWYucHVzaChgICR7dXRmOE5hbWV9PSIke2VuY29kZVRvWG1sU3RyaW5nKHZhbHVlWyRjb250ZW50XSl9ImApOwogICAgfQogICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0gIT09IG51bGwpIHsKICAgICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0pIHsKICAgICAgICBidWYucHVzaChgIHhmYTpkYXRhTm9kZT0iZGF0YVZhbHVlImApOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1Zi5wdXNoKGAgeGZhOmRhdGFOb2RlPSJkYXRhR3JvdXAiYCk7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpc1skY29udGVudF0gJiYgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMCkgewogICAgICBidWYucHVzaCgiLz4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYnVmLnB1c2goIj4iKTsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBpZiAodHlwZW9mIHRoaXNbJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICAgIGJ1Zi5wdXNoKGVuY29kZVRvWG1sU3RyaW5nKHRoaXNbJGNvbnRlbnRdKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpc1skY29udGVudF1bJHRvU3RyaW5nXShidWYpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICAgIGNoaWxkWyR0b1N0cmluZ10oYnVmKTsKICAgICAgfQogICAgfQogICAgYnVmLnB1c2goYDwvJHtwcmVmaXh9JHt1dGY4VGFnTmFtZX0+YCk7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBjb25zdCBub2RlID0gbmV3IFhtbE9iamVjdCh0aGlzWyRuYW1lc3BhY2VJZF0sICIjdGV4dCIpOwogICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF07CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gIiI7CiAgICB9CiAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskb25UZXh0XShzdHIpIHsKICAgIHRoaXNbJGNvbnRlbnRdICs9IHN0cjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodGhpc1skY29udGVudF0gJiYgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3Qgbm9kZSA9IG5ldyBYbWxPYmplY3QodGhpc1skbmFtZXNwYWNlSWRdLCAiI3RleHQiKTsKICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICBub2RlWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdOwogICAgICBkZWxldGUgdGhpc1skY29udGVudF07CiAgICB9CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIGlmICh0aGlzWyRub2RlTmFtZV0gPT09ICIjdGV4dCIpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogIiN0ZXh0IiwKICAgICAgICB2YWx1ZTogdGhpc1skY29udGVudF0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9CiAgWyRnZXRDaGlsZHJlbl0obmFtZSA9IG51bGwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5maWx0ZXIoYyA9PiBjWyRub2RlTmFtZV0gPT09IG5hbWUpOwogIH0KICBbJGdldEF0dHJpYnV0ZXNdKCkgewogICAgcmV0dXJuIHRoaXNbX2F0dHJpYnV0ZXNdOwogIH0KICBbJGdldENoaWxkcmVuQnlDbGFzc10obmFtZSkgewogICAgY29uc3QgdmFsdWUgPSB0aGlzW19hdHRyaWJ1dGVzXS5nZXQobmFtZSk7CiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gdGhpc1skZ2V0Q2hpbGRyZW5dKG5hbWUpOwogIH0KICAqWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCkgewogICAgY29uc3QgdmFsdWUgPSB0aGlzW19hdHRyaWJ1dGVzXS5nZXQobmFtZSk7CiAgICBpZiAodmFsdWUpIHsKICAgICAgeWllbGQgdmFsdWU7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChhbGxUcmFuc3BhcmVudCkgewogICAgICAgIHlpZWxkKiBjaGlsZFskZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQpOwogICAgICB9CiAgICB9CiAgfQogICpbJGdldEF0dHJpYnV0ZUl0XShuYW1lLCBza2lwQ29uc3VtZWQpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpc1tfYXR0cmlidXRlc10uZ2V0KG5hbWUpOwogICAgaWYgKHZhbHVlICYmICghc2tpcENvbnN1bWVkIHx8ICF2YWx1ZVskY29uc3VtZWRdKSkgewogICAgICB5aWVsZCB2YWx1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIHlpZWxkKiBjaGlsZFskZ2V0QXR0cmlidXRlSXRdKG5hbWUsIHNraXBDb25zdW1lZCk7CiAgICB9CiAgfQogICpbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgc2tpcENvbnN1bWVkKSB7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSAmJiAoIXNraXBDb25zdW1lZCB8fCAhY2hpbGRbJGNvbnN1bWVkXSkpIHsKICAgICAgICB5aWVsZCBjaGlsZDsKICAgICAgfQogICAgICBpZiAoYWxsVHJhbnNwYXJlbnQpIHsKICAgICAgICB5aWVsZCogY2hpbGRbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgc2tpcENvbnN1bWVkKTsKICAgICAgfQogICAgfQogIH0KICBbJGlzRGF0YVZhbHVlXSgpIHsKICAgIGlmICh0aGlzW19kYXRhVmFsdWVdID09PSBudWxsKSB7CiAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAwIHx8IHRoaXNbX2NoaWxkcmVuXVswXVskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQ7CiAgICB9CiAgICByZXR1cm4gdGhpc1tfZGF0YVZhbHVlXTsKICB9CiAgWyRnZXREYXRhVmFsdWVdKCkgewogICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0gPT09IG51bGwpIHsKICAgICAgaWYgKHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgICB9CiAgICAgIGlmICh0aGlzW19jaGlsZHJlbl1bMF1bJG5hbWVzcGFjZUlkXSA9PT0gTmFtZXNwYWNlSWRzLnhodG1sLmlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXVswXVskdGV4dF0oKS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdGhpc1skY29udGVudF0udHJpbSgpOwogIH0KICBbJHNldFZhbHVlXSh2YWx1ZSkgewogICAgdmFsdWUgPSB2YWx1ZS52YWx1ZSB8fCAiIjsKICAgIHRoaXNbJGNvbnRlbnRdID0gdmFsdWUudG9TdHJpbmcoKTsKICB9CiAgWyRkdW1wXShoYXNOUyA9IGZhbHNlKSB7CiAgICBjb25zdCBkdW1wZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKGhhc05TKSB7CiAgICAgIGR1bXBlZC4kbnMgPSB0aGlzWyRuYW1lc3BhY2VJZF07CiAgICB9CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgZHVtcGVkLiRjb250ZW50ID0gdGhpc1skY29udGVudF07CiAgICB9CiAgICBkdW1wZWQuJG5hbWUgPSB0aGlzWyRub2RlTmFtZV07CiAgICBkdW1wZWQuY2hpbGRyZW4gPSBbXTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIGR1bXBlZC5jaGlsZHJlbi5wdXNoKGNoaWxkWyRkdW1wXShoYXNOUykpOwogICAgfQogICAgZHVtcGVkLmF0dHJpYnV0ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHRoaXNbX2F0dHJpYnV0ZXNdKSB7CiAgICAgIGR1bXBlZC5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWVbJGNvbnRlbnRdOwogICAgfQogICAgcmV0dXJuIGR1bXBlZDsKICB9Cn0KY2xhc3MgQ29udGVudE9iamVjdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSkgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzWyRjb250ZW50XSA9ICIiOwogIH0KICBbJG9uVGV4dF0odGV4dCkgewogICAgdGhpc1skY29udGVudF0gKz0gdGV4dDsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7fQp9CmNsYXNzIE9wdGlvbk9iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUsIG9wdGlvbnMpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1tfb3B0aW9uc10gPSBvcHRpb25zOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gZ2V0S2V5d29yZCh7CiAgICAgIGRhdGE6IHRoaXNbJGNvbnRlbnRdLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXNbX29wdGlvbnNdWzBdLAogICAgICB2YWxpZGF0ZTogayA9PiB0aGlzW19vcHRpb25zXS5pbmNsdWRlcyhrKQogICAgfSk7CiAgfQogIFskY2xlYW5dKGJ1aWxkZXIpIHsKICAgIHN1cGVyWyRjbGVhbl0oYnVpbGRlcik7CiAgICBkZWxldGUgdGhpc1tfb3B0aW9uc107CiAgfQp9CmNsYXNzIFN0cmluZ09iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgfQp9CmNsYXNzIEludGVnZXJPYmplY3QgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcikgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzW19kZWZhdWx0VmFsdWVdID0gZGVmYXVsdFZhbHVlOwogICAgdGhpc1tfdmFsaWRhdG9yXSA9IHZhbGlkYXRvcjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiB0aGlzWyRjb250ZW50XSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzW19kZWZhdWx0VmFsdWVdLAogICAgICB2YWxpZGF0ZTogdGhpc1tfdmFsaWRhdG9yXQogICAgfSk7CiAgfQogIFskY2xlYW5dKGJ1aWxkZXIpIHsKICAgIHN1cGVyWyRjbGVhbl0oYnVpbGRlcik7CiAgICBkZWxldGUgdGhpc1tfZGVmYXVsdFZhbHVlXTsKICAgIGRlbGV0ZSB0aGlzW192YWxpZGF0b3JdOwogIH0KfQpjbGFzcyBPcHRpb24wMSBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUsIDAsIG4gPT4gbiA9PT0gMSk7CiAgfQp9CmNsYXNzIE9wdGlvbjEwIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSkgewogICAgc3VwZXIobnNJZCwgbmFtZSwgMSwgbiA9PiBuID09PSAwKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9odG1sX3V0aWxzLmpzCgoKCgoKCmZ1bmN0aW9uIG1lYXN1cmVUb1N0cmluZyhtKSB7CiAgaWYgKHR5cGVvZiBtID09PSAic3RyaW5nIikgewogICAgcmV0dXJuICIwcHgiOwogIH0KICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtKSA/IGAke219cHhgIDogYCR7bS50b0ZpeGVkKDIpfXB4YDsKfQpjb25zdCBjb252ZXJ0ZXJzID0gewogIGFuY2hvclR5cGUobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEoInRyYW5zZm9ybSIgaW4gc3R5bGUpKSB7CiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9ICIiOwogICAgfQogICAgc3dpdGNoIChub2RlLmFuY2hvclR5cGUpIHsKICAgICAgY2FzZSAiYm90dG9tQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLCAtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJib3R0b21MZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC0xMDAlKSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbVJpZ2h0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtMTAwJSwtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVDZW50ZXIiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC01MCUsLTUwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVMZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibWlkZGxlUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLDApIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLDApIjsKICAgICAgICBicmVhazsKICAgIH0KICB9LAogIGRpbWVuc2lvbnMobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBsZXQgd2lkdGggPSBub2RlLnc7CiAgICBjb25zdCBoZWlnaHQgPSBub2RlLmg7CiAgICBpZiAocGFyZW50LmxheW91dD8uaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGV4dHJhID0gcGFyZW50WyRleHRyYV07CiAgICAgIGNvbnN0IGNvbFNwYW4gPSBub2RlLmNvbFNwYW47CiAgICAgIGxldCB3OwogICAgICBpZiAoY29sU3BhbiA9PT0gLTEpIHsKICAgICAgICB3ID0gTWF0aC5zdW1QcmVjaXNlKGV4dHJhLmNvbHVtbldpZHRocy5zbGljZShleHRyYS5jdXJyZW50Q29sdW1uKSk7CiAgICAgICAgZXh0cmEuY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdyA9IE1hdGguc3VtUHJlY2lzZShleHRyYS5jb2x1bW5XaWR0aHMuc2xpY2UoZXh0cmEuY3VycmVudENvbHVtbiwgZXh0cmEuY3VycmVudENvbHVtbiArIGNvbFNwYW4pKTsKICAgICAgICBleHRyYS5jdXJyZW50Q29sdW1uID0gKGV4dHJhLmN1cnJlbnRDb2x1bW4gKyBub2RlLmNvbFNwYW4pICUgZXh0cmEuY29sdW1uV2lkdGhzLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoIWlzTmFOKHcpKSB7CiAgICAgICAgd2lkdGggPSBub2RlLncgPSB3OwogICAgICB9CiAgICB9CiAgICBzdHlsZS53aWR0aCA9IHdpZHRoICE9PSAiIiA/IG1lYXN1cmVUb1N0cmluZyh3aWR0aCkgOiAiYXV0byI7CiAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHQgIT09ICIiID8gbWVhc3VyZVRvU3RyaW5nKGhlaWdodCkgOiAiYXV0byI7CiAgfSwKICBwb3NpdGlvbihub2RlLCBzdHlsZSkgewogICAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQ/LmxheW91dCAmJiBwYXJlbnQubGF5b3V0ICE9PSAicG9zaXRpb24iKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHN0eWxlLmxlZnQgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS54KTsKICAgIHN0eWxlLnRvcCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLnkpOwogIH0sCiAgcm90YXRlKG5vZGUsIHN0eWxlKSB7CiAgICBpZiAobm9kZS5yb3RhdGUpIHsKICAgICAgaWYgKCEoInRyYW5zZm9ybSIgaW4gc3R5bGUpKSB7CiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gIiI7CiAgICAgIH0KICAgICAgc3R5bGUudHJhbnNmb3JtICs9IGByb3RhdGUoLSR7bm9kZS5yb3RhdGV9ZGVnKWA7CiAgICAgIHN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICJ0b3AgbGVmdCI7CiAgICB9CiAgfSwKICBwcmVzZW5jZShub2RlLCBzdHlsZSkgewogICAgc3dpdGNoIChub2RlLnByZXNlbmNlKSB7CiAgICAgIGNhc2UgImludmlzaWJsZSI6CiAgICAgICAgc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJoaWRkZW4iOgogICAgICBjYXNlICJpbmFjdGl2ZSI6CiAgICAgICAgc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBicmVhazsKICAgIH0KICB9LAogIGhBbGlnbihub2RlLCBzdHlsZSkgewogICAgaWYgKG5vZGVbJG5vZGVOYW1lXSA9PT0gInBhcmEiKSB7CiAgICAgIHN3aXRjaCAobm9kZS5oQWxpZ24pIHsKICAgICAgICBjYXNlICJqdXN0aWZ5QWxsIjoKICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICJqdXN0aWZ5LWFsbCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyYWRpeCI6CiAgICAgICAgICBzdHlsZS50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gbm9kZS5oQWxpZ247CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAobm9kZS5oQWxpZ24pIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICAgIHN0eWxlLmFsaWduU2VsZiA9ICJzdGFydCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjZW50ZXIiOgogICAgICAgICAgc3R5bGUuYWxpZ25TZWxmID0gImNlbnRlciI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgICBzdHlsZS5hbGlnblNlbGYgPSAiZW5kIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBtYXJnaW4obm9kZSwgc3R5bGUpIHsKICAgIGlmIChub2RlLm1hcmdpbikgewogICAgICBzdHlsZS5tYXJnaW4gPSBub2RlLm1hcmdpblskdG9TdHlsZV0oKS5tYXJnaW47CiAgICB9CiAgfQp9OwpmdW5jdGlvbiBzZXRNaW5NYXhEaW1lbnNpb25zKG5vZGUsIHN0eWxlKSB7CiAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICBpZiAocGFyZW50LmxheW91dCA9PT0gInBvc2l0aW9uIikgewogICAgaWYgKG5vZGUubWluVyA+IDApIHsKICAgICAgc3R5bGUubWluV2lkdGggPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5taW5XKTsKICAgIH0KICAgIGlmIChub2RlLm1heFcgPiAwKSB7CiAgICAgIHN0eWxlLm1heFdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUubWF4Vyk7CiAgICB9CiAgICBpZiAobm9kZS5taW5IID4gMCkgewogICAgICBzdHlsZS5taW5IZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5taW5IKTsKICAgIH0KICAgIGlmIChub2RlLm1heEggPiAwKSB7CiAgICAgIHN0eWxlLm1heEhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLm1heEgpOwogICAgfQogIH0KfQpmdW5jdGlvbiBsYXlvdXRUZXh0KHRleHQsIHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgd2lkdGgpIHsKICBjb25zdCBtZWFzdXJlID0gbmV3IFRleHRNZWFzdXJlKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlcik7CiAgaWYgKHR5cGVvZiB0ZXh0ID09PSAic3RyaW5nIikgewogICAgbWVhc3VyZS5hZGRTdHJpbmcodGV4dCk7CiAgfSBlbHNlIHsKICAgIHRleHRbJHB1c2hHbHlwaHNdKG1lYXN1cmUpOwogIH0KICByZXR1cm4gbWVhc3VyZS5jb21wdXRlKHdpZHRoKTsKfQpmdW5jdGlvbiBsYXlvdXROb2RlKG5vZGUsIGF2YWlsYWJsZVNwYWNlKSB7CiAgbGV0IGhlaWdodCA9IG51bGw7CiAgbGV0IHdpZHRoID0gbnVsbDsKICBsZXQgaXNCcm9rZW4gPSBmYWxzZTsKICBpZiAoKCFub2RlLncgfHwgIW5vZGUuaCkgJiYgbm9kZS52YWx1ZSkgewogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKG5vZGUubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSBub2RlLm1hcmdpbi5sZWZ0SW5zZXQgKyBub2RlLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gbm9kZS5tYXJnaW4udG9wSW5zZXQgKyBub2RlLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGxldCBtYXJnaW4gPSBudWxsOwogICAgaWYgKG5vZGUucGFyYSkgewogICAgICBtYXJnaW4gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBsaW5lSGVpZ2h0ID0gbm9kZS5wYXJhLmxpbmVIZWlnaHQgPT09ICIiID8gbnVsbCA6IG5vZGUucGFyYS5saW5lSGVpZ2h0OwogICAgICBtYXJnaW4udG9wID0gbm9kZS5wYXJhLnNwYWNlQWJvdmUgPT09ICIiID8gMCA6IG5vZGUucGFyYS5zcGFjZUFib3ZlOwogICAgICBtYXJnaW4uYm90dG9tID0gbm9kZS5wYXJhLnNwYWNlQmVsb3cgPT09ICIiID8gMCA6IG5vZGUucGFyYS5zcGFjZUJlbG93OwogICAgICBtYXJnaW4ubGVmdCA9IG5vZGUucGFyYS5tYXJnaW5MZWZ0ID09PSAiIiA/IDAgOiBub2RlLnBhcmEubWFyZ2luTGVmdDsKICAgICAgbWFyZ2luLnJpZ2h0ID0gbm9kZS5wYXJhLm1hcmdpblJpZ2h0ID09PSAiIiA/IDAgOiBub2RlLnBhcmEubWFyZ2luUmlnaHQ7CiAgICB9CiAgICBsZXQgZm9udCA9IG5vZGUuZm9udDsKICAgIGlmICghZm9udCkgewogICAgICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogICAgICBsZXQgcGFyZW50ID0gbm9kZVskZ2V0UGFyZW50XSgpOwogICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gcm9vdCkgewogICAgICAgIGlmIChwYXJlbnQuZm9udCkgewogICAgICAgICAgZm9udCA9IHBhcmVudC5mb250OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHBhcmVudCA9IHBhcmVudFskZ2V0UGFyZW50XSgpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBtYXhXaWR0aCA9IChub2RlLncgfHwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpIC0gbWFyZ2luSDsKICAgIGNvbnN0IGZvbnRGaW5kZXIgPSBub2RlWyRnbG9iYWxEYXRhXS5mb250RmluZGVyOwogICAgaWYgKG5vZGUudmFsdWUuZXhEYXRhICYmIG5vZGUudmFsdWUuZXhEYXRhWyRjb250ZW50XSAmJiBub2RlLnZhbHVlLmV4RGF0YS5jb250ZW50VHlwZSA9PT0gInRleHQvaHRtbCIpIHsKICAgICAgY29uc3QgcmVzID0gbGF5b3V0VGV4dChub2RlLnZhbHVlLmV4RGF0YVskY29udGVudF0sIGZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgbWF4V2lkdGgpOwogICAgICB3aWR0aCA9IHJlcy53aWR0aDsKICAgICAgaGVpZ2h0ID0gcmVzLmhlaWdodDsKICAgICAgaXNCcm9rZW4gPSByZXMuaXNCcm9rZW47CiAgICB9IGVsc2UgewogICAgICBjb25zdCB0ZXh0ID0gbm9kZS52YWx1ZVskdGV4dF0oKTsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICBjb25zdCByZXMgPSBsYXlvdXRUZXh0KHRleHQsIGZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgbWF4V2lkdGgpOwogICAgICAgIHdpZHRoID0gcmVzLndpZHRoOwogICAgICAgIGhlaWdodCA9IHJlcy5oZWlnaHQ7CiAgICAgICAgaXNCcm9rZW4gPSByZXMuaXNCcm9rZW47CiAgICAgIH0KICAgIH0KICAgIGlmICh3aWR0aCAhPT0gbnVsbCAmJiAhbm9kZS53KSB7CiAgICAgIHdpZHRoICs9IG1hcmdpbkg7CiAgICB9CiAgICBpZiAoaGVpZ2h0ICE9PSBudWxsICYmICFub2RlLmgpIHsKICAgICAgaGVpZ2h0ICs9IG1hcmdpblY7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICB3OiB3aWR0aCwKICAgIGg6IGhlaWdodCwKICAgIGlzQnJva2VuCiAgfTsKfQpmdW5jdGlvbiBjb21wdXRlQmJveChub2RlLCBodG1sLCBhdmFpbGFibGVTcGFjZSkgewogIGxldCBiYm94OwogIGlmIChub2RlLncgIT09ICIiICYmIG5vZGUuaCAhPT0gIiIpIHsKICAgIGJib3ggPSBbbm9kZS54LCBub2RlLnksIG5vZGUudywgbm9kZS5oXTsKICB9IGVsc2UgewogICAgaWYgKCFhdmFpbGFibGVTcGFjZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCB3aWR0aCA9IG5vZGUudzsKICAgIGlmICh3aWR0aCA9PT0gIiIpIHsKICAgICAgaWYgKG5vZGUubWF4VyA9PT0gMCkgewogICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICAgICAgd2lkdGggPSBwYXJlbnQubGF5b3V0ID09PSAicG9zaXRpb24iICYmIHBhcmVudC53ICE9PSAiIiA/IDAgOiBub2RlLm1pblc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGggPSBNYXRoLm1pbihub2RlLm1heFcsIGF2YWlsYWJsZVNwYWNlLndpZHRoKTsKICAgICAgfQogICAgICBodG1sLmF0dHJpYnV0ZXMuc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcod2lkdGgpOwogICAgfQogICAgbGV0IGhlaWdodCA9IG5vZGUuaDsKICAgIGlmIChoZWlnaHQgPT09ICIiKSB7CiAgICAgIGlmIChub2RlLm1heEggPT09IDApIHsKICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgICAgIGhlaWdodCA9IHBhcmVudC5sYXlvdXQgPT09ICJwb3NpdGlvbiIgJiYgcGFyZW50LmggIT09ICIiID8gMCA6IG5vZGUubWluSDsKICAgICAgfSBlbHNlIHsKICAgICAgICBoZWlnaHQgPSBNYXRoLm1pbihub2RlLm1heEgsIGF2YWlsYWJsZVNwYWNlLmhlaWdodCk7CiAgICAgIH0KICAgICAgaHRtbC5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhoZWlnaHQpOwogICAgfQogICAgYmJveCA9IFtub2RlLngsIG5vZGUueSwgd2lkdGgsIGhlaWdodF07CiAgfQogIHJldHVybiBiYm94Owp9CmZ1bmN0aW9uIGZpeERpbWVuc2lvbnMobm9kZSkgewogIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgaWYgKHBhcmVudC5sYXlvdXQ/LmluY2x1ZGVzKCJyb3ciKSkgewogICAgY29uc3QgZXh0cmEgPSBwYXJlbnRbJGV4dHJhXTsKICAgIGNvbnN0IGNvbFNwYW4gPSBub2RlLmNvbFNwYW47CiAgICBsZXQgd2lkdGg7CiAgICBpZiAoY29sU3BhbiA9PT0gLTEpIHsKICAgICAgd2lkdGggPSBNYXRoLnN1bVByZWNpc2UoZXh0cmEuY29sdW1uV2lkdGhzLnNsaWNlKGV4dHJhLmN1cnJlbnRDb2x1bW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpZHRoID0gTWF0aC5zdW1QcmVjaXNlKGV4dHJhLmNvbHVtbldpZHRocy5zbGljZShleHRyYS5jdXJyZW50Q29sdW1uLCBleHRyYS5jdXJyZW50Q29sdW1uICsgY29sU3BhbikpOwogICAgfQogICAgaWYgKCFpc05hTih3aWR0aCkpIHsKICAgICAgbm9kZS53ID0gd2lkdGg7CiAgICB9CiAgfQogIGlmIChwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgIG5vZGUueCA9IG5vZGUueSA9IDA7CiAgfQogIGlmIChub2RlLmxheW91dCA9PT0gInRhYmxlIikgewogICAgaWYgKG5vZGUudyA9PT0gIiIgJiYgQXJyYXkuaXNBcnJheShub2RlLmNvbHVtbldpZHRocykpIHsKICAgICAgbm9kZS53ID0gTWF0aC5zdW1QcmVjaXNlKG5vZGUuY29sdW1uV2lkdGhzKTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gbGF5b3V0Q2xhc3Mobm9kZSkgewogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgICAgcmV0dXJuICJ4ZmFQb3NpdGlvbiI7CiAgICBjYXNlICJsci10YiI6CiAgICAgIHJldHVybiAieGZhTHJUYiI7CiAgICBjYXNlICJybC1yb3ciOgogICAgICByZXR1cm4gInhmYVJsUm93IjsKICAgIGNhc2UgInJsLXRiIjoKICAgICAgcmV0dXJuICJ4ZmFSbFRiIjsKICAgIGNhc2UgInJvdyI6CiAgICAgIHJldHVybiAieGZhUm93IjsKICAgIGNhc2UgInRhYmxlIjoKICAgICAgcmV0dXJuICJ4ZmFUYWJsZSI7CiAgICBjYXNlICJ0YiI6CiAgICAgIHJldHVybiAieGZhVGIiOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuICJ4ZmFQb3NpdGlvbiI7CiAgfQp9CmZ1bmN0aW9uIHRvU3R5bGUobm9kZSwgLi4ubmFtZXMpIHsKICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7CiAgICBjb25zdCB2YWx1ZSA9IG5vZGVbbmFtZV07CiAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoY29udmVydGVycy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBjb252ZXJ0ZXJzW25hbWVdKG5vZGUsIHN0eWxlKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3QpIHsKICAgICAgY29uc3QgbmV3U3R5bGUgPSB2YWx1ZVskdG9TdHlsZV0oKTsKICAgICAgaWYgKG5ld1N0eWxlKSB7CiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgbmV3U3R5bGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oYChERUJVRykgLSBYRkEgLSBzdHlsZSBmb3IgJHtuYW1lfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHN0eWxlOwp9CmZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIobm9kZSwgaHRtbCkgewogIGNvbnN0IHsKICAgIGF0dHJpYnV0ZXMKICB9ID0gaHRtbDsKICBjb25zdCB7CiAgICBzdHlsZQogIH0gPSBhdHRyaWJ1dGVzOwogIGNvbnN0IHdyYXBwZXIgPSB7CiAgICBuYW1lOiAiZGl2IiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgY2xhc3M6IFsieGZhV3JhcHBlciJdLAogICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgfSwKICAgIGNoaWxkcmVuOiBbXQogIH07CiAgYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFXcmFwcGVkIik7CiAgaWYgKG5vZGUuYm9yZGVyKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRocywKICAgICAgaW5zZXRzCiAgICB9ID0gbm9kZS5ib3JkZXJbJGV4dHJhXTsKICAgIGxldCB3aWR0aCwgaGVpZ2h0OwogICAgbGV0IHRvcCA9IGluc2V0c1swXTsKICAgIGxldCBsZWZ0ID0gaW5zZXRzWzNdOwogICAgY29uc3QgaW5zZXRzSCA9IGluc2V0c1swXSArIGluc2V0c1syXTsKICAgIGNvbnN0IGluc2V0c1cgPSBpbnNldHNbMV0gKyBpbnNldHNbM107CiAgICBzd2l0Y2ggKG5vZGUuYm9yZGVyLmhhbmQpIHsKICAgICAgY2FzZSAiZXZlbiI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXSAvIDI7CiAgICAgICAgbGVmdCAtPSB3aWR0aHNbM10gLyAyOwogICAgICAgIHdpZHRoID0gYGNhbGMoMTAwJSArICR7KHdpZHRoc1sxXSArIHdpZHRoc1szXSkgLyAyIC0gaW5zZXRzV31weClgOwogICAgICAgIGhlaWdodCA9IGBjYWxjKDEwMCUgKyAkeyh3aWR0aHNbMF0gKyB3aWR0aHNbMl0pIC8gMiAtIGluc2V0c0h9cHgpYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXTsKICAgICAgICBsZWZ0IC09IHdpZHRoc1szXTsKICAgICAgICB3aWR0aCA9IGBjYWxjKDEwMCUgKyAke3dpZHRoc1sxXSArIHdpZHRoc1szXSAtIGluc2V0c1d9cHgpYDsKICAgICAgICBoZWlnaHQgPSBgY2FsYygxMDAlICsgJHt3aWR0aHNbMF0gKyB3aWR0aHNbMl0gLSBpbnNldHNIfXB4KWA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICB3aWR0aCA9IGluc2V0c1cgPyBgY2FsYygxMDAlIC0gJHtpbnNldHNXfXB4KWAgOiAiMTAwJSI7CiAgICAgICAgaGVpZ2h0ID0gaW5zZXRzSCA/IGBjYWxjKDEwMCUgLSAke2luc2V0c0h9cHgpYCA6ICIxMDAlIjsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYUJvcmRlciJdOwogICAgaWYgKGlzUHJpbnRPbmx5KG5vZGUuYm9yZGVyKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYm9yZGVyID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBjbGFzc05hbWVzLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICB0b3A6IGAke3RvcH1weGAsCiAgICAgICAgICBsZWZ0OiBgJHtsZWZ0fXB4YCwKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0CiAgICAgICAgfQogICAgICB9LAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGtleSBvZiBbImJvcmRlciIsICJib3JkZXJXaWR0aCIsICJib3JkZXJDb2xvciIsICJib3JkZXJSYWRpdXMiLCAiYm9yZGVyU3R5bGUiXSkgewogICAgICBpZiAoc3R5bGVba2V5XSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYm9yZGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgICAgZGVsZXRlIHN0eWxlW2tleV07CiAgICAgIH0KICAgIH0KICAgIHdyYXBwZXIuY2hpbGRyZW4ucHVzaChib3JkZXIsIGh0bWwpOwogIH0gZWxzZSB7CiAgICB3cmFwcGVyLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIGZvciAoY29uc3Qga2V5IG9mIFsiYmFja2dyb3VuZCIsICJiYWNrZ3JvdW5kQ2xpcCIsICJ0b3AiLCAibGVmdCIsICJ3aWR0aCIsICJoZWlnaHQiLCAibWluV2lkdGgiLCAibWluSGVpZ2h0IiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJ0cmFuc2Zvcm0iLCAidHJhbnNmb3JtT3JpZ2luIiwgInZpc2liaWxpdHkiXSkgewogICAgaWYgKHN0eWxlW2tleV0gIT09IHVuZGVmaW5lZCkgewogICAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgIGRlbGV0ZSBzdHlsZVtrZXldOwogICAgfQogIH0KICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb24gPSBzdHlsZS5wb3NpdGlvbiA9PT0gImFic29sdXRlIiA/ICJhYnNvbHV0ZSIgOiAicmVsYXRpdmUiOwogIGRlbGV0ZSBzdHlsZS5wb3NpdGlvbjsKICBpZiAoc3R5bGUuYWxpZ25TZWxmKSB7CiAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGUuYWxpZ25TZWxmID0gc3R5bGUuYWxpZ25TZWxmOwogICAgZGVsZXRlIHN0eWxlLmFsaWduU2VsZjsKICB9CiAgcmV0dXJuIHdyYXBwZXI7Cn0KZnVuY3Rpb24gZml4VGV4dEluZGVudChzdHlsZXMpIHsKICBjb25zdCBpbmRlbnQgPSBnZXRNZWFzdXJlbWVudChzdHlsZXMudGV4dEluZGVudCwgIjBweCIpOwogIGlmIChpbmRlbnQgPj0gMCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBhbGlnbiA9IHN0eWxlcy50ZXh0QWxpZ24gPT09ICJyaWdodCIgPyAicmlnaHQiIDogImxlZnQiOwogIGNvbnN0IG5hbWUgPSAicGFkZGluZyIgKyAoYWxpZ24gPT09ICJsZWZ0IiA/ICJMZWZ0IiA6ICJSaWdodCIpOwogIGNvbnN0IHBhZGRpbmcgPSBnZXRNZWFzdXJlbWVudChzdHlsZXNbbmFtZV0sICIwcHgiKTsKICBzdHlsZXNbbmFtZV0gPSBgJHtwYWRkaW5nIC0gaW5kZW50fXB4YDsKfQpmdW5jdGlvbiBzZXRBY2Nlc3Mobm9kZSwgY2xhc3NOYW1lcykgewogIHN3aXRjaCAobm9kZS5hY2Nlc3MpIHsKICAgIGNhc2UgIm5vbkludGVyYWN0aXZlIjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFOb25JbnRlcmFjdGl2ZSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInJlYWRPbmx5IjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFSZWFkT25seSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInByb3RlY3RlZCI6CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhRGlzYWJsZWQiKTsKICAgICAgYnJlYWs7CiAgfQp9CmZ1bmN0aW9uIGlzUHJpbnRPbmx5KG5vZGUpIHsKICByZXR1cm4gbm9kZS5yZWxldmFudC5sZW5ndGggPiAwICYmICFub2RlLnJlbGV2YW50WzBdLmV4Y2x1ZGVkICYmIG5vZGUucmVsZXZhbnRbMF0udmlld25hbWUgPT09ICJwcmludCI7Cn0KZnVuY3Rpb24gZ2V0Q3VycmVudFBhcmEobm9kZSkgewogIGNvbnN0IHN0YWNrID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFyYVN0YWNrOwogIHJldHVybiBzdGFjay5sZW5ndGggPyBzdGFjay5hdCgtMSkgOiBudWxsOwp9CmZ1bmN0aW9uIHNldFBhcmEobm9kZSwgbm9kZVN0eWxlLCB2YWx1ZSkgewogIGlmICh2YWx1ZS5hdHRyaWJ1dGVzLmNsYXNzPy5pbmNsdWRlcygieGZhUmljaCIpKSB7CiAgICBpZiAobm9kZVN0eWxlKSB7CiAgICAgIGlmIChub2RlLmggPT09ICIiKSB7CiAgICAgICAgbm9kZVN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgICAgfQogICAgICBpZiAobm9kZS53ID09PSAiIikgewogICAgICAgIG5vZGVTdHlsZS53aWR0aCA9ICJhdXRvIjsKICAgICAgfQogICAgfQogICAgY29uc3QgcGFyYSA9IGdldEN1cnJlbnRQYXJhKG5vZGUpOwogICAgaWYgKHBhcmEpIHsKICAgICAgY29uc3QgdmFsdWVTdHlsZSA9IHZhbHVlLmF0dHJpYnV0ZXMuc3R5bGU7CiAgICAgIHZhbHVlU3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgICAgdmFsdWVTdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICAgIHN3aXRjaCAocGFyYS52QWxpZ24pIHsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJzdGFydCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJlbmQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWlkZGxlIjoKICAgICAgICAgIHZhbHVlU3R5bGUuanVzdGlmeUNvbnRlbnQgPSAiY2VudGVyIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmFTdHlsZSA9IHBhcmFbJHRvU3R5bGVdKCk7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhwYXJhU3R5bGUpKSB7CiAgICAgICAgaWYgKCEoa2V5IGluIHZhbHVlU3R5bGUpKSB7CiAgICAgICAgICB2YWx1ZVN0eWxlW2tleV0gPSB2YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIHNldEZvbnRGYW1pbHkoeGZhRm9udCwgbm9kZSwgZm9udEZpbmRlciwgc3R5bGUpIHsKICBpZiAoIWZvbnRGaW5kZXIpIHsKICAgIGRlbGV0ZSBzdHlsZS5mb250RmFtaWx5OwogICAgcmV0dXJuOwogIH0KICBjb25zdCBuYW1lID0gc3RyaXBRdW90ZXMoeGZhRm9udC50eXBlZmFjZSk7CiAgc3R5bGUuZm9udEZhbWlseSA9IGAiJHtuYW1lfSJgOwogIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKG5hbWUpOwogIGlmICh0eXBlZmFjZSkgewogICAgY29uc3QgewogICAgICBmb250RmFtaWx5CiAgICB9ID0gdHlwZWZhY2UucmVndWxhci5jc3NGb250SW5mbzsKICAgIGlmIChmb250RmFtaWx5ICE9PSBuYW1lKSB7CiAgICAgIHN0eWxlLmZvbnRGYW1pbHkgPSBgIiR7Zm9udEZhbWlseX0iYDsKICAgIH0KICAgIGNvbnN0IHBhcmEgPSBnZXRDdXJyZW50UGFyYShub2RlKTsKICAgIGlmIChwYXJhICYmIHBhcmEubGluZUhlaWdodCAhPT0gIiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHN0eWxlLmxpbmVIZWlnaHQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGRmRm9udCA9IHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpOwogICAgaWYgKHBkZkZvbnQpIHsKICAgICAgc3R5bGUubGluZUhlaWdodCA9IE1hdGgubWF4KDEuMiwgcGRmRm9udC5saW5lSGVpZ2h0KTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gZml4VVJMKHN0cikgewogIGNvbnN0IGFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybChzdHIsIG51bGwsIHsKICAgIGFkZERlZmF1bHRQcm90b2NvbDogdHJ1ZSwKICAgIHRyeUNvbnZlcnRFbmNvZGluZzogdHJ1ZQogIH0pOwogIHJldHVybiBhYnNvbHV0ZVVybCA/IGFic29sdXRlVXJsLmhyZWYgOiBudWxsOwp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvbGF5b3V0LmpzCgoKCmZ1bmN0aW9uIGNyZWF0ZUxpbmUobm9kZSwgY2hpbGRyZW4pIHsKICByZXR1cm4gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzOiB7CiAgICAgIGNsYXNzOiBbbm9kZS5sYXlvdXQgPT09ICJsci10YiIgPyAieGZhTHIiIDogInhmYVJsIl0KICAgIH0sCiAgICBjaGlsZHJlbgogIH07Cn0KZnVuY3Rpb24gZmx1c2hIVE1MKG5vZGUpIHsKICBpZiAoIW5vZGVbJGV4dHJhXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGF0dHJpYnV0ZXMgPSBub2RlWyRleHRyYV0uYXR0cmlidXRlczsKICBjb25zdCBodG1sID0gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzLAogICAgY2hpbGRyZW46IG5vZGVbJGV4dHJhXS5jaGlsZHJlbgogIH07CiAgaWYgKG5vZGVbJGV4dHJhXS5mYWlsaW5nTm9kZSkgewogICAgY29uc3QgaHRtbEZyb21GYWlsaW5nID0gbm9kZVskZXh0cmFdLmZhaWxpbmdOb2RlWyRmbHVzaEhUTUxdKCk7CiAgICBpZiAoaHRtbEZyb21GYWlsaW5nKSB7CiAgICAgIGlmIChub2RlLmxheW91dC5lbmRzV2l0aCgiLXRiIikpIHsKICAgICAgICBodG1sLmNoaWxkcmVuLnB1c2goY3JlYXRlTGluZShub2RlLCBbaHRtbEZyb21GYWlsaW5nXSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaChodG1sRnJvbUZhaWxpbmcpOwogICAgICB9CiAgICB9CiAgfQogIGlmIChodG1sLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBodG1sOwp9CmZ1bmN0aW9uIGFkZEhUTUwobm9kZSwgaHRtbCwgYmJveCkgewogIGNvbnN0IGV4dHJhID0gbm9kZVskZXh0cmFdOwogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gZXh0cmEuYXZhaWxhYmxlU3BhY2U7CiAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICBzd2l0Y2ggKG5vZGUubGF5b3V0KSB7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGgubWF4KGV4dHJhLndpZHRoLCB4ICsgdyk7CiAgICAgICAgZXh0cmEuaGVpZ2h0ID0gTWF0aC5tYXgoZXh0cmEuaGVpZ2h0LCB5ICsgaCk7CiAgICAgICAgZXh0cmEuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAibHItdGIiOgogICAgY2FzZSAicmwtdGIiOgogICAgICBpZiAoIWV4dHJhLmxpbmUgfHwgZXh0cmEuYXR0ZW1wdCA9PT0gMSkgewogICAgICAgIGV4dHJhLmxpbmUgPSBjcmVhdGVMaW5lKG5vZGUsIFtdKTsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGV4dHJhLmxpbmUpOwogICAgICAgIGV4dHJhLm51bWJlckluTGluZSA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEubnVtYmVySW5MaW5lICs9IDE7CiAgICAgIGV4dHJhLmxpbmUuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgaWYgKGV4dHJhLmF0dGVtcHQgPT09IDApIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGV4dHJhLnByZXZIZWlnaHQgKyBoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggPSB3OwogICAgICAgIGV4dHJhLnByZXZIZWlnaHQgPSBleHRyYS5oZWlnaHQ7CiAgICAgICAgZXh0cmEuaGVpZ2h0ICs9IGg7CiAgICAgICAgZXh0cmEuYXR0ZW1wdCA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEud2lkdGggPSBNYXRoLm1heChleHRyYS53aWR0aCwgZXh0cmEuY3VycmVudFdpZHRoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgewogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgZXh0cmEud2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGgpOwogICAgICAgIGNvbnN0IGhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhleHRyYS5oZWlnaHQpOwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZXh0cmEuY2hpbGRyZW4pIHsKICAgICAgICAgIGNoaWxkLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAidGFibGUiOgogICAgICB7CiAgICAgICAgZXh0cmEud2lkdGggPSBNYXRoQ2xhbXAodywgZXh0cmEud2lkdGgsIGF2YWlsYWJsZVNwYWNlLndpZHRoKTsKICAgICAgICBleHRyYS5oZWlnaHQgKz0gaDsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJ0YiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGhDbGFtcCh3LCBleHRyYS53aWR0aCwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpOwogICAgICAgIGV4dHJhLmhlaWdodCArPSBoOwogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICB9Cn0KZnVuY3Rpb24gZ2V0QXZhaWxhYmxlU3BhY2Uobm9kZSkgewogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gbm9kZVskZXh0cmFdLmF2YWlsYWJsZVNwYWNlOwogIGNvbnN0IG1hcmdpblYgPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLnRvcEluc2V0ICsgbm9kZS5tYXJnaW4uYm90dG9tSW5zZXQgOiAwOwogIGNvbnN0IG1hcmdpbkggPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLmxlZnRJbnNldCArIG5vZGUubWFyZ2luLnJpZ2h0SW5zZXQgOiAwOwogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgImxyLXRiIjoKICAgIGNhc2UgInJsLXRiIjoKICAgICAgaWYgKG5vZGVbJGV4dHJhXS5hdHRlbXB0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkggLSBub2RlWyRleHRyYV0uY3VycmVudFdpZHRoLAogICAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVskZXh0cmFdLnByZXZIZWlnaHQKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVNwYWNlLndpZHRoIC0gbWFyZ2luSCwKICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZVNwYWNlLmhlaWdodCAtIG1hcmdpblYgLSBub2RlWyRleHRyYV0uaGVpZ2h0CiAgICAgIH07CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLnN1bVByZWNpc2Uobm9kZVskZXh0cmFdLmNvbHVtbldpZHRocy5zbGljZShub2RlWyRleHRyYV0uY3VycmVudENvbHVtbikpOwogICAgICByZXR1cm4gewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodDogYXZhaWxhYmxlU3BhY2UuaGVpZ2h0IC0gbWFyZ2luSAogICAgICB9OwogICAgY2FzZSAidGFibGUiOgogICAgY2FzZSAidGIiOgogICAgICByZXR1cm4gewogICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkgsCiAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVskZXh0cmFdLmhlaWdodAogICAgICB9OwogICAgY2FzZSAicG9zaXRpb24iOgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGF2YWlsYWJsZVNwYWNlOwogIH0KfQpmdW5jdGlvbiBnZXRUcmFuc2Zvcm1lZEJCb3gobm9kZSkgewogIGxldCB3ID0gbm9kZS53ID09PSAiIiA/IE5hTiA6IG5vZGUudzsKICBsZXQgaCA9IG5vZGUuaCA9PT0gIiIgPyBOYU4gOiBub2RlLmg7CiAgbGV0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IFswLCAwXTsKICBzd2l0Y2ggKG5vZGUuYW5jaG9yVHlwZSB8fCAiIikgewogICAgY2FzZSAiYm90dG9tQ2VudGVyIjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3cgLyAyLCBoXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJib3R0b21MZWZ0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gWzAsIGhdOwogICAgICBicmVhazsKICAgIGNhc2UgImJvdHRvbVJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIGhdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZUNlbnRlciI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3IC8gMiwgaCAvIDJdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZUxlZnQiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbMCwgaCAvIDJdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZVJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIGggLyAyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJ0b3BDZW50ZXIiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbdyAvIDIsIDBdOwogICAgICBicmVhazsKICAgIGNhc2UgInRvcFJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIDBdOwogICAgICBicmVhazsKICB9CiAgbGV0IHgsIHk7CiAgc3dpdGNoIChub2RlLnJvdGF0ZSB8fCAwKSB7CiAgICBjYXNlIDA6CiAgICAgIFt4LCB5XSA9IFstY2VudGVyWCwgLWNlbnRlclldOwogICAgICBicmVhazsKICAgIGNhc2UgOTA6CiAgICAgIFt4LCB5XSA9IFstY2VudGVyWSwgY2VudGVyWF07CiAgICAgIFt3LCBoXSA9IFtoLCAtd107CiAgICAgIGJyZWFrOwogICAgY2FzZSAxODA6CiAgICAgIFt4LCB5XSA9IFtjZW50ZXJYLCBjZW50ZXJZXTsKICAgICAgW3csIGhdID0gWy13LCAtaF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAyNzA6CiAgICAgIFt4LCB5XSA9IFtjZW50ZXJZLCAtY2VudGVyWF07CiAgICAgIFt3LCBoXSA9IFstaCwgd107CiAgICAgIGJyZWFrOwogIH0KICByZXR1cm4gW25vZGUueCArIHggKyBNYXRoLm1pbigwLCB3KSwgbm9kZS55ICsgeSArIE1hdGgubWluKDAsIGgpLCBNYXRoLmFicyh3KSwgTWF0aC5hYnMoaCldOwp9CmZ1bmN0aW9uIGNoZWNrRGltZW5zaW9ucyhub2RlLCBzcGFjZSkgewogIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9PT0gbnVsbCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmIChub2RlLncgPT09IDAgfHwgbm9kZS5oID09PSAwKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29uc3QgRVJST1IgPSAyOwogIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgY29uc3QgYXR0ZW1wdCA9IHBhcmVudFskZXh0cmFdPy5hdHRlbXB0IHx8IDA7CiAgY29uc3QgWywgeSwgdywgaF0gPSBnZXRUcmFuc2Zvcm1lZEJCb3gobm9kZSk7CiAgc3dpdGNoIChwYXJlbnQubGF5b3V0KSB7CiAgICBjYXNlICJsci10YiI6CiAgICBjYXNlICJybC10YiI6CiAgICAgIGlmIChhdHRlbXB0ID09PSAwKSB7CiAgICAgICAgaWYgKCFub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICAgIGlmIChub2RlLmggIT09ICIiICYmIE1hdGgucm91bmQoaCAtIHNwYWNlLmhlaWdodCkgPiBFUlJPUikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS53ICE9PSAiIikgewogICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmVudFskZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3BhY2Uud2lkdGggPiBFUlJPUjsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUudyAhPT0gIiIpIHsKICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHcgLSBzcGFjZS53aWR0aCkgPD0gRVJST1I7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcGFjZS53aWR0aCA+IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oICE9PSAiIiAmJiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpID4gRVJST1IpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKG5vZGUudyA9PT0gIiIgfHwgTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIHNwYWNlLmhlaWdodCA+IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChwYXJlbnRbJGlzVGhlcmVNb3JlV2lkdGhdKCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHNwYWNlLmhlaWdodCA+IEVSUk9SOwogICAgY2FzZSAidGFibGUiOgogICAgY2FzZSAidGIiOgogICAgICBpZiAobm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuaCAhPT0gIiIgJiYgIW5vZGVbJGlzU3BsaXR0YWJsZV0oKSkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChub2RlLncgPT09ICIiIHx8IE1hdGgucm91bmQodyAtIHNwYWNlLndpZHRoKSA8PSBFUlJPUikgewogICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgfQogICAgICBpZiAocGFyZW50WyRpc1RoZXJlTW9yZVdpZHRoXSgpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgICAgaWYgKG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChub2RlLmggPT09ICIiIHx8IE1hdGgucm91bmQoaCArIHkgLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgY29uc3QgYXJlYSA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYTsKICAgICAgcmV0dXJuIGggKyB5ID4gYXJlYS5oOwogICAgY2FzZSAicmwtcm93IjoKICAgIGNhc2UgInJvdyI6CiAgICAgIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oICE9PSAiIikgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHRydWU7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvdGVtcGxhdGUuanMKCgoKCgoKCgoKCmNvbnN0IFRFTVBMQVRFX05TX0lEID0gTmFtZXNwYWNlSWRzLnRlbXBsYXRlLmlkOwpjb25zdCBTVkdfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciOwpjb25zdCBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUID0gMjsKY29uc3QgTUFYX0VNUFRZX1BBR0VTID0gMzsKY29uc3QgREVGQVVMVF9UQUJfSU5ERVggPSA1MDAwOwpjb25zdCBIRUFESU5HX1BBVFRFUk4gPSAvXkgoXGQrKSQvOwpjb25zdCBNSU1FUyA9IG5ldyBTZXQoWyJpbWFnZS9naWYiLCAiaW1hZ2UvanBlZyIsICJpbWFnZS9qcGciLCAiaW1hZ2UvcGpwZWciLCAiaW1hZ2UvcG5nIiwgImltYWdlL2FwbmciLCAiaW1hZ2UveC1wbmciLCAiaW1hZ2UvYm1wIiwgImltYWdlL3gtbXMtYm1wIiwgImltYWdlL3RpZmYiLCAiaW1hZ2UvdGlmIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJdKTsKY29uc3QgSU1BR0VTX0hFQURFUlMgPSBbW1sweDQyLCAweDRkXSwgImltYWdlL2JtcCJdLCBbWzB4ZmYsIDB4ZDgsIDB4ZmZdLCAiaW1hZ2UvanBlZyJdLCBbWzB4NDksIDB4NDksIDB4MmEsIDB4MDBdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NGQsIDB4NGQsIDB4MDAsIDB4MmFdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NDcsIDB4NDksIDB4NDYsIDB4MzgsIDB4MzksIDB4NjFdLCAiaW1hZ2UvZ2lmIl0sIFtbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV0sICJpbWFnZS9wbmciXV07CmZ1bmN0aW9uIGdldEJvcmRlckRpbXMobm9kZSkgewogIGlmICghbm9kZSB8fCAhbm9kZS5ib3JkZXIpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIGNvbnN0IGJvcmRlckV4dHJhID0gbm9kZS5ib3JkZXJbJGdldEV4dHJhXSgpOwogIGlmICghYm9yZGVyRXh0cmEpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIHJldHVybiB7CiAgICB3OiBib3JkZXJFeHRyYS53aWR0aHNbMF0gKyBib3JkZXJFeHRyYS53aWR0aHNbMl0gKyBib3JkZXJFeHRyYS5pbnNldHNbMF0gKyBib3JkZXJFeHRyYS5pbnNldHNbMl0sCiAgICBoOiBib3JkZXJFeHRyYS53aWR0aHNbMV0gKyBib3JkZXJFeHRyYS53aWR0aHNbM10gKyBib3JkZXJFeHRyYS5pbnNldHNbMV0gKyBib3JkZXJFeHRyYS5pbnNldHNbM10KICB9Owp9CmZ1bmN0aW9uIGhhc01hcmdpbihub2RlKSB7CiAgcmV0dXJuIG5vZGUubWFyZ2luICYmIChub2RlLm1hcmdpbi50b3BJbnNldCB8fCBub2RlLm1hcmdpbi5yaWdodEluc2V0IHx8IG5vZGUubWFyZ2luLmJvdHRvbUluc2V0IHx8IG5vZGUubWFyZ2luLmxlZnRJbnNldCk7Cn0KZnVuY3Rpb24gX3NldFZhbHVlKHRlbXBsYXRlTm9kZSwgdmFsdWUpIHsKICBpZiAoIXRlbXBsYXRlTm9kZS52YWx1ZSkgewogICAgY29uc3Qgbm9kZVZhbHVlID0gbmV3IFZhbHVlKHt9KTsKICAgIHRlbXBsYXRlTm9kZVskYXBwZW5kQ2hpbGRdKG5vZGVWYWx1ZSk7CiAgICB0ZW1wbGF0ZU5vZGUudmFsdWUgPSBub2RlVmFsdWU7CiAgfQogIHRlbXBsYXRlTm9kZS52YWx1ZVskc2V0VmFsdWVdKHZhbHVlKTsKfQpmdW5jdGlvbiogZ2V0Q29udGFpbmVkQ2hpbGRyZW4obm9kZSkgewogIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZVskZ2V0Q2hpbGRyZW5dKCkpIHsKICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN1YmZvcm1TZXQpIHsKICAgICAgeWllbGQqIGNoaWxkWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICB5aWVsZCBjaGlsZDsKICB9Cn0KZnVuY3Rpb24gaXNSZXF1aXJlZChub2RlKSB7CiAgcmV0dXJuIG5vZGUudmFsaWRhdGU/Lm51bGxUZXN0ID09PSAiZXJyb3IiOwp9CmZ1bmN0aW9uIHNldFRhYkluZGV4KG5vZGUpIHsKICB3aGlsZSAobm9kZSkgewogICAgaWYgKCFub2RlLnRyYXZlcnNhbCkgewogICAgICBub2RlWyR0YWJJbmRleF0gPSBub2RlWyRnZXRQYXJlbnRdKClbJHRhYkluZGV4XTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5vZGVbJHRhYkluZGV4XSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgbmV4dCA9IG51bGw7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUudHJhdmVyc2FsWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICBpZiAoY2hpbGQub3BlcmF0aW9uID09PSAibmV4dCIpIHsKICAgICAgICBuZXh0ID0gY2hpbGQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghbmV4dCB8fCAhbmV4dC5yZWYpIHsKICAgICAgbm9kZVskdGFiSW5kZXhdID0gbm9kZVskZ2V0UGFyZW50XSgpWyR0YWJJbmRleF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgICBub2RlWyR0YWJJbmRleF0gPSArK3Jvb3RbJHRhYkluZGV4XTsKICAgIGNvbnN0IHJlZiA9IHJvb3RbJHNlYXJjaE5vZGVdKG5leHQucmVmLCBub2RlKTsKICAgIGlmICghcmVmKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG5vZGUgPSByZWZbMF07CiAgfQp9CmZ1bmN0aW9uIGFwcGx5QXNzaXN0KG9iaiwgYXR0cmlidXRlcykgewogIGNvbnN0IGFzc2lzdCA9IG9iai5hc3Npc3Q7CiAgaWYgKGFzc2lzdCkgewogICAgY29uc3QgYXNzaXN0VGl0bGUgPSBhc3Npc3RbJHRvSFRNTF0oKTsKICAgIGlmIChhc3Npc3RUaXRsZSkgewogICAgICBhdHRyaWJ1dGVzLnRpdGxlID0gYXNzaXN0VGl0bGU7CiAgICB9CiAgICBjb25zdCByb2xlID0gYXNzaXN0LnJvbGU7CiAgICBjb25zdCBtYXRjaCA9IHJvbGUubWF0Y2goSEVBRElOR19QQVRURVJOKTsKICAgIGlmIChtYXRjaCkgewogICAgICBjb25zdCBhcmlhUm9sZSA9ICJoZWFkaW5nIjsKICAgICAgY29uc3QgYXJpYUxldmVsID0gbWF0Y2hbMV07CiAgICAgIGF0dHJpYnV0ZXMucm9sZSA9IGFyaWFSb2xlOwogICAgICBhdHRyaWJ1dGVzWyJhcmlhLWxldmVsIl0gPSBhcmlhTGV2ZWw7CiAgICB9CiAgfQogIGlmIChvYmoubGF5b3V0ID09PSAidGFibGUiKSB7CiAgICBhdHRyaWJ1dGVzLnJvbGUgPSAidGFibGUiOwogIH0gZWxzZSBpZiAob2JqLmxheW91dCA9PT0gInJvdyIpIHsKICAgIGF0dHJpYnV0ZXMucm9sZSA9ICJyb3ciOwogIH0gZWxzZSB7CiAgICBjb25zdCBwYXJlbnQgPSBvYmpbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQubGF5b3V0ID09PSAicm93IikgewogICAgICBhdHRyaWJ1dGVzLnJvbGUgPSBwYXJlbnQuYXNzaXN0Py5yb2xlID09PSAiVEgiID8gImNvbHVtbmhlYWRlciIgOiAiY2VsbCI7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGFyaWFMYWJlbChvYmopIHsKICBpZiAoIW9iai5hc3Npc3QpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBhc3Npc3QgPSBvYmouYXNzaXN0OwogIGlmIChhc3Npc3Quc3BlYWsgJiYgYXNzaXN0LnNwZWFrWyRjb250ZW50XSAhPT0gIiIpIHsKICAgIHJldHVybiBhc3Npc3Quc3BlYWtbJGNvbnRlbnRdOwogIH0KICBpZiAoYXNzaXN0LnRvb2xUaXApIHsKICAgIHJldHVybiBhc3Npc3QudG9vbFRpcFskY29udGVudF07CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHZhbHVlVG9IdG1sKHZhbHVlKSB7CiAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICBuYW1lOiAiZGl2IiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgY2xhc3M6IFsieGZhUmljaCJdLAogICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgfSwKICAgIGNoaWxkcmVuOiBbewogICAgICBuYW1lOiAic3BhbiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgICB9LAogICAgICB2YWx1ZQogICAgfV0KICB9KTsKfQpmdW5jdGlvbiBzZXRGaXJzdFVuc3BsaXR0YWJsZShub2RlKSB7CiAgY29uc3Qgcm9vdCA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKTsKICBpZiAocm9vdFskZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID09PSBudWxsKSB7CiAgICByb290WyRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPSBub2RlOwogICAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgfQp9CmZ1bmN0aW9uIHVuc2V0Rmlyc3RVbnNwbGl0dGFibGUobm9kZSkgewogIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgaWYgKHJvb3RbJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9PT0gbm9kZSkgewogICAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IGZhbHNlOwogIH0KfQpmdW5jdGlvbiBoYW5kbGVCcmVhayhub2RlKSB7CiAgaWYgKG5vZGVbJGV4dHJhXSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBub2RlWyRleHRyYV0gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGlmIChub2RlLnRhcmdldFR5cGUgPT09ICJhdXRvIikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogIGxldCB0YXJnZXQgPSBudWxsOwogIGlmIChub2RlLnRhcmdldCkgewogICAgdGFyZ2V0ID0gcm9vdFskc2VhcmNoTm9kZV0obm9kZS50YXJnZXQsIG5vZGVbJGdldFBhcmVudF0oKSk7CiAgICBpZiAoIXRhcmdldCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0YXJnZXQgPSB0YXJnZXRbMF07CiAgfQogIGNvbnN0IHsKICAgIGN1cnJlbnRQYWdlQXJlYSwKICAgIGN1cnJlbnRDb250ZW50QXJlYQogIH0gPSByb290WyRleHRyYV07CiAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gInBhZ2VBcmVhIikgewogICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgUGFnZUFyZWEpKSB7CiAgICAgIHRhcmdldCA9IG51bGw7CiAgICB9CiAgICBpZiAobm9kZS5zdGFydE5ldykgewogICAgICBub2RlWyRleHRyYV0udGFyZ2V0ID0gdGFyZ2V0IHx8IGN1cnJlbnRQYWdlQXJlYTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGN1cnJlbnRQYWdlQXJlYSkgewogICAgICBub2RlWyRleHRyYV0udGFyZ2V0ID0gdGFyZ2V0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgQ29udGVudEFyZWEpKSB7CiAgICB0YXJnZXQgPSBudWxsOwogIH0KICBjb25zdCBwYWdlQXJlYSA9IHRhcmdldCAmJiB0YXJnZXRbJGdldFBhcmVudF0oKTsKICBsZXQgaW5kZXg7CiAgbGV0IG5leHRQYWdlQXJlYSA9IHBhZ2VBcmVhOwogIGlmIChub2RlLnN0YXJ0TmV3KSB7CiAgICBpZiAodGFyZ2V0KSB7CiAgICAgIGNvbnN0IGNvbnRlbnRBcmVhcyA9IHBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuOwogICAgICBjb25zdCBpbmRleEZvckN1cnJlbnQgPSBjb250ZW50QXJlYXMuaW5kZXhPZihjdXJyZW50Q29udGVudEFyZWEpOwogICAgICBjb25zdCBpbmRleEZvclRhcmdldCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKHRhcmdldCk7CiAgICAgIGlmIChpbmRleEZvckN1cnJlbnQgIT09IC0xICYmIGluZGV4Rm9yQ3VycmVudCA8IGluZGV4Rm9yVGFyZ2V0KSB7CiAgICAgICAgbmV4dFBhZ2VBcmVhID0gbnVsbDsKICAgICAgfQogICAgICBpbmRleCA9IGluZGV4Rm9yVGFyZ2V0IC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGluZGV4ID0gY3VycmVudFBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YoY3VycmVudENvbnRlbnRBcmVhKTsKICAgIH0KICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGN1cnJlbnRDb250ZW50QXJlYSkgewogICAgY29uc3QgY29udGVudEFyZWFzID0gcGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW47CiAgICBpbmRleCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKHRhcmdldCkgLSAxOwogICAgbmV4dFBhZ2VBcmVhID0gcGFnZUFyZWEgPT09IGN1cnJlbnRQYWdlQXJlYSA/IG51bGwgOiBwYWdlQXJlYTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBub2RlWyRleHRyYV0udGFyZ2V0ID0gbmV4dFBhZ2VBcmVhOwogIG5vZGVbJGV4dHJhXS5pbmRleCA9IGluZGV4OwogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGhhbmRsZU92ZXJmbG93KG5vZGUsIGV4dHJhTm9kZSwgc3BhY2UpIHsKICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogIGNvbnN0IHNhdmVkID0gcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZTsKICBjb25zdCBzYXZlZE1ldGhvZCA9IGV4dHJhTm9kZVskZ2V0U3ViZm9ybVBhcmVudF07CiAgZXh0cmFOb2RlWyRnZXRTdWJmb3JtUGFyZW50XSA9ICgpID0+IG5vZGU7CiAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgY29uc3QgcmVzID0gZXh0cmFOb2RlWyR0b0hUTUxdKHNwYWNlKTsKICBub2RlWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogIHJvb3RbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSBzYXZlZDsKICBleHRyYU5vZGVbJGdldFN1YmZvcm1QYXJlbnRdID0gc2F2ZWRNZXRob2Q7Cn0KY2xhc3MgQXBwZWFyYW5jZUZpbHRlciBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhcHBlYXJhbmNlRmlsdGVyIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBBcmMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXJjIiwgdHJ1ZSk7CiAgICB0aGlzLmNpcmN1bGFyID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY2lyY3VsYXIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zdGFydEFuZ2xlID0gZ2V0RmxvYXQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0QW5nbGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLnN3ZWVwQW5nbGUgPSBnZXRGbG9hdCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3dlZXBBbmdsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAzNjAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZWRnZSA9IG51bGw7CiAgICB0aGlzLmZpbGwgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlIHx8IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAodGhpcy5maWxsPy5wcmVzZW5jZSA9PT0gInZpc2libGUiKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuZmlsbFskdG9TdHlsZV0oKSk7CiAgICB9IGVsc2UgewogICAgICBzdHlsZS5maWxsID0gInRyYW5zcGFyZW50IjsKICAgIH0KICAgIHN0eWxlLnN0cm9rZVdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKGVkZ2UucHJlc2VuY2UgPT09ICJ2aXNpYmxlIiA/IGVkZ2UudGhpY2tuZXNzIDogMCk7CiAgICBzdHlsZS5zdHJva2UgPSBlZGdlU3R5bGUuY29sb3I7CiAgICBsZXQgYXJjOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgc3R5bGU6IHsKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgIG92ZXJmbG93OiAidmlzaWJsZSIKICAgICAgfQogICAgfTsKICAgIGlmICh0aGlzLnN3ZWVwQW5nbGUgPT09IDM2MCkgewogICAgICBhcmMgPSB7CiAgICAgICAgbmFtZTogImVsbGlwc2UiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgICBjeDogIjUwJSIsCiAgICAgICAgICBjeTogIjUwJSIsCiAgICAgICAgICByeDogIjUwJSIsCiAgICAgICAgICByeTogIjUwJSIsCiAgICAgICAgICBzdHlsZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSB0aGlzLnN0YXJ0QW5nbGUgKiBNYXRoLlBJIC8gMTgwOwogICAgICBjb25zdCBzd2VlcEFuZ2xlID0gdGhpcy5zd2VlcEFuZ2xlICogTWF0aC5QSSAvIDE4MDsKICAgICAgY29uc3QgbGFyZ2VBcmMgPSB0aGlzLnN3ZWVwQW5nbGUgPiAxODAgPyAxIDogMDsKICAgICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IFs1MCAqICgxICsgTWF0aC5jb3Moc3RhcnRBbmdsZSkpLCA1MCAqICgxIC0gTWF0aC5zaW4oc3RhcnRBbmdsZSkpLCA1MCAqICgxICsgTWF0aC5jb3Moc3RhcnRBbmdsZSArIHN3ZWVwQW5nbGUpKSwgNTAgKiAoMSAtIE1hdGguc2luKHN0YXJ0QW5nbGUgKyBzd2VlcEFuZ2xlKSldOwogICAgICBhcmMgPSB7CiAgICAgICAgbmFtZTogInBhdGgiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgICBkOiBgTSAke3gxfSAke3kxfSBBIDUwIDUwIDAgJHtsYXJnZUFyY30gMCAke3gyfSAke3kyfWAsCiAgICAgICAgICB2ZWN0b3JFZmZlY3Q6ICJub24tc2NhbGluZy1zdHJva2UiLAogICAgICAgICAgc3R5bGUKICAgICAgICB9CiAgICAgIH07CiAgICAgIE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgewogICAgICAgIHZpZXdCb3g6ICIwIDAgMTAwIDEwMCIsCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogIm5vbmUiCiAgICAgIH0pOwogICAgfQogICAgY29uc3Qgc3ZnID0gewogICAgICBuYW1lOiAic3ZnIiwKICAgICAgY2hpbGRyZW46IFthcmNdLAogICAgICBhdHRyaWJ1dGVzCiAgICB9OwogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBpZiAoaGFzTWFyZ2luKHBhcmVudCkpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgZGlzcGxheTogImlubGluZSIsCiAgICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW3N2Z10KICAgICAgfSk7CiAgICB9CiAgICBzdmcuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHN2Zyk7CiAgfQp9CmNsYXNzIEFyZWEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXJlYSIsIHRydWUpOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZHJhdyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGNsR3JvdXAgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogICpbJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIHlpZWxkKiBnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKTsKICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICAgIHRoaXNbJGV4dHJhXS53aWR0aCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS53aWR0aCwgeCArIHcpOwogICAgdGhpc1skZXh0cmFdLmhlaWdodCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS5oZWlnaHQsIHkgKyBoKTsKICAgIHRoaXNbJGV4dHJhXS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybiB0aGlzWyRleHRyYV0uYXZhaWxhYmxlU3BhY2U7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJwb3NpdGlvbiIpOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogWyJ4ZmFBcmVhIl0KICAgIH07CiAgICBpZiAoaXNQcmludE9ubHkodGhpcykpIHsKICAgICAgYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlCiAgICB9OwogICAgY29uc3QgcmVzdWx0ID0gdGhpc1skY2hpbGRyZW5Ub0hUTUxdKHsKICAgICAgZmlsdGVyOiBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImZpZWxkIiwgImV4Y2xHcm91cCIsICJzdWJmb3JtIiwgInN1YmZvcm1TZXQiXSksCiAgICAgIGluY2x1ZGU6IHRydWUKICAgIH0pOwogICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgewogICAgICBpZiAocmVzdWx0LmlzQnJlYWsoKSkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIHN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHRoaXNbJGV4dHJhXS53aWR0aCk7CiAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcodGhpc1skZXh0cmFdLmhlaWdodCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBjb25zdCBiYm94ID0gW3RoaXMueCwgdGhpcy55LCB0aGlzWyRleHRyYV0ud2lkdGgsIHRoaXNbJGV4dHJhXS5oZWlnaHRdOwogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoaHRtbCwgYmJveCk7CiAgfQp9CmNsYXNzIEFzc2lzdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhc3Npc3QiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5yb2xlID0gYXR0cmlidXRlcy5yb2xlIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc3BlYWsgPSBudWxsOwogICAgdGhpcy50b29sVGlwID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgcmV0dXJuIHRoaXMudG9vbFRpcD8uWyRjb250ZW50XSB8fCBudWxsOwogIH0KfQpjbGFzcyBCYXJjb2RlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJhcmNvZGUiLCB0cnVlKTsKICAgIHRoaXMuY2hhckVuY29kaW5nID0gZ2V0S2V5d29yZCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY2hhckVuY29kaW5nID8gYXR0cmlidXRlcy5jaGFyRW5jb2RpbmcudG9Mb3dlckNhc2UoKSA6ICIiLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogayA9PiBbInV0Zi04IiwgImJpZy1maXZlIiwgImZvbnRzcGVjaWZpYyIsICJnYmsiLCAiZ2ItMTgwMzAiLCAiZ2ItMjMxMiIsICJrc2MtNTYwMSIsICJub25lIiwgInNoaWZ0LWppcyIsICJ1Y3MtMiIsICJ1dGYtMTYiXS5pbmNsdWRlcyhrKSB8fCBrLm1hdGNoKC9pc28tODg1OS1cZHsyfS8pCiAgICB9KTsKICAgIHRoaXMuY2hlY2tzdW0gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5jaGVja3N1bSwgWyJub25lIiwgIjFtb2QxMCIsICIxbW9kMTBfMW1vZDExIiwgIjJtb2QxMCIsICJhdXRvIl0pOwogICAgdGhpcy5kYXRhQ29sdW1uQ291bnQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kYXRhQ29sdW1uQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmRhdGFMZW5ndGggPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kYXRhTGVuZ3RoLAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5kYXRhUHJlcCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRhdGFQcmVwLCBbIm5vbmUiLCAiZmxhdGVDb21wcmVzcyJdKTsKICAgIHRoaXMuZGF0YVJvd0NvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGF0YVJvd0NvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5lbmRDaGFyID0gYXR0cmlidXRlcy5lbmRDaGFyIHx8ICIiOwogICAgdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmVycm9yQ29ycmVjdGlvbkxldmVsLAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAgJiYgeCA8PSA4CiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tb2R1bGVIZWlnaHQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1vZHVsZUhlaWdodCwgIjVtbSIpOwogICAgdGhpcy5tb2R1bGVXaWR0aCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubW9kdWxlV2lkdGgsICIwLjI1bW0iKTsKICAgIHRoaXMucHJpbnRDaGVja0RpZ2l0ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucHJpbnRDaGVja0RpZ2l0LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5yb3dDb2x1bW5SYXRpbyA9IGdldFJhdGlvKGF0dHJpYnV0ZXMucm93Q29sdW1uUmF0aW8pOwogICAgdGhpcy5zdGFydENoYXIgPSBhdHRyaWJ1dGVzLnN0YXJ0Q2hhciB8fCAiIjsKICAgIHRoaXMudGV4dExvY2F0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudGV4dExvY2F0aW9uLCBbImJlbG93IiwgImFib3ZlIiwgImFib3ZlRW1iZWRkZWQiLCAiYmVsb3dFbWJlZGRlZCIsICJub25lIl0pOwogICAgdGhpcy50cnVuY2F0ZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRydW5jYXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSA/IGF0dHJpYnV0ZXMudHlwZS50b0xvd2VyQ2FzZSgpIDogIiIsIFsiYXp0ZWMiLCAiY29kYWJhciIsICJjb2RlMm9mNWluZHVzdHJpYWwiLCAiY29kZTJvZjVpbnRlcmxlYXZlZCIsICJjb2RlMm9mNW1hdHJpeCIsICJjb2RlMm9mNXN0YW5kYXJkIiwgImNvZGUzb2Y5IiwgImNvZGUzb2Y5ZXh0ZW5kZWQiLCAiY29kZTExIiwgImNvZGU0OSIsICJjb2RlOTMiLCAiY29kZTEyOCIsICJjb2RlMTI4YSIsICJjb2RlMTI4YiIsICJjb2RlMTI4YyIsICJjb2RlMTI4c3NjYyIsICJkYXRhbWF0cml4IiwgImVhbjgiLCAiZWFuOGFkZDIiLCAiZWFuOGFkZDUiLCAiZWFuMTMiLCAiZWFuMTNhZGQyIiwgImVhbjEzYWRkNSIsICJlYW4xM3B3Y2QiLCAiZmltIiwgImxvZ21hcnMiLCAibWF4aWNvZGUiLCAibXNpIiwgInBkZjQxNyIsICJwZGY0MTdtYWNybyIsICJwbGVzc2V5IiwgInBvc3RhdXNjdXN0MiIsICJwb3N0YXVzY3VzdDMiLCAicG9zdGF1c3JlcGx5cGFpZCIsICJwb3N0YXVzc3RhbmRhcmQiLCAicG9zdHVrcm00c2NjIiwgInBvc3R1c2RwYmMiLCAicG9zdHVzaW1iIiwgInBvc3R1c3N0YW5kYXJkIiwgInBvc3R1czV6aXAiLCAicXJjb2RlIiwgInJmaWQiLCAicnNzMTQiLCAicnNzMTRleHBhbmRlZCIsICJyc3MxNGxpbWl0ZWQiLCAicnNzMTRzdGFja2VkIiwgInJzczE0c3RhY2tlZG9tbmkiLCAicnNzMTR0cnVuY2F0ZWQiLCAidGVsZXBlbiIsICJ1Y2MxMjgiLCAidWNjMTI4cmFuZG9tIiwgInVjYzEyOHNzY2MiLCAidXBjYSIsICJ1cGNhYWRkMiIsICJ1cGNhYWRkNSIsICJ1cGNhcHdjZCIsICJ1cGNlIiwgInVwY2VhZGQyIiwgInVwY2VhZGQ1IiwgInVwY2VhbjIiLCAidXBjZWFuNSIsICJ1cHNtYXhpY29kZSJdKTsKICAgIHRoaXMudXBzTW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnVwc01vZGUsIFsidXNDYXJyaWVyIiwgImludGVybmF0aW9uYWxDYXJyaWVyIiwgInNlY3VyZVN5bWJvbCIsICJzdGFuZGFyZFN5bWJvbCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLndpZGVOYXJyb3dSYXRpbyA9IGdldFJhdGlvKGF0dHJpYnV0ZXMud2lkZU5hcnJvd1JhdGlvKTsKICAgIHRoaXMuZW5jcnlwdCA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQp9CmNsYXNzIEJpbmQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYmluZCIsIHRydWUpOwogICAgdGhpcy5tYXRjaCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1hdGNoLCBbIm9uY2UiLCAiZGF0YVJlZiIsICJnbG9iYWwiLCAibm9uZSJdKTsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogIH0KfQpjbGFzcyBCaW5kSXRlbXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYmluZEl0ZW1zIik7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLmxhYmVsUmVmID0gYXR0cmlidXRlcy5sYWJlbFJlZiB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnZhbHVlUmVmID0gYXR0cmlidXRlcy52YWx1ZVJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgQm9va2VuZCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJib29rZW5kIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBCb29sZWFuRWxlbWVudCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJvb2xlYW4iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gPT09IDEgPyAiMSIgOiAiMCIpOwogIH0KfQpjbGFzcyBCb3JkZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYm9yZGVyIiwgdHJ1ZSk7CiAgICB0aGlzLmJyZWFrID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYnJlYWssIFsiY2xvc2UiLCAib3BlbiJdKTsKICAgIHRoaXMuaGFuZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhhbmQsIFsiZXZlbiIsICJsZWZ0IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29ybmVyID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5lZGdlID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWxsID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyRnZXRFeHRyYV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICBjb25zdCBlZGdlcyA9IHRoaXMuZWRnZS5jaGlsZHJlbi5zbGljZSgpOwogICAgICBpZiAoZWRnZXMubGVuZ3RoIDwgNCkgewogICAgICAgIGNvbnN0IGRlZmF1bHRFZGdlID0gZWRnZXMuYXQoLTEpIHx8IG5ldyBFZGdlKHt9KTsKICAgICAgICBmb3IgKGxldCBpID0gZWRnZXMubGVuZ3RoOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBlZGdlcy5wdXNoKGRlZmF1bHRFZGdlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgd2lkdGhzID0gZWRnZXMubWFwKGVkZ2UgPT4gZWRnZS50aGlja25lc3MpOwogICAgICBjb25zdCBpbnNldHMgPSBbMCwgMCwgMCwgMF07CiAgICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICAgIGluc2V0c1swXSA9IHRoaXMubWFyZ2luLnRvcEluc2V0OwogICAgICAgIGluc2V0c1sxXSA9IHRoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgICAgaW5zZXRzWzJdID0gdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICAgICAgaW5zZXRzWzNdID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0OwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgICB3aWR0aHMsCiAgICAgICAgaW5zZXRzLAogICAgICAgIGVkZ2VzCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpc1skZXh0cmFdOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3QgewogICAgICBlZGdlcwogICAgfSA9IHRoaXNbJGdldEV4dHJhXSgpOwogICAgY29uc3QgZWRnZVN0eWxlcyA9IGVkZ2VzLm1hcChub2RlID0+IHsKICAgICAgY29uc3Qgc3R5bGUgPSBub2RlWyR0b1N0eWxlXSgpOwogICAgICBzdHlsZS5jb2xvciB8fD0gIiMwMDAwMDAiOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9KTsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLm1hcmdpblskdG9TdHlsZV0oKSk7CiAgICB9CiAgICBpZiAodGhpcy5maWxsPy5wcmVzZW5jZSA9PT0gInZpc2libGUiKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuZmlsbFskdG9TdHlsZV0oKSk7CiAgICB9CiAgICBpZiAodGhpcy5jb3JuZXIuY2hpbGRyZW4uc29tZShub2RlID0+IG5vZGUucmFkaXVzICE9PSAwKSkgewogICAgICBjb25zdCBjb3JuZXJTdHlsZXMgPSB0aGlzLmNvcm5lci5jaGlsZHJlbi5tYXAobm9kZSA9PiBub2RlWyR0b1N0eWxlXSgpKTsKICAgICAgaWYgKGNvcm5lclN0eWxlcy5sZW5ndGggPT09IDIgfHwgY29ybmVyU3R5bGVzLmxlbmd0aCA9PT0gMykgewogICAgICAgIGNvbnN0IGxhc3QgPSBjb3JuZXJTdHlsZXMuYXQoLTEpOwogICAgICAgIGZvciAobGV0IGkgPSBjb3JuZXJTdHlsZXMubGVuZ3RoOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBjb3JuZXJTdHlsZXMucHVzaChsYXN0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3R5bGUuYm9yZGVyUmFkaXVzID0gY29ybmVyU3R5bGVzLm1hcChzID0+IHMucmFkaXVzKS5qb2luKCIgIik7CiAgICB9CiAgICBzd2l0Y2ggKHRoaXMucHJlc2VuY2UpIHsKICAgICAgY2FzZSAiaW52aXNpYmxlIjoKICAgICAgY2FzZSAiaGlkZGVuIjoKICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9ICIiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJpbmFjdGl2ZSI6CiAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSAibm9uZSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSBlZGdlU3R5bGVzLm1hcChzID0+IHMuc3R5bGUpLmpvaW4oIiAiKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHN0eWxlLmJvcmRlcldpZHRoID0gZWRnZVN0eWxlcy5tYXAocyA9PiBzLndpZHRoKS5qb2luKCIgIik7CiAgICBzdHlsZS5ib3JkZXJDb2xvciA9IGVkZ2VTdHlsZXMubWFwKHMgPT4gcy5jb2xvcikuam9pbigiICIpOwogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBCcmVhayBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJicmVhayIsIHRydWUpOwogICAgdGhpcy5hZnRlciA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFmdGVyLCBbImF1dG8iLCAiY29udGVudEFyZWEiLCAicGFnZUFyZWEiLCAicGFnZUV2ZW4iLCAicGFnZU9kZCJdKTsKICAgIHRoaXMuYWZ0ZXJUYXJnZXQgPSBhdHRyaWJ1dGVzLmFmdGVyVGFyZ2V0IHx8ICIiOwogICAgdGhpcy5iZWZvcmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5iZWZvcmUsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSIsICJwYWdlRXZlbiIsICJwYWdlT2RkIl0pOwogICAgdGhpcy5iZWZvcmVUYXJnZXQgPSBhdHRyaWJ1dGVzLmJlZm9yZVRhcmdldCB8fCAiIjsKICAgIHRoaXMuYm9va2VuZExlYWRlciA9IGF0dHJpYnV0ZXMuYm9va2VuZExlYWRlciB8fCAiIjsKICAgIHRoaXMuYm9va2VuZFRyYWlsZXIgPSBhdHRyaWJ1dGVzLmJvb2tlbmRUcmFpbGVyIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJmbG93TGVhZGVyID0gYXR0cmlidXRlcy5vdmVyZmxvd0xlYWRlciB8fCAiIjsKICAgIHRoaXMub3ZlcmZsb3dUYXJnZXQgPSBhdHRyaWJ1dGVzLm92ZXJmbG93VGFyZ2V0IHx8ICIiOwogICAgdGhpcy5vdmVyZmxvd1RyYWlsZXIgPSBhdHRyaWJ1dGVzLm92ZXJmbG93VHJhaWxlciB8fCAiIjsKICAgIHRoaXMuc3RhcnROZXcgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zdGFydE5ldywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQp9CmNsYXNzIEJyZWFrQWZ0ZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYnJlYWtBZnRlciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxlYWRlciA9IGF0dHJpYnV0ZXMubGVhZGVyIHx8ICIiOwogICAgdGhpcy5zdGFydE5ldyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0TmV3LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICAgIHRoaXMudGFyZ2V0VHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRhcmdldFR5cGUsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSJdKTsKICAgIHRoaXMudHJhaWxlciA9IGF0dHJpYnV0ZXMudHJhaWxlciB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQp9CmNsYXNzIEJyZWFrQmVmb3JlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJyZWFrQmVmb3JlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnN0YXJ0TmV3ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3RhcnROZXcsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy50YXJnZXRUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudGFyZ2V0VHlwZSwgWyJhdXRvIiwgImNvbnRlbnRBcmVhIiwgInBhZ2VBcmVhIl0pOwogICAgdGhpcy50cmFpbGVyID0gYXR0cmlidXRlcy50cmFpbGVyIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICB0aGlzWyRleHRyYV0gPSB7fTsKICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgfQp9CmNsYXNzIEJ1dHRvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJidXR0b24iLCB0cnVlKTsKICAgIHRoaXMuaGlnaGxpZ2h0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaGlnaGxpZ2h0LCBbImludmVydGVkIiwgIm5vbmUiLCAib3V0bGluZSIsICJwdXNoIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGh0bWxCdXR0b24gPSB7CiAgICAgIG5hbWU6ICJidXR0b24iLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhQnV0dG9uIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZ3JhbmRwYS5ldmVudC5jaGlsZHJlbikgewogICAgICBpZiAoZXZlbnQuYWN0aXZpdHkgIT09ICJjbGljayIgfHwgIWV2ZW50LnNjcmlwdCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGpzVVJMID0gcmVjb3ZlckpzVVJMKGV2ZW50LnNjcmlwdFskY29udGVudF0pOwogICAgICBpZiAoIWpzVVJMKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaHJlZiA9IGZpeFVSTChqc1VSTC51cmwpOwogICAgICBpZiAoIWhyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBodG1sQnV0dG9uLmNoaWxkcmVuLnB1c2goewogICAgICAgIG5hbWU6ICJhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBpZDogImxpbmsiICsgdGhpc1skdWlkXSwKICAgICAgICAgIGhyZWYsCiAgICAgICAgICBuZXdXaW5kb3c6IGpzVVJMLm5ld1dpbmRvdywKICAgICAgICAgIGNsYXNzOiBbInhmYUxpbmsiXSwKICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sCiAgICAgICAgY2hpbGRyZW46IFtdCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhodG1sQnV0dG9uKTsKICB9Cn0KY2xhc3MgQ2FsY3VsYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNhbGN1bGF0ZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJyaWRlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3ZlcnJpZGUsIFsiZGlzYWJsZWQiLCAiZXJyb3IiLCAiaWdub3JlIiwgIndhcm5pbmciXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9Cn0KY2xhc3MgQ2FwdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjYXB0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucGxhY2VtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucGxhY2VtZW50LCBbImxlZnQiLCAiYm90dG9tIiwgImlubGluZSIsICJyaWdodCIsICJ0b3AiXSk7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZXNlcnZlID0gTWF0aC5jZWlsKGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMucmVzZXJ2ZSkpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBfc2V0VmFsdWUodGhpcywgdmFsdWUpOwogIH0KICBbJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgbGV0IHsKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQKICAgICAgfSA9IGF2YWlsYWJsZVNwYWNlOwogICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7CiAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgIGNhc2UgImlubGluZSI6CiAgICAgICAgICB3aWR0aCA9IHRoaXMucmVzZXJ2ZSA8PSAwID8gd2lkdGggOiB0aGlzLnJlc2VydmU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICBoZWlnaHQgPSB0aGlzLnJlc2VydmUgPD0gMCA/IGhlaWdodCA6IHRoaXMucmVzZXJ2ZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXSA9IGxheW91dE5vZGUodGhpcywgewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodAogICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKCF0aGlzLnZhbHVlKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWw7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgY29uc3Qgc2F2ZWRSZXNlcnZlID0gdGhpcy5yZXNlcnZlOwogICAgaWYgKHRoaXMucmVzZXJ2ZSA8PSAwKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICB3LAogICAgICAgIGgKICAgICAgfSA9IHRoaXNbJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSk7CiAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgIHRoaXMucmVzZXJ2ZSA9IHc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICB0aGlzLnJlc2VydmUgPSBoOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICBuYW1lOiAiI3RleHQiLAogICAgICAgIHZhbHVlCiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgY2hpbGRyZW4ucHVzaCh2YWx1ZSk7CiAgICB9CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImZvbnQiLCAibWFyZ2luIiwgInZpc2liaWxpdHkiKTsKICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICBpZiAodGhpcy5yZXNlcnZlID4gMCkgewogICAgICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5yZXNlcnZlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInRvcCI6CiAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgaWYgKHRoaXMucmVzZXJ2ZSA+IDApIHsKICAgICAgICAgIHN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLnJlc2VydmUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIHNldFBhcmEodGhpcywgbnVsbCwgdmFsdWUpOwogICAgdGhpc1skcG9wUGFyYV0oKTsKICAgIHRoaXMucmVzZXJ2ZSA9IHNhdmVkUmVzZXJ2ZTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlLAogICAgICAgIGNsYXNzOiBbInhmYUNhcHRpb24iXQogICAgICB9LAogICAgICBjaGlsZHJlbgogICAgfSk7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNlcnRpZmljYXRlIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjZXJ0aWZpY2F0ZXMiLCB0cnVlKTsKICAgIHRoaXMuY3JlZGVudGlhbFNlcnZlclBvbGljeSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXJsID0gYXR0cmlidXRlcy51cmwgfHwgIiI7CiAgICB0aGlzLnVybFBvbGljeSA9IGF0dHJpYnV0ZXMudXJsUG9saWN5IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmlzc3VlcnMgPSBudWxsOwogICAgdGhpcy5rZXlVc2FnZSA9IG51bGw7CiAgICB0aGlzLm9pZHMgPSBudWxsOwogICAgdGhpcy5zaWduaW5nID0gbnVsbDsKICAgIHRoaXMuc3ViamVjdEROcyA9IG51bGw7CiAgfQp9CmNsYXNzIENoZWNrQnV0dG9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNoZWNrQnV0dG9uIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubWFyayA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1hcmssIFsiZGVmYXVsdCIsICJjaGVjayIsICJjaXJjbGUiLCAiY3Jvc3MiLCAiZGlhbW9uZCIsICJzcXVhcmUiLCAic3RhciJdKTsKICAgIHRoaXMuc2hhcGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zaGFwZSwgWyJzcXVhcmUiLCAicm91bmQiXSk7CiAgICB0aGlzLnNpemUgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNpemUsICIxMHB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSgibWFyZ2luIik7CiAgICBjb25zdCBzaXplID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMuc2l6ZSk7CiAgICBzdHlsZS53aWR0aCA9IHN0eWxlLmhlaWdodCA9IHNpemU7CiAgICBsZXQgdHlwZTsKICAgIGxldCBjbGFzc05hbWU7CiAgICBsZXQgZ3JvdXBJZDsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBpdGVtcyA9IGZpZWxkLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCAmJiBmaWVsZC5pdGVtcy5jaGlsZHJlblswXVskdG9IVE1MXSgpLmh0bWwgfHwgW107CiAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gewogICAgICBvbjogKGl0ZW1zWzBdICE9PSB1bmRlZmluZWQgPyBpdGVtc1swXSA6ICJvbiIpLnRvU3RyaW5nKCksCiAgICAgIG9mZjogKGl0ZW1zWzFdICE9PSB1bmRlZmluZWQgPyBpdGVtc1sxXSA6ICJvZmYiKS50b1N0cmluZygpCiAgICB9OwogICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZT8uWyR0ZXh0XSgpIHx8ICJvZmYiOwogICAgY29uc3QgY2hlY2tlZCA9IHZhbHVlID09PSBleHBvcnRlZFZhbHVlLm9uIHx8IHVuZGVmaW5lZDsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGZpZWxkWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgY29uc3QgZmllbGRJZCA9IGZpZWxkWyR1aWRdOwogICAgbGV0IGRhdGFJZDsKICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFeGNsR3JvdXApIHsKICAgICAgZ3JvdXBJZCA9IGNvbnRhaW5lclskdWlkXTsKICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgIGNsYXNzTmFtZSA9ICJ4ZmFSYWRpbyI7CiAgICAgIGRhdGFJZCA9IGNvbnRhaW5lclskZGF0YV0/LlskdWlkXSB8fCBjb250YWluZXJbJHVpZF07CiAgICB9IGVsc2UgewogICAgICB0eXBlID0gImNoZWNrYm94IjsKICAgICAgY2xhc3NOYW1lID0gInhmYUNoZWNrYm94IjsKICAgICAgZGF0YUlkID0gZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF07CiAgICB9CiAgICBjb25zdCBpbnB1dCA9IHsKICAgICAgbmFtZTogImlucHV0IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbY2xhc3NOYW1lXSwKICAgICAgICBzdHlsZSwKICAgICAgICBmaWVsZElkLAogICAgICAgIGRhdGFJZCwKICAgICAgICB0eXBlLAogICAgICAgIGNoZWNrZWQsCiAgICAgICAgeGZhT246IGV4cG9ydGVkVmFsdWUub24sCiAgICAgICAgeGZhT2ZmOiBleHBvcnRlZFZhbHVlLm9mZiwKICAgICAgICAiYXJpYS1sYWJlbCI6IGFyaWFMYWJlbChmaWVsZCksCiAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICB9CiAgICB9OwogICAgaWYgKGdyb3VwSWQpIHsKICAgICAgaW5wdXQuYXR0cmlidXRlcy5uYW1lID0gZ3JvdXBJZDsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBpbnB1dC5hdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl0gPSB0cnVlOwogICAgICBpbnB1dC5hdHRyaWJ1dGVzLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW2lucHV0XQogICAgfSk7CiAgfQp9CmNsYXNzIENob2ljZUxpc3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY2hvaWNlTGlzdCIsIHRydWUpOwogICAgdGhpcy5jb21taXRPbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNvbW1pdE9uLCBbInNlbGVjdCIsICJleGl0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vcGVuLCBbInVzZXJDb250cm9sIiwgImFsd2F5cyIsICJtdWx0aVNlbGVjdCIsICJvbkVudHJ5Il0pOwogICAgdGhpcy50ZXh0RW50cnkgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy50ZXh0RW50cnksCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiYm9yZGVyIiwgIm1hcmdpbiIpOwogICAgY29uc3QgdWkgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBmaWVsZCA9IHVpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBmb250U2l6ZSA9IGZpZWxkLmZvbnQ/LnNpemUgfHwgMTA7CiAgICBjb25zdCBvcHRpb25TdHlsZSA9IHsKICAgICAgZm9udFNpemU6IGBjYWxjKCR7Zm9udFNpemV9cHggKiB2YXIoLS10b3RhbC1zY2FsZS1mYWN0b3IpKWAKICAgIH07CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgaWYgKGZpZWxkLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgaXRlbXMgPSBmaWVsZC5pdGVtczsKICAgICAgbGV0IGRpc3BsYXllZEluZGV4ID0gMDsKICAgICAgbGV0IHNhdmVJbmRleCA9IDA7CiAgICAgIGlmIChpdGVtcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHsKICAgICAgICBkaXNwbGF5ZWRJbmRleCA9IGl0ZW1zLmNoaWxkcmVuWzBdLnNhdmU7CiAgICAgICAgc2F2ZUluZGV4ID0gMSAtIGRpc3BsYXllZEluZGV4OwogICAgICB9CiAgICAgIGNvbnN0IGRpc3BsYXllZCA9IGl0ZW1zLmNoaWxkcmVuW2Rpc3BsYXllZEluZGV4XVskdG9IVE1MXSgpLmh0bWw7CiAgICAgIGNvbnN0IHZhbHVlcyA9IGl0ZW1zLmNoaWxkcmVuW3NhdmVJbmRleF1bJHRvSFRNTF0oKS5odG1sOwogICAgICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZT8uWyR0ZXh0XSgpIHx8ICIiOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkaXNwbGF5ZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IG9wdGlvbiA9IHsKICAgICAgICAgIG5hbWU6ICJvcHRpb24iLAogICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICB2YWx1ZTogdmFsdWVzW2ldIHx8IGRpc3BsYXllZFtpXSwKICAgICAgICAgICAgc3R5bGU6IG9wdGlvblN0eWxlCiAgICAgICAgICB9LAogICAgICAgICAgdmFsdWU6IGRpc3BsYXllZFtpXQogICAgICAgIH07CiAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpIHsKICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjaGlsZHJlbi5wdXNoKG9wdGlvbik7CiAgICAgIH0KICAgICAgaWYgKCFzZWxlY3RlZCkgewogICAgICAgIGNoaWxkcmVuLnNwbGljZSgwLCAwLCB7CiAgICAgICAgICBuYW1lOiAib3B0aW9uIiwKICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgaGlkZGVuOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlOiAiICIKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc2VsZWN0QXR0cmlidXRlcyA9IHsKICAgICAgY2xhc3M6IFsieGZhU2VsZWN0Il0sCiAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICBzdHlsZSwKICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAiYXJpYS1yZXF1aXJlZCI6IGZhbHNlCiAgICB9OwogICAgaWYgKGlzUmVxdWlyZWQoZmllbGQpKSB7CiAgICAgIHNlbGVjdEF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIHNlbGVjdEF0dHJpYnV0ZXMucmVxdWlyZWQgPSB0cnVlOwogICAgfQogICAgaWYgKHRoaXMub3BlbiA9PT0gIm11bHRpU2VsZWN0IikgewogICAgICBzZWxlY3RBdHRyaWJ1dGVzLm11bHRpcGxlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW3sKICAgICAgICBuYW1lOiAic2VsZWN0IiwKICAgICAgICBjaGlsZHJlbiwKICAgICAgICBhdHRyaWJ1dGVzOiBzZWxlY3RBdHRyaWJ1dGVzCiAgICAgIH1dCiAgICB9KTsKICB9Cn0KY2xhc3MgQ29sb3IgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29sb3IiLCB0cnVlKTsKICAgIHRoaXMuY1NwYWNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY1NwYWNlLCBbIlNSR0IiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZhbHVlID0gYXR0cmlidXRlcy52YWx1ZSA/IGdldENvbG9yKGF0dHJpYnV0ZXMudmFsdWUpIDogIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskaGFzU2V0dGFibGVWYWx1ZV0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICByZXR1cm4gdGhpcy52YWx1ZSA/IFV0aWwubWFrZUhleENvbG9yKHRoaXMudmFsdWUuciwgdGhpcy52YWx1ZS5nLCB0aGlzLnZhbHVlLmIpIDogbnVsbDsKICB9Cn0KY2xhc3MgQ29tYiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb21iIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubnVtYmVyT2ZDZWxscyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm51bWJlck9mQ2VsbHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIENvbm5lY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29ubmVjdCIsIHRydWUpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy51c2FnZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnVzYWdlLCBbImV4cG9ydEFuZEltcG9ydCIsICJleHBvcnRPbmx5IiwgImltcG9ydE9ubHkiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29udGVudEFyZWEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29udGVudEFyZWEiLCB0cnVlKTsKICAgIHRoaXMuaCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuaCk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgbGVmdCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLngpOwogICAgY29uc3QgdG9wID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMueSk7CiAgICBjb25zdCBzdHlsZSA9IHsKICAgICAgbGVmdCwKICAgICAgdG9wLAogICAgICB3aWR0aDogbWVhc3VyZVRvU3RyaW5nKHRoaXMudyksCiAgICAgIGhlaWdodDogbWVhc3VyZVRvU3RyaW5nKHRoaXMuaCkKICAgIH07CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFDb250ZW50YXJlYSJdOwogICAgaWYgKGlzUHJpbnRPbmx5KHRoaXMpKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhUHJpbnRPbmx5Iik7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuOiBbXSwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlLAogICAgICAgIGNsYXNzOiBjbGFzc05hbWVzLAogICAgICAgIGlkOiB0aGlzWyR1aWRdCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBDb3JuZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29ybmVyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW52ZXJ0ZWQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbnZlcnRlZCwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuam9pbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmpvaW4sIFsic3F1YXJlIiwgInJvdW5kIl0pOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmFkaXVzID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5yYWRpdXMpOwogICAgdGhpcy5zdHJva2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zdHJva2UsIFsic29saWQiLCAiZGFzaERvdCIsICJkYXNoRG90RG90IiwgImRhc2hlZCIsICJkb3R0ZWQiLCAiZW1ib3NzZWQiLCAiZXRjaGVkIiwgImxvd2VyZWQiLCAicmFpc2VkIl0pOwogICAgdGhpcy50aGlja25lc3MgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRoaWNrbmVzcywgIjAuNXB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgInZpc2liaWxpdHkiKTsKICAgIHN0eWxlLnJhZGl1cyA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLmpvaW4gPT09ICJzcXVhcmUiID8gMCA6IHRoaXMucmFkaXVzKTsKICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgRGF0ZUVsZW1lbnQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGUiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBkYXRlID0gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgdGhpc1skY29udGVudF0gPSBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSA/IHRoaXNbJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIERhdGVUaW1lIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkYXRlVGltZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRGF0ZVRpbWVFZGl0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGVUaW1lRWRpdCIsIHRydWUpOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5waWNrZXIgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5waWNrZXIsIFsiaG9zdCIsICJub25lIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY29tYiA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJib3JkZXIiLCAiZm9udCIsICJtYXJnaW4iKTsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICAgIGRhdGFJZDogZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhVGV4dGZpZWxkIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIERlY2ltYWwgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRlY2ltYWwiKTsKICAgIHRoaXMuZnJhY0RpZ2l0cyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZyYWNEaWdpdHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMiwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZERpZ2l0cyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmxlYWREaWdpdHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBudW1iZXIgPSBwYXJzZUZsb2F0KHRoaXNbJGNvbnRlbnRdLnRyaW0oKSk7CiAgICB0aGlzWyRjb250ZW50XSA9IGlzTmFOKG51bWJlcikgPyBudWxsIDogbnVtYmVyOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSAhPT0gbnVsbCA/IHRoaXNbJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIERlZmF1bHRVaSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkZWZhdWx0VWkiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgRGVzYyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkZXNjIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBEaWdlc3RNZXRob2QgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGlnZXN0TWV0aG9kIiwgWyIiLCAiU0hBMSIsICJTSEEyNTYiLCAiU0hBNTEyIiwgIlJJUEVNRDE2MCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgRGlnZXN0TWV0aG9kcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkaWdlc3RNZXRob2RzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5kaWdlc3RNZXRob2QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRHJhdyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkcmF3IiwgdHJ1ZSk7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxvY2FsZSA9IGF0dHJpYnV0ZXMubG9jYWxlIHx8ICIiOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWluSCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy5yb3RhdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5yb3RhdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCAlIDkwID09PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBhdHRyaWJ1dGVzLncgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpIDogIiI7CiAgICB0aGlzLnggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5hc3Npc3QgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jYXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZvbnQgPSBudWxsOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnVpID0gbnVsbDsKICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJHNldFZhbHVlXSh2YWx1ZSkgewogICAgX3NldFZhbHVlKHRoaXMsIHZhbHVlKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBzZXRUYWJJbmRleCh0aGlzKTsKICAgIGlmICh0aGlzLnByZXNlbmNlID09PSAiaGlkZGVuIiB8fCB0aGlzLnByZXNlbmNlID09PSAiaW5hY3RpdmUiKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgZml4RGltZW5zaW9ucyh0aGlzKTsKICAgIHRoaXNbJHB1c2hQYXJhXSgpOwogICAgY29uc3Qgc2F2ZWRXID0gdGhpcy53OwogICAgY29uc3Qgc2F2ZWRIID0gdGhpcy5oOwogICAgY29uc3QgewogICAgICB3LAogICAgICBoLAogICAgICBpc0Jyb2tlbgogICAgfSA9IGxheW91dE5vZGUodGhpcywgYXZhaWxhYmxlU3BhY2UpOwogICAgaWYgKHcgJiYgdGhpcy53ID09PSAiIikgewogICAgICBpZiAoaXNCcm9rZW4gJiYgdGhpc1skZ2V0U3ViZm9ybVBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKSkgewogICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgICAgfQogICAgICB0aGlzLncgPSB3OwogICAgfQogICAgaWYgKGggJiYgdGhpcy5oID09PSAiIikgewogICAgICB0aGlzLmggPSBoOwogICAgfQogICAgc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBpZiAoIWNoZWNrRGltZW5zaW9ucyh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmb250IiwgImhBbGlnbiIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgInJvdGF0ZSIsICJhbmNob3JUeXBlIiwgImJvcmRlciIsICJtYXJnaW4iKTsKICAgIHNldE1pbk1heERpbWVuc2lvbnModGhpcywgc3R5bGUpOwogICAgaWYgKHN0eWxlLm1hcmdpbikgewogICAgICBzdHlsZS5wYWRkaW5nID0gc3R5bGUubWFyZ2luOwogICAgICBkZWxldGUgc3R5bGUubWFyZ2luOwogICAgfQogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhRHJhdyJdOwogICAgaWYgKHRoaXMuZm9udCkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYUZvbnQiKTsKICAgIH0KICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgfTsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgYmJveCA9IGNvbXB1dGVCYm94KHRoaXMsIGh0bWwsIGF2YWlsYWJsZVNwYWNlKTsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWwgOiBudWxsOwogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgIHRoaXMudyA9IHNhdmVkVzsKICAgICAgdGhpcy5oID0gc2F2ZWRIOwogICAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogICAgfQogICAgaHRtbC5jaGlsZHJlbi5wdXNoKHZhbHVlKTsKICAgIHNldFBhcmEodGhpcywgc3R5bGUsIHZhbHVlKTsKICAgIHRoaXMudyA9IHNhdmVkVzsKICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogIH0KfQpjbGFzcyBFZGdlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVkZ2UiLCB0cnVlKTsKICAgIHRoaXMuY2FwID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY2FwLCBbInNxdWFyZSIsICJidXR0IiwgInJvdW5kIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5zdHJva2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zdHJva2UsIFsic29saWQiLCAiZGFzaERvdCIsICJkYXNoRG90RG90IiwgImRhc2hlZCIsICJkb3R0ZWQiLCAiZW1ib3NzZWQiLCAiZXRjaGVkIiwgImxvd2VyZWQiLCAicmFpc2VkIl0pOwogICAgdGhpcy50aGlja25lc3MgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRoaWNrbmVzcywgIjAuNXB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgInZpc2liaWxpdHkiKTsKICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHsKICAgICAgbGluZWNhcDogdGhpcy5jYXAsCiAgICAgIHdpZHRoOiBtZWFzdXJlVG9TdHJpbmcodGhpcy50aGlja25lc3MpLAogICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCIsCiAgICAgIHN0eWxlOiAiIgogICAgfSk7CiAgICBpZiAodGhpcy5wcmVzZW5jZSAhPT0gInZpc2libGUiKSB7CiAgICAgIHN0eWxlLnN0eWxlID0gIm5vbmUiOwogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoICh0aGlzLnN0cm9rZSkgewogICAgICAgIGNhc2UgInNvbGlkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gInNvbGlkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3REb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJkYXNoZWQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZG90dGVkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gImRvdHRlZCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJlbWJvc3NlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJyaWRnZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJldGNoZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZ3Jvb3ZlIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvd2VyZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiaW5zZXQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmFpc2VkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gIm91dHNldCI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBFbmNvZGluZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNvZGluZyIsIFsiYWRiZS54NTA5LnJzYV9zaGExIiwgImFkYmUucGtjczcuZGV0YWNoZWQiLCAiYWRiZS5wa2NzNy5zaGExIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFbmNvZGluZ3MgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jb2RpbmdzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNvZGluZyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFbmNyeXB0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHQiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0RGF0YSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNyeXB0RGF0YSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJlbmNyeXB0IiwgImRlY3J5cHQiXSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb24iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2QgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jcnlwdGlvbk1ldGhvZCIsIFsiIiwgIkFFUzI1Ni1DQkMiLCAiVFJJUExFREVTLUNCQyIsICJBRVMxMjgtQ0JDIiwgIkFFUzE5Mi1DQkMiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2RzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb25NZXRob2RzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNyeXB0aW9uTWV0aG9kID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEV2ZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV2ZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFjdGl2aXR5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYWN0aXZpdHksIFsiY2xpY2siLCAiY2hhbmdlIiwgImRvY0Nsb3NlIiwgImRvY1JlYWR5IiwgImVudGVyIiwgImV4aXQiLCAiZnVsbCIsICJpbmRleENoYW5nZSIsICJpbml0aWFsaXplIiwgIm1vdXNlRG93biIsICJtb3VzZUVudGVyIiwgIm1vdXNlRXhpdCIsICJtb3VzZVVwIiwgInBvc3RFeGVjdXRlIiwgInBvc3RPcGVuIiwgInBvc3RQcmludCIsICJwb3N0U2F2ZSIsICJwb3N0U2lnbiIsICJwb3N0U3VibWl0IiwgInByZUV4ZWN1dGUiLCAicHJlT3BlbiIsICJwcmVQcmludCIsICJwcmVTYXZlIiwgInByZVNpZ24iLCAicHJlU3VibWl0IiwgInJlYWR5IiwgInZhbGlkYXRpb25TdGF0ZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5saXN0ZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5saXN0ZW4sIFsicmVmT25seSIsICJyZWZBbmREZXNjZW5kZW50cyJdKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG51bGw7CiAgICB0aGlzLmV4ZWN1dGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy5zaWduRGF0YSA9IG51bGw7CiAgICB0aGlzLnN1Ym1pdCA9IG51bGw7CiAgfQp9CmNsYXNzIEV4RGF0YSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhEYXRhIik7CiAgICB0aGlzLmNvbnRlbnRUeXBlID0gYXR0cmlidXRlcy5jb250ZW50VHlwZSB8fCAiIjsKICAgIHRoaXMuaHJlZiA9IGF0dHJpYnV0ZXMuaHJlZiB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tYXhMZW5ndGggPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXhMZW5ndGgsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gLTEKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yaWQgPSBhdHRyaWJ1dGVzLnJpZCB8fCAiIjsKICAgIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRyYW5zZmVyRW5jb2RpbmcsIFsibm9uZSIsICJiYXNlNjQiLCAicGFja2FnZSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskaXNDREFUQVhtbF0oKSB7CiAgICByZXR1cm4gdGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQvaHRtbCI7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlID09PSAidGV4dC9odG1sIiAmJiBjaGlsZFskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1skY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQveG1sIikgewogICAgICB0aGlzWyRjb250ZW50XSA9IGNoaWxkOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSAhPT0gInRleHQvaHRtbCIgfHwgIXRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICB9Cn0KY2xhc3MgRXhPYmplY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhPYmplY3QiLCB0cnVlKTsKICAgIHRoaXMuYXJjaGl2ZSA9IGF0dHJpYnV0ZXMuYXJjaGl2ZSB8fCAiIjsKICAgIHRoaXMuY2xhc3NJZCA9IGF0dHJpYnV0ZXMuY2xhc3NJZCB8fCAiIjsKICAgIHRoaXMuY29kZUJhc2UgPSBhdHRyaWJ1dGVzLmNvZGVCYXNlIHx8ICIiOwogICAgdGhpcy5jb2RlVHlwZSA9IGF0dHJpYnV0ZXMuY29kZVR5cGUgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFeGNsR3JvdXAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhjbEdyb3VwIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2VzcyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjY2VzcywgWyJvcGVuIiwgIm5vbkludGVyYWN0aXZlIiwgInByb3RlY3RlZCIsICJyZWFkT25seSJdKTsKICAgIHRoaXMuYWNjZXNzS2V5ID0gYXR0cmlidXRlcy5hY2Nlc3NLZXkgfHwgIiI7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxheW91dCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxheW91dCwgWyJwb3NpdGlvbiIsICJsci10YiIsICJybC1yb3ciLCAicmwtdGIiLCAicm93IiwgInRhYmxlIiwgInRiIl0pOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWluSCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGF0dHJpYnV0ZXMudyA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMudykgOiAiIjsKICAgIHRoaXMueCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueCwgIjBwdCIpOwogICAgdGhpcy55ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy55LCAiMHB0Iik7CiAgICB0aGlzLmFzc2lzdCA9IG51bGw7CiAgICB0aGlzLmJpbmQgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jYWxjdWxhdGUgPSBudWxsOwogICAgdGhpcy5jYXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzYWwgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLmNvbm5lY3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc0JpbmRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJGhhc1NldHRhYmxlVmFsdWVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGQuY2hpbGRyZW4pIHsKICAgICAgaWYgKCFmaWVsZC52YWx1ZSkgewogICAgICAgIGNvbnN0IG5vZGVWYWx1ZSA9IG5ldyBWYWx1ZSh7fSk7CiAgICAgICAgZmllbGRbJGFwcGVuZENoaWxkXShub2RlVmFsdWUpOwogICAgICAgIGZpZWxkLnZhbHVlID0gbm9kZVZhbHVlOwogICAgICB9CiAgICAgIGZpZWxkLnZhbHVlWyRzZXRWYWx1ZV0odmFsdWUpOwogICAgfQogIH0KICBbJGlzVGhlcmVNb3JlV2lkdGhdKCkgewogICAgcmV0dXJuIHRoaXMubGF5b3V0LmVuZHNXaXRoKCItdGIiKSAmJiB0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gMCAmJiB0aGlzWyRleHRyYV0ubnVtYmVySW5MaW5lID4gMCB8fCB0aGlzWyRnZXRQYXJlbnRdKClbJGlzVGhlcmVNb3JlV2lkdGhdKCk7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudFskaXNTcGxpdHRhYmxlXSgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZTsKICAgIH0KICAgIGlmICh0aGlzLmxheW91dCA9PT0gInBvc2l0aW9uIiB8fCB0aGlzLmxheW91dC5pbmNsdWRlcygicm93IikpIHsKICAgICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHBhcmVudC5sYXlvdXQ/LmVuZHNXaXRoKCItdGIiKSAmJiBwYXJlbnRbJGV4dHJhXS5udW1iZXJJbkxpbmUgIT09IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSB0cnVlOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskZmx1c2hIVE1MXSgpIHsKICAgIHJldHVybiBmbHVzaEhUTUwodGhpcyk7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgYWRkSFRNTCh0aGlzLCBodG1sLCBiYm94KTsKICB9CiAgWyRnZXRBdmFpbGFibGVTcGFjZV0oKSB7CiAgICByZXR1cm4gZ2V0QXZhaWxhYmxlU3BhY2UodGhpcyk7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgc2V0VGFiSW5kZXgodGhpcyk7CiAgICBpZiAodGhpcy5wcmVzZW5jZSA9PT0gImhpZGRlbiIgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImluYWN0aXZlIiB8fCB0aGlzLmggPT09IDAgfHwgdGhpcy53ID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgZml4RGltZW5zaW9ucyh0aGlzKTsKICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBpZDogdGhpc1skdWlkXSwKICAgICAgY2xhc3M6IFtdCiAgICB9OwogICAgc2V0QWNjZXNzKHRoaXMsIGF0dHJpYnV0ZXMuY2xhc3MpOwogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIE9iamVjdC5hc3NpZ24odGhpc1skZXh0cmFdLCB7CiAgICAgIGNoaWxkcmVuLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBhdHRlbXB0OiAwLAogICAgICBsaW5lOiBudWxsLAogICAgICBudW1iZXJJbkxpbmU6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlOiB7CiAgICAgICAgd2lkdGg6IE1hdGgubWluKHRoaXMudyB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5taW4odGhpcy5oIHx8IEluZmluaXR5LCBhdmFpbGFibGVTcGFjZS5oZWlnaHQpCiAgICAgIH0sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHByZXZIZWlnaHQ6IDAsCiAgICAgIGN1cnJlbnRXaWR0aDogMAogICAgfSk7CiAgICBjb25zdCBpc1NwbGl0dGFibGUgPSB0aGlzWyRpc1NwbGl0dGFibGVdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICghY2hlY2tEaW1lbnNpb25zKHRoaXMsIGF2YWlsYWJsZVNwYWNlKSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgY29uc3QgZmlsdGVyID0gbmV3IFNldChbImZpZWxkIl0pOwogICAgaWYgKHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSkgewogICAgICBjb25zdCBjb2x1bW5XaWR0aHMgPSB0aGlzWyRnZXRTdWJmb3JtUGFyZW50XSgpLmNvbHVtbldpZHRoczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1uV2lkdGhzKSAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXNbJGV4dHJhXS5jb2x1bW5XaWR0aHMgPSBjb2x1bW5XaWR0aHM7CiAgICAgICAgdGhpc1skZXh0cmFdLmN1cnJlbnRDb2x1bW4gPSAwOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImFuY2hvclR5cGUiLCAiZGltZW5zaW9ucyIsICJwb3NpdGlvbiIsICJwcmVzZW5jZSIsICJib3JkZXIiLCAibWFyZ2luIiwgImhBbGlnbiIpOwogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhRXhjbGdyb3VwIl07CiAgICBjb25zdCBjbCA9IGxheW91dENsYXNzKHRoaXMpOwogICAgaWYgKGNsKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaChjbCk7CiAgICB9CiAgICBpZiAoaXNQcmludE9ubHkodGhpcykpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGF0dHJpYnV0ZXMuc3R5bGUgPSBzdHlsZTsKICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBjbGFzc05hbWVzOwogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICB0aGlzWyRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IGlzTHJUYiA9IHRoaXMubGF5b3V0ID09PSAibHItdGIiIHx8IHRoaXMubGF5b3V0ID09PSAicmwtdGIiOwogICAgY29uc3QgbWF4UnVuID0gaXNMclRiID8gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCA6IDE7CiAgICBmb3IgKDsgdGhpc1skZXh0cmFdLmF0dGVtcHQgPCBtYXhSdW47IHRoaXNbJGV4dHJhXS5hdHRlbXB0KyspIHsKICAgICAgaWYgKGlzTHJUYiAmJiB0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCAtIDEpIHsKICAgICAgICB0aGlzWyRleHRyYV0ubnVtYmVySW5MaW5lID0gMDsKICAgICAgfQogICAgICBjb25zdCByZXN1bHQgPSB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICAgIGZpbHRlciwKICAgICAgICBpbmNsdWRlOiB0cnVlCiAgICAgIH0pOwogICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocmVzdWx0LmlzQnJlYWsoKSkgewogICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBpZiAoaXNMclRiICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPT09IDAgJiYgIXRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID0gbWF4UnVuOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgdW5zZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gbWF4UnVuKSB7CiAgICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQgKyB0aGlzLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gdGhpcy5tYXJnaW4udG9wSW5zZXQgKyB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLndpZHRoICsgbWFyZ2luSCwgdGhpcy53IHx8IDApOwogICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLmhlaWdodCArIG1hcmdpblYsIHRoaXMuaCB8fCAwKTsKICAgIGNvbnN0IGJib3ggPSBbdGhpcy54LCB0aGlzLnksIHdpZHRoLCBoZWlnaHRdOwogICAgaWYgKHRoaXMudyA9PT0gIiIpIHsKICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcod2lkdGgpOwogICAgfQogICAgaWYgKHRoaXMuaCA9PT0gIiIpIHsKICAgICAgc3R5bGUuaGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKGhlaWdodCk7CiAgICB9CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBhcHBseUFzc2lzdCh0aGlzLCBhdHRyaWJ1dGVzKTsKICAgIGRlbGV0ZSB0aGlzWyRleHRyYV07CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogIH0KfQpjbGFzcyBFeGVjdXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV4ZWN1dGUiKTsKICAgIHRoaXMuY29ubmVjdGlvbiA9IGF0dHJpYnV0ZXMuY29ubmVjdGlvbiB8fCAiIjsKICAgIHRoaXMuZXhlY3V0ZVR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5leGVjdXRlVHlwZSwgWyJpbXBvcnQiLCAicmVtZXJnZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5ydW5BdCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJ1bkF0LCBbImNsaWVudCIsICJib3RoIiwgInNlcnZlciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEV4dHJhcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJleHRyYXMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4dHJhcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBGaWVsZCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWVsZCIsIHRydWUpOwogICAgdGhpcy5hY2Nlc3MgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hY2Nlc3MsIFsib3BlbiIsICJub25JbnRlcmFjdGl2ZSIsICJwcm90ZWN0ZWQiLCAicmVhZE9ubHkiXSk7CiAgICB0aGlzLmFjY2Vzc0tleSA9IGF0dHJpYnV0ZXMuYWNjZXNzS2V5IHx8ICIiOwogICAgdGhpcy5hbmNob3JUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYW5jaG9yVHlwZSwgWyJ0b3BMZWZ0IiwgImJvdHRvbUNlbnRlciIsICJib3R0b21MZWZ0IiwgImJvdHRvbVJpZ2h0IiwgIm1pZGRsZUNlbnRlciIsICJtaWRkbGVMZWZ0IiwgIm1pZGRsZVJpZ2h0IiwgInRvcENlbnRlciIsICJ0b3BSaWdodCJdKTsKICAgIHRoaXMuY29sU3BhbiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmNvbFNwYW4sCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAxIHx8IG4gPT09IC0xCiAgICB9KTsKICAgIHRoaXMuaCA9IGF0dHJpYnV0ZXMuaCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuaCkgOiAiIjsKICAgIHRoaXMuaEFsaWduID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaEFsaWduLCBbImxlZnQiLCAiY2VudGVyIiwgImp1c3RpZnkiLCAianVzdGlmeUFsbCIsICJyYWRpeCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sb2NhbGUgPSBhdHRyaWJ1dGVzLmxvY2FsZSB8fCAiIjsKICAgIHRoaXMubWF4SCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4SCwgIjBwdCIpOwogICAgdGhpcy5tYXhXID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhXLCAiMHB0Iik7CiAgICB0aGlzLm1pbkggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pbkgsICIwcHQiKTsKICAgIHRoaXMubWluVyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluVywgIjBwdCIpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMucm90YXRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucm90YXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggJSA5MCA9PT0gMAogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ID0gYXR0cmlidXRlcy53ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy53KSA6ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuYXNzaXN0ID0gbnVsbDsKICAgIHRoaXMuYmluZCA9IG51bGw7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG51bGw7CiAgICB0aGlzLmNhcHRpb24gPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmZvcm1hdCA9IG51bGw7CiAgICB0aGlzLml0ZW1zID0gbmV3IFhGQU9iamVjdEFycmF5KDIpOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnVpID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgICB0aGlzLmJpbmRJdGVtcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIF9zZXRWYWx1ZSh0aGlzLCB2YWx1ZSk7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgc2V0VGFiSW5kZXgodGhpcyk7CiAgICBpZiAoIXRoaXMudWkpIHsKICAgICAgdGhpcy51aSA9IG5ldyBVaSh7fSk7CiAgICAgIHRoaXMudWlbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXSh0aGlzLnVpKTsKICAgICAgbGV0IG5vZGU7CiAgICAgIHN3aXRjaCAodGhpcy5pdGVtcy5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBub2RlID0gbmV3IFRleHRFZGl0KHt9KTsKICAgICAgICAgIHRoaXMudWkudGV4dEVkaXQgPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgbm9kZSA9IG5ldyBDaGVja0J1dHRvbih7fSk7CiAgICAgICAgICB0aGlzLnVpLmNoZWNrQnV0dG9uID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIG5vZGUgPSBuZXcgQ2hvaWNlTGlzdCh7fSk7CiAgICAgICAgICB0aGlzLnVpLmNob2ljZUxpc3QgPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGhpcy51aVskYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgfQogICAgaWYgKCF0aGlzLnVpIHx8IHRoaXMucHJlc2VuY2UgPT09ICJoaWRkZW4iIHx8IHRoaXMucHJlc2VuY2UgPT09ICJpbmFjdGl2ZSIgfHwgdGhpcy5oID09PSAwIHx8IHRoaXMudyA9PT0gMCkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICh0aGlzLmNhcHRpb24pIHsKICAgICAgZGVsZXRlIHRoaXMuY2FwdGlvblskZXh0cmFdOwogICAgfQogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCBjYXB0aW9uID0gdGhpcy5jYXB0aW9uID8gdGhpcy5jYXB0aW9uWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKS5odG1sIDogbnVsbDsKICAgIGNvbnN0IHNhdmVkVyA9IHRoaXMudzsKICAgIGNvbnN0IHNhdmVkSCA9IHRoaXMuaDsKICAgIGxldCBtYXJnaW5IID0gMDsKICAgIGxldCBtYXJnaW5WID0gMDsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBtYXJnaW5IID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0ICsgdGhpcy5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgbWFyZ2luViA9IHRoaXMubWFyZ2luLnRvcEluc2V0ICsgdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICB9CiAgICBsZXQgYm9yZGVyRGltcyA9IG51bGw7CiAgICBpZiAodGhpcy53ID09PSAiIiB8fCB0aGlzLmggPT09ICIiKSB7CiAgICAgIGxldCB3aWR0aCA9IG51bGw7CiAgICAgIGxldCBoZWlnaHQgPSBudWxsOwogICAgICBsZXQgdWlXID0gMDsKICAgICAgbGV0IHVpSCA9IDA7CiAgICAgIGlmICh0aGlzLnVpLmNoZWNrQnV0dG9uKSB7CiAgICAgICAgdWlXID0gdWlIID0gdGhpcy51aS5jaGVja0J1dHRvbi5zaXplOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHcsCiAgICAgICAgICBoCiAgICAgICAgfSA9IGxheW91dE5vZGUodGhpcywgYXZhaWxhYmxlU3BhY2UpOwogICAgICAgIGlmICh3ICE9PSBudWxsKSB7CiAgICAgICAgICB1aVcgPSB3OwogICAgICAgICAgdWlIID0gaDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdWlIID0gZm9udHNfZ2V0TWV0cmljcyh0aGlzLmZvbnQsIHRydWUpLmxpbmVOb0dhcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYm9yZGVyRGltcyA9IGdldEJvcmRlckRpbXModGhpcy51aVskZ2V0RXh0cmFdKCkpOwogICAgICB1aVcgKz0gYm9yZGVyRGltcy53OwogICAgICB1aUggKz0gYm9yZGVyRGltcy5oOwogICAgICBpZiAodGhpcy5jYXB0aW9uKSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgdywKICAgICAgICAgIGgsCiAgICAgICAgICBpc0Jyb2tlbgogICAgICAgIH0gPSB0aGlzLmNhcHRpb25bJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSk7CiAgICAgICAgaWYgKGlzQnJva2VuICYmIHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKClbJGlzVGhlcmVNb3JlV2lkdGhdKCkpIHsKICAgICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgICAgIH0KICAgICAgICB3aWR0aCA9IHc7CiAgICAgICAgaGVpZ2h0ID0gaDsKICAgICAgICBzd2l0Y2ggKHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpIHsKICAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgICAgd2lkdGggKz0gdWlXOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgICBoZWlnaHQgKz0gdWlIOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGggPSB1aVc7CiAgICAgICAgaGVpZ2h0ID0gdWlIOwogICAgICB9CiAgICAgIGlmICh3aWR0aCAmJiB0aGlzLncgPT09ICIiKSB7CiAgICAgICAgd2lkdGggKz0gbWFyZ2luSDsKICAgICAgICB0aGlzLncgPSBNYXRoLm1pbih0aGlzLm1heFcgPD0gMCA/IEluZmluaXR5IDogdGhpcy5tYXhXLCB0aGlzLm1pblcgKyAxIDwgd2lkdGggPyB3aWR0aCA6IHRoaXMubWluVyk7CiAgICAgIH0KICAgICAgaWYgKGhlaWdodCAmJiB0aGlzLmggPT09ICIiKSB7CiAgICAgICAgaGVpZ2h0ICs9IG1hcmdpblY7CiAgICAgICAgdGhpcy5oID0gTWF0aC5taW4odGhpcy5tYXhIIDw9IDAgPyBJbmZpbml0eSA6IHRoaXMubWF4SCwgdGhpcy5taW5IICsgMSA8IGhlaWdodCA/IGhlaWdodCA6IHRoaXMubWluSCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICBmaXhEaW1lbnNpb25zKHRoaXMpOwogICAgc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBpZiAoIWNoZWNrRGltZW5zaW9ucyh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmb250IiwgImRpbWVuc2lvbnMiLCAicG9zaXRpb24iLCAicm90YXRlIiwgImFuY2hvclR5cGUiLCAicHJlc2VuY2UiLCAibWFyZ2luIiwgImhBbGlnbiIpOwogICAgc2V0TWluTWF4RGltZW5zaW9ucyh0aGlzLCBzdHlsZSk7CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFGaWVsZCJdOwogICAgaWYgKHRoaXMuZm9udCkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYUZvbnQiKTsKICAgIH0KICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgfTsKICAgIGlmIChzdHlsZS5tYXJnaW4pIHsKICAgICAgc3R5bGUucGFkZGluZyA9IHN0eWxlLm1hcmdpbjsKICAgICAgZGVsZXRlIHN0eWxlLm1hcmdpbjsKICAgIH0KICAgIHNldEFjY2Vzcyh0aGlzLCBjbGFzc05hbWVzKTsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgYm9yZGVyU3R5bGUgPSB0aGlzLmJvcmRlciA/IHRoaXMuYm9yZGVyWyR0b1N0eWxlXSgpIDogbnVsbDsKICAgIGNvbnN0IGJib3ggPSBjb21wdXRlQmJveCh0aGlzLCBodG1sLCBhdmFpbGFibGVTcGFjZSk7CiAgICBjb25zdCB1aSA9IHRoaXMudWlbJHRvSFRNTF0oKS5odG1sOwogICAgaWYgKCF1aSkgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCBib3JkZXJTdHlsZSk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgICB9CiAgICBpZiAodGhpc1skdGFiSW5kZXhdKSB7CiAgICAgIGlmICh1aS5jaGlsZHJlbj8uWzBdKSB7CiAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy50YWJpbmRleCA9IHRoaXNbJHRhYkluZGV4XTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1aS5hdHRyaWJ1dGVzLnRhYmluZGV4ID0gdGhpc1skdGFiSW5kZXhdOwogICAgICB9CiAgICB9CiAgICBpZiAoIXVpLmF0dHJpYnV0ZXMuc3R5bGUpIHsKICAgICAgdWkuYXR0cmlidXRlcy5zdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBsZXQgYUVsZW1lbnQgPSBudWxsOwogICAgaWYgKHRoaXMudWkuYnV0dG9uKSB7CiAgICAgIGlmICh1aS5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHsKICAgICAgICBbYUVsZW1lbnRdID0gdWkuY2hpbGRyZW4uc3BsaWNlKDAsIDEpOwogICAgICB9CiAgICAgIE9iamVjdC5hc3NpZ24odWkuYXR0cmlidXRlcy5zdHlsZSwgYm9yZGVyU3R5bGUpOwogICAgfSBlbHNlIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgYm9yZGVyU3R5bGUpOwogICAgfQogICAgY2hpbGRyZW4ucHVzaCh1aSk7CiAgICBpZiAodGhpcy52YWx1ZSkgewogICAgICBpZiAodGhpcy51aS5pbWFnZUVkaXQpIHsKICAgICAgICB1aS5jaGlsZHJlbi5wdXNoKHRoaXMudmFsdWVbJHRvSFRNTF0oKS5odG1sKTsKICAgICAgfSBlbHNlIGlmICghdGhpcy51aS5idXR0b24pIHsKICAgICAgICBsZXQgdmFsdWUgPSAiIjsKICAgICAgICBpZiAodGhpcy52YWx1ZS5leERhdGEpIHsKICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZS5leERhdGFbJHRleHRdKCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLnRleHQpIHsKICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZS50ZXh0WyRnZXRFeHRyYV0oKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgaHRtbFZhbHVlID0gdGhpcy52YWx1ZVskdG9IVE1MXSgpLmh0bWw7CiAgICAgICAgICBpZiAoaHRtbFZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHZhbHVlID0gaHRtbFZhbHVlLmNoaWxkcmVuWzBdLnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy51aS50ZXh0RWRpdCAmJiB0aGlzLnZhbHVlLnRleHQ/Lm1heENoYXJzKSB7CiAgICAgICAgICB1aS5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLm1heExlbmd0aCA9IHRoaXMudmFsdWUudGV4dC5tYXhDaGFyczsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAodGhpcy51aS5udW1lcmljRWRpdCkgewogICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1aS5jaGlsZHJlblswXS5uYW1lID09PSAidGV4dGFyZWEiKSB7CiAgICAgICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpcy51aS5pbWFnZUVkaXQgJiYgdWkuY2hpbGRyZW4/LlswXSAmJiB0aGlzLmgpIHsKICAgICAgYm9yZGVyRGltcyA9IGJvcmRlckRpbXMgfHwgZ2V0Qm9yZGVyRGltcyh0aGlzLnVpWyRnZXRFeHRyYV0oKSk7CiAgICAgIGxldCBjYXB0aW9uSGVpZ2h0ID0gMDsKICAgICAgaWYgKHRoaXMuY2FwdGlvbiAmJiBbInRvcCIsICJib3R0b20iXS5pbmNsdWRlcyh0aGlzLmNhcHRpb24ucGxhY2VtZW50KSkgewogICAgICAgIGNhcHRpb25IZWlnaHQgPSB0aGlzLmNhcHRpb24ucmVzZXJ2ZTsKICAgICAgICBpZiAoY2FwdGlvbkhlaWdodCA8PSAwKSB7CiAgICAgICAgICBjYXB0aW9uSGVpZ2h0ID0gdGhpcy5jYXB0aW9uWyRnZXRFeHRyYV0oYXZhaWxhYmxlU3BhY2UpLmg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGhpcy5oIC0gY2FwdGlvbkhlaWdodCAtIG1hcmdpblYgLSBib3JkZXJEaW1zLmg7CiAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaW5wdXRIZWlnaHQpOwogICAgICB9IGVsc2UgewogICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CiAgICB9CiAgICBpZiAoYUVsZW1lbnQpIHsKICAgICAgdWkuY2hpbGRyZW4ucHVzaChhRWxlbWVudCk7CiAgICB9CiAgICBpZiAoIWNhcHRpb24pIHsKICAgICAgaWYgKHVpLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgfQogICAgICB0aGlzLncgPSBzYXZlZFc7CiAgICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhjcmVhdGVXcmFwcGVyKHRoaXMsIGh0bWwpLCBiYm94KTsKICAgIH0KICAgIGlmICh0aGlzLnVpLmJ1dHRvbikgewogICAgICBpZiAoc3R5bGUucGFkZGluZykgewogICAgICAgIGRlbGV0ZSBzdHlsZS5wYWRkaW5nOwogICAgICB9CiAgICAgIGlmIChjYXB0aW9uLm5hbWUgPT09ICJkaXYiKSB7CiAgICAgICAgY2FwdGlvbi5uYW1lID0gInNwYW4iOwogICAgICB9CiAgICAgIHVpLmNoaWxkcmVuLnB1c2goY2FwdGlvbik7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoaHRtbCwgYmJveCk7CiAgICB9IGVsc2UgaWYgKHRoaXMudWkuY2hlY2tCdXR0b24pIHsKICAgICAgY2FwdGlvbi5hdHRyaWJ1dGVzLmNsYXNzWzBdID0gInhmYUNhcHRpb25Gb3JDaGVja0J1dHRvbiI7CiAgICB9CiAgICBpZiAoIXVpLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcyA9IFtdOwogICAgfQogICAgdWkuY2hpbGRyZW4uc3BsaWNlKDAsIDAsIGNhcHRpb24pOwogICAgc3dpdGNoICh0aGlzLmNhcHRpb24ucGxhY2VtZW50KSB7CiAgICAgIGNhc2UgImxlZnQiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhTGVmdCIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFSaWdodCIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ0b3AiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhVG9wIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFCb3R0b20iKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHRoaXMudyA9IHNhdmVkVzsKICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgfQp9CmNsYXNzIEZpbGwgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZmlsbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5saW5lYXIgPSBudWxsOwogICAgdGhpcy5wYXR0ZXJuID0gbnVsbDsKICAgIHRoaXMucmFkaWFsID0gbnVsbDsKICAgIHRoaXMuc29saWQgPSBudWxsOwogICAgdGhpcy5zdGlwcGxlID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdncmFuZHBhID0gZ3JhbmRwYVskZ2V0UGFyZW50XSgpOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IHByb3BOYW1lID0gImNvbG9yIjsKICAgIGxldCBhbHRQcm9wTmFtZSA9IHByb3BOYW1lOwogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJvcmRlcikgewogICAgICBwcm9wTmFtZSA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsKICAgICAgYWx0UHJvcE5hbWUgPSAiYmFja2dyb3VuZCI7CiAgICAgIGlmIChnZ3JhbmRwYSBpbnN0YW5jZW9mIFVpKSB7CiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIndoaXRlIjsKICAgICAgfQogICAgfQogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBBcmMpIHsKICAgICAgcHJvcE5hbWUgPSBhbHRQcm9wTmFtZSA9ICJmaWxsIjsKICAgICAgc3R5bGUuZmlsbCA9ICJ3aGl0ZSI7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJleHRyYXMiIHx8IG5hbWUgPT09ICJjb2xvciIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYRkFPYmplY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29sb3IgPSBvYmpbJHRvU3R5bGVdKHRoaXMuY29sb3IpOwogICAgICBpZiAoY29sb3IpIHsKICAgICAgICBzdHlsZVtjb2xvci5zdGFydHNXaXRoKCIjIikgPyBwcm9wTmFtZSA6IGFsdFByb3BOYW1lXSA9IGNvbG9yOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICAgIGlmICh0aGlzLmNvbG9yPy52YWx1ZSkgewogICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3JbJHRvU3R5bGVdKCk7CiAgICAgIHN0eWxlW2NvbG9yLnN0YXJ0c1dpdGgoIiMiKSA/IHByb3BOYW1lIDogYWx0UHJvcE5hbWVdID0gY29sb3I7CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEZpbHRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWx0ZXIiLCB0cnVlKTsKICAgIHRoaXMuYWRkUmV2b2NhdGlvbkluZm8gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hZGRSZXZvY2F0aW9uSW5mbywgWyIiLCAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAibm9uZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudmVyc2lvbiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiB0aGlzLnZlcnNpb24sCiAgICAgIGRlZmF1bHRWYWx1ZTogNSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAxICYmIHggPD0gNQogICAgfSk7CiAgICB0aGlzLmFwcGVhcmFuY2VGaWx0ZXIgPSBudWxsOwogICAgdGhpcy5jZXJ0aWZpY2F0ZXMgPSBudWxsOwogICAgdGhpcy5kaWdlc3RNZXRob2RzID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmdzID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZHMgPSBudWxsOwogICAgdGhpcy5oYW5kbGVyID0gbnVsbDsKICAgIHRoaXMubG9ja0RvY3VtZW50ID0gbnVsbDsKICAgIHRoaXMubWRwID0gbnVsbDsKICAgIHRoaXMucmVhc29ucyA9IG51bGw7CiAgICB0aGlzLnRpbWVTdGFtcCA9IG51bGw7CiAgfQp9CmNsYXNzIEZsb2F0IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmbG9hdCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQodGhpc1skY29udGVudF0udHJpbSgpKTsKICAgIHRoaXNbJGNvbnRlbnRdID0gaXNOYU4obnVtYmVyKSA/IG51bGwgOiBudW1iZXI7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdICE9PSBudWxsID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgdGVtcGxhdGVfRm9udCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmb250IiwgdHJ1ZSk7CiAgICB0aGlzLmJhc2VsaW5lU2hpZnQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmJhc2VsaW5lU2hpZnQpOwogICAgdGhpcy5mb250SG9yaXpvbnRhbFNjYWxlID0gZ2V0RmxvYXQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZvbnRIb3Jpem9udGFsU2NhbGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMTAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5mb250VmVydGljYWxTY2FsZSA9IGdldEZsb2F0KHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb250VmVydGljYWxTY2FsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxMDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMua2VybmluZ01vZGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5rZXJuaW5nTW9kZSwgWyJub25lIiwgInBhaXIiXSk7CiAgICB0aGlzLmxldHRlclNwYWNpbmcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmxldHRlclNwYWNpbmcsICIwIik7CiAgICB0aGlzLmxpbmVUaHJvdWdoID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubGluZVRocm91Z2gsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMubGluZVRocm91Z2hQZXJpb2QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5saW5lVGhyb3VnaFBlcmlvZCwgWyJhbGwiLCAid29yZCJdKTsKICAgIHRoaXMub3ZlcmxpbmUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5vdmVybGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxIHx8IHggPT09IDIKICAgIH0pOwogICAgdGhpcy5vdmVybGluZVBlcmlvZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm92ZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy5wb3N0dXJlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucG9zdHVyZSwgWyJub3JtYWwiLCAiaXRhbGljIl0pOwogICAgdGhpcy5zaXplID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5zaXplLCAiMTBwdCIpOwogICAgdGhpcy50eXBlZmFjZSA9IGF0dHJpYnV0ZXMudHlwZWZhY2UgfHwgIkNvdXJpZXIiOwogICAgdGhpcy51bmRlcmxpbmUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy51bmRlcmxpbmUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMudW5kZXJsaW5lUGVyaW9kID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudW5kZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMud2VpZ2h0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMud2VpZ2h0LCBbIm5vcm1hbCIsICJib2xkIl0pOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWxsID0gbnVsbDsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXNbJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMuYWRkKHRoaXMudHlwZWZhY2UpOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmaWxsIik7CiAgICBjb25zdCBjb2xvciA9IHN0eWxlLmNvbG9yOwogICAgaWYgKGNvbG9yKSB7CiAgICAgIGlmIChjb2xvciA9PT0gIiMwMDAwMDAiKSB7CiAgICAgICAgZGVsZXRlIHN0eWxlLmNvbG9yOwogICAgICB9IGVsc2UgaWYgKCFjb2xvci5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgICBzdHlsZS5iYWNrZ3JvdW5kID0gY29sb3I7CiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENsaXAgPSAidGV4dCI7CiAgICAgICAgc3R5bGUuY29sb3IgPSAidHJhbnNwYXJlbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5iYXNlbGluZVNoaWZ0KSB7CiAgICAgIHN0eWxlLnZlcnRpY2FsQWxpZ24gPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5iYXNlbGluZVNoaWZ0KTsKICAgIH0KICAgIHN0eWxlLmZvbnRLZXJuaW5nID0gdGhpcy5rZXJuaW5nTW9kZSA9PT0gIm5vbmUiID8gIm5vbmUiIDogIm5vcm1hbCI7CiAgICBzdHlsZS5sZXR0ZXJTcGFjaW5nID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubGV0dGVyU3BhY2luZyk7CiAgICBpZiAodGhpcy5saW5lVGhyb3VnaCAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJsaW5lLXRocm91Z2giOwogICAgICBpZiAodGhpcy5saW5lVGhyb3VnaCA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMub3ZlcmxpbmUgIT09IDApIHsKICAgICAgc3R5bGUudGV4dERlY29yYXRpb24gPSAib3ZlcmxpbmUiOwogICAgICBpZiAodGhpcy5vdmVybGluZSA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgc3R5bGUuZm9udFN0eWxlID0gdGhpcy5wb3N0dXJlOwogICAgc3R5bGUuZm9udFNpemUgPSBtZWFzdXJlVG9TdHJpbmcoMC45OSAqIHRoaXMuc2l6ZSk7CiAgICBzZXRGb250RmFtaWx5KHRoaXMsIHRoaXMsIHRoaXNbJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIsIHN0eWxlKTsKICAgIGlmICh0aGlzLnVuZGVybGluZSAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJ1bmRlcmxpbmUiOwogICAgICBpZiAodGhpcy51bmRlcmxpbmUgPT09IDIpIHsKICAgICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvblN0eWxlID0gImRvdWJsZSI7CiAgICAgIH0KICAgIH0KICAgIHN0eWxlLmZvbnRXZWlnaHQgPSB0aGlzLndlaWdodDsKICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgRm9ybWF0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImZvcm1hdCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICB9Cn0KY2xhc3MgSGFuZGxlciBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJoYW5kbGVyIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBIeXBoZW5hdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJoeXBoZW5hdGlvbiIpOwogICAgdGhpcy5leGNsdWRlQWxsQ2FwcyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmV4Y2x1ZGVBbGxDYXBzLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5leGNsdWRlSW5pdGlhbENhcCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmV4Y2x1ZGVJbml0aWFsQ2FwLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5oeXBoZW5hdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5oeXBoZW5hdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHVzaENoYXJhY3RlckNvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucHVzaENoYXJhY3RlckNvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IDMsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLnJlbWFpbkNoYXJhY3RlckNvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucmVtYWluQ2hhcmFjdGVyQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMywKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLndvcmRDaGFyYWN0ZXJDb3VudCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLndvcmRDaGFyYWN0ZXJDb3VudCwKICAgICAgZGVmYXVsdFZhbHVlOiA3LAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogIH0KfQpjbGFzcyBJbWFnZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJpbWFnZSIpOwogICAgdGhpcy5hc3BlY3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hc3BlY3QsIFsiZml0IiwgImFjdHVhbCIsICJoZWlnaHQiLCAibm9uZSIsICJ3aWR0aCJdKTsKICAgIHRoaXMuY29udGVudFR5cGUgPSBhdHRyaWJ1dGVzLmNvbnRlbnRUeXBlIHx8ICIiOwogICAgdGhpcy5ocmVmID0gYXR0cmlidXRlcy5ocmVmIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnRyYW5zZmVyRW5jb2RpbmcgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmFuc2ZlckVuY29kaW5nLCBbImJhc2U2NCIsICJub25lIiwgInBhY2thZ2UiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSAmJiAhTUlNRVMuaGFzKHRoaXMuY29udGVudFR5cGUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBsZXQgYnVmZmVyID0gdGhpc1skZ2xvYmFsRGF0YV0uaW1hZ2VzICYmIHRoaXNbJGdsb2JhbERhdGFdLmltYWdlcy5nZXQodGhpcy5ocmVmKTsKICAgIGlmICghYnVmZmVyICYmICh0aGlzLmhyZWYgfHwgIXRoaXNbJGNvbnRlbnRdKSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICghYnVmZmVyICYmIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9PT0gImJhc2U2NCIpIHsKICAgICAgYnVmZmVyID0gZnJvbUJhc2U2NFV0aWwodGhpc1skY29udGVudF0pOwogICAgfQogICAgaWYgKCFidWZmZXIpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBpZiAoIXRoaXMuY29udGVudFR5cGUpIHsKICAgICAgZm9yIChjb25zdCBbaGVhZGVyLCB0eXBlXSBvZiBJTUFHRVNfSEVBREVSUykgewogICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gaGVhZGVyLmxlbmd0aCAmJiBoZWFkZXIuZXZlcnkoKHgsIGkpID0+IHggPT09IGJ1ZmZlcltpXSkpIHsKICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSB0eXBlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5jb250ZW50VHlwZSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgICB9CiAgICB9CiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsKICAgICAgdHlwZTogdGhpcy5jb250ZW50VHlwZQogICAgfSk7CiAgICBsZXQgc3R5bGU7CiAgICBzd2l0Y2ggKHRoaXMuYXNwZWN0KSB7CiAgICAgIGNhc2UgImZpdCI6CiAgICAgIGNhc2UgImFjdHVhbCI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhlaWdodCI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICBoZWlnaHQ6ICIxMDAlIiwKICAgICAgICAgIG9iamVjdEZpdDogImZpbGwiCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibm9uZSI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgaGVpZ2h0OiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIndpZHRoIjoKICAgICAgICBzdHlsZSA9IHsKICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImltZyIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFJbWFnZSJdLAogICAgICAgIHN0eWxlLAogICAgICAgIHNyYzogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwKICAgICAgICBhbHQ6IHBhcmVudCA/IGFyaWFMYWJlbChwYXJlbnRbJGdldFBhcmVudF0oKSkgOiBudWxsCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBJbWFnZUVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW1hZ2VFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGEgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kYXRhLCBbImxpbmsiLCAiZW1iZWQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKHRoaXMuZGF0YSA9PT0gImVtYmVkIikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgYXR0cmlidXRlczoge30KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9Cn0KY2xhc3MgSW50ZWdlciBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW50ZWdlciIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHRoaXNbJGNvbnRlbnRdLnRyaW0oKSwgMTApOwogICAgdGhpc1skY29udGVudF0gPSBpc05hTihudW1iZXIpID8gbnVsbCA6IG51bWJlcjsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gIT09IG51bGwgPyB0aGlzWyRjb250ZW50XS50b1N0cmluZygpIDogIiIpOwogIH0KfQpjbGFzcyBJc3N1ZXJzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImlzc3VlcnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEl0ZW1zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIml0ZW1zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy5zYXZlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc2F2ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1skZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgb3V0cHV0LnB1c2goY2hpbGRbJHRleHRdKCkpOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhvdXRwdXQpOwogIH0KfQpjbGFzcyBLZWVwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImtlZXAiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgY29uc3Qgb3B0aW9ucyA9IFsibm9uZSIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSJdOwogICAgdGhpcy5pbnRhY3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5pbnRhY3QsIG9wdGlvbnMpOwogICAgdGhpcy5uZXh0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmV4dCwgb3B0aW9ucyk7CiAgICB0aGlzLnByZXZpb3VzID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJldmlvdXMsIG9wdGlvbnMpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgS2V5VXNhZ2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAia2V5VXNhZ2UiKTsKICAgIGNvbnN0IG9wdGlvbnMgPSBbIiIsICJ5ZXMiLCAibm8iXTsKICAgIHRoaXMuY3JsU2lnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNybFNpZ24sIG9wdGlvbnMpOwogICAgdGhpcy5kYXRhRW5jaXBoZXJtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZGF0YUVuY2lwaGVybWVudCwgb3B0aW9ucyk7CiAgICB0aGlzLmRlY2lwaGVyT25seSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRlY2lwaGVyT25seSwgb3B0aW9ucyk7CiAgICB0aGlzLmRpZ2l0YWxTaWduYXR1cmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kaWdpdGFsU2lnbmF0dXJlLCBvcHRpb25zKTsKICAgIHRoaXMuZW5jaXBoZXJPbmx5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZW5jaXBoZXJPbmx5LCBvcHRpb25zKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5rZXlBZ3JlZW1lbnQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5rZXlBZ3JlZW1lbnQsIG9wdGlvbnMpOwogICAgdGhpcy5rZXlDZXJ0U2lnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmtleUNlcnRTaWduLCBvcHRpb25zKTsKICAgIHRoaXMua2V5RW5jaXBoZXJtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMua2V5RW5jaXBoZXJtZW50LCBvcHRpb25zKTsKICAgIHRoaXMubm9uUmVwdWRpYXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ub25SZXB1ZGlhdGlvbiwgb3B0aW9ucyk7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgTGluZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJsaW5lIiwgdHJ1ZSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zbG9wZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNsb3BlLCBbIlxcIiwgIi8iXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lZGdlID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlIHx8IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCB0aGlja25lc3MgPSBlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDA7CiAgICBzdHlsZS5zdHJva2VXaWR0aCA9IG1lYXN1cmVUb1N0cmluZyh0aGlja25lc3MpOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgbGV0IHgxLCB5MSwgeDIsIHkyOwogICAgbGV0IHdpZHRoID0gIjEwMCUiOwogICAgbGV0IGhlaWdodCA9ICIxMDAlIjsKICAgIGlmIChwYXJlbnQudyA8PSB0aGlja25lc3MpIHsKICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFsiNTAlIiwgMCwgIjUwJSIsICIxMDAlIl07CiAgICAgIHdpZHRoID0gc3R5bGUuc3Ryb2tlV2lkdGg7CiAgICB9IGVsc2UgaWYgKHBhcmVudC5oIDw9IHRoaWNrbmVzcykgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWzAsICI1MCUiLCAiMTAwJSIsICI1MCUiXTsKICAgICAgaGVpZ2h0ID0gc3R5bGUuc3Ryb2tlV2lkdGg7CiAgICB9IGVsc2UgaWYgKHRoaXMuc2xvcGUgPT09ICJcXCIpIHsKICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFswLCAwLCAiMTAwJSIsICIxMDAlIl07CiAgICB9IGVsc2UgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWzAsICIxMDAlIiwgIjEwMCUiLCAwXTsKICAgIH0KICAgIGNvbnN0IGxpbmUgPSB7CiAgICAgIG5hbWU6ICJsaW5lIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgeDEsCiAgICAgICAgeTEsCiAgICAgICAgeDIsCiAgICAgICAgeTIsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbbGluZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBzdHlsZTogewogICAgICAgICAgb3ZlcmZsb3c6ICJ2aXNpYmxlIgogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3Moc3ZnKTsKICB9Cn0KY2xhc3MgTGluZWFyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImxpbmVhciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbInRvUmlnaHQiLCAidG9Cb3R0b20iLCAidG9MZWZ0IiwgInRvVG9wIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHN0YXJ0Q29sb3IgPSBzdGFydENvbG9yID8gc3RhcnRDb2xvclskdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICAgIGNvbnN0IHRyYW5zZiA9IHRoaXMudHlwZS5yZXBsYWNlKC8oW1JCTFRdKS8sICIgJDEiKS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgZW5kQ29sb3IgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIjsKICAgIHJldHVybiBgbGluZWFyLWdyYWRpZW50KCR7dHJhbnNmfSwgJHtzdGFydENvbG9yfSwgJHtlbmRDb2xvcn0pYDsKICB9Cn0KY2xhc3MgTG9ja0RvY3VtZW50IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJsb2NrRG9jdW1lbnQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSBnZXRTdHJpbmdPcHRpb24odGhpc1skY29udGVudF0sIFsiYXV0byIsICIwIiwgIjEiXSk7CiAgfQp9CmNsYXNzIE1hbmlmZXN0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1hbmlmZXN0IiwgdHJ1ZSk7CiAgICB0aGlzLmFjdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjdGlvbiwgWyJpbmNsdWRlIiwgImFsbCIsICJleGNsdWRlIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5yZWYgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWFyZ2luIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1hcmdpbiIsIHRydWUpOwogICAgdGhpcy5ib3R0b21JbnNldCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuYm90dG9tSW5zZXQsICIwIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVmdEluc2V0ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5sZWZ0SW5zZXQsICIwIik7CiAgICB0aGlzLnJpZ2h0SW5zZXQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnJpZ2h0SW5zZXQsICIwIik7CiAgICB0aGlzLnRvcEluc2V0ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy50b3BJbnNldCwgIjAiKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICByZXR1cm4gewogICAgICBtYXJnaW46IG1lYXN1cmVUb1N0cmluZyh0aGlzLnRvcEluc2V0KSArICIgIiArIG1lYXN1cmVUb1N0cmluZyh0aGlzLnJpZ2h0SW5zZXQpICsgIiAiICsgbWVhc3VyZVRvU3RyaW5nKHRoaXMuYm90dG9tSW5zZXQpICsgIiAiICsgbWVhc3VyZVRvU3RyaW5nKHRoaXMubGVmdEluc2V0KQogICAgfTsKICB9Cn0KY2xhc3MgTWRwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1kcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBlcm1pc3Npb25zID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucGVybWlzc2lvbnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMiwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAzCiAgICB9KTsKICAgIHRoaXMuc2lnbmF0dXJlVHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNpZ25hdHVyZVR5cGUsIFsiZmlsbGVyIiwgImF1dGhvciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE1lZGl1bSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJtZWRpdW0iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbWFnaW5nQkJveCA9IGdldEJCb3goYXR0cmlidXRlcy5pbWFnaW5nQkJveCk7CiAgICB0aGlzLmxvbmcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmxvbmcpOwogICAgdGhpcy5vcmllbnRhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9yaWVudGF0aW9uLCBbInBvcnRyYWl0IiwgImxhbmRzY2FwZSJdKTsKICAgIHRoaXMuc2hvcnQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNob3J0KTsKICAgIHRoaXMuc3RvY2sgPSBhdHRyaWJ1dGVzLnN0b2NrIHx8ICIiOwogICAgdGhpcy50cmF5SW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmF5SW4sIFsiYXV0byIsICJkZWxlZ2F0ZSIsICJwYWdlRnJvbnQiXSk7CiAgICB0aGlzLnRyYXlPdXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmF5T3V0LCBbImF1dG8iLCAiZGVsZWdhdGUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBNZXNzYWdlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1lc3NhZ2UiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBOdW1lcmljRWRpdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJudW1lcmljRWRpdCIsIHRydWUpOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY29tYiA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJib3JkZXIiLCAiZm9udCIsICJtYXJnaW4iKTsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICAgIGRhdGFJZDogZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhVGV4dGZpZWxkIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIE9jY3VyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm9jY3VyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW5pdGlhbCA9IGF0dHJpYnV0ZXMuaW5pdGlhbCAhPT0gIiIgPyBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbml0aWFsLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KSA6ICIiOwogICAgdGhpcy5tYXggPSBhdHRyaWJ1dGVzLm1heCAhPT0gIiIgPyBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXgsCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSkgOiAiIjsKICAgIHRoaXMubWluID0gYXR0cmlidXRlcy5taW4gIT09ICIiID8gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWluLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pIDogIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJGNsZWFuXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IG9yaWdpbmFsTWluID0gdGhpcy5taW47CiAgICBpZiAodGhpcy5taW4gPT09ICIiKSB7CiAgICAgIHRoaXMubWluID0gcGFyZW50IGluc3RhbmNlb2YgUGFnZUFyZWEgfHwgcGFyZW50IGluc3RhbmNlb2YgUGFnZVNldCA/IDAgOiAxOwogICAgfQogICAgaWYgKHRoaXMubWF4ID09PSAiIikgewogICAgICBpZiAob3JpZ2luYWxNaW4gPT09ICIiKSB7CiAgICAgICAgdGhpcy5tYXggPSBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlQXJlYSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlU2V0ID8gLTEgOiAxOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubWF4ID0gdGhpcy5taW47CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLm1heCAhPT0gLTEgJiYgdGhpcy5tYXggPCB0aGlzLm1pbikgewogICAgICB0aGlzLm1heCA9IHRoaXMubWluOwogICAgfQogICAgaWYgKHRoaXMuaW5pdGlhbCA9PT0gIiIpIHsKICAgICAgdGhpcy5pbml0aWFsID0gcGFyZW50IGluc3RhbmNlb2YgVGVtcGxhdGUgPyAxIDogdGhpcy5taW47CiAgICB9CiAgfQp9CmNsYXNzIE9pZCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvaWQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgT2lkcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvaWRzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5vaWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgT3ZlcmZsb3cgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAib3ZlcmZsb3ciKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkZXIgPSBhdHRyaWJ1dGVzLmxlYWRlciB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgICAgY29uc3Qgcm9vdCA9IHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgICAgY29uc3QgdGFyZ2V0ID0gcm9vdFskc2VhcmNoTm9kZV0odGhpcy50YXJnZXQsIHBhcmVudCk7CiAgICAgIGNvbnN0IGxlYWRlciA9IHJvb3RbJHNlYXJjaE5vZGVdKHRoaXMubGVhZGVyLCBwYXJlbnQpOwogICAgICBjb25zdCB0cmFpbGVyID0gcm9vdFskc2VhcmNoTm9kZV0odGhpcy50cmFpbGVyLCBwYXJlbnQpOwogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgdGFyZ2V0OiB0YXJnZXQ/LlswXSB8fCBudWxsLAogICAgICAgIGxlYWRlcjogbGVhZGVyPy5bMF0gfHwgbnVsbCwKICAgICAgICB0cmFpbGVyOiB0cmFpbGVyPy5bMF0gfHwgbnVsbCwKICAgICAgICBhZGRMZWFkZXI6IGZhbHNlLAogICAgICAgIGFkZFRyYWlsZXI6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpc1skZXh0cmFdOwogIH0KfQpjbGFzcyBQYWdlQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYWdlQXJlYSIsIHRydWUpOwogICAgdGhpcy5ibGFua09yTm90QmxhbmsgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ibGFua09yTm90QmxhbmssIFsiYW55IiwgImJsYW5rIiwgIm5vdEJsYW5rIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmluaXRpYWxOdW1iZXIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbml0aWFsTnVtYmVyLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5udW1iZXJlZCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm51bWJlcmVkLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5vZGRPckV2ZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vZGRPckV2ZW4sIFsiYW55IiwgImV2ZW4iLCAib2RkIl0pOwogICAgdGhpcy5wYWdlUG9zaXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wYWdlUG9zaXRpb24sIFsiYW55IiwgImZpcnN0IiwgImxhc3QiLCAib25seSIsICJyZXN0Il0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bSA9IG51bGw7CiAgICB0aGlzLm9jY3VyID0gbnVsbDsKICAgIHRoaXMuYXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb250ZW50QXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskaXNVc2FibGVdKCkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAwCiAgICAgIH07CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuICF0aGlzLm9jY3VyIHx8IHRoaXMub2NjdXIubWF4ID09PSAtMSB8fCB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgPCB0aGlzLm9jY3VyLm1heDsKICB9CiAgWyRjbGVhblBhZ2VdKCkgewogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICB9CiAgWyRnZXROZXh0UGFnZV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDAKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQucmVsYXRpb24gPT09ICJvcmRlcmVkT2NjdXJyZW5jZSIpIHsKICAgICAgaWYgKHRoaXNbJGlzVXNhYmxlXSgpKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLm51bWJlck9mVXNlICs9IDE7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJlbnRbJGdldE5leHRQYWdlXSgpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybiB0aGlzWyRleHRyYV0uc3BhY2UgfHwgewogICAgICB3aWR0aDogMCwKICAgICAgaGVpZ2h0OiAwCiAgICB9OwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDEKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICB0aGlzWyRleHRyYV0uY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLm1lZGl1bSAmJiB0aGlzLm1lZGl1bS5zaG9ydCAmJiB0aGlzLm1lZGl1bS5sb25nKSB7CiAgICAgIHN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWVkaXVtLnNob3J0KTsKICAgICAgc3R5bGUuaGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWVkaXVtLmxvbmcpOwogICAgICB0aGlzWyRleHRyYV0uc3BhY2UgPSB7CiAgICAgICAgd2lkdGg6IHRoaXMubWVkaXVtLnNob3J0LAogICAgICAgIGhlaWdodDogdGhpcy5tZWRpdW0ubG9uZwogICAgICB9OwogICAgICBpZiAodGhpcy5tZWRpdW0ub3JpZW50YXRpb24gPT09ICJsYW5kc2NhcGUiKSB7CiAgICAgICAgY29uc3QgeCA9IHN0eWxlLndpZHRoOwogICAgICAgIHN0eWxlLndpZHRoID0gc3R5bGUuaGVpZ2h0OwogICAgICAgIHN0eWxlLmhlaWdodCA9IHg7CiAgICAgICAgdGhpc1skZXh0cmFdLnNwYWNlID0gewogICAgICAgICAgd2lkdGg6IHRoaXMubWVkaXVtLmxvbmcsCiAgICAgICAgICBoZWlnaHQ6IHRoaXMubWVkaXVtLnNob3J0CiAgICAgICAgfTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2FybigiWEZBIC0gTm8gbWVkaXVtIHNwZWNpZmllZCBpbiBwYWdlQXJlYTogcGxlYXNlIGZpbGUgYSBidWcuIik7CiAgICB9CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICBmaWx0ZXI6IG5ldyBTZXQoWyJhcmVhIiwgImRyYXciLCAiZmllbGQiLCAic3ViZm9ybSJdKSwKICAgICAgaW5jbHVkZTogdHJ1ZQogICAgfSk7CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICBmaWx0ZXI6IG5ldyBTZXQoWyJjb250ZW50QXJlYSJdKSwKICAgICAgaW5jbHVkZTogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhUGFnZSJdLAogICAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICAgIHN0eWxlLAogICAgICAgIHhmYU5hbWU6IHRoaXMubmFtZQogICAgICB9CiAgICB9KTsKICB9Cn0KY2xhc3MgUGFnZVNldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYWdlU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLmR1cGxleEltcG9zaXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kdXBsZXhJbXBvc2l0aW9uLCBbImxvbmdFZGdlIiwgInNob3J0RWRnZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yZWxhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJlbGF0aW9uLCBbIm9yZGVyZWRPY2N1cnJlbmNlIiwgImR1cGxleFBhZ2luYXRlZCIsICJzaW1wbGV4UGFnaW5hdGVkIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5wYWdlQXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskY2xlYW5QYWdlXSgpIHsKICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuKSB7CiAgICAgIHBhZ2VbJGNsZWFuUGFnZV0oKTsKICAgIH0KICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4pIHsKICAgICAgcGFnZVskY2xlYW5QYWdlXSgpOwogICAgfQogIH0KICBbJGlzVXNhYmxlXSgpIHsKICAgIHJldHVybiAhdGhpcy5vY2N1ciB8fCB0aGlzLm9jY3VyLm1heCA9PT0gLTEgfHwgdGhpc1skZXh0cmFdLm51bWJlck9mVXNlIDwgdGhpcy5vY2N1ci5tYXg7CiAgfQogIFskZ2V0TmV4dFBhZ2VdKCkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAxLAogICAgICAgIHBhZ2VJbmRleDogLTEsCiAgICAgICAgcGFnZVNldEluZGV4OiAtMQogICAgICB9OwogICAgfQogICAgaWYgKHRoaXMucmVsYXRpb24gPT09ICJvcmRlcmVkT2NjdXJyZW5jZSIpIHsKICAgICAgaWYgKHRoaXNbJGV4dHJhXS5wYWdlSW5kZXggKyAxIDwgdGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICB0aGlzWyRleHRyYV0ucGFnZUluZGV4ICs9IDE7CiAgICAgICAgY29uc3QgcGFnZUFyZWEgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuW3RoaXNbJGV4dHJhXS5wYWdlSW5kZXhdOwogICAgICAgIHJldHVybiBwYWdlQXJlYVskZ2V0TmV4dFBhZ2VdKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXggKyAxIDwgdGhpcy5wYWdlU2V0LmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHRoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXggKz0gMTsKICAgICAgICByZXR1cm4gdGhpcy5wYWdlU2V0LmNoaWxkcmVuW3RoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXhdWyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBpZiAodGhpc1skaXNVc2FibGVdKCkpIHsKICAgICAgICB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgKz0gMTsKICAgICAgICB0aGlzWyRleHRyYV0ucGFnZUluZGV4ID0gLTE7CiAgICAgICAgdGhpc1skZXh0cmFdLnBhZ2VTZXRJbmRleCA9IC0xOwogICAgICAgIHJldHVybiB0aGlzWyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBQYWdlU2V0KSB7CiAgICAgICAgcmV0dXJuIHBhcmVudFskZ2V0TmV4dFBhZ2VdKCk7CiAgICAgIH0KICAgICAgdGhpc1skY2xlYW5QYWdlXSgpOwogICAgICByZXR1cm4gdGhpc1skZ2V0TmV4dFBhZ2VdKCk7CiAgICB9CiAgICBjb25zdCBwYWdlTnVtYmVyID0gdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFnZU51bWJlcjsKICAgIGNvbnN0IHBhcml0eSA9IHBhZ2VOdW1iZXIgJSAyID09PSAwID8gImV2ZW4iIDogIm9kZCI7CiAgICBjb25zdCBwb3NpdGlvbiA9IHBhZ2VOdW1iZXIgPT09IDAgPyAiZmlyc3QiIDogInJlc3QiOwogICAgbGV0IHBhZ2UgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQocCA9PiBwLm9kZE9yRXZlbiA9PT0gcGFyaXR5ICYmIHAucGFnZVBvc2l0aW9uID09PSBwb3NpdGlvbik7CiAgICBpZiAocGFnZSkgewogICAgICByZXR1cm4gcGFnZTsKICAgIH0KICAgIHBhZ2UgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQocCA9PiBwLm9kZE9yRXZlbiA9PT0gImFueSIgJiYgcC5wYWdlUG9zaXRpb24gPT09IHBvc2l0aW9uKTsKICAgIGlmIChwYWdlKSB7CiAgICAgIHJldHVybiBwYWdlOwogICAgfQogICAgcGFnZSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZChwID0+IHAub2RkT3JFdmVuID09PSAiYW55IiAmJiBwLnBhZ2VQb3NpdGlvbiA9PT0gImFueSIpOwogICAgaWYgKHBhZ2UpIHsKICAgICAgcmV0dXJuIHBhZ2U7CiAgICB9CiAgICByZXR1cm4gdGhpcy5wYWdlQXJlYS5jaGlsZHJlblswXTsKICB9Cn0KY2xhc3MgUGFyYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYXJhIiwgdHJ1ZSk7CiAgICB0aGlzLmhBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGluZUhlaWdodCA9IGF0dHJpYnV0ZXMubGluZUhlaWdodCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubGluZUhlaWdodCwgIjBwdCIpIDogIiI7CiAgICB0aGlzLm1hcmdpbkxlZnQgPSBhdHRyaWJ1dGVzLm1hcmdpbkxlZnQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1hcmdpbkxlZnQsICIwcHQiKSA6ICIiOwogICAgdGhpcy5tYXJnaW5SaWdodCA9IGF0dHJpYnV0ZXMubWFyZ2luUmlnaHQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1hcmdpblJpZ2h0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMub3JwaGFucyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm9ycGhhbnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMucHJlc2VydmUgPSBhdHRyaWJ1dGVzLnByZXNlcnZlIHx8ICIiOwogICAgdGhpcy5yYWRpeE9mZnNldCA9IGF0dHJpYnV0ZXMucmFkaXhPZmZzZXQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnJhZGl4T2Zmc2V0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMuc3BhY2VBYm92ZSA9IGF0dHJpYnV0ZXMuc3BhY2VBYm92ZSA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuc3BhY2VBYm92ZSwgIjBwdCIpIDogIiI7CiAgICB0aGlzLnNwYWNlQmVsb3cgPSBhdHRyaWJ1dGVzLnNwYWNlQmVsb3cgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNwYWNlQmVsb3csICIwcHQiKSA6ICIiOwogICAgdGhpcy50YWJEZWZhdWx0ID0gYXR0cmlidXRlcy50YWJEZWZhdWx0ID8gZ2V0TWVhc3VyZW1lbnQodGhpcy50YWJEZWZhdWx0KSA6ICIiOwogICAgdGhpcy50YWJTdG9wcyA9IChhdHRyaWJ1dGVzLnRhYlN0b3BzIHx8ICIiKS50cmltKCkuc3BsaXQoL1xzKy8pLm1hcCgoeCwgaSkgPT4gaSAlIDIgPT09IDEgPyBnZXRNZWFzdXJlbWVudCh4KSA6IHgpOwogICAgdGhpcy50ZXh0SW5kZW50ID0gYXR0cmlidXRlcy50ZXh0SW5kZW50ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy50ZXh0SW5kZW50LCAiMHB0IikgOiAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnZBbGlnbiwgWyJ0b3AiLCAiYm90dG9tIiwgIm1pZGRsZSJdKTsKICAgIHRoaXMud2lkb3dzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMud2lkb3dzLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmh5cGhlbmF0aW9uID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiaEFsaWduIik7CiAgICBpZiAodGhpcy5tYXJnaW5MZWZ0ICE9PSAiIikgewogICAgICBzdHlsZS5wYWRkaW5nTGVmdCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLm1hcmdpbkxlZnQpOwogICAgfQogICAgaWYgKHRoaXMubWFyZ2luUmlnaHQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdSaWdodCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLm1hcmdpblJpZ2h0KTsKICAgIH0KICAgIGlmICh0aGlzLnNwYWNlQWJvdmUgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdUb3AgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5zcGFjZUFib3ZlKTsKICAgIH0KICAgIGlmICh0aGlzLnNwYWNlQmVsb3cgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdCb3R0b20gPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5zcGFjZUJlbG93KTsKICAgIH0KICAgIGlmICh0aGlzLnRleHRJbmRlbnQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnRleHRJbmRlbnQgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy50ZXh0SW5kZW50KTsKICAgICAgZml4VGV4dEluZGVudChzdHlsZSk7CiAgICB9CiAgICBpZiAodGhpcy5saW5lSGVpZ2h0ID4gMCkgewogICAgICBzdHlsZS5saW5lSGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubGluZUhlaWdodCk7CiAgICB9CiAgICBpZiAodGhpcy50YWJEZWZhdWx0ICE9PSAiIikgewogICAgICBzdHlsZS50YWJTaXplID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMudGFiRGVmYXVsdCk7CiAgICB9CiAgICBpZiAodGhpcy50YWJTdG9wcy5sZW5ndGggPiAwKSB7fQogICAgaWYgKHRoaXMuaHlwaGVuYXRhdGlvbikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLmh5cGhlbmF0YXRpb25bJHRvU3R5bGVdKCkpOwogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBQYXNzd29yZEVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGFzc3dvcmRFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBhc3N3b3JkQ2hhciA9IGF0dHJpYnV0ZXMucGFzc3dvcmRDaGFyIHx8ICIqIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQp9CmNsYXNzIHRlbXBsYXRlX1BhdHRlcm4gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGF0dGVybiIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbImNyb3NzSGF0Y2giLCAiY3Jvc3NEaWFnb25hbCIsICJkaWFnb25hbExlZnQiLCAiZGlhZ29uYWxSaWdodCIsICJob3Jpem9udGFsIiwgInZlcnRpY2FsIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHN0YXJ0Q29sb3IgPSBzdGFydENvbG9yID8gc3RhcnRDb2xvclskdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICAgIGNvbnN0IGVuZENvbG9yID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCI7CiAgICBjb25zdCB3aWR0aCA9IDU7CiAgICBjb25zdCBjbWQgPSAicmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCI7CiAgICBjb25zdCBjb2xvcnMgPSBgJHtzdGFydENvbG9yfSwke3N0YXJ0Q29sb3J9ICR7d2lkdGh9cHgsJHtlbmRDb2xvcn0gJHt3aWR0aH1weCwke2VuZENvbG9yfSAkezIgKiB3aWR0aH1weGA7CiAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewogICAgICBjYXNlICJjcm9zc0hhdGNoIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byB0b3AsJHtjb2xvcnN9KSAke2NtZH0odG8gcmlnaHQsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgImNyb3NzRGlhZ29uYWwiOgogICAgICAgIHJldHVybiBgJHtjbWR9KDQ1ZGVnLCR7Y29sb3JzfSkgJHtjbWR9KC00NWRlZywke2NvbG9yc30pYDsKICAgICAgY2FzZSAiZGlhZ29uYWxMZWZ0IjoKICAgICAgICByZXR1cm4gYCR7Y21kfSg0NWRlZywke2NvbG9yc30pYDsKICAgICAgY2FzZSAiZGlhZ29uYWxSaWdodCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0oLTQ1ZGVnLCR7Y29sb3JzfSlgOwogICAgICBjYXNlICJob3Jpem9udGFsIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byB0b3AsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgInZlcnRpY2FsIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byByaWdodCwke2NvbG9yc30pYDsKICAgIH0KICAgIHJldHVybiAiIjsKICB9Cn0KY2xhc3MgUGljdHVyZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwaWN0dXJlIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFByb3RvIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInByb3RvIiwgdHJ1ZSk7CiAgICB0aGlzLmFwcGVhcmFuY2VGaWx0ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYXJjID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYXNzaXN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJhcmNvZGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYmluZEl0ZW1zID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJvb2tlbmQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ib3JkZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWsgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtBZnRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5icmVha0JlZm9yZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5idXR0b24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2FsY3VsYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNhcHRpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2VydGlmaWNhdGVzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNoZWNrQnV0dG9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNob2ljZUxpc3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29sb3IgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29tYiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvbnRlbnRBcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvcm5lciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlZmF1bHRVaSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZXNjID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRpZ2VzdE1ldGhvZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kaWdlc3RNZXRob2RzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRyYXcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZWRnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNvZGluZyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNvZGluZ3MgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY3J5cHRpb25NZXRob2QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZHMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGVjdXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4dHJhcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWxsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZpbHRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mb250ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZvcm1hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5oYW5kbGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmh5cGhlbmF0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmlzc3VlcnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaXRlbXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMua2VlcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5rZXlVc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5saW5lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmxpbmVhciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5sb2NrRG9jdW1lbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWFuaWZlc3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWFyZ2luID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1kcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5tZWRpdW0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWVzc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5udW1lcmljRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vY2N1ciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vaWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMub2lkcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vdmVyZmxvdyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlQXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhcmEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGFzc3dvcmRFZGl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhdHRlcm4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGljdHVyZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5yYWRpYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVhc29uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlYXNvbnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVjdGFuZ2xlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zY3JpcHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbkRhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbmF0dXJlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNpZ25pbmcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc29saWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3BlYWsgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3RpcHBsZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm1TZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViamVjdEROID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmplY3RETnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3VibWl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dEVkaXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lU3RhbXAgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudG9vbFRpcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmF2ZXJzYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudHJhdmVyc2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudWkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFsaWRhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFsdWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFyaWFibGVzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIFJhZGlhbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyYWRpYWwiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJ0b0VkZ2UiLCAidG9DZW50ZXIiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgc3RhcnRDb2xvciA9IHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogICAgY29uc3QgZW5kQ29sb3IgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIjsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMudHlwZSA9PT0gInRvRWRnZSIgPyBgJHtzdGFydENvbG9yfSwke2VuZENvbG9yfWAgOiBgJHtlbmRDb2xvcn0sJHtzdGFydENvbG9yfWA7CiAgICByZXR1cm4gYHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgY2VudGVyLCAke2NvbG9yc30pYDsKICB9Cn0KY2xhc3MgUmVhc29uIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlYXNvbiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBSZWFzb25zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlYXNvbnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnJlYXNvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBSZWN0YW5nbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicmVjdGFuZ2xlIiwgdHJ1ZSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29ybmVyID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5lZGdlID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5maWxsID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgY29uc3QgZWRnZSA9IHRoaXMuZWRnZS5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmVkZ2UuY2hpbGRyZW5bMF0gOiBuZXcgRWRnZSh7fSk7CiAgICBjb25zdCBlZGdlU3R5bGUgPSBlZGdlWyR0b1N0eWxlXSgpOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXMuZmlsbD8ucHJlc2VuY2UgPT09ICJ2aXNpYmxlIikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLmZpbGxbJHRvU3R5bGVdKCkpOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGUuZmlsbCA9ICJ0cmFuc3BhcmVudCI7CiAgICB9CiAgICBzdHlsZS5zdHJva2VXaWR0aCA9IG1lYXN1cmVUb1N0cmluZyhlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDApOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgY29uc3QgY29ybmVyID0gdGhpcy5jb3JuZXIuY2hpbGRyZW4ubGVuZ3RoID8gdGhpcy5jb3JuZXIuY2hpbGRyZW5bMF0gOiBuZXcgQ29ybmVyKHt9KTsKICAgIGNvbnN0IGNvcm5lclN0eWxlID0gY29ybmVyWyR0b1N0eWxlXSgpOwogICAgY29uc3QgcmVjdCA9IHsKICAgICAgbmFtZTogInJlY3QiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgIHg6IDAsCiAgICAgICAgeTogMCwKICAgICAgICByeDogY29ybmVyU3R5bGUucmFkaXVzLAogICAgICAgIHJ5OiBjb3JuZXJTdHlsZS5yYWRpdXMsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbcmVjdF0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICBvdmVyZmxvdzogInZpc2libGUiCiAgICAgICAgfSwKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3Moc3ZnKTsKICB9Cn0KY2xhc3MgUmVmRWxlbWVudCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyZWYiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgU2NyaXB0IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNjcmlwdCIpOwogICAgdGhpcy5iaW5kaW5nID0gYXR0cmlidXRlcy5iaW5kaW5nIHx8ICIiOwogICAgdGhpcy5jb250ZW50VHlwZSA9IGF0dHJpYnV0ZXMuY29udGVudFR5cGUgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucnVuQXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ydW5BdCwgWyJjbGllbnQiLCAiYm90aCIsICJzZXJ2ZXIiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTZXRQcm9wZXJ0eSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzZXRQcm9wZXJ0eSIpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgfQp9CmNsYXNzIFNpZ25EYXRhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNpZ25EYXRhIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3BlcmF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3BlcmF0aW9uLCBbInNpZ24iLCAiY2xlYXIiLCAidmVyaWZ5Il0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5maWx0ZXIgPSBudWxsOwogICAgdGhpcy5tYW5pZmVzdCA9IG51bGw7CiAgfQp9CmNsYXNzIFNpZ25hdHVyZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzaWduYXR1cmUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJQREYxLjMiLCAiUERGMS42Il0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KfQpjbGFzcyBTaWduaW5nIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNpZ25pbmciLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIFNvbGlkIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNvbGlkIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgcmV0dXJuIHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogIH0KfQpjbGFzcyBTcGVhayBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzcGVhayIpOwogICAgdGhpcy5kaXNhYmxlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGlzYWJsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wcmlvcml0eSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByaW9yaXR5LCBbImN1c3RvbSIsICJjYXB0aW9uIiwgIm5hbWUiLCAidG9vbFRpcCJdKTsKICAgIHRoaXMucmlkID0gYXR0cmlidXRlcy5yaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTdGlwcGxlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN0aXBwbGUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5yYXRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucmF0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiA1MCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwICYmIHggPD0gMTAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXShiZ0NvbG9yKSB7CiAgICBjb25zdCBhbHBoYSA9IHRoaXMucmF0ZSAvIDEwMDsKICAgIHJldHVybiBVdGlsLm1ha2VIZXhDb2xvcihNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuciAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5yICogYWxwaGEpLCBNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuZyAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5nICogYWxwaGEpLCBNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuYiAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5iICogYWxwaGEpKTsKICB9Cn0KY2xhc3MgU3ViZm9ybSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJmb3JtIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2VzcyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjY2VzcywgWyJvcGVuIiwgIm5vbkludGVyYWN0aXZlIiwgInByb3RlY3RlZCIsICJyZWFkT25seSJdKTsKICAgIHRoaXMuYWxsb3dNYWNybyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFsbG93TWFjcm8sCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5jb2x1bW5XaWR0aHMgPSAoYXR0cmlidXRlcy5jb2x1bW5XaWR0aHMgfHwgIiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKHggPT4geCA9PT0gIi0xIiA/IC0xIDogZ2V0TWVhc3VyZW1lbnQoeCkpOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxheW91dCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxheW91dCwgWyJwb3NpdGlvbiIsICJsci10YiIsICJybC1yb3ciLCAicmwtdGIiLCAicm93IiwgInRhYmxlIiwgInRiIl0pOwogICAgdGhpcy5sb2NhbGUgPSBhdHRyaWJ1dGVzLmxvY2FsZSB8fCAiIjsKICAgIHRoaXMubWF4SCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4SCwgIjBwdCIpOwogICAgdGhpcy5tYXhXID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhXLCAiMHB0Iik7CiAgICB0aGlzLm1lcmdlTW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1lcmdlTW9kZSwgWyJjb25zdW1lRGF0YSIsICJtYXRjaFRlbXBsYXRlIl0pOwogICAgdGhpcy5taW5IID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5ILCAiMHB0Iik7CiAgICB0aGlzLm1pblcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pblcsICIwcHQiKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnJlc3RvcmVTdGF0ZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJlc3RvcmVTdGF0ZSwgWyJtYW51YWwiLCAiYXV0byJdKTsKICAgIHRoaXMuc2NvcGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zY29wZSwgWyJuYW1lIiwgIm5vbmUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ID0gYXR0cmlidXRlcy53ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy53KSA6ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuYXNzaXN0ID0gbnVsbDsKICAgIHRoaXMuYmluZCA9IG51bGw7CiAgICB0aGlzLmJvb2tlbmQgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5icmVhayA9IG51bGw7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG51bGw7CiAgICB0aGlzLmRlc2MgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5vdmVyZmxvdyA9IG51bGw7CiAgICB0aGlzLnBhZ2VTZXQgPSBudWxsOwogICAgdGhpcy5wYXJhID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2FsID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy52YXJpYWJsZXMgPSBudWxsOwogICAgdGhpcy5hcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtCZWZvcmUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29ubmVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wcm90byA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm1TZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRnZXRTdWJmb3JtUGFyZW50XSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTdWJmb3JtU2V0KSB7CiAgICAgIHJldHVybiBwYXJlbnRbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50OwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskaXNUaGVyZU1vcmVXaWR0aF0oKSB7CiAgICByZXR1cm4gdGhpcy5sYXlvdXQuZW5kc1dpdGgoIi10YiIpICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPiAwIHx8IHRoaXNbJGdldFBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKTsKICB9CiAgKlskZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkgewogICAgeWllbGQqIGdldENvbnRhaW5lZENoaWxkcmVuKHRoaXMpOwogIH0KICBbJGZsdXNoSFRNTF0oKSB7CiAgICByZXR1cm4gZmx1c2hIVE1MKHRoaXMpOwogIH0KICBbJGFkZEhUTUxdKGh0bWwsIGJib3gpIHsKICAgIGFkZEhUTUwodGhpcywgaHRtbCwgYmJveCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkgewogICAgcmV0dXJuIGdldEF2YWlsYWJsZVNwYWNlKHRoaXMpOwogIH0KICBbJGlzU3BsaXR0YWJsZV0oKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgaWYgKCFwYXJlbnRbJGlzU3BsaXR0YWJsZV0oKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGU7CiAgICB9CiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICJwb3NpdGlvbiIgfHwgdGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLmtlZXAgJiYgdGhpcy5rZWVwLmludGFjdCAhPT0gIm5vbmUiKSB7CiAgICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChwYXJlbnQubGF5b3V0Py5lbmRzV2l0aCgiLXRiIikgJiYgcGFyZW50WyRleHRyYV0ubnVtYmVySW5MaW5lICE9PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gdHJ1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHNldFRhYkluZGV4KHRoaXMpOwogICAgaWYgKHRoaXMuYnJlYWspIHsKICAgICAgaWYgKHRoaXMuYnJlYWsuYWZ0ZXIgIT09ICJhdXRvIiB8fCB0aGlzLmJyZWFrLmFmdGVyVGFyZ2V0ICE9PSAiIikgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQnJlYWtBZnRlcih7CiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLmJyZWFrLmFmdGVyLAogICAgICAgICAgdGFyZ2V0OiB0aGlzLmJyZWFrLmFmdGVyVGFyZ2V0LAogICAgICAgICAgc3RhcnROZXc6IHRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKQogICAgICAgIH0pOwogICAgICAgIG5vZGVbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgIHRoaXMuYnJlYWtBZnRlci5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJyZWFrLmJlZm9yZSAhPT0gImF1dG8iIHx8IHRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0ICE9PSAiIikgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQnJlYWtCZWZvcmUoewogICAgICAgICAgdGFyZ2V0VHlwZTogdGhpcy5icmVhay5iZWZvcmUsCiAgICAgICAgICB0YXJnZXQ6IHRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0LAogICAgICAgICAgc3RhcnROZXc6IHRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKQogICAgICAgIH0pOwogICAgICAgIG5vZGVbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgIHRoaXMuYnJlYWtCZWZvcmUucHVzaChub2RlKTsKICAgICAgfQogICAgICBpZiAodGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCAhPT0gIiIpIHsKICAgICAgICBjb25zdCBub2RlID0gbmV3IE92ZXJmbG93KHsKICAgICAgICAgIHRhcmdldDogdGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCwKICAgICAgICAgIGxlYWRlcjogdGhpcy5icmVhay5vdmVyZmxvd0xlYWRlciwKICAgICAgICAgIHRyYWlsZXI6IHRoaXMuYnJlYWsub3ZlcmZsb3dUcmFpbGVyCiAgICAgICAgfSk7CiAgICAgICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgICAgdGhpcy5vdmVyZmxvdy5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIHRoaXNbJHJlbW92ZUNoaWxkXSh0aGlzLmJyZWFrKTsKICAgICAgdGhpcy5icmVhayA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5wcmVzZW5jZSA9PT0gImhpZGRlbiIgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImluYWN0aXZlIikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICh0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgdGhpcy5icmVha0FmdGVyLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigiWEZBIC0gU2V2ZXJhbCBicmVha0JlZm9yZSBvciBicmVha0FmdGVyIGluIHN1YmZvcm1zOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKTsKICAgIH0KICAgIGlmICh0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7CiAgICAgIGNvbnN0IGJyZWFrQmVmb3JlID0gdGhpcy5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgaWYgKGhhbmRsZUJyZWFrKGJyZWFrQmVmb3JlKSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LmJyZWFrTm9kZShicmVha0JlZm9yZSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0/LmFmdGVyQnJlYWtBZnRlcikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGZpeERpbWVuc2lvbnModGhpcyk7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgIGNsYXNzOiBbXQogICAgfTsKICAgIHNldEFjY2Vzcyh0aGlzLCBhdHRyaWJ1dGVzLmNsYXNzKTsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIHRoaXNbJGV4dHJhXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBPYmplY3QuYXNzaWduKHRoaXNbJGV4dHJhXSwgewogICAgICBjaGlsZHJlbiwKICAgICAgbGluZTogbnVsbCwKICAgICAgYXR0cmlidXRlcywKICAgICAgYXR0ZW1wdDogMCwKICAgICAgbnVtYmVySW5MaW5lOiAwLAogICAgICBhdmFpbGFibGVTcGFjZTogewogICAgICAgIHdpZHRoOiBNYXRoLm1pbih0aGlzLncgfHwgSW5maW5pdHksIGF2YWlsYWJsZVNwYWNlLndpZHRoKSwKICAgICAgICBoZWlnaHQ6IE1hdGgubWluKHRoaXMuaCB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2UuaGVpZ2h0KQogICAgICB9LAogICAgICB3aWR0aDogMCwKICAgICAgaGVpZ2h0OiAwLAogICAgICBwcmV2SGVpZ2h0OiAwLAogICAgICBjdXJyZW50V2lkdGg6IDAKICAgIH0pOwogICAgY29uc3Qgcm9vdCA9IHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgIGNvbnN0IHNhdmVkTm9MYXlvdXRGYWlsdXJlID0gcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZTsKICAgIGNvbnN0IGlzU3BsaXR0YWJsZSA9IHRoaXNbJGlzU3BsaXR0YWJsZV0oKTsKICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgIHNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgfQogICAgaWYgKCFjaGVja0RpbWVuc2lvbnModGhpcywgYXZhaWxhYmxlU3BhY2UpKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImV4Y2xHcm91cCIsICJmaWVsZCIsICJzdWJmb3JtIiwgInN1YmZvcm1TZXQiXSk7CiAgICBpZiAodGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5XaWR0aHMpICYmIGNvbHVtbldpZHRocy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRoczsKICAgICAgICB0aGlzWyRleHRyYV0uY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiYW5jaG9yVHlwZSIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgImJvcmRlciIsICJtYXJnaW4iLCAiaEFsaWduIik7CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFTdWJmb3JtIl07CiAgICBjb25zdCBjbCA9IGxheW91dENsYXNzKHRoaXMpOwogICAgaWYgKGNsKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaChjbCk7CiAgICB9CiAgICBhdHRyaWJ1dGVzLnN0eWxlID0gc3R5bGU7CiAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3NOYW1lczsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgaWYgKHRoaXMub3ZlcmZsb3cpIHsKICAgICAgY29uc3Qgb3ZlcmZsb3dFeHRyYSA9IHRoaXMub3ZlcmZsb3dbJGdldEV4dHJhXSgpOwogICAgICBpZiAob3ZlcmZsb3dFeHRyYS5hZGRMZWFkZXIpIHsKICAgICAgICBvdmVyZmxvd0V4dHJhLmFkZExlYWRlciA9IGZhbHNlOwogICAgICAgIGhhbmRsZU92ZXJmbG93KHRoaXMsIG92ZXJmbG93RXh0cmEubGVhZGVyLCBhdmFpbGFibGVTcGFjZSk7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHB1c2hQYXJhXSgpOwogICAgY29uc3QgaXNMclRiID0gdGhpcy5sYXlvdXQgPT09ICJsci10YiIgfHwgdGhpcy5sYXlvdXQgPT09ICJybC10YiI7CiAgICBjb25zdCBtYXhSdW4gPSBpc0xyVGIgPyBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIDogMTsKICAgIGZvciAoOyB0aGlzWyRleHRyYV0uYXR0ZW1wdCA8IG1heFJ1bjsgdGhpc1skZXh0cmFdLmF0dGVtcHQrKykgewogICAgICBpZiAoaXNMclRiICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIC0gMSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPSAwOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgICAgZmlsdGVyLAogICAgICAgIGluY2x1ZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQuaXNCcmVhaygpKSB7CiAgICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGlmIChpc0xyVGIgJiYgdGhpc1skZXh0cmFdLmF0dGVtcHQgPT09IDAgJiYgdGhpc1skZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCAmJiAhcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID0gbWF4UnVuOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgdW5zZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIHJvb3RbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSBzYXZlZE5vTGF5b3V0RmFpbHVyZTsKICAgIGlmICh0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gbWF4UnVuKSB7CiAgICAgIGlmICh0aGlzLm92ZXJmbG93KSB7CiAgICAgICAgdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ub3ZlcmZsb3dOb2RlID0gdGhpcy5vdmVyZmxvdzsKICAgICAgfQogICAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICAgIGRlbGV0ZSB0aGlzWyRleHRyYV07CiAgICAgIH0KICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIGlmICh0aGlzLm92ZXJmbG93KSB7CiAgICAgIGNvbnN0IG92ZXJmbG93RXh0cmEgPSB0aGlzLm92ZXJmbG93WyRnZXRFeHRyYV0oKTsKICAgICAgaWYgKG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlcikgewogICAgICAgIG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlciA9IGZhbHNlOwogICAgICAgIGhhbmRsZU92ZXJmbG93KHRoaXMsIG92ZXJmbG93RXh0cmEudHJhaWxlciwgYXZhaWxhYmxlU3BhY2UpOwogICAgICB9CiAgICB9CiAgICBsZXQgbWFyZ2luSCA9IDA7CiAgICBsZXQgbWFyZ2luViA9IDA7CiAgICBpZiAodGhpcy5tYXJnaW4pIHsKICAgICAgbWFyZ2luSCA9IHRoaXMubWFyZ2luLmxlZnRJbnNldCArIHRoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgIG1hcmdpblYgPSB0aGlzLm1hcmdpbi50b3BJbnNldCArIHRoaXMubWFyZ2luLmJvdHRvbUluc2V0OwogICAgfQogICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCh0aGlzWyRleHRyYV0ud2lkdGggKyBtYXJnaW5ILCB0aGlzLncgfHwgMCk7CiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCh0aGlzWyRleHRyYV0uaGVpZ2h0ICsgbWFyZ2luViwgdGhpcy5oIHx8IDApOwogICAgY29uc3QgYmJveCA9IFt0aGlzLngsIHRoaXMueSwgd2lkdGgsIGhlaWdodF07CiAgICBpZiAodGhpcy53ID09PSAiIikgewogICAgICBzdHlsZS53aWR0aCA9IG1lYXN1cmVUb1N0cmluZyh3aWR0aCk7CiAgICB9CiAgICBpZiAodGhpcy5oID09PSAiIikgewogICAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaGVpZ2h0KTsKICAgIH0KICAgIGlmICgoc3R5bGUud2lkdGggPT09ICIwcHgiIHx8IHN0eWxlLmhlaWdodCA9PT0gIjBweCIpICYmIGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgcmVzdWx0ID0gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogICAgaWYgKHRoaXMuYnJlYWtBZnRlci5jaGlsZHJlbi5sZW5ndGggPj0gMSkgewogICAgICBjb25zdCBicmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyLmNoaWxkcmVuWzBdOwogICAgICBpZiAoaGFuZGxlQnJlYWsoYnJlYWtBZnRlcikpIHsKICAgICAgICB0aGlzWyRleHRyYV0uYWZ0ZXJCcmVha0FmdGVyID0gcmVzdWx0OwogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LmJyZWFrTm9kZShicmVha0FmdGVyKTsKICAgICAgfQogICAgfQogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CmNsYXNzIFN1YmZvcm1TZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3ViZm9ybVNldCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucmVsYXRpb24sIFsib3JkZXJlZCIsICJjaG9pY2UiLCAidW5vcmRlcmVkIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9va2VuZCA9IG51bGw7CiAgICB0aGlzLmJyZWFrID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm9jY3VyID0gbnVsbDsKICAgIHRoaXMub3ZlcmZsb3cgPSBudWxsOwogICAgdGhpcy5icmVha0FmdGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQmVmb3JlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybVNldCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICAqWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSB7CiAgICB5aWVsZCogZ2V0Q29udGFpbmVkQ2hpbGRyZW4odGhpcyk7CiAgfQogIFskZ2V0U3ViZm9ybVBhcmVudF0oKSB7CiAgICBsZXQgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU3ViZm9ybSkpIHsKICAgICAgcGFyZW50ID0gcGFyZW50WyRnZXRQYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50OwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CmNsYXNzIFN1YmplY3RETiBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3ViamVjdEROIik7CiAgICB0aGlzLmRlbGltaXRlciA9IGF0dHJpYnV0ZXMuZGVsaW1pdGVyIHx8ICIsIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IG5ldyBNYXAodGhpc1skY29udGVudF0uc3BsaXQodGhpcy5kZWxpbWl0ZXIpLm1hcChrdiA9PiB7CiAgICAgIGt2ID0ga3Yuc3BsaXQoIj0iLCAyKTsKICAgICAga3ZbMF0gPSBrdlswXS50cmltKCk7CiAgICAgIHJldHVybiBrdjsKICAgIH0pKTsKICB9Cn0KY2xhc3MgU3ViamVjdEROcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJqZWN0RE5zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5zdWJqZWN0RE4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgU3VibWl0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN1Ym1pdCIsIHRydWUpOwogICAgdGhpcy5lbWJlZFBERiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmVtYmVkUERGLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5mb3JtYXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5mb3JtYXQsIFsieGRwIiwgImZvcm1kYXRhIiwgInBkZiIsICJ1cmxlbmNvZGVkIiwgInhmZCIsICJ4bWwiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRleHRFbmNvZGluZyA9IGdldEtleXdvcmQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRleHRFbmNvZGluZyA/IGF0dHJpYnV0ZXMudGV4dEVuY29kaW5nLnRvTG93ZXJDYXNlKCkgOiAiIiwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IGsgPT4gWyJ1dGYtOCIsICJiaWctZml2ZSIsICJmb250c3BlY2lmaWMiLCAiZ2JrIiwgImdiLTE4MDMwIiwgImdiLTIzMTIiLCAia3NjLTU2MDEiLCAibm9uZSIsICJzaGlmdC1qaXMiLCAidWNzLTIiLCAidXRmLTE2Il0uaW5jbHVkZXMoaykgfHwgay5tYXRjaCgvaXNvLTg4NTktXGR7Mn0vKQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy54ZHBDb250ZW50ID0gYXR0cmlidXRlcy54ZHBDb250ZW50IHx8ICIiOwogICAgdGhpcy5lbmNyeXB0ID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdERhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbkRhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGVtcGxhdGUiLCB0cnVlKTsKICAgIHRoaXMuYmFzZVByb2ZpbGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5iYXNlUHJvZmlsZSwgWyJmdWxsIiwgImludGVyYWN0aXZlRm9ybXMiXSk7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodGhpcy5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICB3YXJuKCJYRkEgLSBObyBzdWJmb3JtcyBpbiB0ZW1wbGF0ZSBub2RlLiIpOwogICAgfQogICAgaWYgKHRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGggPj0gMikgewogICAgICB3YXJuKCJYRkEgLSBTZXZlcmFsIHN1YmZvcm1zIGluIHRlbXBsYXRlIG5vZGU6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgfQogICAgdGhpc1skdGFiSW5kZXhdID0gREVGQVVMVF9UQUJfSU5ERVg7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJHNlYXJjaE5vZGVdKGV4cHIsIGNvbnRhaW5lcikgewogICAgaWYgKGV4cHIuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgIHJldHVybiBbdGhpc1skaWRzXS5nZXQoZXhwci5zbGljZSgxKSldOwogICAgfQogICAgcmV0dXJuIHNlYXJjaE5vZGUodGhpcywgY29udGFpbmVyLCBleHByLCB0cnVlLCB0cnVlKTsKICB9CiAgKlskdG9QYWdlc10oKSB7CiAgICBpZiAoIXRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgY2hpbGRyZW46IFtdCiAgICAgIH0pOwogICAgfQogICAgdGhpc1skZXh0cmFdID0gewogICAgICBvdmVyZmxvd05vZGU6IG51bGwsCiAgICAgIGZpcnN0VW5zcGxpdHRhYmxlOiBudWxsLAogICAgICBjdXJyZW50Q29udGVudEFyZWE6IG51bGwsCiAgICAgIGN1cnJlbnRQYWdlQXJlYTogbnVsbCwKICAgICAgbm9MYXlvdXRGYWlsdXJlOiBmYWxzZSwKICAgICAgcGFnZU51bWJlcjogMSwKICAgICAgcGFnZVBvc2l0aW9uOiAiZmlyc3QiLAogICAgICBvZGRPckV2ZW46ICJvZGQiLAogICAgICBibGFua09yTm90Qmxhbms6ICJub25CbGFuayIsCiAgICAgIHBhcmFTdGFjazogW10KICAgIH07CiAgICBjb25zdCByb290ID0gdGhpcy5zdWJmb3JtLmNoaWxkcmVuWzBdOwogICAgcm9vdC5wYWdlU2V0WyRjbGVhblBhZ2VdKCk7CiAgICBjb25zdCBwYWdlQXJlYXMgPSByb290LnBhZ2VTZXQucGFnZUFyZWEuY2hpbGRyZW47CiAgICBjb25zdCBtYWluSHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGxldCBwYWdlQXJlYSA9IG51bGw7CiAgICBsZXQgYnJlYWtCZWZvcmUgPSBudWxsOwogICAgbGV0IGJyZWFrQmVmb3JlVGFyZ2V0ID0gbnVsbDsKICAgIGlmIChyb290LmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7CiAgICAgIGJyZWFrQmVmb3JlID0gcm9vdC5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgYnJlYWtCZWZvcmVUYXJnZXQgPSBicmVha0JlZm9yZS50YXJnZXQ7CiAgICB9IGVsc2UgaWYgKHJvb3Quc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGggPj0gMSAmJiByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW5bMF07CiAgICAgIGJyZWFrQmVmb3JlVGFyZ2V0ID0gYnJlYWtCZWZvcmUudGFyZ2V0OwogICAgfSBlbHNlIGlmIChyb290LmJyZWFrPy5iZWZvcmVUYXJnZXQpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LmJyZWFrOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLmJlZm9yZVRhcmdldDsKICAgIH0gZWxzZSBpZiAocm9vdC5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA+PSAxICYmIHJvb3Quc3ViZm9ybS5jaGlsZHJlblswXS5icmVhaz8uYmVmb3JlVGFyZ2V0KSB7CiAgICAgIGJyZWFrQmVmb3JlID0gcm9vdC5zdWJmb3JtLmNoaWxkcmVuWzBdLmJyZWFrOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLmJlZm9yZVRhcmdldDsKICAgIH0KICAgIGlmIChicmVha0JlZm9yZSkgewogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzWyRzZWFyY2hOb2RlXShicmVha0JlZm9yZVRhcmdldCwgYnJlYWtCZWZvcmVbJGdldFBhcmVudF0oKSk7CiAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkgewogICAgICAgIHBhZ2VBcmVhID0gdGFyZ2V0OwogICAgICAgIGJyZWFrQmVmb3JlWyRleHRyYV0gPSB7fTsKICAgICAgfQogICAgfQogICAgaWYgKCFwYWdlQXJlYSkgewogICAgICBwYWdlQXJlYSA9IHBhZ2VBcmVhc1swXTsKICAgIH0KICAgIHBhZ2VBcmVhWyRleHRyYV0gPSB7CiAgICAgIG51bWJlck9mVXNlOiAxCiAgICB9OwogICAgY29uc3QgcGFnZUFyZWFQYXJlbnQgPSBwYWdlQXJlYVskZ2V0UGFyZW50XSgpOwogICAgcGFnZUFyZWFQYXJlbnRbJGV4dHJhXSA9IHsKICAgICAgbnVtYmVyT2ZVc2U6IDEsCiAgICAgIHBhZ2VJbmRleDogcGFnZUFyZWFQYXJlbnQucGFnZUFyZWEuY2hpbGRyZW4uaW5kZXhPZihwYWdlQXJlYSksCiAgICAgIHBhZ2VTZXRJbmRleDogMAogICAgfTsKICAgIGxldCB0YXJnZXRQYWdlQXJlYTsKICAgIGxldCBsZWFkZXIgPSBudWxsOwogICAgbGV0IHRyYWlsZXIgPSBudWxsOwogICAgbGV0IGhhc1NvbWV0aGluZyA9IHRydWU7CiAgICBsZXQgaGFzU29tZXRoaW5nQ291bnRlciA9IDA7CiAgICBsZXQgc3RhcnRJbmRleCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoIWhhc1NvbWV0aGluZykgewogICAgICAgIG1haW5IdG1sLmNoaWxkcmVuLnBvcCgpOwogICAgICAgIGlmICgrK2hhc1NvbWV0aGluZ0NvdW50ZXIgPT09IE1BWF9FTVBUWV9QQUdFUykgewogICAgICAgICAgd2FybigiWEZBIC0gU29tZXRoaW5nIGdvZXMgd3Jvbmc6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgICAgICAgcmV0dXJuIG1haW5IdG1sOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBoYXNTb21ldGhpbmdDb3VudGVyID0gMDsKICAgICAgfQogICAgICB0YXJnZXRQYWdlQXJlYSA9IG51bGw7CiAgICAgIHRoaXNbJGV4dHJhXS5jdXJyZW50UGFnZUFyZWEgPSBwYWdlQXJlYTsKICAgICAgY29uc3QgcGFnZSA9IHBhZ2VBcmVhWyR0b0hUTUxdKCkuaHRtbDsKICAgICAgbWFpbkh0bWwuY2hpbGRyZW4ucHVzaChwYWdlKTsKICAgICAgaWYgKGxlYWRlcikgewogICAgICAgIHRoaXNbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSB0cnVlOwogICAgICAgIHBhZ2UuY2hpbGRyZW4ucHVzaChsZWFkZXJbJHRvSFRNTF0ocGFnZUFyZWFbJGV4dHJhXS5zcGFjZSkuaHRtbCk7CiAgICAgICAgbGVhZGVyID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodHJhaWxlcikgewogICAgICAgIHRoaXNbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSB0cnVlOwogICAgICAgIHBhZ2UuY2hpbGRyZW4ucHVzaCh0cmFpbGVyWyR0b0hUTUxdKHBhZ2VBcmVhWyRleHRyYV0uc3BhY2UpLmh0bWwpOwogICAgICAgIHRyYWlsZXIgPSBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGNvbnRlbnRBcmVhcyA9IHBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuOwogICAgICBjb25zdCBodG1sQ29udGVudEFyZWFzID0gcGFnZS5jaGlsZHJlbi5maWx0ZXIobm9kZSA9PiBub2RlLmF0dHJpYnV0ZXMuY2xhc3MuaW5jbHVkZXMoInhmYUNvbnRlbnRhcmVhIikpOwogICAgICBoYXNTb21ldGhpbmcgPSBmYWxzZTsKICAgICAgdGhpc1skZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID0gbnVsbDsKICAgICAgdGhpc1skZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IGZhbHNlOwogICAgICBjb25zdCBmbHVzaCA9IGluZGV4ID0+IHsKICAgICAgICBjb25zdCBodG1sID0gcm9vdFskZmx1c2hIVE1MXSgpOwogICAgICAgIGlmIChodG1sKSB7CiAgICAgICAgICBoYXNTb21ldGhpbmcgfHw9IGh0bWwuY2hpbGRyZW4/Lmxlbmd0aCA+IDA7CiAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2luZGV4XS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGlpID0gY29udGVudEFyZWFzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBjb250ZW50QXJlYSA9IHRoaXNbJGV4dHJhXS5jdXJyZW50Q29udGVudEFyZWEgPSBjb250ZW50QXJlYXNbaV07CiAgICAgICAgY29uc3Qgc3BhY2UgPSB7CiAgICAgICAgICB3aWR0aDogY29udGVudEFyZWEudywKICAgICAgICAgIGhlaWdodDogY29udGVudEFyZWEuaAogICAgICAgIH07CiAgICAgICAgc3RhcnRJbmRleCA9IDA7CiAgICAgICAgaWYgKGxlYWRlcikgewogICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpXS5jaGlsZHJlbi5wdXNoKGxlYWRlclskdG9IVE1MXShzcGFjZSkuaHRtbCk7CiAgICAgICAgICBsZWFkZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodHJhaWxlcikgewogICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpXS5jaGlsZHJlbi5wdXNoKHRyYWlsZXJbJHRvSFRNTF0oc3BhY2UpLmh0bWwpOwogICAgICAgICAgdHJhaWxlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGh0bWwgPSByb290WyR0b0hUTUxdKHNwYWNlKTsKICAgICAgICBpZiAoaHRtbC5zdWNjZXNzKSB7CiAgICAgICAgICBpZiAoaHRtbC5odG1sKSB7CiAgICAgICAgICAgIGhhc1NvbWV0aGluZyB8fD0gaHRtbC5odG1sLmNoaWxkcmVuPy5sZW5ndGggPiAwOwogICAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2ldLmNoaWxkcmVuLnB1c2goaHRtbC5odG1sKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1NvbWV0aGluZyAmJiBtYWluSHRtbC5jaGlsZHJlbi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIG1haW5IdG1sLmNoaWxkcmVuLnBvcCgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1haW5IdG1sOwogICAgICAgIH0KICAgICAgICBpZiAoaHRtbC5pc0JyZWFrKCkpIHsKICAgICAgICAgIGNvbnN0IG5vZGUgPSBodG1sLmJyZWFrTm9kZTsKICAgICAgICAgIGZsdXNoKGkpOwogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gImF1dG8iKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUubGVhZGVyKSB7CiAgICAgICAgICAgIGxlYWRlciA9IHRoaXNbJHNlYXJjaE5vZGVdKG5vZGUubGVhZGVyLCBub2RlWyRnZXRQYXJlbnRdKCkpOwogICAgICAgICAgICBsZWFkZXIgPSBsZWFkZXIgPyBsZWFkZXJbMF0gOiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudHJhaWxlcikgewogICAgICAgICAgICB0cmFpbGVyID0gdGhpc1skc2VhcmNoTm9kZV0obm9kZS50cmFpbGVyLCBub2RlWyRnZXRQYXJlbnRdKCkpOwogICAgICAgICAgICB0cmFpbGVyID0gdHJhaWxlciA/IHRyYWlsZXJbMF0gOiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gInBhZ2VBcmVhIikgewogICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IG5vZGVbJGV4dHJhXS50YXJnZXQ7CiAgICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGVbJGV4dHJhXS50YXJnZXQpIHsKICAgICAgICAgICAgaSA9IG5vZGVbJGV4dHJhXS5pbmRleDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gbm9kZVskZXh0cmFdLnRhcmdldDsKICAgICAgICAgICAgc3RhcnRJbmRleCA9IG5vZGVbJGV4dHJhXS5pbmRleCArIDE7CiAgICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodGhpc1skZXh0cmFdLm92ZXJmbG93Tm9kZSkgewogICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXNbJGV4dHJhXS5vdmVyZmxvd05vZGU7CiAgICAgICAgICB0aGlzWyRleHRyYV0ub3ZlcmZsb3dOb2RlID0gbnVsbDsKICAgICAgICAgIGNvbnN0IG92ZXJmbG93RXh0cmEgPSBub2RlWyRnZXRFeHRyYV0oKTsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG92ZXJmbG93RXh0cmEudGFyZ2V0OwogICAgICAgICAgb3ZlcmZsb3dFeHRyYS5hZGRMZWFkZXIgPSBvdmVyZmxvd0V4dHJhLmxlYWRlciAhPT0gbnVsbDsKICAgICAgICAgIG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlciA9IG92ZXJmbG93RXh0cmEudHJhaWxlciAhPT0gbnVsbDsKICAgICAgICAgIGZsdXNoKGkpOwogICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gaTsKICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkgewogICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IHRhcmdldDsKICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29udGVudEFyZWEpIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjb250ZW50QXJlYXMuaW5kZXhPZih0YXJnZXQpOwogICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gY3VycmVudEluZGV4KSB7CiAgICAgICAgICAgICAgICBpID0gaW5kZXggLSAxOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gdGFyZ2V0WyRnZXRQYXJlbnRdKCk7CiAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRhcmdldFBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YodGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZsdXNoKGkpOwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXS5wYWdlTnVtYmVyICs9IDE7CiAgICAgIGlmICh0YXJnZXRQYWdlQXJlYSkgewogICAgICAgIGlmICh0YXJnZXRQYWdlQXJlYVskaXNVc2FibGVdKCkpIHsKICAgICAgICAgIHRhcmdldFBhZ2VBcmVhWyRleHRyYV0ubnVtYmVyT2ZVc2UgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0UGFnZUFyZWEgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICBwYWdlQXJlYSA9IHRhcmdldFBhZ2VBcmVhIHx8IHBhZ2VBcmVhWyRnZXROZXh0UGFnZV0oKTsKICAgICAgeWllbGQgbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgVGV4dCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm1heENoYXJzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWF4Q2hhcnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmlkID0gYXR0cmlidXRlcy5yaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmIChjaGlsZFskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1skY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIGNvbnRlbnQgaW4gVGV4dDogJHtjaGlsZFskbm9kZU5hbWVdfS5gKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRvblRleHRdKHN0cikgewogICAgaWYgKHRoaXNbJGNvbnRlbnRdIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN1cGVyWyRvblRleHRdKHN0cik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS5yZXBsYWNlQWxsKCJcclxuIiwgIlxuIik7CiAgICB9CiAgfQogIFskZ2V0RXh0cmFdKCkgewogICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnNwbGl0KC9bXHUyMDI5XHUyMDI4XG5dLykuZmlsdGVyKGxpbmUgPT4gISFsaW5lKS5qb2luKCJcbiIpOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0ZXh0XSgpOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGlmICh0eXBlb2YgdGhpc1skY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGh0bWwgPSB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSkuaHRtbDsKICAgICAgaWYgKHRoaXNbJGNvbnRlbnRdLmluY2x1ZGVzKCJcdTIwMjkiKSkgewogICAgICAgIGh0bWwubmFtZSA9ICJkaXYiOwogICAgICAgIGh0bWwuY2hpbGRyZW4gPSBbXTsKICAgICAgICB0aGlzWyRjb250ZW50XS5zcGxpdCgiXHUyMDI5IikubWFwKHBhcmEgPT4gcGFyYS5zcGxpdCgvW1x1MjAyOFxuXS8pLmZsYXRNYXAobGluZSA9PiBbewogICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgdmFsdWU6IGxpbmUKICAgICAgICB9LCB7CiAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgfV0pKS5mb3JFYWNoKGxpbmVzID0+IHsKICAgICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIG5hbWU6ICJwIiwKICAgICAgICAgICAgY2hpbGRyZW46IGxpbmVzCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICgvW1x1MjAyOFxuXS8udGVzdCh0aGlzWyRjb250ZW50XSkpIHsKICAgICAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgICAgICBodG1sLmNoaWxkcmVuID0gW107CiAgICAgICAgdGhpc1skY29udGVudF0uc3BsaXQoL1tcdTIwMjhcbl0vKS5mb3JFYWNoKGxpbmUgPT4gewogICAgICAgICAgaHRtbC5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgICB2YWx1ZTogbGluZQogICAgICAgICAgfSwgewogICAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWwpOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICB9Cn0KY2xhc3MgVGV4dEVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dEVkaXQiLCB0cnVlKTsKICAgIHRoaXMuYWxsb3dSaWNoVGV4dCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFsbG93UmljaFRleHQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm11bHRpTGluZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm11bHRpTGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMCB8fCB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy52U2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jb21iID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImJvcmRlciIsICJmb250IiwgIm1hcmdpbiIpOwogICAgbGV0IGh0bWw7CiAgICBjb25zdCBmaWVsZCA9IHRoaXNbJGdldFBhcmVudF0oKVskZ2V0UGFyZW50XSgpOwogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAiIikgewogICAgICB0aGlzLm11bHRpTGluZSA9IGZpZWxkIGluc3RhbmNlb2YgRHJhdyA/IDEgOiAwOwogICAgfQogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAxKSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogInRleHRhcmVhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogImlucHV0IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIFRpbWUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGltZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgVGltZVN0YW1wIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRpbWVTdGFtcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnNlcnZlciA9IGF0dHJpYnV0ZXMuc2VydmVyIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFRvb2xUaXAgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidG9vbFRpcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJpZCA9IGF0dHJpYnV0ZXMucmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgVHJhdmVyc2FsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRyYXZlcnNhbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBUcmF2ZXJzZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0cmF2ZXJzZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJuZXh0IiwgImJhY2siLCAiZG93biIsICJmaXJzdCIsICJsZWZ0IiwgInJpZ2h0IiwgInVwIl0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQogIGdldCBuYW1lKCkgewogICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uOwogIH0KICBbJGlzVHJhbnNwYXJlbnRdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpjbGFzcyBVaSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ1aSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICAgIHRoaXMuYmFyY29kZSA9IG51bGw7CiAgICB0aGlzLmJ1dHRvbiA9IG51bGw7CiAgICB0aGlzLmNoZWNrQnV0dG9uID0gbnVsbDsKICAgIHRoaXMuY2hvaWNlTGlzdCA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lRWRpdCA9IG51bGw7CiAgICB0aGlzLmRlZmF1bHRVaSA9IG51bGw7CiAgICB0aGlzLmltYWdlRWRpdCA9IG51bGw7CiAgICB0aGlzLm51bWVyaWNFZGl0ID0gbnVsbDsKICAgIHRoaXMucGFzc3dvcmRFZGl0ID0gbnVsbDsKICAgIHRoaXMuc2lnbmF0dXJlID0gbnVsbDsKICAgIHRoaXMudGV4dEVkaXQgPSBudWxsOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICh0aGlzWyRleHRyYV0gPT09IHVuZGVmaW5lZCkgewogICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgICBpZiAobmFtZSA9PT0gImV4dHJhcyIgfHwgbmFtZSA9PT0gInBpY3R1cmUiKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2JqID0gdGhpc1tuYW1lXTsKICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYRkFPYmplY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhpc1skZXh0cmFdID0gb2JqOwogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgdGhpc1skZXh0cmFdID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgb2JqID0gdGhpc1skZ2V0RXh0cmFdKCk7CiAgICBpZiAob2JqKSB7CiAgICAgIHJldHVybiBvYmpbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgfQp9CmNsYXNzIFZhbGlkYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInZhbGlkYXRlIiwgdHJ1ZSk7CiAgICB0aGlzLmZvcm1hdFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5mb3JtYXRUZXN0LCBbIndhcm5pbmciLCAiZGlzYWJsZWQiLCAiZXJyb3IiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubnVsbFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5udWxsVGVzdCwgWyJkaXNhYmxlZCIsICJlcnJvciIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy5zY3JpcHRUZXN0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NyaXB0VGVzdCwgWyJlcnJvciIsICJkaXNhYmxlZCIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KfQpjbGFzcyBWYWx1ZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ2YWx1ZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJyaWRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMub3ZlcnJpZGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5hcmMgPSBudWxsOwogICAgdGhpcy5ib29sZWFuID0gbnVsbDsKICAgIHRoaXMuZGF0ZSA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lID0gbnVsbDsKICAgIHRoaXMuZGVjaW1hbCA9IG51bGw7CiAgICB0aGlzLmV4RGF0YSA9IG51bGw7CiAgICB0aGlzLmZsb2F0ID0gbnVsbDsKICAgIHRoaXMuaW1hZ2UgPSBudWxsOwogICAgdGhpcy5pbnRlZ2VyID0gbnVsbDsKICAgIHRoaXMubGluZSA9IG51bGw7CiAgICB0aGlzLnJlY3RhbmdsZSA9IG51bGw7CiAgICB0aGlzLnRleHQgPSBudWxsOwogICAgdGhpcy50aW1lID0gbnVsbDsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGaWVsZCkgewogICAgICBpZiAocGFyZW50LnVpPy5pbWFnZUVkaXQpIHsKICAgICAgICBpZiAoIXRoaXMuaW1hZ2UpIHsKICAgICAgICAgIHRoaXMuaW1hZ2UgPSBuZXcgSW1hZ2Uoe30pOwogICAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKHRoaXMuaW1hZ2UpOwogICAgICAgIH0KICAgICAgICB0aGlzLmltYWdlWyRjb250ZW50XSA9IHZhbHVlWyRjb250ZW50XTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHZhbHVlTmFtZSA9IHZhbHVlWyRub2RlTmFtZV07CiAgICBpZiAodGhpc1t2YWx1ZU5hbWVdICE9PSBudWxsKSB7CiAgICAgIHRoaXNbdmFsdWVOYW1lXVskY29udGVudF0gPSB2YWx1ZVskY29udGVudF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IG51bGw7CiAgICAgICAgdGhpc1skcmVtb3ZlQ2hpbGRdKG9iaik7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbdmFsdWVbJG5vZGVOYW1lXV0gPSB2YWx1ZTsKICAgIHRoaXNbJGFwcGVuZENoaWxkXSh2YWx1ZSk7CiAgfQogIFskdGV4dF0oKSB7CiAgICBpZiAodGhpcy5leERhdGEpIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4RGF0YVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XVskdGV4dF0oKS50cmltKCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJpbWFnZSIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIChvYmpbJGNvbnRlbnRdIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhGQU9iamVjdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gb2JqWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KfQpjbGFzcyBWYXJpYWJsZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidmFyaWFibGVzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1hbmlmZXN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNjcmlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBUZW1wbGF0ZU5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChUZW1wbGF0ZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBjb25zdCBub2RlID0gVGVtcGxhdGVOYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICAgIG5vZGVbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBhcHBlYXJhbmNlRmlsdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFwcGVhcmFuY2VGaWx0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYXJjKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyYyhhdHRycyk7CiAgfQogIHN0YXRpYyBhcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyZWEoYXR0cnMpOwogIH0KICBzdGF0aWMgYXNzaXN0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFzc2lzdChhdHRycyk7CiAgfQogIHN0YXRpYyBiYXJjb2RlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhcmNvZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgYmluZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJpbmRJdGVtcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9va2VuZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCb29rZW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJvb2xlYW4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQm9vbGVhbkVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9yZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJvcmRlcihhdHRycyk7CiAgfQogIHN0YXRpYyBicmVhayhhdHRycykgewogICAgcmV0dXJuIG5ldyBCcmVhayhhdHRycyk7CiAgfQogIHN0YXRpYyBicmVha0FmdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrQWZ0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYnJlYWtCZWZvcmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQnJlYWtCZWZvcmUoYXR0cnMpOwogIH0KICBzdGF0aWMgYnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJ1dHRvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjYWxjdWxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhcHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDZXJ0aWZpY2F0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2VydGlmaWNhdGVzKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoZWNrQnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENoZWNrQnV0dG9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNob2ljZUxpc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2hvaWNlTGlzdChhdHRycyk7CiAgfQogIHN0YXRpYyBjb2xvcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb2xvcihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21iKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbWIoYXR0cnMpOwogIH0KICBzdGF0aWMgY29ubmVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25uZWN0KGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbnRlbnRBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbnRlbnRBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvcm5lcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb3JuZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWVFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGRlY2ltYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVjaW1hbChhdHRycyk7CiAgfQogIHN0YXRpYyBkZWZhdWx0VWkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVmYXVsdFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlc2MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzYyhhdHRycyk7CiAgfQogIHN0YXRpYyBkaWdlc3RNZXRob2QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kKGF0dHJzKTsKICB9CiAgc3RhdGljIGRpZ2VzdE1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kcyhhdHRycyk7CiAgfQogIHN0YXRpYyBkcmF3KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERyYXcoYXR0cnMpOwogIH0KICBzdGF0aWMgZWRnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZGdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY29kaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5ncyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNvZGluZ3MoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHREYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHREYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uTWV0aG9kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHRpb25NZXRob2QoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZXZlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXZlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhEYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEV4RGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBleE9iamVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFeE9iamVjdChhdHRycyk7CiAgfQogIHN0YXRpYyBleGNsR3JvdXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhjbEdyb3VwKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4ZWN1dGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhlY3V0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBleHRyYXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXh0cmFzKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpZWxkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZpZWxkKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpbGwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsbChhdHRycyk7CiAgfQogIHN0YXRpYyBmaWx0ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsdGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGZsb2F0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0KGF0dHJzKTsKICB9CiAgc3RhdGljIGZvbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgdGVtcGxhdGVfRm9udChhdHRycyk7CiAgfQogIHN0YXRpYyBmb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIGhhbmRsZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSGFuZGxlcihhdHRycyk7CiAgfQogIHN0YXRpYyBoeXBoZW5hdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBIeXBoZW5hdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbWFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW1hZ2VFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGludGVnZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW50ZWdlcihhdHRycyk7CiAgfQogIHN0YXRpYyBpc3N1ZXJzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IElzc3VlcnMoYXR0cnMpOwogIH0KICBzdGF0aWMgaXRlbXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMga2VlcChhdHRycykgewogICAgcmV0dXJuIG5ldyBLZWVwKGF0dHJzKTsKICB9CiAgc3RhdGljIGtleVVzYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEtleVVzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGxpbmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZShhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZWFyKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2tEb2N1bWVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2NrRG9jdW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFuaWZlc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWFuaWZlc3QoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFyZ2luKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcmdpbihhdHRycyk7CiAgfQogIHN0YXRpYyBtZHAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWRwKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lZGl1bShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVzc2FnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXNzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIG51bWVyaWNFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWVyaWNFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIG9jY3VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9jY3VyKGF0dHJzKTsKICB9CiAgc3RhdGljIG9pZChhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWQoYXR0cnMpOwogIH0KICBzdGF0aWMgb2lkcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWRzKGF0dHJzKTsKICB9CiAgc3RhdGljIG92ZXJmbG93KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE92ZXJmbG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2VBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZVNldChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXJhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhcmEoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFzc3dvcmRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhc3N3b3JkRWRpdChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IHRlbXBsYXRlX1BhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgcGljdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQaWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIHByb3RvKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByb3RvKGF0dHJzKTsKICB9CiAgc3RhdGljIHJhZGlhbChhdHRycykgewogICAgcmV0dXJuIG5ldyBSYWRpYWwoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVhc29uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbihhdHRycyk7CiAgfQogIHN0YXRpYyByZWFzb25zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbnMoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVjdGFuZ2xlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShhdHRycyk7CiAgfQogIHN0YXRpYyByZWYoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVmRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2NyaXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIHNldFByb3BlcnR5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNldFByb3BlcnR5KGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25EYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNpZ25EYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgc2lnbmluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHNvbGlkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvbGlkKGF0dHJzKTsKICB9CiAgc3RhdGljIHNwZWFrKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNwZWFrKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0aXBwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RpcHBsZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJmb3JtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YmZvcm0oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViZm9ybVNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJmb3JtU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1YmplY3RETihhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE4oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViamVjdEROcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE5zKGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGVtcGxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGV4dChhdHRycykgewogICAgcmV0dXJuIG5ldyBUZXh0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRleHRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRleHRFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRpbWUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyB0aW1lU3RhbXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVN0YW1wKGF0dHJzKTsKICB9CiAgc3RhdGljIHRvb2xUaXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVG9vbFRpcChhdHRycyk7CiAgfQogIHN0YXRpYyB0cmF2ZXJzYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhdmVyc2FsKGF0dHJzKTsKICB9CiAgc3RhdGljIHRyYXZlcnNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYXZlcnNlKGF0dHJzKTsKICB9CiAgc3RhdGljIHVpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbGlkYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbHVlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbHVlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhcmlhYmxlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWYXJpYWJsZXMoYXR0cnMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2JpbmQuanMKCgoKCgoKY29uc3QgYmluZF9OU19EQVRBU0VUUyA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKZnVuY3Rpb24gY3JlYXRlVGV4dChjb250ZW50KSB7CiAgY29uc3Qgbm9kZSA9IG5ldyBUZXh0KHt9KTsKICBub2RlWyRjb250ZW50XSA9IGNvbnRlbnQ7CiAgcmV0dXJuIG5vZGU7Cn0KY2xhc3MgQmluZGVyIHsKICBjb25zdHJ1Y3Rvcihyb290KSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy5kYXRhc2V0cyA9IHJvb3QuZGF0YXNldHM7CiAgICB0aGlzLmRhdGEgPSByb290LmRhdGFzZXRzPy5kYXRhIHx8IG5ldyBYbWxPYmplY3QoTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkLCAiZGF0YSIpOwogICAgdGhpcy5lbXB0eU1lcmdlID0gdGhpcy5kYXRhWyRnZXRDaGlsZHJlbl0oKS5sZW5ndGggPT09IDA7CiAgICB0aGlzLnJvb3QuZm9ybSA9IHRoaXMuZm9ybSA9IHJvb3QudGVtcGxhdGVbJGNsb25lXSgpOwogIH0KICBfaXNDb25zdW1lRGF0YSgpIHsKICAgIHJldHVybiAhdGhpcy5lbXB0eU1lcmdlICYmIHRoaXMuX21lcmdlTW9kZTsKICB9CiAgX2lzTWF0Y2hUZW1wbGF0ZSgpIHsKICAgIHJldHVybiAhdGhpcy5faXNDb25zdW1lRGF0YSgpOwogIH0KICBiaW5kKCkgewogICAgdGhpcy5fYmluZEVsZW1lbnQodGhpcy5mb3JtLCB0aGlzLmRhdGEpOwogICAgcmV0dXJuIHRoaXMuZm9ybTsKICB9CiAgZ2V0RGF0YSgpIHsKICAgIHJldHVybiB0aGlzLmRhdGE7CiAgfQogIF9iaW5kVmFsdWUoZm9ybU5vZGUsIGRhdGEsIHBpY3R1cmUpIHsKICAgIGZvcm1Ob2RlWyRkYXRhXSA9IGRhdGE7CiAgICBpZiAoZm9ybU5vZGVbJGhhc1NldHRhYmxlVmFsdWVdKCkpIHsKICAgICAgaWYgKGRhdGFbJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhWyRnZXREYXRhVmFsdWVdKCk7CiAgICAgICAgZm9ybU5vZGVbJHNldFZhbHVlXShjcmVhdGVUZXh0KHZhbHVlKSk7CiAgICAgIH0gZWxzZSBpZiAoZm9ybU5vZGUgaW5zdGFuY2VvZiBGaWVsZCAmJiBmb3JtTm9kZS51aT8uY2hvaWNlTGlzdD8ub3BlbiA9PT0gIm11bHRpU2VsZWN0IikgewogICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVskZ2V0Q2hpbGRyZW5dKCkubWFwKGNoaWxkID0+IGNoaWxkWyRjb250ZW50XS50cmltKCkpLmpvaW4oIlxuIik7CiAgICAgICAgZm9ybU5vZGVbJHNldFZhbHVlXShjcmVhdGVUZXh0KHZhbHVlKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgd2FybihgWEZBIC0gTm9kZXMgaGF2ZW4ndCB0aGUgc2FtZSB0eXBlLmApOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFkYXRhWyRpc0RhdGFWYWx1ZV0oKSB8fCB0aGlzLl9pc01hdGNoVGVtcGxhdGUoKSkgewogICAgICB0aGlzLl9iaW5kRWxlbWVudChmb3JtTm9kZSwgZGF0YSk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKGBYRkEgLSBOb2RlcyBoYXZlbid0IHRoZSBzYW1lIHR5cGUuYCk7CiAgICB9CiAgfQogIF9maW5kRGF0YUJ5TmFtZVRvQ29uc3VtZShuYW1lLCBpc1ZhbHVlLCBkYXRhTm9kZSwgZ2xvYmFsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgZ2VuZXJhdG9yLCBtYXRjaDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgIGdlbmVyYXRvciA9IGRhdGFOb2RlWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgZmFsc2UsIHRydWUpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG1hdGNoID0gZ2VuZXJhdG9yLm5leHQoKS52YWx1ZTsKICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVmFsdWUgPT09IG1hdGNoWyRpc0RhdGFWYWx1ZV0oKSkgewogICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkICYmIGRhdGFOb2RlWyRub2RlTmFtZV0gPT09ICJkYXRhIikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRhdGFOb2RlID0gZGF0YU5vZGVbJGdldFBhcmVudF0oKTsKICAgIH0KICAgIGlmICghZ2xvYmFsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZ2VuZXJhdG9yID0gdGhpcy5kYXRhWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgdHJ1ZSwgZmFsc2UpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIGdlbmVyYXRvciA9IHRoaXMuZGF0YVskZ2V0QXR0cmlidXRlSXRdKG5hbWUsIHRydWUpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoPy5bJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgZGF0YU5vZGUpIHsKICAgIGlmICghZm9ybU5vZGUuaGFzT3duUHJvcGVydHkoInNldFByb3BlcnR5IikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZiwKICAgICAgdGFyZ2V0LAogICAgICBjb25uZWN0aW9uCiAgICB9IG9mIGZvcm1Ob2RlLnNldFByb3BlcnR5LmNoaWxkcmVuKSB7CiAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBub2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCBmYWxzZSwgZmFsc2UpOwogICAgICBpZiAoIW5vZGVzKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBbbm9kZV0gPSBub2RlczsKICAgICAgaWYgKCFub2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YSkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIG5vZGU6IG11c3QgYmUgYSBkYXRhIG5vZGUuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdGFyZ2V0Tm9kZXMgPSBzZWFyY2hOb2RlKHRoaXMucm9vdCwgZm9ybU5vZGUsIHRhcmdldCwgZmFsc2UsIGZhbHNlKTsKICAgICAgaWYgKCF0YXJnZXROb2RlcykgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdGFyZ2V0OiAke3RhcmdldH0uYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgW3RhcmdldE5vZGVdID0gdGFyZ2V0Tm9kZXM7CiAgICAgIGlmICghdGFyZ2V0Tm9kZVskaXNEZXNjZW5kZW50XShmb3JtTm9kZSkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHRhcmdldDogbXVzdCBiZSBhIHByb3BlcnR5IG9yIHN1YnByb3BlcnR5LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHRhcmdldFBhcmVudCA9IHRhcmdldE5vZGVbJGdldFBhcmVudF0oKTsKICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBTZXRQcm9wZXJ0eSB8fCB0YXJnZXRQYXJlbnQgaW5zdGFuY2VvZiBTZXRQcm9wZXJ0eSkgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdGFyZ2V0OiBjYW5ub3QgYmUgYSBzZXRQcm9wZXJ0eSBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBCaW5kSXRlbXMgfHwgdGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgQmluZEl0ZW1zKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIGJpbmRJdGVtcyBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29udGVudCA9IG5vZGVbJHRleHRdKCk7CiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb2RlWyRub2RlTmFtZV07CiAgICAgIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgWEZBQXR0cmlidXRlKSB7CiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGF0dHJzW25hbWVdID0gY29udGVudDsKICAgICAgICBjb25zdCBvYmogPSBSZWZsZWN0LmNvbnN0cnVjdChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0UGFyZW50KS5jb25zdHJ1Y3RvciwgW2F0dHJzXSk7CiAgICAgICAgdGFyZ2V0UGFyZW50W25hbWVdID0gb2JqW25hbWVdOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghdGFyZ2V0Tm9kZS5oYXNPd25Qcm9wZXJ0eSgkY29udGVudCkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIG5vZGUgdG8gdXNlIGluIHNldFByb3BlcnR5YCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGFyZ2V0Tm9kZVskZGF0YV0gPSBub2RlOwogICAgICB0YXJnZXROb2RlWyRjb250ZW50XSA9IGNvbnRlbnQ7CiAgICAgIHRhcmdldE5vZGVbJGZpbmFsaXplXSgpOwogICAgfQogIH0KICBfYmluZEl0ZW1zKGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgaWYgKCFmb3JtTm9kZS5oYXNPd25Qcm9wZXJ0eSgiaXRlbXMiKSB8fCAhZm9ybU5vZGUuaGFzT3duUHJvcGVydHkoImJpbmRJdGVtcyIpIHx8IGZvcm1Ob2RlLmJpbmRJdGVtcy5pc0VtcHR5KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBpdGVtIG9mIGZvcm1Ob2RlLml0ZW1zLmNoaWxkcmVuKSB7CiAgICAgIGZvcm1Ob2RlWyRyZW1vdmVDaGlsZF0oaXRlbSk7CiAgICB9CiAgICBmb3JtTm9kZS5pdGVtcy5jbGVhcigpOwogICAgY29uc3QgbGFiZWxzID0gbmV3IEl0ZW1zKHt9KTsKICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBJdGVtcyh7fSk7CiAgICBmb3JtTm9kZVskYXBwZW5kQ2hpbGRdKGxhYmVscyk7CiAgICBmb3JtTm9kZS5pdGVtcy5wdXNoKGxhYmVscyk7CiAgICBmb3JtTm9kZVskYXBwZW5kQ2hpbGRdKHZhbHVlcyk7CiAgICBmb3JtTm9kZS5pdGVtcy5wdXNoKHZhbHVlcyk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgcmVmLAogICAgICBsYWJlbFJlZiwKICAgICAgdmFsdWVSZWYsCiAgICAgIGNvbm5lY3Rpb24KICAgIH0gb2YgZm9ybU5vZGUuYmluZEl0ZW1zLmNoaWxkcmVuKSB7CiAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBub2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCBmYWxzZSwgZmFsc2UpOwogICAgICBpZiAoIW5vZGVzKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHsKICAgICAgICBpZiAoIW5vZGVbJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpIHsKICAgICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgcmVmICgke3JlZn0pOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWxOb2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBub2RlLCBsYWJlbFJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmICghbGFiZWxOb2RlcykgewogICAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCBsYWJlbDogJHtsYWJlbFJlZn0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgW2xhYmVsTm9kZV0gPSBsYWJlbE5vZGVzOwogICAgICAgIGlmICghbGFiZWxOb2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIGxhYmVsOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmFsdWVOb2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBub2RlLCB2YWx1ZVJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmICghdmFsdWVOb2RlcykgewogICAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB2YWx1ZTogJHt2YWx1ZVJlZn0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgW3ZhbHVlTm9kZV0gPSB2YWx1ZU5vZGVzOwogICAgICAgIGlmICghdmFsdWVOb2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWwgPSBjcmVhdGVUZXh0KGxhYmVsTm9kZVskdGV4dF0oKSk7CiAgICAgICAgY29uc3QgdmFsdWUgPSBjcmVhdGVUZXh0KHZhbHVlTm9kZVskdGV4dF0oKSk7CiAgICAgICAgbGFiZWxzWyRhcHBlbmRDaGlsZF0obGFiZWwpOwogICAgICAgIGxhYmVscy50ZXh0LnB1c2gobGFiZWwpOwogICAgICAgIHZhbHVlc1skYXBwZW5kQ2hpbGRdKHZhbHVlKTsKICAgICAgICB2YWx1ZXMudGV4dC5wdXNoKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KICBfYmluZE9jY3VycmVuY2VzKGZvcm1Ob2RlLCBtYXRjaGVzLCBwaWN0dXJlKSB7CiAgICBsZXQgYmFzZUNsb25lOwogICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkgewogICAgICBiYXNlQ2xvbmUgPSBmb3JtTm9kZVskY2xvbmVdKCk7CiAgICAgIGJhc2VDbG9uZVskcmVtb3ZlQ2hpbGRdKGJhc2VDbG9uZS5vY2N1cik7CiAgICAgIGJhc2VDbG9uZS5vY2N1ciA9IG51bGw7CiAgICB9CiAgICB0aGlzLl9iaW5kVmFsdWUoZm9ybU5vZGUsIG1hdGNoZXNbMF0sIHBpY3R1cmUpOwogICAgdGhpcy5fc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgbWF0Y2hlc1swXSk7CiAgICB0aGlzLl9iaW5kSXRlbXMoZm9ybU5vZGUsIG1hdGNoZXNbMF0pOwogICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAxKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IGZvcm1Ob2RlWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBuYW1lID0gZm9ybU5vZGVbJG5vZGVOYW1lXTsKICAgIGNvbnN0IHBvcyA9IHBhcmVudFskaW5kZXhPZl0oZm9ybU5vZGUpOwogICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbWF0Y2hlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgY29uc3QgY2xvbmUgPSBiYXNlQ2xvbmVbJGNsb25lXSgpOwogICAgICBwYXJlbnRbbmFtZV0ucHVzaChjbG9uZSk7CiAgICAgIHBhcmVudFskaW5zZXJ0QXRdKHBvcyArIGksIGNsb25lKTsKICAgICAgdGhpcy5fYmluZFZhbHVlKGNsb25lLCBtYXRjaCwgcGljdHVyZSk7CiAgICAgIHRoaXMuX3NldFByb3BlcnRpZXMoY2xvbmUsIG1hdGNoKTsKICAgICAgdGhpcy5fYmluZEl0ZW1zKGNsb25lLCBtYXRjaCk7CiAgICB9CiAgfQogIF9jcmVhdGVPY2N1cnJlbmNlcyhmb3JtTm9kZSkgewogICAgaWYgKCF0aGlzLmVtcHR5TWVyZ2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgewogICAgICBvY2N1cgogICAgfSA9IGZvcm1Ob2RlOwogICAgaWYgKCFvY2N1ciB8fCBvY2N1ci5pbml0aWFsIDw9IDEpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50ID0gZm9ybU5vZGVbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IG5hbWUgPSBmb3JtTm9kZVskbm9kZU5hbWVdOwogICAgaWYgKCEocGFyZW50W25hbWVdIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBjdXJyZW50TnVtYmVyOwogICAgaWYgKGZvcm1Ob2RlLm5hbWUpIHsKICAgICAgY3VycmVudE51bWJlciA9IHBhcmVudFtuYW1lXS5jaGlsZHJlbi5maWx0ZXIoZSA9PiBlLm5hbWUgPT09IGZvcm1Ob2RlLm5hbWUpLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnROdW1iZXIgPSBwYXJlbnRbbmFtZV0uY2hpbGRyZW4ubGVuZ3RoOwogICAgfQogICAgY29uc3QgcG9zID0gcGFyZW50WyRpbmRleE9mXShmb3JtTm9kZSkgKyAxOwogICAgY29uc3QgaWkgPSBvY2N1ci5pbml0aWFsIC0gY3VycmVudE51bWJlcjsKICAgIGlmIChpaSkgewogICAgICBjb25zdCBub2RlQ2xvbmUgPSBmb3JtTm9kZVskY2xvbmVdKCk7CiAgICAgIG5vZGVDbG9uZVskcmVtb3ZlQ2hpbGRdKG5vZGVDbG9uZS5vY2N1cik7CiAgICAgIG5vZGVDbG9uZS5vY2N1ciA9IG51bGw7CiAgICAgIHBhcmVudFtuYW1lXS5wdXNoKG5vZGVDbG9uZSk7CiAgICAgIHBhcmVudFskaW5zZXJ0QXRdKHBvcywgbm9kZUNsb25lKTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgY2xvbmUgPSBub2RlQ2xvbmVbJGNsb25lXSgpOwogICAgICAgIHBhcmVudFtuYW1lXS5wdXNoKGNsb25lKTsKICAgICAgICBwYXJlbnRbJGluc2VydEF0XShwb3MgKyBpLCBjbG9uZSk7CiAgICAgIH0KICAgIH0KICB9CiAgX2dldE9jY3VySW5mbyhmb3JtTm9kZSkgewogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICBvY2N1cgogICAgfSA9IGZvcm1Ob2RlOwogICAgaWYgKCFvY2N1ciB8fCAhbmFtZSkgewogICAgICByZXR1cm4gWzEsIDFdOwogICAgfQogICAgY29uc3QgbWF4ID0gb2NjdXIubWF4ID09PSAtMSA/IEluZmluaXR5IDogb2NjdXIubWF4OwogICAgcmV0dXJuIFtvY2N1ci5taW4sIG1heF07CiAgfQogIF9zZXRBbmRCaW5kKGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgdGhpcy5fc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgZGF0YU5vZGUpOwogICAgdGhpcy5fYmluZEl0ZW1zKGZvcm1Ob2RlLCBkYXRhTm9kZSk7CiAgICB0aGlzLl9iaW5kRWxlbWVudChmb3JtTm9kZSwgZGF0YU5vZGUpOwogIH0KICBfYmluZEVsZW1lbnQoZm9ybU5vZGUsIGRhdGFOb2RlKSB7CiAgICBjb25zdCB1c2VsZXNzTm9kZXMgPSBbXTsKICAgIHRoaXMuX2NyZWF0ZU9jY3VycmVuY2VzKGZvcm1Ob2RlKTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZm9ybU5vZGVbJGdldENoaWxkcmVuXSgpKSB7CiAgICAgIGlmIChjaGlsZFskZGF0YV0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbWVyZ2VNb2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGRbJG5vZGVOYW1lXSA9PT0gInN1YmZvcm0iKSB7CiAgICAgICAgdGhpcy5fbWVyZ2VNb2RlID0gY2hpbGQubWVyZ2VNb2RlID09PSAiY29uc3VtZURhdGEiOwogICAgICAgIGNvbnN0IGRhdGFDaGlsZHJlbiA9IGRhdGFOb2RlWyRnZXRDaGlsZHJlbl0oKTsKICAgICAgICBpZiAoZGF0YUNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuX2JpbmRPY2N1cnJlbmNlcyhjaGlsZCwgW2RhdGFDaGlsZHJlblswXV0sIG51bGwpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICBjb25zdCBuc0lkID0gZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gYmluZF9OU19EQVRBU0VUUyA/IC0xIDogZGF0YU5vZGVbJG5hbWVzcGFjZUlkXTsKICAgICAgICAgIGNvbnN0IGRhdGFDaGlsZCA9IGNoaWxkWyRkYXRhXSA9IG5ldyBYbWxPYmplY3QobnNJZCwgY2hpbGQubmFtZSB8fCAicm9vdCIpOwogICAgICAgICAgZGF0YU5vZGVbJGFwcGVuZENoaWxkXShkYXRhQ2hpbGQpOwogICAgICAgICAgdGhpcy5fYmluZEVsZW1lbnQoY2hpbGQsIGRhdGFDaGlsZCk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghY2hpbGRbJGlzQmluZGFibGVdKCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgZ2xvYmFsID0gZmFsc2U7CiAgICAgIGxldCBwaWN0dXJlID0gbnVsbDsKICAgICAgbGV0IHJlZiA9IG51bGw7CiAgICAgIGxldCBtYXRjaCA9IG51bGw7CiAgICAgIGlmIChjaGlsZC5iaW5kKSB7CiAgICAgICAgc3dpdGNoIChjaGlsZC5iaW5kLm1hdGNoKSB7CiAgICAgICAgICBjYXNlICJub25lIjoKICAgICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgImdsb2JhbCI6CiAgICAgICAgICAgIGdsb2JhbCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiZGF0YVJlZiI6CiAgICAgICAgICAgIGlmICghY2hpbGQuYmluZC5yZWYpIHsKICAgICAgICAgICAgICB3YXJuKGBYRkEgLSByZWYgaXMgZW1wdHkgaW4gbm9kZSAke2NoaWxkWyRub2RlTmFtZV19LmApOwogICAgICAgICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIGRhdGFOb2RlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWYgPSBjaGlsZC5iaW5kLnJlZjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGNoaWxkLmJpbmQucGljdHVyZSkgewogICAgICAgICAgcGljdHVyZSA9IGNoaWxkLmJpbmQucGljdHVyZVskY29udGVudF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLl9nZXRPY2N1ckluZm8oY2hpbGQpOwogICAgICBpZiAocmVmKSB7CiAgICAgICAgbWF0Y2ggPSBzZWFyY2hOb2RlKHRoaXMucm9vdCwgZGF0YU5vZGUsIHJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCkgewogICAgICAgICAgbWF0Y2ggPSBjcmVhdGVEYXRhTm9kZSh0aGlzLmRhdGEsIGRhdGFOb2RlLCByZWYpOwogICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgICAgbWF0Y2hbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBtYXRjaCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX2lzQ29uc3VtZURhdGEoKSkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLmZpbHRlcihub2RlID0+ICFub2RlWyRjb25zdW1lZF0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IG1heCkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLnNsaWNlKDAsIG1heCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBtYXRjaCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgICAgIG1hdGNoLmZvckVhY2gobm9kZSA9PiB7CiAgICAgICAgICAgICAgbm9kZVskY29uc3VtZWRdID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICghY2hpbGQubmFtZSkgewogICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBbXTsKICAgICAgICAgIHdoaWxlIChtYXRjaGVzLmxlbmd0aCA8IG1heCkgewogICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX2ZpbmREYXRhQnlOYW1lVG9Db25zdW1lKGNoaWxkLm5hbWUsIGNoaWxkWyRoYXNTZXR0YWJsZVZhbHVlXSgpLCBkYXRhTm9kZSwgZ2xvYmFsKTsKICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvdW5kWyRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgICBtYXRjaGVzLnB1c2goZm91bmQpOwogICAgICAgICAgfQogICAgICAgICAgbWF0Y2ggPSBtYXRjaGVzLmxlbmd0aCA+IDAgPyBtYXRjaGVzIDogbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWF0Y2ggPSBkYXRhTm9kZVskZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGNoaWxkLm5hbWUsIGZhbHNlLCB0aGlzLmVtcHR5TWVyZ2UpLm5leHQoKS52YWx1ZTsKICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgaWYgKG1pbiA9PT0gMCkgewogICAgICAgICAgICAgIHVzZWxlc3NOb2Rlcy5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuc0lkID0gZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gYmluZF9OU19EQVRBU0VUUyA/IC0xIDogZGF0YU5vZGVbJG5hbWVzcGFjZUlkXTsKICAgICAgICAgICAgbWF0Y2ggPSBjaGlsZFskZGF0YV0gPSBuZXcgWG1sT2JqZWN0KG5zSWQsIGNoaWxkLm5hbWUpOwogICAgICAgICAgICBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICAgICAgbWF0Y2hbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YU5vZGVbJGFwcGVuZENoaWxkXShtYXRjaCk7CiAgICAgICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIG1hdGNoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICAgIG1hdGNoWyRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgbWF0Y2ggPSBbbWF0Y2hdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICB0aGlzLl9iaW5kT2NjdXJyZW5jZXMoY2hpbGQsIG1hdGNoLCBwaWN0dXJlKTsKICAgICAgfSBlbHNlIGlmIChtaW4gPiAwKSB7CiAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHVzZWxlc3NOb2Rlcy5wdXNoKGNoaWxkKTsKICAgICAgfQogICAgfQogICAgdXNlbGVzc05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlWyRnZXRQYXJlbnRdKClbJHJlbW92ZUNoaWxkXShub2RlKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvZGF0YS5qcwoKY2xhc3MgRGF0YUhhbmRsZXIgewogIGNvbnN0cnVjdG9yKHJvb3QsIGRhdGEpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLmRhdGFzZXQgPSByb290LmRhdGFzZXRzIHx8IG51bGw7CiAgfQogIHNlcmlhbGl6ZShzdG9yYWdlKSB7CiAgICBjb25zdCBzdGFjayA9IFtbLTEsIHRoaXMuZGF0YVskZ2V0Q2hpbGRyZW5dKCldXTsKICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5hdCgtMSk7CiAgICAgIGNvbnN0IFtpLCBjaGlsZHJlbl0gPSBsYXN0OwogICAgICBpZiAoaSArIDEgPT09IGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bKytsYXN0WzBdXTsKICAgICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gc3RvcmFnZS5nZXQoY2hpbGRbJHVpZF0pOwogICAgICBpZiAoc3RvcmFnZUVudHJ5KSB7CiAgICAgICAgY2hpbGRbJHNldFZhbHVlXShzdG9yYWdlRW50cnkpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjaGlsZFskZ2V0QXR0cmlidXRlc10oKTsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGF0dHJpYnV0ZXMudmFsdWVzKCkpIHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gc3RvcmFnZS5nZXQodmFsdWVbJHVpZF0pOwogICAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgIHZhbHVlWyRzZXRWYWx1ZV0oZW50cnkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZFskZ2V0Q2hpbGRyZW5dKCk7CiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgc3RhY2sucHVzaChbLTEsIG5vZGVzXSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGJ1ZiA9IFtgPHhmYTpkYXRhc2V0cyB4bWxuczp4ZmE9Imh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyI+YF07CiAgICBpZiAodGhpcy5kYXRhc2V0KSB7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5kYXRhc2V0WyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdICE9PSAiZGF0YSIpIHsKICAgICAgICAgIGNoaWxkWyR0b1N0cmluZ10oYnVmKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGF0YVskdG9TdHJpbmddKGJ1Zik7CiAgICBidWYucHVzaCgiPC94ZmE6ZGF0YXNldHM+Iik7CiAgICByZXR1cm4gYnVmLmpvaW4oIiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2NvbmZpZy5qcwoKCgoKCmNvbnN0IENPTkZJR19OU19JRCA9IE5hbWVzcGFjZUlkcy5jb25maWcuaWQ7CmNsYXNzIEFjcm9iYXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQiLCB0cnVlKTsKICAgIHRoaXMuYWNyb2JhdDcgPSBudWxsOwogICAgdGhpcy5hdXRvU2F2ZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLnZhbGlkYXRlID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMgPSBudWxsOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWNyb2JhdDcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQ3IiwgdHJ1ZSk7CiAgICB0aGlzLmR5bmFtaWNSZW5kZXIgPSBudWxsOwogIH0KfQpjbGFzcyBBREJFX0pTQ29uc29sZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiQURCRV9KU0NvbnNvbGUiLCBbImRlbGVnYXRlIiwgIkVuYWJsZSIsICJEaXNhYmxlIl0pOwogIH0KfQpjbGFzcyBBREJFX0pTRGVidWdnZXIgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIkFEQkVfSlNEZWJ1Z2dlciIsIFsiZGVsZWdhdGUiLCAiRW5hYmxlIiwgIkRpc2FibGUiXSk7CiAgfQp9CmNsYXNzIEFkZFNpbGVudFByaW50IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFNpbGVudFByaW50Iik7CiAgfQp9CmNsYXNzIEFkZFZpZXdlclByZWZlcmVuY2VzIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFZpZXdlclByZWZlcmVuY2VzIik7CiAgfQp9CmNsYXNzIEFkanVzdERhdGEgZXh0ZW5kcyBPcHRpb24xMCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRqdXN0RGF0YSIpOwogIH0KfQpjbGFzcyBBZG9iZUV4dGVuc2lvbkxldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRvYmVFeHRlbnNpb25MZXZlbCIsIDAsIG4gPT4gbiA+PSAxICYmIG4gPD0gOCk7CiAgfQp9CmNsYXNzIEFnZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhZ2VudCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5jb21tb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWx3YXlzRW1iZWQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhbHdheXNFbWJlZCIpOwogIH0KfQpjbGFzcyBBbWQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFtZCIpOwogIH0KfQpjbGFzcyBjb25maWdfQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYXJlYSIpOwogICAgdGhpcy5sZXZlbCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmxldmVsLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSAmJiBuIDw9IDMKICAgIH0pOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyIiLCAiYmFyY29kZSIsICJjb3JlaW5pdCIsICJkZXZpY2VEcml2ZXIiLCAiZm9udCIsICJnZW5lcmFsIiwgImxheW91dCIsICJtZXJnZSIsICJzY3JpcHQiLCAic2lnbmF0dXJlIiwgInNvdXJjZVNldCIsICJ0ZW1wbGF0ZUNhY2hlIl0pOwogIH0KfQpjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdHRyaWJ1dGVzIiwgWyJwcmVzZXJ2ZSIsICJkZWxlZ2F0ZSIsICJpZ25vcmUiXSk7CiAgfQp9CmNsYXNzIEF1dG9TYXZlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdXRvU2F2ZSIsIFsiZGlzYWJsZWQiLCAiZW5hYmxlZCJdKTsKICB9Cn0KY2xhc3MgQmFzZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmFzZSIpOwogIH0KfQpjbGFzcyBCYXRjaE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmF0Y2hPdXRwdXQiKTsKICAgIHRoaXMuZm9ybWF0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZm9ybWF0LCBbIm5vbmUiLCAiY29uY2F0IiwgInppcCIsICJ6aXBDb21wcmVzcyJdKTsKICB9Cn0KY2xhc3MgQmVoYXZpb3JPdmVycmlkZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImJlaGF2aW9yT3ZlcnJpZGUiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IG5ldyBNYXAodGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKCI6IikpLm1hcCh4ID0+IHguc3BsaXQoIjoiLCAyKSkpOwogIH0KfQpjbGFzcyBDYWNoZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY2FjaGUiLCB0cnVlKTsKICAgIHRoaXMudGVtcGxhdGVDYWNoZSA9IG51bGw7CiAgfQp9CmNsYXNzIENoYW5nZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjaGFuZ2UiKTsKICB9Cn0KY2xhc3MgQ29tbW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21tb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZVNldCA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2luZyA9IG51bGw7CiAgICB0aGlzLnN1cHByZXNzQmFubmVyID0gbnVsbDsKICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnaW5nID0gbnVsbDsKICAgIHRoaXMudmVyc2lvbkNvbnRyb2wgPSBudWxsOwogICAgdGhpcy5sb2cgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQ29tcHJlc3MgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzIik7CiAgICB0aGlzLnNjb3BlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NvcGUsIFsiaW1hZ2VPbmx5IiwgImRvY3VtZW50Il0pOwogIH0KfQpjbGFzcyBDb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIik7CiAgfQp9CmNsYXNzIENvbXByZXNzT2JqZWN0U3RyZWFtIGV4dGVuZHMgT3B0aW9uMTAgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzT2JqZWN0U3RyZWFtIik7CiAgfQp9CmNsYXNzIENvbXByZXNzaW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21wcmVzc2lvbiIsIHRydWUpOwogICAgdGhpcy5jb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgPSBudWxsOwogICAgdGhpcy5jb21wcmVzc09iamVjdFN0cmVhbSA9IG51bGw7CiAgICB0aGlzLmxldmVsID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgfQp9CmNsYXNzIENvbmZpZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZmlnIiwgdHJ1ZSk7CiAgICB0aGlzLmFjcm9iYXQgPSBudWxsOwogICAgdGhpcy5wcmVzZW50ID0gbnVsbDsKICAgIHRoaXMudHJhY2UgPSBudWxsOwogICAgdGhpcy5hZ2VudCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBDb25mb3JtYW5jZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZm9ybWFuY2UiLCBbIkEiLCAiQiJdKTsKICB9Cn0KY2xhc3MgQ29udGVudENvcHkgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29udGVudENvcHkiKTsKICB9Cn0KY2xhc3MgQ29waWVzIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29waWVzIiwgMSwgbiA9PiBuID49IDEpOwogIH0KfQpjbGFzcyBDcmVhdG9yIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjcmVhdG9yIik7CiAgfQp9CmNsYXNzIEN1cnJlbnRQYWdlIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY3VycmVudFBhZ2UiLCAwLCBuID0+IG4gPj0gMCk7CiAgfQp9CmNsYXNzIERhdGEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRhdGEiLCB0cnVlKTsKICAgIHRoaXMuYWRqdXN0RGF0YSA9IG51bGw7CiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOwogICAgdGhpcy5pbmNyZW1lbnRhbExvYWQgPSBudWxsOwogICAgdGhpcy5vdXRwdXRYU0wgPSBudWxsOwogICAgdGhpcy5yYW5nZSA9IG51bGw7CiAgICB0aGlzLnJlY29yZCA9IG51bGw7CiAgICB0aGlzLnN0YXJ0Tm9kZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgICB0aGlzLndpbmRvdyA9IG51bGw7CiAgICB0aGlzLnhzbCA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGVOUyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRGVidWcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlYnVnIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIERlZmF1bHRUeXBlZmFjZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlZmF1bHRUeXBlZmFjZSIpOwogICAgdGhpcy53cml0aW5nU2NyaXB0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMud3JpdGluZ1NjcmlwdCwgWyIqIiwgIkFyYWJpYyIsICJDeXJpbGxpYyIsICJFYXN0RXVyb3BlYW5Sb21hbiIsICJHcmVlayIsICJIZWJyZXciLCAiSmFwYW5lc2UiLCAiS29yZWFuIiwgIlJvbWFuIiwgIlNpbXBsaWZpZWRDaGluZXNlIiwgIlRoYWkiLCAiVHJhZGl0aW9uYWxDaGluZXNlIiwgIlZpZXRuYW1lc2UiXSk7CiAgfQp9CmNsYXNzIERlc3RpbmF0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkZXN0aW5hdGlvbiIsIFsicGRmIiwgInBjbCIsICJwcyIsICJ3ZWJDbGllbnQiLCAienBsIl0pOwogIH0KfQpjbGFzcyBEb2N1bWVudEFzc2VtYmx5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRvY3VtZW50QXNzZW1ibHkiKTsKICB9Cn0KY2xhc3MgRHJpdmVyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkcml2ZXIiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSA/IGF0dHJpYnV0ZXMubmFtZS50cmltKCkgOiAiIjsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBEdXBsZXhPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImR1cGxleE9wdGlvbiIsIFsic2ltcGxleCIsICJkdXBsZXhGbGlwTG9uZ0VkZ2UiLCAiZHVwbGV4RmxpcFNob3J0RWRnZSJdKTsKICB9Cn0KY2xhc3MgRHluYW1pY1JlbmRlciBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZHluYW1pY1JlbmRlciIsIFsiZm9yYmlkZGVuIiwgInJlcXVpcmVkIl0pOwogIH0KfQpjbGFzcyBFbWJlZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbWJlZCIpOwogIH0KfQpjbGFzcyBjb25maWdfRW5jcnlwdCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0Iik7CiAgfQp9CmNsYXNzIGNvbmZpZ19FbmNyeXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmVuY3J5cHQgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0aW9uTGV2ZWwgPSBudWxsOwogICAgdGhpcy5wZXJtaXNzaW9ucyA9IG51bGw7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25MZXZlbCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZW5jcnlwdGlvbkxldmVsIiwgWyI0MGJpdCIsICIxMjhiaXQiXSk7CiAgfQp9CmNsYXNzIEVuZm9yY2UgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImVuZm9yY2UiKTsKICB9Cn0KY2xhc3MgRXF1YXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlcXVhdGUiKTsKICAgIHRoaXMuZm9yY2UgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb3JjZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID09PSAwCiAgICB9KTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogIH0KfQpjbGFzcyBFcXVhdGVSYW5nZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXF1YXRlUmFuZ2UiKTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogICAgdGhpcy5fdW5pY29kZVJhbmdlID0gYXR0cmlidXRlcy51bmljb2RlUmFuZ2UgfHwgIiI7CiAgfQogIGdldCB1bmljb2RlUmFuZ2UoKSB7CiAgICBjb25zdCByYW5nZXMgPSBbXTsKICAgIGNvbnN0IHVuaWNvZGVSZWdleCA9IC9VXCsoWzAtOWEtZkEtRl0rKS87CiAgICBjb25zdCB1bmljb2RlUmFuZ2UgPSB0aGlzLl91bmljb2RlUmFuZ2U7CiAgICBmb3IgKGxldCByYW5nZSBvZiB1bmljb2RlUmFuZ2Uuc3BsaXQoIiwiKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4gISF4KSkgewogICAgICByYW5nZSA9IHJhbmdlLnNwbGl0KCItIiwgMikubWFwKHggPT4gewogICAgICAgIGNvbnN0IGZvdW5kID0geC5tYXRjaCh1bmljb2RlUmVnZXgpOwogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyc2VJbnQoZm91bmRbMV0sIDE2KTsKICAgICAgfSk7CiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDEpIHsKICAgICAgICByYW5nZS5wdXNoKHJhbmdlWzBdKTsKICAgICAgfQogICAgICByYW5nZXMucHVzaChyYW5nZSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ1bmljb2RlUmFuZ2UiLCByYW5nZXMpOwogIH0KfQpjbGFzcyBFeGNsdWRlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXhjbHVkZSIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4ICYmIFsiY2FsY3VsYXRlIiwgImNsb3NlIiwgImVudGVyIiwgImV4aXQiLCAiaW5pdGlhbGl6ZSIsICJyZWFkeSIsICJ2YWxpZGF0ZSJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgRXhjbHVkZU5TIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJleGNsdWRlTlMiKTsKICB9Cn0KY2xhc3MgRmxpcExhYmVsIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmbGlwTGFiZWwiLCBbInVzZVByaW50ZXJTZXR0aW5nIiwgIm9uIiwgIm9mZiJdKTsKICB9Cn0KY2xhc3MgY29uZmlnX0ZvbnRJbmZvIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb250SW5mbyIsIHRydWUpOwogICAgdGhpcy5lbWJlZCA9IG51bGw7CiAgICB0aGlzLm1hcCA9IG51bGw7CiAgICB0aGlzLnN1YnNldEJlbG93ID0gbnVsbDsKICAgIHRoaXMuYWx3YXlzRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVmYXVsdFR5cGVmYWNlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm5ldmVyRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRm9ybUZpZWxkRmlsbGluZyBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb3JtRmllbGRGaWxsaW5nIik7CiAgfQp9CmNsYXNzIEdyb3VwUGFyZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJncm91cFBhcmVudCIpOwogIH0KfQpjbGFzcyBJZkVtcHR5IGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpZkVtcHR5IiwgWyJkYXRhVmFsdWUiLCAiZGF0YUdyb3VwIiwgImlnbm9yZSIsICJyZW1vdmUiXSk7CiAgfQp9CmNsYXNzIEluY2x1ZGVYRFBDb250ZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNsdWRlWERQQ29udGVudCIpOwogIH0KfQpjbGFzcyBJbmNyZW1lbnRhbExvYWQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImluY3JlbWVudGFsTG9hZCIsIFsibm9uZSIsICJmb3J3YXJkT25seSJdKTsKICB9Cn0KY2xhc3MgSW5jcmVtZW50YWxNZXJnZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNyZW1lbnRhbE1lcmdlIik7CiAgfQp9CmNsYXNzIEludGVyYWN0aXZlIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImludGVyYWN0aXZlIik7CiAgfQp9CmNsYXNzIEpvZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiam9nIiwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJub25lIiwgInBhZ2VTZXQiXSk7CiAgfQp9CmNsYXNzIExhYmVsUHJpbnRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGFiZWxQcmludGVyIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uYW1lLCBbInpwbCIsICJkcGwiLCAiaXBsIiwgInRjcGwiXSk7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuZmxpcExhYmVsID0gbnVsbDsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBMYXlvdXQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImxheW91dCIsIFsicGFnaW5hdGUiLCAicGFuZWwiXSk7CiAgfQp9CmNsYXNzIExldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGV2ZWwiLCAwLCBuID0+IG4gPiAwKTsKICB9Cn0KY2xhc3MgTGluZWFyaXplZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJsaW5lYXJpemVkIik7CiAgfQp9CmNsYXNzIExvY2FsZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlIik7CiAgfQp9CmNsYXNzIExvY2FsZVNldCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlU2V0Iik7CiAgfQp9CmNsYXNzIExvZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9nIiwgdHJ1ZSk7CiAgICB0aGlzLm1vZGUgPSBudWxsOwogICAgdGhpcy50aHJlc2hvbGQgPSBudWxsOwogICAgdGhpcy50byA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE1hcEVsZW1lbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm1hcCIsIHRydWUpOwogICAgdGhpcy5lcXVhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXF1YXRlUmFuZ2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWVkaXVtSW5mbyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVkaXVtSW5mbyIsIHRydWUpOwogICAgdGhpcy5tYXAgPSBudWxsOwogIH0KfQpjbGFzcyBjb25maWdfTWVzc2FnZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVzc2FnZSIsIHRydWUpOwogICAgdGhpcy5tc2dJZCA9IG51bGw7CiAgICB0aGlzLnNldmVyaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgTWVzc2FnaW5nIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtZXNzYWdpbmciLCB0cnVlKTsKICAgIHRoaXMubWVzc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNb2RlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtb2RlIiwgWyJhcHBlbmQiLCAib3ZlcndyaXRlIl0pOwogIH0KfQpjbGFzcyBNb2RpZnlBbm5vdHMgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibW9kaWZ5QW5ub3RzIik7CiAgfQp9CmNsYXNzIE1zZ0lkIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibXNnSWQiLCAxLCBuID0+IG4gPj0gMSk7CiAgfQp9CmNsYXNzIE5hbWVBdHRyIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJuYW1lQXR0ciIpOwogIH0KfQpjbGFzcyBOZXZlckVtYmVkIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibmV2ZXJFbWJlZCIpOwogIH0KfQpjbGFzcyBOdW1iZXJPZkNvcGllcyBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm51bWJlck9mQ29waWVzIiwgbnVsbCwgbiA9PiBuID49IDIgJiYgbiA8PSA1KTsKICB9Cn0KY2xhc3MgT3BlbkFjdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3BlbkFjdGlvbiIsIHRydWUpOwogICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0IiwgdHJ1ZSk7CiAgICB0aGlzLnRvID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dEJpbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0QmluIik7CiAgfQp9CmNsYXNzIE91dHB1dFhTTCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0WFNMIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE92ZXJwcmludCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3ZlcnByaW50IiwgWyJub25lIiwgImJvdGgiLCAiZHJhdyIsICJmaWVsZCJdKTsKICB9Cn0KY2xhc3MgUGFja2V0cyBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFja2V0cyIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSA9PT0gIioiKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiBbImNvbmZpZyIsICJkYXRhc2V0cyIsICJ0ZW1wbGF0ZSIsICJ4ZmRmIiwgInhzbHQiXS5pbmNsdWRlcyh4KSk7CiAgfQp9CmNsYXNzIFBhZ2VPZmZzZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2VPZmZzZXQiKTsKICAgIHRoaXMueCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLngsCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMueSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnksCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICB9Cn0KY2xhc3MgUGFnZVJhbmdlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwYWdlUmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBudW1iZXJzID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoeCA9PiBwYXJzZUludCh4LCAxMCkpOwogICAgY29uc3QgcmFuZ2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBudW1iZXJzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgcmFuZ2VzLnB1c2gobnVtYmVycy5zbGljZShpLCBpICsgMikpOwogICAgfQogICAgdGhpc1skY29udGVudF0gPSByYW5nZXM7CiAgfQp9CmNsYXNzIFBhZ2luYXRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb24iLCBbInNpbXBsZXgiLCAiZHVwbGV4U2hvcnRFZGdlIiwgImR1cGxleExvbmdFZGdlIl0pOwogIH0KfQpjbGFzcyBQYWdpbmF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb25PdmVycmlkZSIsIFsibm9uZSIsICJmb3JjZUR1cGxleCIsICJmb3JjZUR1cGxleExvbmdFZGdlIiwgImZvcmNlRHVwbGV4U2hvcnRFZGdlIiwgImZvcmNlU2ltcGxleCJdKTsKICB9Cn0KY2xhc3MgUGFydCBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhcnQiLCAxLCBuID0+IGZhbHNlKTsKICB9Cn0KY2xhc3MgUGNsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwY2wiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLmpvZyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bUluZm8gPSBudWxsOwogICAgdGhpcy5vdXRwdXRCaW4gPSBudWxsOwogICAgdGhpcy5wYWdlT2Zmc2V0ID0gbnVsbDsKICAgIHRoaXMuc3RhcGxlID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgUGRmIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGYiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYWRvYmVFeHRlbnNpb25MZXZlbCA9IG51bGw7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuY29tcHJlc3Npb24gPSBudWxsOwogICAgdGhpcy5jcmVhdG9yID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuaW50ZXJhY3RpdmUgPSBudWxsOwogICAgdGhpcy5saW5lYXJpemVkID0gbnVsbDsKICAgIHRoaXMub3BlbkFjdGlvbiA9IG51bGw7CiAgICB0aGlzLnBkZmEgPSBudWxsOwogICAgdGhpcy5wcm9kdWNlciA9IG51bGw7CiAgICB0aGlzLnJlbmRlclBvbGljeSA9IG51bGw7CiAgICB0aGlzLnNjcmlwdE1vZGVsID0gbnVsbDsKICAgIHRoaXMuc2lsZW50UHJpbnQgPSBudWxsOwogICAgdGhpcy5zdWJtaXRGb3JtYXQgPSBudWxsOwogICAgdGhpcy50YWdnZWQgPSBudWxsOwogICAgdGhpcy52ZXJzaW9uID0gbnVsbDsKICAgIHRoaXMudmlld2VyUHJlZmVyZW5jZXMgPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBQZGZhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGZhIiwgdHJ1ZSk7CiAgICB0aGlzLmFtZCA9IG51bGw7CiAgICB0aGlzLmNvbmZvcm1hbmNlID0gbnVsbDsKICAgIHRoaXMuaW5jbHVkZVhEUENvbnRlbnQgPSBudWxsOwogICAgdGhpcy5wYXJ0ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGVybWlzc2lvbnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBlcm1pc3Npb25zIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2Vzc2libGVDb250ZW50ID0gbnVsbDsKICAgIHRoaXMuY2hhbmdlID0gbnVsbDsKICAgIHRoaXMuY29udGVudENvcHkgPSBudWxsOwogICAgdGhpcy5kb2N1bWVudEFzc2VtYmx5ID0gbnVsbDsKICAgIHRoaXMuZm9ybUZpZWxkRmlsbGluZyA9IG51bGw7CiAgICB0aGlzLm1vZGlmeUFubm90cyA9IG51bGw7CiAgICB0aGlzLnBsYWludGV4dE1ldGFkYXRhID0gbnVsbDsKICAgIHRoaXMucHJpbnQgPSBudWxsOwogICAgdGhpcy5wcmludEhpZ2hRdWFsaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGlja1RyYXlCeVBERlNpemUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGlja1RyYXlCeVBERlNpemUiKTsKICB9Cn0KY2xhc3MgY29uZmlnX1BpY3R1cmUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBpY3R1cmUiKTsKICB9Cn0KY2xhc3MgUGxhaW50ZXh0TWV0YWRhdGEgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGxhaW50ZXh0TWV0YWRhdGEiKTsKICB9Cn0KY2xhc3MgUHJlc2VuY2UgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByZXNlbmNlIiwgWyJwcmVzZXJ2ZSIsICJkaXNzb2x2ZSIsICJkaXNzb2x2ZVN0cnVjdHVyZSIsICJpZ25vcmUiLCAicmVtb3ZlIl0pOwogIH0KfQpjbGFzcyBQcmVzZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmVzZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmJlaGF2aW9yT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5jYWNoZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLmNvcGllcyA9IG51bGw7CiAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDsKICAgIHRoaXMuaW5jcmVtZW50YWxNZXJnZSA9IG51bGw7CiAgICB0aGlzLmxheW91dCA9IG51bGw7CiAgICB0aGlzLm91dHB1dCA9IG51bGw7CiAgICB0aGlzLm92ZXJwcmludCA9IG51bGw7CiAgICB0aGlzLnBhZ2luYXRpb24gPSBudWxsOwogICAgdGhpcy5wYWdpbmF0aW9uT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLnhkcCA9IG51bGw7CiAgICB0aGlzLmRyaXZlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5sYWJlbFByaW50ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGNsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBkZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMud2ViQ2xpZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnpwbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBQcmludCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludCIpOwogIH0KfQpjbGFzcyBQcmludEhpZ2hRdWFsaXR5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByaW50SGlnaFF1YWxpdHkiKTsKICB9Cn0KY2xhc3MgUHJpbnRTY2FsaW5nIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludFNjYWxpbmciLCBbImFwcGRlZmF1bHQiLCAibm9TY2FsaW5nIl0pOwogIH0KfQpjbGFzcyBQcmludGVyTmFtZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHJpbnRlck5hbWUiKTsKICB9Cn0KY2xhc3MgUHJvZHVjZXIgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByb2R1Y2VyIik7CiAgfQp9CmNsYXNzIFBzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcyIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuam9nID0gbnVsbDsKICAgIHRoaXMubWVkaXVtSW5mbyA9IG51bGw7CiAgICB0aGlzLm91dHB1dEJpbiA9IG51bGw7CiAgICB0aGlzLnN0YXBsZSA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIFJhbmdlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnNwbGl0KCIsIiwgMikubWFwKHJhbmdlID0+IHJhbmdlLnNwbGl0KCItIikubWFwKHggPT4gcGFyc2VJbnQoeC50cmltKCksIDEwKSkpLmZpbHRlcihyYW5nZSA9PiByYW5nZS5ldmVyeSh4ID0+ICFpc05hTih4KSkpLm1hcChyYW5nZSA9PiB7CiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDEpIHsKICAgICAgICByYW5nZS5wdXNoKHJhbmdlWzBdKTsKICAgICAgfQogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9KTsKICB9Cn0KY2xhc3MgUmVjb3JkIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmVjb3JkIik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICBjb25zdCBuID0gcGFyc2VJbnQodGhpc1skY29udGVudF0sIDEwKTsKICAgIGlmICghaXNOYU4obikgJiYgbiA+PSAwKSB7CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gbjsKICAgIH0KICB9Cn0KY2xhc3MgUmVsZXZhbnQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJyZWxldmFudCIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKTsKICB9Cn0KY2xhc3MgUmVuYW1lIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmVuYW1lIik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICBpZiAodGhpc1skY29udGVudF0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ4bWwiKSB8fCBuZXcgUmVnRXhwKCJbXFxwe0x9X11bXFxwe0x9XFxkLl9cXHB7TX0tXSoiLCAidSIpLnRlc3QodGhpc1skY29udGVudF0pKSB7CiAgICAgIHdhcm4oIlhGQSAtIFJlbmFtZTogaW52YWxpZCBYRkEgbmFtZSIpOwogICAgfQogIH0KfQpjbGFzcyBSZW5kZXJQb2xpY3kgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJlbmRlclBvbGljeSIsIFsic2VydmVyIiwgImNsaWVudCJdKTsKICB9Cn0KY2xhc3MgUnVuU2NyaXB0cyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicnVuU2NyaXB0cyIsIFsiYm90aCIsICJjbGllbnQiLCAibm9uZSIsICJzZXJ2ZXIiXSk7CiAgfQp9CmNsYXNzIGNvbmZpZ19TY3JpcHQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdCIsIHRydWUpOwogICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGUgPSBudWxsOwogICAgdGhpcy5ydW5TY3JpcHRzID0gbnVsbDsKICB9Cn0KY2xhc3MgU2NyaXB0TW9kZWwgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdE1vZGVsIiwgWyJYRkEiLCAibm9uZSJdKTsKICB9Cn0KY2xhc3MgU2V2ZXJpdHkgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNldmVyaXR5IiwgWyJpZ25vcmUiLCAiZXJyb3IiLCAiaW5mb3JtYXRpb24iLCAidHJhY2UiLCAid2FybmluZyJdKTsKICB9Cn0KY2xhc3MgU2lsZW50UHJpbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNpbGVudFByaW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFkZFNpbGVudFByaW50ID0gbnVsbDsKICAgIHRoaXMucHJpbnRlck5hbWUgPSBudWxsOwogIH0KfQpjbGFzcyBTdGFwbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXBsZSIpOwogICAgdGhpcy5tb2RlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubW9kZSwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJvbiIsICJvZmYiXSk7CiAgfQp9CmNsYXNzIFN0YXJ0Tm9kZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3RhcnROb2RlIik7CiAgfQp9CmNsYXNzIFN0YXJ0UGFnZSBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXJ0UGFnZSIsIDAsIG4gPT4gdHJ1ZSk7CiAgfQp9CmNsYXNzIFN1Ym1pdEZvcm1hdCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3VibWl0Rm9ybWF0IiwgWyJodG1sIiwgImRlbGVnYXRlIiwgImZkZiIsICJ4bWwiLCAicGRmIl0pOwogIH0KfQpjbGFzcyBTdWJtaXRVcmwgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1Ym1pdFVybCIpOwogIH0KfQpjbGFzcyBTdWJzZXRCZWxvdyBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1YnNldEJlbG93IiwgMTAwLCBuID0+IG4gPj0gMCAmJiBuIDw9IDEwMCk7CiAgfQp9CmNsYXNzIFN1cHByZXNzQmFubmVyIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1cHByZXNzQmFubmVyIik7CiAgfQp9CmNsYXNzIFRhZ2dlZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0YWdnZWQiKTsKICB9Cn0KY2xhc3MgY29uZmlnX1RlbXBsYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0ZW1wbGF0ZSIsIHRydWUpOwogICAgdGhpcy5iYXNlID0gbnVsbDsKICAgIHRoaXMucmVsZXZhbnQgPSBudWxsOwogICAgdGhpcy5zdGFydFBhZ2UgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogICAgdGhpcy54c2wgPSBudWxsOwogIH0KfQpjbGFzcyBUaHJlc2hvbGQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRocmVzaG9sZCIsIFsidHJhY2UiLCAiZXJyb3IiLCAiaW5mb3JtYXRpb24iLCAid2FybmluZyJdKTsKICB9Cn0KY2xhc3MgVG8gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRvIiwgWyJudWxsIiwgIm1lbW9yeSIsICJzdGRlcnIiLCAic3Rkb3V0IiwgInN5c3RlbSIsICJ1cmkiXSk7CiAgfQp9CmNsYXNzIFRlbXBsYXRlQ2FjaGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRlbXBsYXRlQ2FjaGUiKTsKICAgIHRoaXMubWF4RW50cmllcyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm1heEVudHJpZXMsCiAgICAgIGRlZmF1bHRWYWx1ZTogNSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAwCiAgICB9KTsKICB9Cn0KY2xhc3MgVHJhY2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRyYWNlIiwgdHJ1ZSk7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0cmFuc2Zvcm0iLCB0cnVlKTsKICAgIHRoaXMuZ3JvdXBQYXJlbnQgPSBudWxsOwogICAgdGhpcy5pZkVtcHR5ID0gbnVsbDsKICAgIHRoaXMubmFtZUF0dHIgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICAgIHRoaXMucHJlc2VuY2UgPSBudWxsOwogICAgdGhpcy5yZW5hbWUgPSBudWxsOwogICAgdGhpcy53aGl0ZXNwYWNlID0gbnVsbDsKICB9Cn0KY2xhc3MgVHlwZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidHlwZSIsIFsibm9uZSIsICJhc2NpaTg1IiwgImFzY2lpSGV4IiwgImNjaXR0ZmF4IiwgImZsYXRlIiwgImx6dyIsICJydW5MZW5ndGgiLCAibmF0aXZlIiwgInhkcCIsICJtZXJnZWRYRFAiXSk7CiAgfQp9CmNsYXNzIFVyaSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidXJpIik7CiAgfQp9CmNsYXNzIGNvbmZpZ19WYWxpZGF0ZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGUiLCBbInByZVN1Ym1pdCIsICJwcmVQcmludCIsICJwcmVFeGVjdXRlIiwgInByZVNhdmUiXSk7CiAgfQp9CmNsYXNzIFZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykuZmlsdGVyKHggPT4gWyJkb2NSZWFkeSIsICJwb3N0U2lnbiJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2luZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGlvbk1lc3NhZ2luZyIsIFsiYWxsTWVzc2FnZXNJbmRpdmlkdWFsbHkiLCAiYWxsTWVzc2FnZXNUb2dldGhlciIsICJmaXJzdE1lc3NhZ2VPbmx5IiwgIm5vTWVzc2FnZXMiXSk7CiAgfQp9CmNsYXNzIFZlcnNpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZlcnNpb24iLCBbIjEuNyIsICIxLjYiLCAiMS41IiwgIjEuNCIsICIxLjMiLCAiMS4yIl0pOwogIH0KfQpjbGFzcyBWZXJzaW9uQ29udHJvbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiVmVyc2lvbkNvbnRyb2wiKTsKICAgIHRoaXMub3V0cHV0QmVsb3cgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vdXRwdXRCZWxvdywgWyJ3YXJuIiwgImVycm9yIiwgInVwZGF0ZSJdKTsKICAgIHRoaXMuc291cmNlQWJvdmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zb3VyY2VBYm92ZSwgWyJ3YXJuIiwgImVycm9yIl0pOwogICAgdGhpcy5zb3VyY2VCZWxvdyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNvdXJjZUJlbG93LCBbInVwZGF0ZSIsICJtYWludGFpbiJdKTsKICB9Cn0KY2xhc3MgVmlld2VyUHJlZmVyZW5jZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZpZXdlclByZWZlcmVuY2VzIiwgdHJ1ZSk7CiAgICB0aGlzLkFEQkVfSlNDb25zb2xlID0gbnVsbDsKICAgIHRoaXMuQURCRV9KU0RlYnVnZ2VyID0gbnVsbDsKICAgIHRoaXMuYWRkVmlld2VyUHJlZmVyZW5jZXMgPSBudWxsOwogICAgdGhpcy5kdXBsZXhPcHRpb24gPSBudWxsOwogICAgdGhpcy5lbmZvcmNlID0gbnVsbDsKICAgIHRoaXMubnVtYmVyT2ZDb3BpZXMgPSBudWxsOwogICAgdGhpcy5wYWdlUmFuZ2UgPSBudWxsOwogICAgdGhpcy5waWNrVHJheUJ5UERGU2l6ZSA9IG51bGw7CiAgICB0aGlzLnByaW50U2NhbGluZyA9IG51bGw7CiAgfQp9CmNsYXNzIFdlYkNsaWVudCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAid2ViQ2xpZW50IiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgPyBhdHRyaWJ1dGVzLm5hbWUudHJpbSgpIDogIiI7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgV2hpdGVzcGFjZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAid2hpdGVzcGFjZSIsIFsicHJlc2VydmUiLCAibHRyaW0iLCAibm9ybWFsaXplIiwgInJ0cmltIiwgInRyaW0iXSk7CiAgfQp9CmNsYXNzIFdpbmRvdyBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIndpbmRvdyIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IHBhaXIgPSB0aGlzWyRjb250ZW50XS5zcGxpdCgiLCIsIDIpLm1hcCh4ID0+IHBhcnNlSW50KHgudHJpbSgpLCAxMCkpOwogICAgaWYgKHBhaXIuc29tZSh4ID0+IGlzTmFOKHgpKSkgewogICAgICB0aGlzWyRjb250ZW50XSA9IFswLCAwXTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhaXIubGVuZ3RoID09PSAxKSB7CiAgICAgIHBhaXIucHVzaChwYWlyWzBdKTsKICAgIH0KICAgIHRoaXNbJGNvbnRlbnRdID0gcGFpcjsKICB9Cn0KY2xhc3MgWGRjIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4ZGMiLCB0cnVlKTsKICAgIHRoaXMudXJpID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnhzbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBYZHAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInhkcCIsIHRydWUpOwogICAgdGhpcy5wYWNrZXRzID0gbnVsbDsKICB9Cn0KY2xhc3MgWHNsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4c2wiLCB0cnVlKTsKICAgIHRoaXMuZGVidWcgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBacGwgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInpwbCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZsaXBMYWJlbCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29uZmlnTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKENvbmZpZ05hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gQ29uZmlnTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGFjcm9iYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWNyb2JhdChhdHRycyk7CiAgfQogIHN0YXRpYyBhY3JvYmF0NyhhdHRycykgewogICAgcmV0dXJuIG5ldyBBY3JvYmF0NyhhdHRycyk7CiAgfQogIHN0YXRpYyBBREJFX0pTQ29uc29sZShhdHRycykgewogICAgcmV0dXJuIG5ldyBBREJFX0pTQ29uc29sZShhdHRycyk7CiAgfQogIHN0YXRpYyBBREJFX0pTRGVidWdnZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQURCRV9KU0RlYnVnZ2VyKGF0dHJzKTsKICB9CiAgc3RhdGljIGFkZFNpbGVudFByaW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkZFNpbGVudFByaW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGFkZFZpZXdlclByZWZlcmVuY2VzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkZFZpZXdlclByZWZlcmVuY2VzKGF0dHJzKTsKICB9CiAgc3RhdGljIGFkanVzdERhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWRqdXN0RGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBhZG9iZUV4dGVuc2lvbkxldmVsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkb2JlRXh0ZW5zaW9uTGV2ZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgYWdlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWdlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgYWx3YXlzRW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWx3YXlzRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgYW1kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFtZChhdHRycyk7CiAgfQogIHN0YXRpYyBhcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19BcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGF0dHJpYnV0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXR0cmlidXRlcyhhdHRycyk7CiAgfQogIHN0YXRpYyBhdXRvU2F2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBBdXRvU2F2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBiYXNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhc2UoYXR0cnMpOwogIH0KICBzdGF0aWMgYmF0Y2hPdXRwdXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQmF0Y2hPdXRwdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgYmVoYXZpb3JPdmVycmlkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBCZWhhdmlvck92ZXJyaWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhY2hlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENhY2hlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoYW5nZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDaGFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29tbW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbW1vbihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb21wcmVzcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzaW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzaW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbmZpZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25maWcoYXR0cnMpOwogIH0KICBzdGF0aWMgY29uZm9ybWFuY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29uZm9ybWFuY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29udGVudENvcHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29udGVudENvcHkoYXR0cnMpOwogIH0KICBzdGF0aWMgY29waWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvcGllcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjcmVhdG9yKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENyZWF0b3IoYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVudFBhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ3VycmVudFBhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0YShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlYnVnKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERlYnVnKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlZmF1bHRUeXBlZmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEZWZhdWx0VHlwZWZhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGVzdGluYXRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzdGluYXRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgZG9jdW1lbnRBc3NlbWJseShhdHRycykgewogICAgcmV0dXJuIG5ldyBEb2N1bWVudEFzc2VtYmx5KGF0dHJzKTsKICB9CiAgc3RhdGljIGRyaXZlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBEcml2ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZHVwbGV4T3B0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER1cGxleE9wdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBkeW5hbWljUmVuZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER5bmFtaWNSZW5kZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfRW5jcnlwdChhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19FbmNyeXB0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb25MZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0aW9uTGV2ZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5mb3JjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmZvcmNlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVxdWF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFcXVhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgZXF1YXRlUmFuZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXF1YXRlUmFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhjbHVkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGNsdWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4Y2x1ZGVOUyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGNsdWRlTlMoYXR0cnMpOwogIH0KICBzdGF0aWMgZmxpcExhYmVsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZsaXBMYWJlbChhdHRycyk7CiAgfQogIHN0YXRpYyBmb250SW5mbyhhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfRm9udEluZm8oYXR0cnMpOwogIH0KICBzdGF0aWMgZm9ybUZpZWxkRmlsbGluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBGb3JtRmllbGRGaWxsaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGdyb3VwUGFyZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEdyb3VwUGFyZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGlmRW1wdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSWZFbXB0eShhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNsdWRlWERQQ29udGVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBJbmNsdWRlWERQQ29udGVudChhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNyZW1lbnRhbExvYWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxMb2FkKGF0dHJzKTsKICB9CiAgc3RhdGljIGluY3JlbWVudGFsTWVyZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxNZXJnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbnRlcmFjdGl2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbnRlcmFjdGl2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBqb2coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSm9nKGF0dHJzKTsKICB9CiAgc3RhdGljIGxhYmVsUHJpbnRlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBMYWJlbFByaW50ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgbGF5b3V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExheW91dChhdHRycyk7CiAgfQogIHN0YXRpYyBsZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBMZXZlbChhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXJpemVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExpbmVhcml6ZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbG9jYWxlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExvY2FsZShhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGVTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTG9jYWxlU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIGxvZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2coYXR0cnMpOwogIH0KICBzdGF0aWMgbWFwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcEVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVkaXVtSW5mbyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW1JbmZvKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lc3NhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX01lc3NhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVzc2FnaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1lc3NhZ2luZyhhdHRycyk7CiAgfQogIHN0YXRpYyBtb2RlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgbW9kaWZ5QW5ub3RzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vZGlmeUFubm90cyhhdHRycyk7CiAgfQogIHN0YXRpYyBtc2dJZChhdHRycykgewogICAgcmV0dXJuIG5ldyBNc2dJZChhdHRycyk7CiAgfQogIHN0YXRpYyBuYW1lQXR0cihhdHRycykgewogICAgcmV0dXJuIG5ldyBOYW1lQXR0cihhdHRycyk7CiAgfQogIHN0YXRpYyBuZXZlckVtYmVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE5ldmVyRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyT2ZDb3BpZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtYmVyT2ZDb3BpZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgb3BlbkFjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBPcGVuQWN0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIG91dHB1dChhdHRycykgewogICAgcmV0dXJuIG5ldyBPdXRwdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgb3V0cHV0QmluKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE91dHB1dEJpbihhdHRycyk7CiAgfQogIHN0YXRpYyBvdXRwdXRYU0woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3V0cHV0WFNMKGF0dHJzKTsKICB9CiAgc3RhdGljIG92ZXJwcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBPdmVycHJpbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFja2V0cyhhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWNrZXRzKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VPZmZzZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZU9mZnNldChhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdlUmFuZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZVJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2luYXRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdpbmF0aW9uT3ZlcnJpZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbk92ZXJyaWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhcnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFydChhdHRycyk7CiAgfQogIHN0YXRpYyBwY2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGNsKGF0dHJzKTsKICB9CiAgc3RhdGljIHBkZihhdHRycykgewogICAgcmV0dXJuIG5ldyBQZGYoYXR0cnMpOwogIH0KICBzdGF0aWMgcGRmYShhdHRycykgewogICAgcmV0dXJuIG5ldyBQZGZhKGF0dHJzKTsKICB9CiAgc3RhdGljIHBlcm1pc3Npb25zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25zKGF0dHJzKTsKICB9CiAgc3RhdGljIHBpY2tUcmF5QnlQREZTaXplKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBpY2tUcmF5QnlQREZTaXplKGF0dHJzKTsKICB9CiAgc3RhdGljIHBpY3R1cmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1BpY3R1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgcGxhaW50ZXh0TWV0YWRhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGxhaW50ZXh0TWV0YWRhdGEoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJlc2VuY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJlc2VuY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJlc2VudChhdHRycykgewogICAgcmV0dXJuIG5ldyBQcmVzZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50SGlnaFF1YWxpdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJpbnRIaWdoUXVhbGl0eShhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludFNjYWxpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJpbnRTY2FsaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50ZXJOYW1lKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50ZXJOYW1lKGF0dHJzKTsKICB9CiAgc3RhdGljIHByb2R1Y2VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByb2R1Y2VyKGF0dHJzKTsKICB9CiAgc3RhdGljIHBzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBzKGF0dHJzKTsKICB9CiAgc3RhdGljIHJhbmdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIHJlY29yZChhdHRycykgewogICAgcmV0dXJuIG5ldyBSZWNvcmQoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVsZXZhbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVsZXZhbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVuYW1lKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlbmFtZShhdHRycyk7CiAgfQogIHN0YXRpYyByZW5kZXJQb2xpY3koYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVuZGVyUG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIHJ1blNjcmlwdHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUnVuU2NyaXB0cyhhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1NjcmlwdChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHRNb2RlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBTY3JpcHRNb2RlbChhdHRycyk7CiAgfQogIHN0YXRpYyBzZXZlcml0eShhdHRycykgewogICAgcmV0dXJuIG5ldyBTZXZlcml0eShhdHRycyk7CiAgfQogIHN0YXRpYyBzaWxlbnRQcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWxlbnRQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBzdGFwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RhcGxlKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0YXJ0Tm9kZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTdGFydE5vZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgc3RhcnRQYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN0YXJ0UGFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJtaXRGb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VibWl0Rm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdFVybChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXRVcmwoYXR0cnMpOwogIH0KICBzdGF0aWMgc3Vic2V0QmVsb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3Vic2V0QmVsb3coYXR0cnMpOwogIH0KICBzdGF0aWMgc3VwcHJlc3NCYW5uZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VwcHJlc3NCYW5uZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgdGFnZ2VkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRhZ2dlZChhdHRycyk7CiAgfQogIHN0YXRpYyB0ZW1wbGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfVGVtcGxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGVDYWNoZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUZW1wbGF0ZUNhY2hlKGF0dHJzKTsKICB9CiAgc3RhdGljIHRocmVzaG9sZChhdHRycykgewogICAgcmV0dXJuIG5ldyBUaHJlc2hvbGQoYXR0cnMpOwogIH0KICBzdGF0aWMgdG8oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVG8oYXR0cnMpOwogIH0KICBzdGF0aWMgdHJhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgdHJhbnNmb3JtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYW5zZm9ybShhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFR5cGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdXJpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFVyaShhdHRycyk7CiAgfQogIHN0YXRpYyB2YWxpZGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfVmFsaWRhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGlvbk1lc3NhZ2luZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uTWVzc2FnaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHZlcnNpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmVyc2lvbihhdHRycyk7CiAgfQogIHN0YXRpYyB2ZXJzaW9uQ29udHJvbChhdHRycykgewogICAgcmV0dXJuIG5ldyBWZXJzaW9uQ29udHJvbChhdHRycyk7CiAgfQogIHN0YXRpYyB2aWV3ZXJQcmVmZXJlbmNlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWaWV3ZXJQcmVmZXJlbmNlcyhhdHRycyk7CiAgfQogIHN0YXRpYyB3ZWJDbGllbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2ViQ2xpZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHdoaXRlc3BhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2hpdGVzcGFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB3aW5kb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2luZG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHhkYyhhdHRycykgewogICAgcmV0dXJuIG5ldyBYZGMoYXR0cnMpOwogIH0KICBzdGF0aWMgeGRwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhkcChhdHRycyk7CiAgfQogIHN0YXRpYyB4c2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWHNsKGF0dHJzKTsKICB9CiAgc3RhdGljIHpwbChhdHRycykgewogICAgcmV0dXJuIG5ldyBacGwoYXR0cnMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2Nvbm5lY3Rpb25fc2V0LmpzCgoKY29uc3QgQ09OTkVDVElPTl9TRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMuY29ubmVjdGlvblNldC5pZDsKY2xhc3MgQ29ubmVjdGlvblNldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJjb25uZWN0aW9uU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLndzZGxDb25uZWN0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnhtbENvbm5lY3Rpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMueHNkQ29ubmVjdGlvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFZmZlY3RpdmVJbnB1dFBvbGljeSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJlZmZlY3RpdmVJbnB1dFBvbGljeSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFZmZlY3RpdmVPdXRwdXRQb2xpY3kgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAiZWZmZWN0aXZlT3V0cHV0UG9saWN5Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE9wZXJhdGlvbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJvcGVyYXRpb24iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbnB1dCA9IGF0dHJpYnV0ZXMuaW5wdXQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLm91dHB1dCA9IGF0dHJpYnV0ZXMub3V0cHV0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgUm9vdEVsZW1lbnQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAicm9vdEVsZW1lbnQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgU29hcEFjdGlvbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJzb2FwQWN0aW9uIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFNvYXBBZGRyZXNzIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInNvYXBBZGRyZXNzIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIGNvbm5lY3Rpb25fc2V0X1VyaSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJ1cmkiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgV3NkbEFkZHJlc3MgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAid3NkbEFkZHJlc3MiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgV3NkbENvbm5lY3Rpb24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAid3NkbENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLmVmZmVjdGl2ZUlucHV0UG9saWN5ID0gbnVsbDsKICAgIHRoaXMuZWZmZWN0aXZlT3V0cHV0UG9saWN5ID0gbnVsbDsKICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDsKICAgIHRoaXMuc29hcEFjdGlvbiA9IG51bGw7CiAgICB0aGlzLnNvYXBBZGRyZXNzID0gbnVsbDsKICAgIHRoaXMud3NkbEFkZHJlc3MgPSBudWxsOwogIH0KfQpjbGFzcyBYbWxDb25uZWN0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInhtbENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIFhzZENvbm5lY3Rpb24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAieHNkQ29ubmVjdGlvbiIsIHRydWUpOwogICAgdGhpcy5kYXRhRGVzY3JpcHRpb24gPSBhdHRyaWJ1dGVzLmRhdGFEZXNjcmlwdGlvbiB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucm9vdEVsZW1lbnQgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBDb25uZWN0aW9uU2V0TmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKENvbm5lY3Rpb25TZXROYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIENvbm5lY3Rpb25TZXROYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBzdGF0aWMgY29ubmVjdGlvblNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVmZmVjdGl2ZUlucHV0UG9saWN5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVmZmVjdGl2ZUlucHV0UG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIGVmZmVjdGl2ZU91dHB1dFBvbGljeShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZmZlY3RpdmVPdXRwdXRQb2xpY3koYXR0cnMpOwogIH0KICBzdGF0aWMgb3BlcmF0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9wZXJhdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyByb290RWxlbWVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBSb290RWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBzb2FwQWN0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvYXBBY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgc29hcEFkZHJlc3MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU29hcEFkZHJlc3MoYXR0cnMpOwogIH0KICBzdGF0aWMgdXJpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbm5lY3Rpb25fc2V0X1VyaShhdHRycyk7CiAgfQogIHN0YXRpYyB3c2RsQWRkcmVzcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBXc2RsQWRkcmVzcyhhdHRycyk7CiAgfQogIHN0YXRpYyB3c2RsQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBXc2RsQ29ubmVjdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyB4bWxDb25uZWN0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhtbENvbm5lY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgeHNkQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBYc2RDb25uZWN0aW9uKGF0dHJzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9kYXRhc2V0cy5qcwoKCgpjb25zdCBEQVRBU0VUU19OU19JRCA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKY2xhc3MgZGF0YXNldHNfRGF0YSBleHRlbmRzIFhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhIiwgYXR0cmlidXRlcyk7CiAgfQogIFskaXNOc0Fnbm9zdGljXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBEYXRhc2V0cyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhc2V0cyIsIHRydWUpOwogICAgdGhpcy5kYXRhID0gbnVsbDsKICAgIHRoaXMuU2lnbmF0dXJlID0gbnVsbDsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICBpZiAobmFtZSA9PT0gImRhdGEiICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IERBVEFTRVRTX05TX0lEIHx8IG5hbWUgPT09ICJTaWduYXR1cmUiICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQpIHsKICAgICAgdGhpc1tuYW1lXSA9IGNoaWxkOwogICAgfQogICAgdGhpc1skYXBwZW5kQ2hpbGRdKGNoaWxkKTsKICB9Cn0KY2xhc3MgRGF0YXNldHNOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoRGF0YXNldHNOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIERhdGFzZXRzTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGRhdGFzZXRzKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgRGF0YXNldHMoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBkYXRhKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgZGF0YXNldHNfRGF0YShhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9sb2NhbGVfc2V0LmpzCgoKCmNvbnN0IExPQ0FMRV9TRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMubG9jYWxlU2V0LmlkOwpjbGFzcyBDYWxlbmRhclN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjYWxlbmRhclN5bWJvbHMiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9ICJncmVnb3JpYW4iOwogICAgdGhpcy5kYXlOYW1lcyA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICAgIHRoaXMuZXJhTmFtZXMgPSBudWxsOwogICAgdGhpcy5tZXJpZGllbU5hbWVzID0gbnVsbDsKICAgIHRoaXMubW9udGhOYW1lcyA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICB9Cn0KY2xhc3MgQ3VycmVuY3lTeW1ib2wgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjdXJyZW5jeVN5bWJvbCIpOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyJzeW1ib2wiLCAiaXNvbmFtZSIsICJkZWNpbWFsIl0pOwogIH0KfQpjbGFzcyBDdXJyZW5jeVN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjdXJyZW5jeVN5bWJvbHMiLCB0cnVlKTsKICAgIHRoaXMuY3VycmVuY3lTeW1ib2wgPSBuZXcgWEZBT2JqZWN0QXJyYXkoMyk7CiAgfQp9CmNsYXNzIERhdGVQYXR0ZXJuIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgRGF0ZVBhdHRlcm5zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVBhdHRlcm5zIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGVQYXR0ZXJuID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogIH0KfQpjbGFzcyBEYXRlVGltZVN5bWJvbHMgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVRpbWVTeW1ib2xzIik7CiAgfQp9CmNsYXNzIERheSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRheSIpOwogIH0KfQpjbGFzcyBEYXlOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRheU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmFiYnIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5hYmJyLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5kYXkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNyk7CiAgfQp9CmNsYXNzIEVyYSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImVyYSIpOwogIH0KfQpjbGFzcyBFcmFOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImVyYU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmVyYSA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICB9Cn0KY2xhc3MgbG9jYWxlX3NldF9Mb2NhbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJsb2NhbGUiLCB0cnVlKTsKICAgIHRoaXMuZGVzYyA9IGF0dHJpYnV0ZXMuZGVzYyB8fCAiIjsKICAgIHRoaXMubmFtZSA9ICJpc29uYW1lIjsKICAgIHRoaXMuY2FsZW5kYXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuY3VycmVuY3lTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuZGF0ZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMuZGF0ZVRpbWVTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMubnVtYmVyUGF0dGVybnMgPSBudWxsOwogICAgdGhpcy5udW1iZXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMudGltZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMudHlwZUZhY2VzID0gbnVsbDsKICB9Cn0KY2xhc3MgbG9jYWxlX3NldF9Mb2NhbGVTZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJsb2NhbGVTZXQiLCB0cnVlKTsKICAgIHRoaXMubG9jYWxlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIE1lcmlkaWVtIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibWVyaWRpZW0iKTsKICB9Cn0KY2xhc3MgTWVyaWRpZW1OYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1lcmlkaWVtTmFtZXMiLCB0cnVlKTsKICAgIHRoaXMubWVyaWRpZW0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoMik7CiAgfQp9CmNsYXNzIE1vbnRoIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibW9udGgiKTsKICB9Cn0KY2xhc3MgTW9udGhOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1vbnRoTmFtZXMiLCB0cnVlKTsKICAgIHRoaXMuYWJiciA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFiYnIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLm1vbnRoID0gbmV3IFhGQU9iamVjdEFycmF5KDEyKTsKICB9Cn0KY2xhc3MgTnVtYmVyUGF0dGVybiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm51bWJlclBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgTnVtYmVyUGF0dGVybnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJQYXR0ZXJucyIsIHRydWUpOwogICAgdGhpcy5udW1iZXJQYXR0ZXJuID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogIH0KfQpjbGFzcyBOdW1iZXJTeW1ib2wgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJTeW1ib2wiKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZGVjaW1hbCIsICJncm91cGluZyIsICJwZXJjZW50IiwgIm1pbnVzIiwgInplcm8iXSk7CiAgfQp9CmNsYXNzIE51bWJlclN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJTeW1ib2xzIiwgdHJ1ZSk7CiAgICB0aGlzLm51bWJlclN5bWJvbCA9IG5ldyBYRkFPYmplY3RBcnJheSg1KTsKICB9Cn0KY2xhc3MgVGltZVBhdHRlcm4gZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0aW1lUGF0dGVybiIpOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyJmdWxsIiwgImxvbmciLCAibWVkIiwgInNob3J0Il0pOwogIH0KfQpjbGFzcyBUaW1lUGF0dGVybnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0aW1lUGF0dGVybnMiLCB0cnVlKTsKICAgIHRoaXMudGltZVBhdHRlcm4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoNCk7CiAgfQp9CmNsYXNzIFR5cGVGYWNlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidHlwZUZhY2UiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8ICIiOwogIH0KfQpjbGFzcyBUeXBlRmFjZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0eXBlRmFjZXMiLCB0cnVlKTsKICAgIHRoaXMudHlwZUZhY2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTG9jYWxlU2V0TmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKExvY2FsZVNldE5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gTG9jYWxlU2V0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGNhbGVuZGFyU3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDYWxlbmRhclN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVuY3lTeW1ib2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ3VycmVuY3lTeW1ib2woYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVuY3lTeW1ib2xzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEN1cnJlbmN5U3ltYm9scyhhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlUGF0dGVybihhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlUGF0dGVybihhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlUGF0dGVybnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVBhdHRlcm5zKGF0dHJzKTsKICB9CiAgc3RhdGljIGRhdGVUaW1lU3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZVN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERheShhdHRycyk7CiAgfQogIHN0YXRpYyBkYXlOYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXlOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBlcmEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXJhKGF0dHJzKTsKICB9CiAgc3RhdGljIGVyYU5hbWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVyYU5hbWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2FsZShhdHRycykgewogICAgcmV0dXJuIG5ldyBsb2NhbGVfc2V0X0xvY2FsZShhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGVTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgbG9jYWxlX3NldF9Mb2NhbGVTZXQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW0oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVyaWRpZW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW1OYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXJpZGllbU5hbWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vbnRoKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoTmFtZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTW9udGhOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJQYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyUGF0dGVybnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtYmVyUGF0dGVybnMoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyU3ltYm9sKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbChhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJTeW1ib2xzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRpbWVQYXR0ZXJucyhhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUeXBlRmFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHlwZUZhY2VzKGF0dHJzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zaWduYXR1cmUuanMKCgpjb25zdCBTSUdOQVRVUkVfTlNfSUQgPSBOYW1lc3BhY2VJZHMuc2lnbmF0dXJlLmlkOwpjbGFzcyBzaWduYXR1cmVfU2lnbmF0dXJlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihTSUdOQVRVUkVfTlNfSUQsICJzaWduYXR1cmUiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU2lnbmF0dXJlTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKFNpZ25hdHVyZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gU2lnbmF0dXJlTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IHNpZ25hdHVyZV9TaWduYXR1cmUoYXR0cmlidXRlcyk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvc3R5bGVzaGVldC5qcwoKCmNvbnN0IFNUWUxFU0hFRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMuc3R5bGVzaGVldC5pZDsKY2xhc3MgU3R5bGVzaGVldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoU1RZTEVTSEVFVF9OU19JRCwgInN0eWxlc2hlZXQiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU3R5bGVzaGVldE5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChTdHlsZXNoZWV0TmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBTdHlsZXNoZWV0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHN0eWxlc2hlZXQoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3hkcC5qcwoKCgpjb25zdCBYRFBfTlNfSUQgPSBOYW1lc3BhY2VJZHMueGRwLmlkOwpjbGFzcyB4ZHBfWGRwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihYRFBfTlNfSUQsICJ4ZHAiLCB0cnVlKTsKICAgIHRoaXMudXVpZCA9IGF0dHJpYnV0ZXMudXVpZCB8fCAiIjsKICAgIHRoaXMudGltZVN0YW1wID0gYXR0cmlidXRlcy50aW1lU3RhbXAgfHwgIiI7CiAgICB0aGlzLmNvbmZpZyA9IG51bGw7CiAgICB0aGlzLmNvbm5lY3Rpb25TZXQgPSBudWxsOwogICAgdGhpcy5kYXRhc2V0cyA9IG51bGw7CiAgICB0aGlzLmxvY2FsZVNldCA9IG51bGw7CiAgICB0aGlzLnN0eWxlc2hlZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogIH0KICBbJG9uQ2hpbGRDaGVja10oY2hpbGQpIHsKICAgIGNvbnN0IG5zID0gTmFtZXNwYWNlSWRzW2NoaWxkWyRub2RlTmFtZV1dOwogICAgcmV0dXJuIG5zICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IG5zLmlkOwogIH0KfQpjbGFzcyBYZHBOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGRwTmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBYZHBOYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBzdGF0aWMgeGRwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgeGRwX1hkcChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS94aHRtbC5qcwoKCgoKCmNvbnN0IFhIVE1MX05TX0lEID0gTmFtZXNwYWNlSWRzLnhodG1sLmlkOwpjb25zdCAkcmljaFRleHQgPSBTeW1ib2woKTsKY29uc3QgVkFMSURfU1RZTEVTID0gbmV3IFNldChbImNvbG9yIiwgImZvbnQiLCAiZm9udC1mYW1pbHkiLCAiZm9udC1zaXplIiwgImZvbnQtc3RyZXRjaCIsICJmb250LXN0eWxlIiwgImZvbnQtd2VpZ2h0IiwgIm1hcmdpbiIsICJtYXJnaW4tYm90dG9tIiwgIm1hcmdpbi1sZWZ0IiwgIm1hcmdpbi1yaWdodCIsICJtYXJnaW4tdG9wIiwgImxldHRlci1zcGFjaW5nIiwgImxpbmUtaGVpZ2h0IiwgIm9ycGhhbnMiLCAicGFnZS1icmVhay1hZnRlciIsICJwYWdlLWJyZWFrLWJlZm9yZSIsICJwYWdlLWJyZWFrLWluc2lkZSIsICJ0YWItaW50ZXJ2YWwiLCAidGFiLXN0b3AiLCAidGV4dC1hbGlnbiIsICJ0ZXh0LWRlY29yYXRpb24iLCAidGV4dC1pbmRlbnQiLCAidmVydGljYWwtYWxpZ24iLCAid2lkb3dzIiwgImtlcm5pbmctbW9kZSIsICJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiwgInhmYS1mb250LXZlcnRpY2FsLXNjYWxlIiwgInhmYS1zcGFjZXJ1biIsICJ4ZmEtdGFiLXN0b3BzIl0pOwpjb25zdCBTdHlsZU1hcHBpbmcgPSBuZXcgTWFwKFtbInBhZ2UtYnJlYWstYWZ0ZXIiLCAiYnJlYWtBZnRlciJdLCBbInBhZ2UtYnJlYWstYmVmb3JlIiwgImJyZWFrQmVmb3JlIl0sIFsicGFnZS1icmVhay1pbnNpZGUiLCAiYnJlYWtJbnNpZGUiXSwgWyJrZXJuaW5nLW1vZGUiLCB2YWx1ZSA9PiB2YWx1ZSA9PT0gIm5vbmUiID8gIm5vbmUiIDogIm5vcm1hbCJdLCBbInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLCB2YWx1ZSA9PiBgc2NhbGVYKCR7TWF0aC5tYXgoMCwgcGFyc2VJbnQodmFsdWUpIC8gMTAwKS50b0ZpeGVkKDIpfSlgXSwgWyJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsIHZhbHVlID0+IGBzY2FsZVkoJHtNYXRoLm1heCgwLCBwYXJzZUludCh2YWx1ZSkgLyAxMDApLnRvRml4ZWQoMil9KWBdLCBbInhmYS1zcGFjZXJ1biIsICIiXSwgWyJ4ZmEtdGFiLXN0b3BzIiwgIiJdLCBbImZvbnQtc2l6ZSIsICh2YWx1ZSwgb3JpZ2luYWwpID0+IHsKICB2YWx1ZSA9IG9yaWdpbmFsLmZvbnRTaXplID0gTWF0aC5hYnMoZ2V0TWVhc3VyZW1lbnQodmFsdWUpKTsKICByZXR1cm4gbWVhc3VyZVRvU3RyaW5nKDAuOTkgKiB2YWx1ZSk7Cn1dLCBbImxldHRlci1zcGFjaW5nIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbImxpbmUtaGVpZ2h0IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbiIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tYm90dG9tIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbi1sZWZ0IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbi1yaWdodCIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tdG9wIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbInRleHQtaW5kZW50IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbImZvbnQtZmFtaWx5IiwgdmFsdWUgPT4gdmFsdWVdLCBbInZlcnRpY2FsLWFsaWduIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldXSk7CmNvbnN0IHNwYWNlc1JlZ0V4cCA9IC9ccysvZzsKY29uc3QgY3JsZlJlZ0V4cCA9IC9bXHJcbl0rL2c7CmNvbnN0IGNybGZGb3JSaWNoVGV4dFJlZ0V4cCA9IC9cclxuPy9nOwpmdW5jdGlvbiBtYXBTdHlsZShzdHlsZVN0ciwgbm9kZSwgcmljaFRleHQpIHsKICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFzdHlsZVN0cikgewogICAgcmV0dXJuIHN0eWxlOwogIH0KICBjb25zdCBvcmlnaW5hbCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3R5bGVTdHIuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICBjb25zdCBtYXBwaW5nID0gU3R5bGVNYXBwaW5nLmdldChrZXkpOwogICAgaWYgKG1hcHBpbmcgPT09ICIiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IG5ld1ZhbHVlID0gdmFsdWU7CiAgICBpZiAobWFwcGluZykgewogICAgICBuZXdWYWx1ZSA9IHR5cGVvZiBtYXBwaW5nID09PSAic3RyaW5nIiA/IG1hcHBpbmcgOiBtYXBwaW5nKHZhbHVlLCBvcmlnaW5hbCk7CiAgICB9CiAgICBpZiAoa2V5LmVuZHNXaXRoKCJzY2FsZSIpKSB7CiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zZm9ybSA/IGAke3N0eWxlW2tleV19ICR7bmV3VmFsdWV9YCA6IG5ld1ZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGVba2V5LnJlcGxhY2VBbGwoLy0oW2EtekEtWl0pL2csIChfLCB4KSA9PiB4LnRvVXBwZXJDYXNlKCkpXSA9IG5ld1ZhbHVlOwogICAgfQogIH0KICBpZiAoc3R5bGUuZm9udEZhbWlseSkgewogICAgc2V0Rm9udEZhbWlseSh7CiAgICAgIHR5cGVmYWNlOiBzdHlsZS5mb250RmFtaWx5LAogICAgICB3ZWlnaHQ6IHN0eWxlLmZvbnRXZWlnaHQgfHwgIm5vcm1hbCIsCiAgICAgIHBvc3R1cmU6IHN0eWxlLmZvbnRTdHlsZSB8fCAibm9ybWFsIiwKICAgICAgc2l6ZTogb3JpZ2luYWwuZm9udFNpemUgfHwgMAogICAgfSwgbm9kZSwgbm9kZVskZ2xvYmFsRGF0YV0uZm9udEZpbmRlciwgc3R5bGUpOwogIH0KICBpZiAocmljaFRleHQgJiYgc3R5bGUudmVydGljYWxBbGlnbiAmJiBzdHlsZS52ZXJ0aWNhbEFsaWduICE9PSAiMHB4IiAmJiBzdHlsZS5mb250U2l6ZSkgewogICAgY29uc3QgU1VCX1NVUEVSX1NDUklQVF9GQUNUT1IgPSAwLjU4MzsKICAgIGNvbnN0IFZFUlRJQ0FMX0ZBQ1RPUiA9IDAuMzMzOwogICAgY29uc3QgZm9udFNpemUgPSBnZXRNZWFzdXJlbWVudChzdHlsZS5mb250U2l6ZSk7CiAgICBzdHlsZS5mb250U2l6ZSA9IG1lYXN1cmVUb1N0cmluZyhmb250U2l6ZSAqIFNVQl9TVVBFUl9TQ1JJUFRfRkFDVE9SKTsKICAgIHN0eWxlLnZlcnRpY2FsQWxpZ24gPSBtZWFzdXJlVG9TdHJpbmcoTWF0aC5zaWduKGdldE1lYXN1cmVtZW50KHN0eWxlLnZlcnRpY2FsQWxpZ24pKSAqIGZvbnRTaXplICogVkVSVElDQUxfRkFDVE9SKTsKICB9CiAgaWYgKHJpY2hUZXh0ICYmIHN0eWxlLmZvbnRTaXplKSB7CiAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7c3R5bGUuZm9udFNpemV9ICogdmFyKC0tdG90YWwtc2NhbGUtZmFjdG9yKSlgOwogIH0KICBmaXhUZXh0SW5kZW50KHN0eWxlKTsKICByZXR1cm4gc3R5bGU7Cn0KZnVuY3Rpb24gY2hlY2tTdHlsZShub2RlKSB7CiAgaWYgKCFub2RlLnN0eWxlKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIHJldHVybiBub2RlLnN0eWxlLnNwbGl0KCI7IikuZmlsdGVyKHMgPT4gISFzLnRyaW0oKSkubWFwKHMgPT4gcy5zcGxpdCgiOiIsIDIpLm1hcCh0ID0+IHQudHJpbSgpKSkuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHsKICAgIGlmIChrZXkgPT09ICJmb250LWZhbWlseSIpIHsKICAgICAgbm9kZVskZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIFZBTElEX1NUWUxFUy5oYXMoa2V5KTsKICB9KS5tYXAoa3YgPT4ga3Yuam9pbigiOiIpKS5qb2luKCI7Iik7Cn0KY29uc3QgTm9XaGl0ZXMgPSBuZXcgU2V0KFsiYm9keSIsICJodG1sIl0pOwpjbGFzcyBYaHRtbE9iamVjdCBleHRlbmRzIFhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcywgbmFtZSkgewogICAgc3VwZXIoWEhUTUxfTlNfSUQsIG5hbWUpOwogICAgdGhpc1skcmljaFRleHRdID0gZmFsc2U7CiAgICB0aGlzLnN0eWxlID0gYXR0cmlidXRlcy5zdHlsZSB8fCAiIjsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXMuc3R5bGUgPSBjaGVja1N0eWxlKHRoaXMpOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuICFOb1doaXRlcy5oYXModGhpc1skbm9kZU5hbWVdKTsKICB9CiAgWyRvblRleHRdKHN0ciwgcmljaFRleHQgPSBmYWxzZSkgewogICAgaWYgKCFyaWNoVGV4dCkgewogICAgICBzdHIgPSBzdHIucmVwbGFjZUFsbChjcmxmUmVnRXhwLCAiIik7CiAgICAgIGlmICghdGhpcy5zdHlsZS5pbmNsdWRlcygieGZhLXNwYWNlcnVuOnllcyIpKSB7CiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoc3BhY2VzUmVnRXhwLCAiICIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzWyRyaWNoVGV4dF0gPSB0cnVlOwogICAgfQogICAgaWYgKHN0cikgewogICAgICB0aGlzWyRjb250ZW50XSArPSBzdHI7CiAgICB9CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSwgbXVzdFBvcCA9IHRydWUpIHsKICAgIGNvbnN0IHhmYUZvbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgbWFyZ2luID0gewogICAgICB0b3A6IE5hTiwKICAgICAgYm90dG9tOiBOYU4sCiAgICAgIGxlZnQ6IE5hTiwKICAgICAgcmlnaHQ6IE5hTgogICAgfTsKICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc3R5bGUuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiZm9udC1mYW1pbHkiOgogICAgICAgICAgeGZhRm9udC50eXBlZmFjZSA9IHN0cmlwUXVvdGVzKHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZvbnQtc2l6ZSI6CiAgICAgICAgICB4ZmFGb250LnNpemUgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmb250LXdlaWdodCI6CiAgICAgICAgICB4ZmFGb250LndlaWdodCA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZm9udC1zdHlsZSI6CiAgICAgICAgICB4ZmFGb250LnBvc3R1cmUgPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxldHRlci1zcGFjaW5nIjoKICAgICAgICAgIHhmYUZvbnQubGV0dGVyU3BhY2luZyA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1hcmdpbiI6CiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgvIFx0LykubWFwKHggPT4gZ2V0TWVhc3VyZW1lbnQoeCkpOwogICAgICAgICAgc3dpdGNoICh2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gbWFyZ2luLmJvdHRvbSA9IG1hcmdpbi5sZWZ0ID0gbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgbWFyZ2luLnRvcCA9IG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMF07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5sZWZ0ID0gdmFsdWVzWzFdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzNdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLXRvcCI6CiAgICAgICAgICBtYXJnaW4udG9wID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWJvdHRvbSI6CiAgICAgICAgICBtYXJnaW4uYm90dG9tID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWxlZnQiOgogICAgICAgICAgbWFyZ2luLmxlZnQgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtYXJnaW4tcmlnaHQiOgogICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibGluZS1oZWlnaHQiOgogICAgICAgICAgbGluZUhlaWdodCA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBtZWFzdXJlLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgbWVhc3VyZS5hZGRTdHJpbmcodGhpc1skY29udGVudF0pOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdID09PSAiI3RleHQiKSB7CiAgICAgICAgICBtZWFzdXJlLmFkZFN0cmluZyhjaGlsZFskY29udGVudF0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNoaWxkWyRwdXNoR2x5cGhzXShtZWFzdXJlKTsKICAgICAgfQogICAgfQogICAgaWYgKG11c3RQb3ApIHsKICAgICAgbWVhc3VyZS5wb3BGb250KCk7CiAgICB9CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oe30pOwogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpc1skY29udGVudF0pIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBsZXQgdmFsdWU7CiAgICBpZiAodGhpc1skcmljaFRleHRdKSB7CiAgICAgIHZhbHVlID0gdGhpc1skY29udGVudF0gPyB0aGlzWyRjb250ZW50XS5yZXBsYWNlQWxsKGNybGZGb3JSaWNoVGV4dFJlZ0V4cCwgIlxuIikgOiB1bmRlZmluZWQ7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IHRoaXNbJGNvbnRlbnRdIHx8IHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiB0aGlzWyRub2RlTmFtZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBocmVmOiB0aGlzLmhyZWYsCiAgICAgICAgc3R5bGU6IG1hcFN0eWxlKHRoaXMuc3R5bGUsIHRoaXMsIHRoaXNbJHJpY2hUZXh0XSkKICAgICAgfSwKICAgICAgY2hpbGRyZW4sCiAgICAgIHZhbHVlCiAgICB9KTsKICB9Cn0KY2xhc3MgQSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiYSIpOwogICAgdGhpcy5ocmVmID0gZml4VVJMKGF0dHJpYnV0ZXMuaHJlZikgfHwgIiI7CiAgfQp9CmNsYXNzIEIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImIiKTsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLnB1c2hGb250KHsKICAgICAgd2VpZ2h0OiAiYm9sZCIKICAgIH0pOwogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUpOwogICAgbWVhc3VyZS5wb3BGb250KCk7CiAgfQp9CmNsYXNzIEJvZHkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJvZHkiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCByZXMgPSBzdXBlclskdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgICBjb25zdCB7CiAgICAgIGh0bWwKICAgIH0gPSByZXM7CiAgICBpZiAoIWh0bWwpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgIGh0bWwuYXR0cmlidXRlcy5jbGFzcyA9IFsieGZhUmljaCJdOwogICAgcmV0dXJuIHJlczsKICB9Cn0KY2xhc3MgQnIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJyIik7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gIlxuIjsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLmFkZFN0cmluZygiXG4iKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImJyIgogICAgfSk7CiAgfQp9CmNsYXNzIEh0bWwgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImh0bWwiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgdGhpc1skZXh0cmFdID0gewogICAgICBjaGlsZHJlbgogICAgfTsKICAgIHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7fSk7CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIGNsYXNzOiBbInhmYVJpY2giXSwKICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sCiAgICAgICAgdmFsdWU6IHRoaXNbJGNvbnRlbnRdIHx8ICIiCiAgICAgIH0pOwogICAgfQogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdOwogICAgICBpZiAoY2hpbGQuYXR0cmlidXRlcz8uY2xhc3MuaW5jbHVkZXMoInhmYVJpY2giKSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuCiAgICB9KTsKICB9Cn0KY2xhc3MgSSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiaSIpOwogIH0KICBbJHB1c2hHbHlwaHNdKG1lYXN1cmUpIHsKICAgIG1lYXN1cmUucHVzaEZvbnQoewogICAgICBwb3N0dXJlOiAiaXRhbGljIgogICAgfSk7CiAgICBzdXBlclskcHVzaEdseXBoc10obWVhc3VyZSk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9Cn0KY2xhc3MgTGkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImxpIik7CiAgfQp9CmNsYXNzIE9sIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJvbCIpOwogIH0KfQpjbGFzcyBQIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJwIik7CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSkgewogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUsIGZhbHNlKTsKICAgIG1lYXN1cmUuYWRkU3RyaW5nKCJcbiIpOwogICAgbWVhc3VyZS5hZGRQYXJhKCk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9CiAgWyR0ZXh0XSgpIHsKICAgIGNvbnN0IHNpYmxpbmdzID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRDaGlsZHJlbl0oKTsKICAgIGlmIChzaWJsaW5ncy5hdCgtMSkgPT09IHRoaXMpIHsKICAgICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpOwogICAgfQogICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpICsgIlxuIjsKICB9Cn0KY2xhc3MgU3BhbiBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAic3BhbiIpOwogIH0KfQpjbGFzcyBTdWIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1YiIpOwogIH0KfQpjbGFzcyBTdXAgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1cCIpOwogIH0KfQpjbGFzcyBVbCBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAidWwiKTsKICB9Cn0KY2xhc3MgWGh0bWxOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGh0bWxOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIFhodG1sTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGEoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBBKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgYihhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IEIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBib2R5KGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQm9keShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGJyKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQnIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBodG1sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgSHRtbChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBJKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgbGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBMaShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIG9sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgT2woYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgUChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIHNwYW4oYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTcGFuKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3ViKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3ViKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3VwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3VwKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgdWwoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBVbChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zZXR1cC5qcwoKCgoKCgoKCgpjb25zdCBOYW1lc3BhY2VTZXRVcCA9IHsKICBjb25maWc6IENvbmZpZ05hbWVzcGFjZSwKICBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2V0TmFtZXNwYWNlLAogIGRhdGFzZXRzOiBEYXRhc2V0c05hbWVzcGFjZSwKICBsb2NhbGVTZXQ6IExvY2FsZVNldE5hbWVzcGFjZSwKICBzaWduYXR1cmU6IFNpZ25hdHVyZU5hbWVzcGFjZSwKICBzdHlsZXNoZWV0OiBTdHlsZXNoZWV0TmFtZXNwYWNlLAogIHRlbXBsYXRlOiBUZW1wbGF0ZU5hbWVzcGFjZSwKICB4ZHA6IFhkcE5hbWVzcGFjZSwKICB4aHRtbDogWGh0bWxOYW1lc3BhY2UKfTsKCjsvLyAuL3NyYy9jb3JlL3hmYS91bmtub3duLmpzCgoKY2xhc3MgVW5rbm93bk5hbWVzcGFjZSB7CiAgY29uc3RydWN0b3IobnNJZCkgewogICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5zSWQ7CiAgfQogIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgWG1sT2JqZWN0KHRoaXMubmFtZXNwYWNlSWQsIG5hbWUsIGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2J1aWxkZXIuanMKCgoKCgoKCmNsYXNzIFJvb3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGlkcykgewogICAgc3VwZXIoLTEsICJyb290IiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgICB0aGlzLmVsZW1lbnQgPSBudWxsOwogICAgdGhpc1skaWRzXSA9IGlkczsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgdGhpcy5lbGVtZW50ID0gY2hpbGQ7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBzdXBlclskZmluYWxpemVdKCk7CiAgICBpZiAodGhpcy5lbGVtZW50LnRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKICAgICAgdGhpc1skaWRzXS5zZXQoJHJvb3QsIHRoaXMuZWxlbWVudCk7CiAgICAgIHRoaXMuZWxlbWVudC50ZW1wbGF0ZVskcmVzb2x2ZVByb3RvdHlwZXNdKHRoaXNbJGlkc10pOwogICAgICB0aGlzLmVsZW1lbnQudGVtcGxhdGVbJGlkc10gPSB0aGlzWyRpZHNdOwogICAgfQogIH0KfQpjbGFzcyBFbXB0eSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigtMSwgIiIsIE9iamVjdC5jcmVhdGUobnVsbCkpOwogIH0KICBbJG9uQ2hpbGRdKF8pIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KY2xhc3MgQnVpbGRlciB7CiAgY29uc3RydWN0b3Iocm9vdE5hbWVTcGFjZSA9IG51bGwpIHsKICAgIHRoaXMuX25hbWVzcGFjZVN0YWNrID0gW107CiAgICB0aGlzLl9uc0Fnbm9zdGljTGV2ZWwgPSAwOwogICAgdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9uYW1lc3BhY2VzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fbmV4dE5zSWQgPSBNYXRoLm1heCguLi5PYmplY3QudmFsdWVzKE5hbWVzcGFjZUlkcykubWFwKCh7CiAgICAgIGlkCiAgICB9KSA9PiBpZCkpOwogICAgdGhpcy5fY3VycmVudE5hbWVzcGFjZSA9IHJvb3ROYW1lU3BhY2UgfHwgbmV3IFVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCk7CiAgfQogIGJ1aWxkUm9vdChpZHMpIHsKICAgIHJldHVybiBuZXcgUm9vdChpZHMpOwogIH0KICBidWlsZCh7CiAgICBuc1ByZWZpeCwKICAgIG5hbWUsCiAgICBhdHRyaWJ1dGVzLAogICAgbmFtZXNwYWNlLAogICAgcHJlZml4ZXMKICB9KSB7CiAgICBjb25zdCBoYXNOYW1lc3BhY2VEZWYgPSBuYW1lc3BhY2UgIT09IG51bGw7CiAgICBpZiAoaGFzTmFtZXNwYWNlRGVmKSB7CiAgICAgIHRoaXMuX25hbWVzcGFjZVN0YWNrLnB1c2godGhpcy5fY3VycmVudE5hbWVzcGFjZSk7CiAgICAgIHRoaXMuX2N1cnJlbnROYW1lc3BhY2UgPSB0aGlzLl9zZWFyY2hOYW1lc3BhY2UobmFtZXNwYWNlKTsKICAgIH0KICAgIGlmIChwcmVmaXhlcykgewogICAgICB0aGlzLl9hZGROYW1lc3BhY2VQcmVmaXgocHJlZml4ZXMpOwogICAgfQogICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoJG5zQXR0cmlidXRlcykpIHsKICAgICAgY29uc3QgZGF0YVRlbXBsYXRlID0gTmFtZXNwYWNlU2V0VXAuZGF0YXNldHM7CiAgICAgIGNvbnN0IG5zQXR0cnMgPSBhdHRyaWJ1dGVzWyRuc0F0dHJpYnV0ZXNdOwogICAgICBsZXQgeGZhQXR0cnMgPSBudWxsOwogICAgICBmb3IgKGNvbnN0IFtucywgYXR0cnNdIG9mIE9iamVjdC5lbnRyaWVzKG5zQXR0cnMpKSB7CiAgICAgICAgY29uc3QgbnNUb1VzZSA9IHRoaXMuX2dldE5hbWVzcGFjZVRvVXNlKG5zKTsKICAgICAgICBpZiAobnNUb1VzZSA9PT0gZGF0YVRlbXBsYXRlKSB7CiAgICAgICAgICB4ZmFBdHRycyA9IHsKICAgICAgICAgICAgeGZhOiBhdHRycwogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoeGZhQXR0cnMpIHsKICAgICAgICBhdHRyaWJ1dGVzWyRuc0F0dHJpYnV0ZXNdID0geGZhQXR0cnM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXNbJG5zQXR0cmlidXRlc107CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG5hbWVzcGFjZVRvVXNlID0gdGhpcy5fZ2V0TmFtZXNwYWNlVG9Vc2UobnNQcmVmaXgpOwogICAgY29uc3Qgbm9kZSA9IG5hbWVzcGFjZVRvVXNlPy5bJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB8fCBuZXcgRW1wdHkoKTsKICAgIGlmIChub2RlWyRpc05zQWdub3N0aWNdKCkpIHsKICAgICAgdGhpcy5fbnNBZ25vc3RpY0xldmVsKys7CiAgICB9CiAgICBpZiAoaGFzTmFtZXNwYWNlRGVmIHx8IHByZWZpeGVzIHx8IG5vZGVbJGlzTnNBZ25vc3RpY10oKSkgewogICAgICBub2RlWyRjbGVhbnVwXSA9IHsKICAgICAgICBoYXNOYW1lc3BhY2U6IGhhc05hbWVzcGFjZURlZiwKICAgICAgICBwcmVmaXhlcywKICAgICAgICBuc0Fnbm9zdGljOiBub2RlWyRpc05zQWdub3N0aWNdKCkKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KICBpc05zQWdub3N0aWMoKSB7CiAgICByZXR1cm4gdGhpcy5fbnNBZ25vc3RpY0xldmVsID4gMDsKICB9CiAgX3NlYXJjaE5hbWVzcGFjZShuc05hbWUpIHsKICAgIGxldCBucyA9IHRoaXMuX25hbWVzcGFjZXMuZ2V0KG5zTmFtZSk7CiAgICBpZiAobnMpIHsKICAgICAgcmV0dXJuIG5zOwogICAgfQogICAgZm9yIChjb25zdCBbbmFtZSwgewogICAgICBjaGVjawogICAgfV0gb2YgT2JqZWN0LmVudHJpZXMoTmFtZXNwYWNlSWRzKSkgewogICAgICBpZiAoY2hlY2sobnNOYW1lKSkgewogICAgICAgIG5zID0gTmFtZXNwYWNlU2V0VXBbbmFtZV07CiAgICAgICAgaWYgKG5zKSB7CiAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgICAgICAgIHJldHVybiBuczsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIG5zID0gbmV3IFVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCk7CiAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgIHJldHVybiBuczsKICB9CiAgX2FkZE5hbWVzcGFjZVByZWZpeChwcmVmaXhlcykgewogICAgZm9yIChjb25zdCB7CiAgICAgIHByZWZpeCwKICAgICAgdmFsdWUKICAgIH0gb2YgcHJlZml4ZXMpIHsKICAgICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5fc2VhcmNoTmFtZXNwYWNlKHZhbHVlKTsKICAgICAgbGV0IHByZWZpeFN0YWNrID0gdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMuZ2V0KHByZWZpeCk7CiAgICAgIGlmICghcHJlZml4U3RhY2spIHsKICAgICAgICBwcmVmaXhTdGFjayA9IFtdOwogICAgICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLnNldChwcmVmaXgsIHByZWZpeFN0YWNrKTsKICAgICAgfQogICAgICBwcmVmaXhTdGFjay5wdXNoKG5hbWVzcGFjZSk7CiAgICB9CiAgfQogIF9nZXROYW1lc3BhY2VUb1VzZShwcmVmaXgpIHsKICAgIGlmICghcHJlZml4KSB7CiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmFtZXNwYWNlOwogICAgfQogICAgY29uc3QgcHJlZml4U3RhY2sgPSB0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQocHJlZml4KTsKICAgIGlmIChwcmVmaXhTdGFjaz8ubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gcHJlZml4U3RhY2suYXQoLTEpOwogICAgfQogICAgd2FybihgVW5rbm93biBuYW1lc3BhY2UgcHJlZml4OiAke3ByZWZpeH0uYCk7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY2xlYW4oZGF0YSkgewogICAgY29uc3QgewogICAgICBoYXNOYW1lc3BhY2UsCiAgICAgIHByZWZpeGVzLAogICAgICBuc0Fnbm9zdGljCiAgICB9ID0gZGF0YTsKICAgIGlmIChoYXNOYW1lc3BhY2UpIHsKICAgICAgdGhpcy5fY3VycmVudE5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZVN0YWNrLnBvcCgpOwogICAgfQogICAgaWYgKHByZWZpeGVzKSB7CiAgICAgIHByZWZpeGVzLmZvckVhY2goKHsKICAgICAgICBwcmVmaXgKICAgICAgfSkgPT4gewogICAgICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLmdldChwcmVmaXgpLnBvcCgpOwogICAgICB9KTsKICAgIH0KICAgIGlmIChuc0Fnbm9zdGljKSB7CiAgICAgIHRoaXMuX25zQWdub3N0aWNMZXZlbC0tOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3BhcnNlci5qcwoKCgoKY2xhc3MgWEZBUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyQmFzZSB7CiAgY29uc3RydWN0b3Iocm9vdE5hbWVTcGFjZSA9IG51bGwsIHJpY2hUZXh0ID0gZmFsc2UpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9idWlsZGVyID0gbmV3IEJ1aWxkZXIocm9vdE5hbWVTcGFjZSk7CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZ2xvYmFsRGF0YSA9IHsKICAgICAgdXNlZFR5cGVmYWNlczogbmV3IFNldCgpCiAgICB9OwogICAgdGhpcy5faWRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fY3VycmVudCA9IHRoaXMuX2J1aWxkZXIuYnVpbGRSb290KHRoaXMuX2lkcyk7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcjsKICAgIHRoaXMuX3doaXRlUmVnZXggPSAvXlxzKyQvOwogICAgdGhpcy5fbmJzcHMgPSAvXHhhMCsvZzsKICAgIHRoaXMuX3JpY2hUZXh0ID0gcmljaFRleHQ7CiAgfQogIHBhcnNlKGRhdGEpIHsKICAgIHRoaXMucGFyc2VYbWwoZGF0YSk7CiAgICBpZiAodGhpcy5fZXJyb3JDb2RlICE9PSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcikgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhpcy5fY3VycmVudFskZmluYWxpemVdKCk7CiAgICByZXR1cm4gdGhpcy5fY3VycmVudC5lbGVtZW50OwogIH0KICBvblRleHQodGV4dCkgewogICAgdGV4dCA9IHRleHQucmVwbGFjZSh0aGlzLl9uYnNwcywgbWF0Y2ggPT4gbWF0Y2guc2xpY2UoMSkgKyAiICIpOwogICAgaWYgKHRoaXMuX3JpY2hUZXh0IHx8IHRoaXMuX2N1cnJlbnRbJGFjY2VwdFdoaXRlc3BhY2VdKCkpIHsKICAgICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LCB0aGlzLl9yaWNoVGV4dCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl93aGl0ZVJlZ2V4LnRlc3QodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LnRyaW0oKSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0KTsKICB9CiAgX21rQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCB0YWdOYW1lKSB7CiAgICBsZXQgbmFtZXNwYWNlID0gbnVsbDsKICAgIGxldCBwcmVmaXhlcyA9IG51bGw7CiAgICBjb25zdCBhdHRyaWJ1dGVPYmogPSBPYmplY3QuY3JlYXRlKHt9KTsKICAgIGZvciAoY29uc3QgewogICAgICBuYW1lLAogICAgICB2YWx1ZQogICAgfSBvZiBhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChuYW1lID09PSAieG1sbnMiKSB7CiAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHsKICAgICAgICAgIG5hbWVzcGFjZSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBtdWx0aXBsZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpbiA8JHt0YWdOYW1lfT5gKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgewogICAgICAgIGNvbnN0IHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKCJ4bWxuczoiLmxlbmd0aCk7CiAgICAgICAgaWYgKCFwcmVmaXhlcykgewogICAgICAgICAgcHJlZml4ZXMgPSBbXTsKICAgICAgICB9CiAgICAgICAgcHJlZml4ZXMucHVzaCh7CiAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICB2YWx1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGkgPSBuYW1lLmluZGV4T2YoIjoiKTsKICAgICAgICBpZiAoaSA9PT0gLTEpIHsKICAgICAgICAgIGF0dHJpYnV0ZU9ialtuYW1lXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgbnNBdHRycyA9IGF0dHJpYnV0ZU9ialskbnNBdHRyaWJ1dGVzXTsKICAgICAgICAgIGlmICghbnNBdHRycykgewogICAgICAgICAgICBuc0F0dHJzID0gYXR0cmlidXRlT2JqWyRuc0F0dHJpYnV0ZXNdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IFtucywgYXR0ck5hbWVdID0gW25hbWUuc2xpY2UoMCwgaSksIG5hbWUuc2xpY2UoaSArIDEpXTsKICAgICAgICAgIGNvbnN0IGF0dHJzID0gbnNBdHRyc1tuc10gfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICBhdHRyc1thdHRyTmFtZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlT2JqXTsKICB9CiAgX2dldE5hbWVBbmRQcmVmaXgobmFtZSwgbnNBZ25vc3RpYykgewogICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPT09IC0xKSB7CiAgICAgIHJldHVybiBbbmFtZSwgbnVsbF07CiAgICB9CiAgICByZXR1cm4gW25hbWUuc3Vic3RyaW5nKGkgKyAxKSwgbnNBZ25vc3RpYyA/ICIiIDogbmFtZS5zdWJzdHJpbmcoMCwgaSldOwogIH0KICBvbkJlZ2luRWxlbWVudCh0YWdOYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7CiAgICBjb25zdCBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlc09ial0gPSB0aGlzLl9ta0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgdGFnTmFtZSk7CiAgICBjb25zdCBbbmFtZSwgbnNQcmVmaXhdID0gdGhpcy5fZ2V0TmFtZUFuZFByZWZpeCh0YWdOYW1lLCB0aGlzLl9idWlsZGVyLmlzTnNBZ25vc3RpYygpKTsKICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9idWlsZGVyLmJ1aWxkKHsKICAgICAgbnNQcmVmaXgsCiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNPYmosCiAgICAgIG5hbWVzcGFjZSwKICAgICAgcHJlZml4ZXMKICAgIH0pOwogICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzLl9nbG9iYWxEYXRhOwogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgbm9kZVskZmluYWxpemVdKCk7CiAgICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICAgIG5vZGVbJHNldElkXSh0aGlzLl9pZHMpOwogICAgICB9CiAgICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fc3RhY2sucHVzaCh0aGlzLl9jdXJyZW50KTsKICAgIHRoaXMuX2N1cnJlbnQgPSBub2RlOwogIH0KICBvbkVuZEVsZW1lbnQobmFtZSkgewogICAgY29uc3Qgbm9kZSA9IHRoaXMuX2N1cnJlbnQ7CiAgICBpZiAobm9kZVskaXNDREFUQVhtbF0oKSAmJiB0eXBlb2Ygbm9kZVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBYRkFQYXJzZXIoKTsKICAgICAgcGFyc2VyLl9nbG9iYWxEYXRhID0gdGhpcy5fZ2xvYmFsRGF0YTsKICAgICAgY29uc3Qgcm9vdCA9IHBhcnNlci5wYXJzZShub2RlWyRjb250ZW50XSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gbnVsbDsKICAgICAgbm9kZVskb25DaGlsZF0ocm9vdCk7CiAgICB9CiAgICBub2RlWyRmaW5hbGl6ZV0oKTsKICAgIHRoaXMuX2N1cnJlbnQgPSB0aGlzLl9zdGFjay5wb3AoKTsKICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICBub2RlWyRzZXRJZF0odGhpcy5faWRzKTsKICAgIH0KICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZhY3RvcnkuanMKCgoKCgoKCgpjbGFzcyBYRkFGYWN0b3J5IHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICB0cnkgewogICAgICB0aGlzLnJvb3QgPSBuZXcgWEZBUGFyc2VyKCkucGFyc2UoWEZBRmFjdG9yeS5fY3JlYXRlRG9jdW1lbnQoZGF0YSkpOwogICAgICBjb25zdCBiaW5kZXIgPSBuZXcgQmluZGVyKHRoaXMucm9vdCk7CiAgICAgIHRoaXMuZm9ybSA9IGJpbmRlci5iaW5kKCk7CiAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIodGhpcy5yb290LCBiaW5kZXIuZ2V0RGF0YSgpKTsKICAgICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS50ZW1wbGF0ZSA9IHRoaXMuZm9ybTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgd2FybihgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgYW5kIGJpbmRpbmc6ICR7ZX1gKTsKICAgIH0KICB9CiAgaXNWYWxpZCgpIHsKICAgIHJldHVybiB0aGlzLnJvb3QgJiYgdGhpcy5mb3JtOwogIH0KICBfY3JlYXRlUGFnZXNIZWxwZXIoKSB7CiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuZm9ybVskdG9QYWdlc10oKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IG5leHRJdGVyYXRpb24gPSAoKSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgaWYgKHZhbHVlLmRvbmUpIHsKICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZS52YWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXRUaW1lb3V0KG5leHRJdGVyYXRpb24sIDApOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHNldFRpbWVvdXQobmV4dEl0ZXJhdGlvbiwgMCk7CiAgICB9KTsKICB9CiAgYXN5bmMgX2NyZWF0ZVBhZ2VzKCkgewogICAgdHJ5IHsKICAgICAgdGhpcy5wYWdlcyA9IGF3YWl0IHRoaXMuX2NyZWF0ZVBhZ2VzSGVscGVyKCk7CiAgICAgIHRoaXMuZGltcyA9IHRoaXMucGFnZXMuY2hpbGRyZW4ubWFwKGMgPT4gewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0CiAgICAgICAgfSA9IGMuYXR0cmlidXRlcy5zdHlsZTsKICAgICAgICByZXR1cm4gWzAsIDAsIHBhcnNlSW50KHdpZHRoKSwgcGFyc2VJbnQoaGVpZ2h0KV07CiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICB3YXJuKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgbGF5b3V0OiAke2V9YCk7CiAgICB9CiAgfQogIGdldEJvdW5kaW5nQm94KHBhZ2VJbmRleCkgewogICAgcmV0dXJuIHRoaXMuZGltc1twYWdlSW5kZXhdOwogIH0KICBhc3luYyBnZXROdW1QYWdlcygpIHsKICAgIGlmICghdGhpcy5wYWdlcykgewogICAgICBhd2FpdCB0aGlzLl9jcmVhdGVQYWdlcygpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGltcy5sZW5ndGg7CiAgfQogIHNldEltYWdlcyhpbWFnZXMpIHsKICAgIHRoaXMuZm9ybVskZ2xvYmFsRGF0YV0uaW1hZ2VzID0gaW1hZ2VzOwogIH0KICBzZXRGb250cyhmb250cykgewogICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS5mb250RmluZGVyID0gbmV3IEZvbnRGaW5kZXIoZm9udHMpOwogICAgY29uc3QgbWlzc2luZ0ZvbnRzID0gW107CiAgICBmb3IgKGxldCB0eXBlZmFjZSBvZiB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMpIHsKICAgICAgdHlwZWZhY2UgPSBzdHJpcFF1b3Rlcyh0eXBlZmFjZSk7CiAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZCh0eXBlZmFjZSk7CiAgICAgIGlmICghZm9udCkgewogICAgICAgIG1pc3NpbmdGb250cy5wdXNoKHR5cGVmYWNlKTsKICAgICAgfQogICAgfQogICAgaWYgKG1pc3NpbmdGb250cy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiBtaXNzaW5nRm9udHM7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgYXBwZW5kRm9udHMoZm9udHMsIHJlYWxseU1pc3NpbmdGb250cykgewogICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS5mb250RmluZGVyLmFkZChmb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzKTsKICB9CiAgYXN5bmMgZ2V0UGFnZXMoKSB7CiAgICBpZiAoIXRoaXMucGFnZXMpIHsKICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTsKICAgIH0KICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlczsKICAgIHRoaXMucGFnZXMgPSBudWxsOwogICAgcmV0dXJuIHBhZ2VzOwogIH0KICBzZXJpYWxpemVEYXRhKHN0b3JhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRhdGFIYW5kbGVyLnNlcmlhbGl6ZShzdG9yYWdlKTsKICB9CiAgc3RhdGljIF9jcmVhdGVEb2N1bWVudChkYXRhKSB7CiAgICBpZiAoIWRhdGFbIi94ZHA6eGRwIl0pIHsKICAgICAgcmV0dXJuIGRhdGFbInhkcDp4ZHAiXTsKICAgIH0KICAgIHJldHVybiBPYmplY3QudmFsdWVzKGRhdGEpLmpvaW4oIiIpOwogIH0KICBzdGF0aWMgZ2V0UmljaFRleHRBc0h0bWwocmMpIHsKICAgIGlmICghcmMgfHwgdHlwZW9mIHJjICE9PSAic3RyaW5nIikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRyeSB7CiAgICAgIGxldCByb290ID0gbmV3IFhGQVBhcnNlcihYaHRtbE5hbWVzcGFjZSwgdHJ1ZSkucGFyc2UocmMpOwogICAgICBpZiAoIVsiYm9keSIsICJ4aHRtbCJdLmluY2x1ZGVzKHJvb3RbJG5vZGVOYW1lXSkpIHsKICAgICAgICBjb25zdCBuZXdSb290ID0gWGh0bWxOYW1lc3BhY2UuYm9keSh7fSk7CiAgICAgICAgbmV3Um9vdFskYXBwZW5kQ2hpbGRdKHJvb3QpOwogICAgICAgIHJvb3QgPSBuZXdSb290OwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHJvb3RbJHRvSFRNTF0oKTsKICAgICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBodG1sCiAgICAgIH0gPSByZXN1bHQ7CiAgICAgIGNvbnN0IHsKICAgICAgICBhdHRyaWJ1dGVzCiAgICAgIH0gPSBodG1sOwogICAgICBpZiAoYXR0cmlidXRlcykgewogICAgICAgIGlmIChhdHRyaWJ1dGVzLmNsYXNzKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gYXR0cmlidXRlcy5jbGFzcy5maWx0ZXIoYXR0ciA9PiAhYXR0ci5zdGFydHNXaXRoKCJ4ZmEiKSk7CiAgICAgICAgfQogICAgICAgIGF0dHJpYnV0ZXMuZGlyID0gImF1dG8iOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaHRtbCwKICAgICAgICBzdHI6IHJvb3RbJHRleHRdKCkKICAgICAgfTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgd2FybihgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgb2YgcmljaCB0ZXh0OiAke2V9YCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2Fubm90YXRpb24uanMKCgoKCgoKCgoKCgoKCgpjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZUdsb2JhbHMocGRmTWFuYWdlcikgewogICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJ4ZmFEYXRhc2V0cyIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInN0cnVjdFRyZWVSb290IiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYmFzZVVybCIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZ2xvYmFsQ29sb3JTcGFjZUNhY2hlIildKS50aGVuKChbYWNyb0Zvcm0sIHhmYURhdGFzZXRzLCBzdHJ1Y3RUcmVlUm9vdCwgYmFzZVVybCwgYXR0YWNobWVudHMsIGdsb2JhbENvbG9yU3BhY2VDYWNoZV0pID0+ICh7CiAgICAgIHBkZk1hbmFnZXIsCiAgICAgIGFjcm9Gb3JtOiBhY3JvRm9ybSBpbnN0YW5jZW9mIERpY3QgPyBhY3JvRm9ybSA6IERpY3QuZW1wdHksCiAgICAgIHhmYURhdGFzZXRzLAogICAgICBzdHJ1Y3RUcmVlUm9vdCwKICAgICAgYmFzZVVybCwKICAgICAgYXR0YWNobWVudHMsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZQogICAgfSksIHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYGNyZWF0ZUdsb2JhbHM6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0pOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlKHhyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcywgb3JwaGFuRmllbGRzLCBwYWdlUmVmKSB7CiAgICBjb25zdCBwYWdlSW5kZXggPSBjb2xsZWN0RmllbGRzID8gYXdhaXQgdGhpcy5fZ2V0UGFnZUluZGV4KHhyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMucGRmTWFuYWdlcikgOiBudWxsOwogICAgcmV0dXJuIGFubm90YXRpb25HbG9iYWxzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJfY3JlYXRlIiwgW3hyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcywgb3JwaGFuRmllbGRzLCBwYWdlSW5kZXgsIHBhZ2VSZWZdKTsKICB9CiAgc3RhdGljIF9jcmVhdGUoeHJlZiwgcmVmLCBhbm5vdGF0aW9uR2xvYmFscywgaWRGYWN0b3J5LCBjb2xsZWN0RmllbGRzID0gZmFsc2UsIG9ycGhhbkZpZWxkcyA9IG51bGwsIHBhZ2VJbmRleCA9IG51bGwsIHBhZ2VSZWYgPSBudWxsKSB7CiAgICBjb25zdCBkaWN0ID0geHJlZi5mZXRjaElmUmVmKHJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgYWNyb0Zvcm0sCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSBhbm5vdGF0aW9uR2xvYmFsczsKICAgIGNvbnN0IGlkID0gcmVmIGluc3RhbmNlb2YgUmVmID8gcmVmLnRvU3RyaW5nKCkgOiBgYW5ub3RfJHtpZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gOwogICAgbGV0IHN1YnR5cGUgPSBkaWN0LmdldCgiU3VidHlwZSIpOwogICAgc3VidHlwZSA9IHN1YnR5cGUgaW5zdGFuY2VvZiBOYW1lID8gc3VidHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7CiAgICAgIHhyZWYsCiAgICAgIHJlZiwKICAgICAgZGljdCwKICAgICAgc3VidHlwZSwKICAgICAgaWQsCiAgICAgIGFubm90YXRpb25HbG9iYWxzLAogICAgICBjb2xsZWN0RmllbGRzLAogICAgICBvcnBoYW5GaWVsZHMsCiAgICAgIG5lZWRBcHBlYXJhbmNlczogIWNvbGxlY3RGaWVsZHMgJiYgYWNyb0Zvcm0uZ2V0KCJOZWVkQXBwZWFyYW5jZXMiKSA9PT0gdHJ1ZSwKICAgICAgcGFnZUluZGV4LAogICAgICBldmFsdWF0b3JPcHRpb25zOiBwZGZNYW5hZ2VyLmV2YWx1YXRvck9wdGlvbnMsCiAgICAgIHBhZ2VSZWYKICAgIH07CiAgICBzd2l0Y2ggKHN1YnR5cGUpIHsKICAgICAgY2FzZSAiTGluayI6CiAgICAgICAgcmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiVGV4dCI6CiAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiV2lkZ2V0IjoKICAgICAgICBsZXQgZmllbGRUeXBlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgICAgICBkaWN0LAogICAgICAgICAga2V5OiAiRlQiCiAgICAgICAgfSk7CiAgICAgICAgZmllbGRUeXBlID0gZmllbGRUeXBlIGluc3RhbmNlb2YgTmFtZSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgewogICAgICAgICAgY2FzZSAiVHgiOgogICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQnRuIjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQ2giOgogICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgICBjYXNlICJTaWciOgogICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgfQogICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgd2lkZ2V0IGZpZWxkIHR5cGUgIiR7ZmllbGRUeXBlfSIsIGAgKyAiZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS4iKTsKICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlBvcHVwIjoKICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiRnJlZVRleHQiOgogICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJMaW5lIjoKICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTcXVhcmUiOgogICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiQ2lyY2xlIjoKICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlBvbHlMaW5lIjoKICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiUG9seWdvbiI6CiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiQ2FyZXQiOgogICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJJbmsiOgogICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiSGlnaGxpZ2h0IjoKICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlVuZGVybGluZSI6CiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTcXVpZ2dseSI6CiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlN0cmlrZU91dCI6CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTdGFtcCI6CiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkZpbGVBdHRhY2htZW50IjoKICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAoIWNvbGxlY3RGaWVsZHMpIHsKICAgICAgICAgIGlmICghc3VidHlwZSkgewogICAgICAgICAgICB3YXJuKCJBbm5vdGF0aW9uIGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIC9TdWJ0eXBlLiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2FybihgVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgIiR7c3VidHlwZX0iLCBgICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGFubm90YXRpb24uIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIF9nZXRQYWdlSW5kZXgoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyKSB7CiAgICB0cnkgewogICAgICBjb25zdCBhbm5vdERpY3QgPSBhd2FpdCB4cmVmLmZldGNoSWZSZWZBc3luYyhyZWYpOwogICAgICBpZiAoIShhbm5vdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCBwYWdlUmVmID0gYW5ub3REaWN0LmdldFJhdygiUCIpOwogICAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICAgICAgICByZXR1cm4gcGFnZUluZGV4OwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICBpbmZvKGBfZ2V0UGFnZUluZGV4IC0tIG5vdCBhIHZhbGlkIHBhZ2UgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYW5ub3REaWN0LmhhcygiS2lkcyIpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGNvbnN0IG51bVBhZ2VzID0gYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoIm51bVBhZ2VzIik7CiAgICAgIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IG51bVBhZ2VzOyBwYWdlSW5kZXgrKykgewogICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KTsKICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJhbm5vdGF0aW9ucyIpOwogICAgICAgIGZvciAoY29uc3QgYW5ub3RSZWYgb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgICAgIGlmIChhbm5vdFJlZiBpbnN0YW5jZW9mIFJlZiAmJiBpc1JlZnNFcXVhbChhbm5vdFJlZiwgcmVmKSkgewogICAgICAgICAgICByZXR1cm4gcGFnZUluZGV4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgd2FybihgX2dldFBhZ2VJbmRleDogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgc3RhdGljIGdlbmVyYXRlSW1hZ2VzKGFubm90YXRpb25zLCB4cmVmLCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICB3YXJuKCJnZW5lcmF0ZUltYWdlczogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGNhbm5vdCBzYXZlIG9yIHByaW50IHNvbWUgYW5ub3RhdGlvbnMgd2l0aCBpbWFnZXMuIik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGltYWdlUHJvbWlzZXM7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgYml0bWFwSWQsCiAgICAgIGJpdG1hcAogICAgfSBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoIWJpdG1hcCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGltYWdlUHJvbWlzZXMgfHw9IG5ldyBNYXAoKTsKICAgICAgaW1hZ2VQcm9taXNlcy5zZXQoYml0bWFwSWQsIFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVJbWFnZShiaXRtYXAsIHhyZWYpKTsKICAgIH0KICAgIHJldHVybiBpbWFnZVByb21pc2VzOwogIH0KICBzdGF0aWMgYXN5bmMgc2F2ZU5ld0Fubm90YXRpb25zKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHhyZWYgPSBldmFsdWF0b3IueHJlZjsKICAgIGxldCBiYXNlRm9udFJlZjsKICAgIGNvbnN0IHByb21pc2VzID0gW107CiAgICBjb25zdCB7CiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICB9ID0gZXZhbHVhdG9yLm9wdGlvbnM7CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgaWYgKGFubm90YXRpb24uZGVsZXRlZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHN3aXRjaCAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSkgewogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6CiAgICAgICAgICBpZiAoIWJhc2VGb250UmVmKSB7CiAgICAgICAgICAgIGNvbnN0IGJhc2VGb250ID0gbmV3IERpY3QoeHJlZik7CiAgICAgICAgICAgIGJhc2VGb250LnNldCgiQmFzZUZvbnQiLCBOYW1lLmdldCgiSGVsdmV0aWNhIikpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRm9udCIpKTsKICAgICAgICAgICAgYmFzZUZvbnQuc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIlR5cGUxIikpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIkVuY29kaW5nIiwgTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTsKICAgICAgICAgICAgYmFzZUZvbnRSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgICAgICBjaGFuZ2VzLnB1dChiYXNlRm9udFJlZiwgewogICAgICAgICAgICAgIGRhdGE6IGJhc2VGb250CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcHJvbWlzZXMucHVzaChGcmVlVGV4dEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCB7CiAgICAgICAgICAgIGV2YWx1YXRvciwKICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgYmFzZUZvbnRSZWYKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOgogICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhZFBvaW50cykgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKEhpZ2hsaWdodEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGNoYW5nZXMpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA6CiAgICAgICAgICBjb25zdCBpbWFnZSA9IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID8gYXdhaXQgaW1hZ2VQcm9taXNlcz8uZ2V0KGFubm90YXRpb24uYml0bWFwSWQpIDogbnVsbDsKICAgICAgICAgIGlmIChpbWFnZT8uaW1hZ2VTdHJlYW0pIHsKICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgIGltYWdlU3RyZWFtLAogICAgICAgICAgICAgIHNtYXNrU3RyZWFtCiAgICAgICAgICAgIH0gPSBpbWFnZTsKICAgICAgICAgICAgaWYgKHNtYXNrU3RyZWFtKSB7CiAgICAgICAgICAgICAgY29uc3Qgc21hc2tSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgICAgICAgIGNoYW5nZXMucHV0KHNtYXNrUmVmLCB7CiAgICAgICAgICAgICAgICBkYXRhOiBzbWFza1N0cmVhbQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGltYWdlU3RyZWFtLmRpY3Quc2V0KCJTTWFzayIsIHNtYXNrUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpbWFnZVJlZiA9IGltYWdlLmltYWdlUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgICAgICAgY2hhbmdlcy5wdXQoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgICBkYXRhOiBpbWFnZVN0cmVhbQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaW1hZ2UuaW1hZ2VTdHJlYW0gPSBpbWFnZS5zbWFza1N0cmVhbSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBwcm9taXNlcy5wdXNoKFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGNoYW5nZXMsIHsKICAgICAgICAgICAgaW1hZ2UKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuU0lHTkFUVVJFOgogICAgICAgICAgcHJvbWlzZXMucHVzaChTdGFtcEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCB7fSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGFubm90YXRpb25zOiBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcykKICAgIH07CiAgfQogIHN0YXRpYyBhc3luYyBwcmludE5ld0Fubm90YXRpb25zKGFubm90YXRpb25HbG9iYWxzLCBldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25zLCBpbWFnZVByb21pc2VzKSB7CiAgICBpZiAoIWFubm90YXRpb25zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgewogICAgICBvcHRpb25zLAogICAgICB4cmVmCiAgICB9ID0gZXZhbHVhdG9yOwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbi5kZWxldGVkKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgc3dpdGNoIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKSB7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDoKICAgICAgICAgIHByb21pc2VzLnB1c2goRnJlZVRleHRBbm5vdGF0aW9uLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBldmFsdWF0b3IsCiAgICAgICAgICAgIHRhc2ssCiAgICAgICAgICAgIGV2YWx1YXRvck9wdGlvbnM6IG9wdGlvbnMKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOgogICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhZFBvaW50cykgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKEhpZ2hsaWdodEFubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDoKICAgICAgICAgIGNvbnN0IGltYWdlID0gb3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA/IGF3YWl0IGltYWdlUHJvbWlzZXM/LmdldChhbm5vdGF0aW9uLmJpdG1hcElkKSA6IG51bGw7CiAgICAgICAgICBpZiAoaW1hZ2U/LmltYWdlU3RyZWFtKSB7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBpbWFnZVN0cmVhbSwKICAgICAgICAgICAgICBzbWFza1N0cmVhbQogICAgICAgICAgICB9ID0gaW1hZ2U7CiAgICAgICAgICAgIGlmIChzbWFza1N0cmVhbSkgewogICAgICAgICAgICAgIGltYWdlU3RyZWFtLmRpY3Quc2V0KCJTTWFzayIsIHNtYXNrU3RyZWFtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbWFnZS5pbWFnZVJlZiA9IG5ldyBKcGVnU3RyZWFtKGltYWdlU3RyZWFtLCBpbWFnZVN0cmVhbS5sZW5ndGgpOwogICAgICAgICAgICBpbWFnZS5pbWFnZVN0cmVhbSA9IGltYWdlLnNtYXNrU3RyZWFtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHByb21pc2VzLnB1c2goU3RhbXBBbm5vdGF0aW9uLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBpbWFnZSwKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TSUdOQVRVUkU6CiAgICAgICAgICBwcm9taXNlcy5wdXNoKFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQp9CmZ1bmN0aW9uIGdldFJnYkNvbG9yKGNvbG9yLCBkZWZhdWx0Q29sb3IgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMykpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoY29sb3IpKSB7CiAgICByZXR1cm4gZGVmYXVsdENvbG9yOwogIH0KICBjb25zdCByZ2JDb2xvciA9IGRlZmF1bHRDb2xvciB8fCBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7CiAgc3dpdGNoIChjb2xvci5sZW5ndGgpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIG51bGw7CiAgICBjYXNlIDE6CiAgICAgIENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgY2FzZSAzOgogICAgICBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgY2FzZSA0OgogICAgICBDb2xvclNwYWNlVXRpbHMuY215ay5nZXRSZ2JJdGVtKGNvbG9yLCAwLCByZ2JDb2xvciwgMCk7CiAgICAgIHJldHVybiByZ2JDb2xvcjsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBkZWZhdWx0Q29sb3I7CiAgfQp9CmZ1bmN0aW9uIGdldFBkZkNvbG9yQXJyYXkoY29sb3IpIHsKICByZXR1cm4gQXJyYXkuZnJvbShjb2xvciwgYyA9PiBjIC8gMjU1KTsKfQpmdW5jdGlvbiBnZXRRdWFkUG9pbnRzKGRpY3QsIHJlY3QpIHsKICBjb25zdCBxdWFkUG9pbnRzID0gZGljdC5nZXRBcnJheSgiUXVhZFBvaW50cyIpOwogIGlmICghaXNOdW1iZXJBcnJheShxdWFkUG9pbnRzLCBudWxsKSB8fCBxdWFkUG9pbnRzLmxlbmd0aCA9PT0gMCB8fCBxdWFkUG9pbnRzLmxlbmd0aCAlIDggPiAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbmV3UXVhZFBvaW50cyA9IG5ldyBGbG9hdDMyQXJyYXkocXVhZFBvaW50cy5sZW5ndGgpOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHF1YWRQb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gOCkgewogICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NF0gPSBxdWFkUG9pbnRzLnNsaWNlKGksIGkgKyA4KTsKICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4MSwgeDIsIHgzLCB4NCk7CiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDEsIHgyLCB4MywgeDQpOwogICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxLCB5MiwgeTMsIHk0KTsKICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5MSwgeTIsIHkzLCB5NCk7CiAgICBpZiAocmVjdCAhPT0gbnVsbCAmJiAobWluWCA8IHJlY3RbMF0gfHwgbWF4WCA+IHJlY3RbMl0gfHwgbWluWSA8IHJlY3RbMV0gfHwgbWF4WSA+IHJlY3RbM10pKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbmV3UXVhZFBvaW50cy5zZXQoW21pblgsIG1heFksIG1heFgsIG1heFksIG1pblgsIG1pblksIG1heFgsIG1pblldLCBpKTsKICB9CiAgcmV0dXJuIG5ld1F1YWRQb2ludHM7Cn0KZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTWF0cml4KHJlY3QsIGJib3gsIG1hdHJpeCkgewogIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goYmJveCwgbWF0cml4KTsKICBpZiAobWluWCA9PT0gbWF4WCB8fCBtaW5ZID09PSBtYXhZKSB7CiAgICByZXR1cm4gWzEsIDAsIDAsIDEsIHJlY3RbMF0sIHJlY3RbMV1dOwogIH0KICBjb25zdCB4UmF0aW8gPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gKG1heFggLSBtaW5YKTsKICBjb25zdCB5UmF0aW8gPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gKG1heFkgLSBtaW5ZKTsKICByZXR1cm4gW3hSYXRpbywgMCwgMCwgeVJhdGlvLCByZWN0WzBdIC0gbWluWCAqIHhSYXRpbywgcmVjdFsxXSAtIG1pblkgKiB5UmF0aW9dOwp9CmNsYXNzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgcmVmLAogICAgICBvcnBoYW5GaWVsZHMKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCBwYXJlbnRSZWYgPSBvcnBoYW5GaWVsZHM/LmdldChyZWYpOwogICAgaWYgKHBhcmVudFJlZikgewogICAgICBkaWN0LnNldCgiUGFyZW50IiwgcGFyZW50UmVmKTsKICAgIH0KICAgIHRoaXMuc2V0VGl0bGUoZGljdC5nZXQoIlQiKSk7CiAgICB0aGlzLnNldENvbnRlbnRzKGRpY3QuZ2V0KCJDb250ZW50cyIpKTsKICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShkaWN0LmdldCgiTSIpKTsKICAgIHRoaXMuc2V0RmxhZ3MoZGljdC5nZXQoIkYiKSk7CiAgICB0aGlzLnNldFJlY3RhbmdsZShkaWN0LmdldEFycmF5KCJSZWN0IikpOwogICAgdGhpcy5zZXRDb2xvcihkaWN0LmdldEFycmF5KCJDIikpOwogICAgdGhpcy5zZXRCb3JkZXJTdHlsZShkaWN0KTsKICAgIHRoaXMuc2V0QXBwZWFyYW5jZShkaWN0KTsKICAgIHRoaXMuc2V0T3B0aW9uYWxDb250ZW50KGRpY3QpOwogICAgY29uc3QgTUsgPSBkaWN0LmdldCgiTUsiKTsKICAgIHRoaXMuc2V0Qm9yZGVyQW5kQmFja2dyb3VuZENvbG9ycyhNSyk7CiAgICB0aGlzLnNldFJvdGF0aW9uKE1LLCBkaWN0KTsKICAgIHRoaXMucmVmID0gcGFyYW1zLnJlZiBpbnN0YW5jZW9mIFJlZiA/IHBhcmFtcy5yZWYgOiBudWxsOwogICAgdGhpcy5fc3RyZWFtcyA9IFtdOwogICAgaWYgKHRoaXMuYXBwZWFyYW5jZSkgewogICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlKTsKICAgIH0KICAgIGNvbnN0IGlzTG9ja2VkID0gISEodGhpcy5mbGFncyAmIEFubm90YXRpb25GbGFnLkxPQ0tFRCk7CiAgICBjb25zdCBpc0NvbnRlbnRMb2NrZWQgPSAhISh0aGlzLmZsYWdzICYgQW5ub3RhdGlvbkZsYWcuTE9DS0VEQ09OVEVOVFMpOwogICAgdGhpcy5kYXRhID0gewogICAgICBhbm5vdGF0aW9uRmxhZ3M6IHRoaXMuZmxhZ3MsCiAgICAgIGJvcmRlclN0eWxlOiB0aGlzLmJvcmRlclN0eWxlLAogICAgICBjb2xvcjogdGhpcy5jb2xvciwKICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvciwKICAgICAgYm9yZGVyQ29sb3I6IHRoaXMuYm9yZGVyQ29sb3IsCiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAogICAgICBjb250ZW50c09iajogdGhpcy5fY29udGVudHMsCiAgICAgIGhhc0FwcGVhcmFuY2U6ICEhdGhpcy5hcHBlYXJhbmNlLAogICAgICBpZDogcGFyYW1zLmlkLAogICAgICBtb2RpZmljYXRpb25EYXRlOiB0aGlzLm1vZGlmaWNhdGlvbkRhdGUsCiAgICAgIHJlY3Q6IHRoaXMucmVjdGFuZ2xlLAogICAgICBzdWJ0eXBlOiBwYXJhbXMuc3VidHlwZSwKICAgICAgaGFzT3duQ2FudmFzOiBmYWxzZSwKICAgICAgbm9Sb3RhdGU6ICEhKHRoaXMuZmxhZ3MgJiBBbm5vdGF0aW9uRmxhZy5OT1JPVEFURSksCiAgICAgIG5vSFRNTDogaXNMb2NrZWQgJiYgaXNDb250ZW50TG9ja2VkLAogICAgICBpc0VkaXRhYmxlOiBmYWxzZSwKICAgICAgc3RydWN0UGFyZW50OiAtMQogICAgfTsKICAgIGlmIChhbm5vdGF0aW9uR2xvYmFscy5zdHJ1Y3RUcmVlUm9vdCkgewogICAgICBsZXQgc3RydWN0UGFyZW50ID0gZGljdC5nZXQoIlN0cnVjdFBhcmVudCIpOwogICAgICB0aGlzLmRhdGEuc3RydWN0UGFyZW50ID0gc3RydWN0UGFyZW50ID0gTnVtYmVyLmlzSW50ZWdlcihzdHJ1Y3RQYXJlbnQpICYmIHN0cnVjdFBhcmVudCA+PSAwID8gc3RydWN0UGFyZW50IDogLTE7CiAgICAgIGFubm90YXRpb25HbG9iYWxzLnN0cnVjdFRyZWVSb290LmFkZEFubm90YXRpb25JZFRvUGFnZShwYXJhbXMucGFnZVJlZiwgc3RydWN0UGFyZW50KTsKICAgIH0KICAgIGlmIChwYXJhbXMuY29sbGVjdEZpZWxkcykgewogICAgICBjb25zdCBraWRzID0gZGljdC5nZXQoIktpZHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBjb25zdCBraWRJZHMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtpZCBvZiBraWRzKSB7CiAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGtpZElkcy5wdXNoKGtpZC50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGtpZElkcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgIHRoaXMuZGF0YS5raWRJZHMgPSBraWRJZHM7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuZGF0YS5hY3Rpb25zID0gY29sbGVjdEFjdGlvbnMoeHJlZiwgZGljdCwgQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSk7CiAgICAgIHRoaXMuZGF0YS5maWVsZE5hbWUgPSB0aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUoZGljdCk7CiAgICAgIHRoaXMuZGF0YS5wYWdlSW5kZXggPSBwYXJhbXMucGFnZUluZGV4OwogICAgfQogICAgY29uc3QgaXQgPSBkaWN0LmdldCgiSVQiKTsKICAgIGlmIChpdCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgdGhpcy5kYXRhLml0ID0gaXQubmFtZTsKICAgIH0KICAgIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gcGFyYW1zLmV2YWx1YXRvck9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7CiAgICB0aGlzLl9mYWxsYmFja0ZvbnREaWN0ID0gbnVsbDsKICAgIHRoaXMuX25lZWRBcHBlYXJhbmNlcyA9IGZhbHNlOwogIH0KICBfaGFzRmxhZyhmbGFncywgZmxhZykgewogICAgcmV0dXJuICEhKGZsYWdzICYgZmxhZyk7CiAgfQogIF9idWlsZEZsYWdzKG5vVmlldywgbm9QcmludCkgewogICAgbGV0IHsKICAgICAgZmxhZ3MKICAgIH0gPSB0aGlzOwogICAgaWYgKG5vVmlldyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmIChub1ByaW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIGlmIChub1ByaW50KSB7CiAgICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLlBSSU5UOwogICAgICB9CiAgICAgIHJldHVybiBmbGFncyAmIH5Bbm5vdGF0aW9uRmxhZy5ISURERU4gfCBBbm5vdGF0aW9uRmxhZy5QUklOVDsKICAgIH0KICAgIGlmIChub1ZpZXcpIHsKICAgICAgZmxhZ3MgfD0gQW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgICAgIGlmIChub1ByaW50KSB7CiAgICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLk5PVklFVyB8IEFubm90YXRpb25GbGFnLkhJRERFTjsKICAgICAgfQogICAgICByZXR1cm4gZmxhZ3MgJiB+QW5ub3RhdGlvbkZsYWcuSElEREVOIHwgQW5ub3RhdGlvbkZsYWcuTk9WSUVXOwogICAgfQogICAgZmxhZ3MgJj0gfihBbm5vdGF0aW9uRmxhZy5ISURERU4gfCBBbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOwogICAgaWYgKG5vUHJpbnQpIHsKICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLlBSSU5UOwogICAgfQogICAgcmV0dXJuIGZsYWdzIHwgQW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgfQogIF9pc1ZpZXdhYmxlKGZsYWdzKSB7CiAgICByZXR1cm4gIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLklOVklTSUJMRSkgJiYgIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLk5PVklFVyk7CiAgfQogIF9pc1ByaW50YWJsZShmbGFncykgewogICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLlBSSU5UKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKTsKICB9CiAgbXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCBfcmVuZGVyRm9ybXMpIHsKICAgIGNvbnN0IG5vVmlldyA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ubm9WaWV3OwogICAgaWYgKG5vVmlldyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAhbm9WaWV3OwogICAgfQogICAgcmV0dXJuIHRoaXMudmlld2FibGUgJiYgIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKICB9CiAgbXVzdEJlUHJpbnRlZChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3Qgbm9QcmludCA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ubm9QcmludDsKICAgIGlmIChub1ByaW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuICFub1ByaW50OwogICAgfQogICAgcmV0dXJuIHRoaXMucHJpbnRhYmxlOwogIH0KICBtdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzID0gbnVsbCkgewogICAgcmV0dXJuIGlzRWRpdGluZyA/ICF0aGlzLmRhdGEuaXNFZGl0YWJsZSA6ICFtb2RpZmllZElkcz8uaGFzKHRoaXMuZGF0YS5pZCk7CiAgfQogIGdldCB2aWV3YWJsZSgpIHsKICAgIGlmICh0aGlzLmRhdGEucXVhZFBvaW50cyA9PT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5mbGFncyA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9pc1ZpZXdhYmxlKHRoaXMuZmxhZ3MpOwogIH0KICBnZXQgcHJpbnRhYmxlKCkgewogICAgaWYgKHRoaXMuZGF0YS5xdWFkUG9pbnRzID09PSBudWxsKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLmZsYWdzID09PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9pc1ByaW50YWJsZSh0aGlzLmZsYWdzKTsKICB9CiAgX3BhcnNlU3RyaW5nSGVscGVyKGRhdGEpIHsKICAgIGNvbnN0IHN0ciA9IHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGRhdGEpIDogIiI7CiAgICBjb25zdCBkaXIgPSBzdHIgJiYgYmlkaShzdHIpLmRpciA9PT0gInJ0bCIgPyAicnRsIiA6ICJsdHIiOwogICAgcmV0dXJuIHsKICAgICAgc3RyLAogICAgICBkaXIKICAgIH07CiAgfQogIHNldERlZmF1bHRBcHBlYXJhbmNlKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IGRlZmF1bHRBcHBlYXJhbmNlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRBIgogICAgfSkgfHwgYW5ub3RhdGlvbkdsb2JhbHMuYWNyb0Zvcm0uZ2V0KCJEQSIpOwogICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSB0eXBlb2YgZGVmYXVsdEFwcGVhcmFuY2UgPT09ICJzdHJpbmciID8gZGVmYXVsdEFwcGVhcmFuY2UgOiAiIjsKICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEgPSBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlKTsKICB9CiAgc2V0VGl0bGUodGl0bGUpIHsKICAgIHRoaXMuX3RpdGxlID0gdGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIodGl0bGUpOwogIH0KICBzZXRDb250ZW50cyhjb250ZW50cykgewogICAgdGhpcy5fY29udGVudHMgPSB0aGlzLl9wYXJzZVN0cmluZ0hlbHBlcihjb250ZW50cyk7CiAgfQogIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkgewogICAgdGhpcy5tb2RpZmljYXRpb25EYXRlID0gdHlwZW9mIG1vZGlmaWNhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gbW9kaWZpY2F0aW9uRGF0ZSA6IG51bGw7CiAgfQogIHNldEZsYWdzKGZsYWdzKSB7CiAgICB0aGlzLmZsYWdzID0gTnVtYmVyLmlzSW50ZWdlcihmbGFncykgJiYgZmxhZ3MgPiAwID8gZmxhZ3MgOiAwOwogICAgaWYgKHRoaXMuZmxhZ3MgJiBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUgJiYgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAiQW5ub3RhdGlvbiIpIHsKICAgICAgdGhpcy5mbGFncyBePSBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEU7CiAgICB9CiAgfQogIGhhc0ZsYWcoZmxhZykgewogICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgZmxhZyk7CiAgfQogIHNldFJlY3RhbmdsZShyZWN0YW5nbGUpIHsKICAgIHRoaXMucmVjdGFuZ2xlID0gbG9va3VwTm9ybWFsUmVjdChyZWN0YW5nbGUsIFswLCAwLCAwLCAwXSk7CiAgfQogIHNldENvbG9yKGNvbG9yKSB7CiAgICB0aGlzLmNvbG9yID0gZ2V0UmdiQ29sb3IoY29sb3IpOwogIH0KICBzZXRMaW5lRW5kaW5ncyhsaW5lRW5kaW5ncykgewogICAgdGhpcy5saW5lRW5kaW5ncyA9IFsiTm9uZSIsICJOb25lIl07CiAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lRW5kaW5ncykgJiYgbGluZUVuZGluZ3MubGVuZ3RoID09PSAyKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgY29uc3Qgb2JqID0gbGluZUVuZGluZ3NbaV07CiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiTm9uZSI6CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNhc2UgIlNxdWFyZSI6CiAgICAgICAgICAgIGNhc2UgIkNpcmNsZSI6CiAgICAgICAgICAgIGNhc2UgIkRpYW1vbmQiOgogICAgICAgICAgICBjYXNlICJPcGVuQXJyb3ciOgogICAgICAgICAgICBjYXNlICJDbG9zZWRBcnJvdyI6CiAgICAgICAgICAgIGNhc2UgIkJ1dHQiOgogICAgICAgICAgICBjYXNlICJST3BlbkFycm93IjoKICAgICAgICAgICAgY2FzZSAiUkNsb3NlZEFycm93IjoKICAgICAgICAgICAgY2FzZSAiU2xhc2giOgogICAgICAgICAgICAgIHRoaXMubGluZUVuZGluZ3NbaV0gPSBvYmoubmFtZTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2FybihgSWdub3JpbmcgaW52YWxpZCBsaW5lRW5kaW5nOiAke29ian1gKTsKICAgICAgfQogICAgfQogIH0KICBzZXRSb3RhdGlvbihtaywgZGljdCkgewogICAgdGhpcy5yb3RhdGlvbiA9IDA7CiAgICBsZXQgYW5nbGUgPSBtayBpbnN0YW5jZW9mIERpY3QgPyBtay5nZXQoIlIiKSB8fCAwIDogZGljdC5nZXQoIlJvdGF0ZSIpIHx8IDA7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihhbmdsZSkgJiYgYW5nbGUgIT09IDApIHsKICAgICAgYW5nbGUgJT0gMzYwOwogICAgICBpZiAoYW5nbGUgPCAwKSB7CiAgICAgICAgYW5nbGUgKz0gMzYwOwogICAgICB9CiAgICAgIGlmIChhbmdsZSAlIDkwID09PSAwKSB7CiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGFuZ2xlOwogICAgICB9CiAgICB9CiAgfQogIHNldEJvcmRlckFuZEJhY2tncm91bmRDb2xvcnMobWspIHsKICAgIGlmIChtayBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgdGhpcy5ib3JkZXJDb2xvciA9IGdldFJnYkNvbG9yKG1rLmdldEFycmF5KCJCQyIpLCBudWxsKTsKICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBnZXRSZ2JDb2xvcihtay5nZXRBcnJheSgiQkciKSwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJvcmRlckNvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwogICAgfQogIH0KICBzZXRCb3JkZXJTdHlsZShib3JkZXJTdHlsZSkgewogICAgdGhpcy5ib3JkZXJTdHlsZSA9IG5ldyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKICAgIGlmICghKGJvcmRlclN0eWxlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJvcmRlclN0eWxlLmhhcygiQlMiKSkgewogICAgICBjb25zdCBkaWN0ID0gYm9yZGVyU3R5bGUuZ2V0KCJCUyIpOwogICAgICBpZiAoZGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBkaWN0VHlwZSA9IGRpY3QuZ2V0KCJUeXBlIik7CiAgICAgICAgaWYgKCFkaWN0VHlwZSB8fCBpc05hbWUoZGljdFR5cGUsICJCb3JkZXIiKSkgewogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aChkaWN0LmdldCgiVyIpLCB0aGlzLnJlY3RhbmdsZSk7CiAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFN0eWxlKGRpY3QuZ2V0KCJTIikpOwogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoZGljdC5nZXRBcnJheSgiRCIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYm9yZGVyU3R5bGUuaGFzKCJCb3JkZXIiKSkgewogICAgICBjb25zdCBhcnJheSA9IGJvcmRlclN0eWxlLmdldEFycmF5KCJCb3JkZXIiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+PSAzKSB7CiAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKGFycmF5WzBdKTsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKGFycmF5WzFdKTsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGFycmF5WzJdLCB0aGlzLnJlY3RhbmdsZSk7CiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gNCkgewogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoYXJyYXlbM10sIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aCgwKTsKICAgIH0KICB9CiAgc2V0QXBwZWFyYW5jZShkaWN0KSB7CiAgICB0aGlzLmFwcGVhcmFuY2UgPSBudWxsOwogICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlcyA9IGRpY3QuZ2V0KCJBUCIpOwogICAgaWYgKCEoYXBwZWFyYW5jZVN0YXRlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CiAgICBpZiAobm9ybWFsQXBwZWFyYW5jZVN0YXRlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghKG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFzID0gZGljdC5nZXQoIkFTIik7CiAgICBpZiAoIShhcyBpbnN0YW5jZW9mIE5hbWUpIHx8ICFub3JtYWxBcHBlYXJhbmNlU3RhdGUuaGFzKGFzLm5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGUuZ2V0KGFzLm5hbWUpOwogICAgaWYgKGFwcGVhcmFuY2UgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7CiAgICB9CiAgfQogIHNldE9wdGlvbmFsQ29udGVudChkaWN0KSB7CiAgICB0aGlzLm9jID0gbnVsbDsKICAgIGNvbnN0IG9jID0gZGljdC5nZXQoIk9DIik7CiAgICBpZiAob2MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHdhcm4oInNldE9wdGlvbmFsQ29udGVudDogU3VwcG9ydCBmb3IgL05hbWUtZW50cnkgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgfSBlbHNlIGlmIChvYyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgdGhpcy5vYyA9IG9jOwogICAgfQogIH0KICBsb2FkUmVzb3VyY2VzKGtleXMsIGFwcGVhcmFuY2UpIHsKICAgIHJldHVybiBhcHBlYXJhbmNlLmRpY3QuZ2V0QXN5bmMoIlJlc291cmNlcyIpLnRoZW4ocmVzb3VyY2VzID0+IHsKICAgICAgaWYgKCFyZXNvdXJjZXMpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIocmVzb3VyY2VzLCBrZXlzLCByZXNvdXJjZXMueHJlZik7CiAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpLnRoZW4oKCkgPT4gcmVzb3VyY2VzKTsKICAgIH0pOwogIH0KICBhc3luYyBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCB7CiAgICAgIGhhc093bkNhbnZhcywKICAgICAgaWQsCiAgICAgIHJlY3QKICAgIH0gPSB0aGlzLmRhdGE7CiAgICBsZXQgYXBwZWFyYW5jZSA9IHRoaXMuYXBwZWFyYW5jZTsKICAgIGNvbnN0IGlzVXNpbmdPd25DYW52YXMgPSAhIShoYXNPd25DYW52YXMgJiYgaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKTsKICAgIGlmIChpc1VzaW5nT3duQ2FudmFzICYmICh0aGlzLndpZHRoID09PSAwIHx8IHRoaXMuaGVpZ2h0ID09PSAwKSkgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gZmFsc2U7CiAgICAgIHJldHVybiB7CiAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGlmICghYXBwZWFyYW5jZSkgewogICAgICBpZiAoIWlzVXNpbmdPd25DYW52YXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBhcHBlYXJhbmNlID0gbmV3IFN0cmluZ1N0cmVhbSgiIik7CiAgICAgIGFwcGVhcmFuY2UuZGljdCA9IG5ldyBEaWN0KCk7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IGFwcGVhcmFuY2UuZGljdDsKICAgIGNvbnN0IHJlc291cmNlcyA9IGF3YWl0IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJDb2xvclNwYWNlIiwgIlBhdHRlcm4iLCAiU2hhZGluZyIsICJYT2JqZWN0IiwgIkZvbnQiXSwgYXBwZWFyYW5jZSk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwUmVjdChhcHBlYXJhbmNlRGljdC5nZXRBcnJheSgiQkJveCIpLCBbMCwgMCwgMSwgMV0pOwogICAgY29uc3QgbWF0cml4ID0gbG9va3VwTWF0cml4KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgSURFTlRJVFlfTUFUUklYKTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeChyZWN0LCBiYm94LCBtYXRyaXgpOwogICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgbGV0IG9wdGlvbmFsQ29udGVudDsKICAgIGlmICh0aGlzLm9jKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IGV2YWx1YXRvci5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyh0aGlzLm9jLCBudWxsKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbIk9DIiwgb3B0aW9uYWxDb250ZW50XSk7CiAgICB9CiAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luQW5ub3RhdGlvbiwgW2lkLCByZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaXNVc2luZ093bkNhbnZhc10pOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCwKICAgICAgZmFsbGJhY2tGb250RGljdDogdGhpcy5fZmFsbGJhY2tGb250RGljdAogICAgfSk7CiAgICBvcExpc3QuYWRkT3AoT1BTLmVuZEFubm90YXRpb24sIFtdKTsKICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICAgIHRoaXMucmVzZXQoKTsKICAgIHJldHVybiB7CiAgICAgIG9wTGlzdCwKICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgc2VwYXJhdGVDYW52YXM6IGlzVXNpbmdPd25DYW52YXMKICAgIH07CiAgfQogIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KGV2YWx1YXRvciwgdGFzaywgdmlld0JveCkgewogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUHJvcGVydGllcyIsICJYT2JqZWN0Il0sIHRoaXMuYXBwZWFyYW5jZSk7CiAgICBjb25zdCB0ZXh0ID0gW107CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGxldCBmaXJzdFBvc2l0aW9uID0gbnVsbDsKICAgIGNvbnN0IHNpbmsgPSB7CiAgICAgIGRlc2lyZWRTaXplOiBNYXRoLkluZmluaXR5LAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSkgewogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjaHVuay5pdGVtcykgewogICAgICAgICAgaWYgKGl0ZW0uc3RyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBmaXJzdFBvc2l0aW9uIHx8PSBpdGVtLnRyYW5zZm9ybS5zbGljZSgtMik7CiAgICAgICAgICBidWZmZXIucHVzaChpdGVtLnN0cik7CiAgICAgICAgICBpZiAoaXRlbS5oYXNFT0wpIHsKICAgICAgICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBhd2FpdCBldmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IHRoaXMuYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdHJ1ZSwKICAgICAga2VlcFdoaXRlU3BhY2U6IHRydWUsCiAgICAgIHNpbmssCiAgICAgIHZpZXdCb3gKICAgIH0pOwogICAgdGhpcy5yZXNldCgpOwogICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgfQogICAgaWYgKHRleHQubGVuZ3RoID4gMSB8fCB0ZXh0WzBdKSB7CiAgICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gdGhpcy5hcHBlYXJhbmNlLmRpY3Q7CiAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBSZWN0KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoYXBwZWFyYW5jZURpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBudWxsKTsKICAgICAgdGhpcy5kYXRhLnRleHRQb3NpdGlvbiA9IHRoaXMuX3RyYW5zZm9ybVBvaW50KGZpcnN0UG9zaXRpb24sIGJib3gsIG1hdHJpeCk7CiAgICAgIHRoaXMuZGF0YS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICB9CiAgfQogIF90cmFuc2Zvcm1Qb2ludChjb29yZHMsIGJib3gsIG1hdHJpeCkgewogICAgY29uc3QgewogICAgICByZWN0CiAgICB9ID0gdGhpcy5kYXRhOwogICAgYmJveCB8fD0gWzAsIDAsIDEsIDFdOwogICAgbWF0cml4IHx8PSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KTsKICAgIHRyYW5zZm9ybVs0XSAtPSByZWN0WzBdOwogICAgdHJhbnNmb3JtWzVdIC09IHJlY3RbMV07CiAgICBjb29yZHMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgdHJhbnNmb3JtKTsKICAgIHJldHVybiBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgbWF0cml4KTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBpZiAodGhpcy5kYXRhLmtpZElkcykgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgICAgbmFtZTogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgICB0eXBlOiAiIiwKICAgICAgICBraWRJZHM6IHRoaXMuZGF0YS5raWRJZHMsCiAgICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbgogICAgICB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlc2V0KCkgewogICAgZm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5fc3RyZWFtcykgewogICAgICBzdHJlYW0ucmVzZXQoKTsKICAgIH0KICB9CiAgX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KSB7CiAgICBpZiAoIWRpY3QuaGFzKCJUIikgJiYgIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICB3YXJuKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpOwogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGljdC5nZXQoIlQiKSk7CiAgICB9CiAgICBjb25zdCBmaWVsZE5hbWUgPSBbXTsKICAgIGlmIChkaWN0LmhhcygiVCIpKSB7CiAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KCJUIikpKTsKICAgIH0KICAgIGxldCBsb29wRGljdCA9IGRpY3Q7CiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogICAgaWYgKGRpY3Qub2JqSWQpIHsKICAgICAgdmlzaXRlZC5wdXQoZGljdC5vYmpJZCk7CiAgICB9CiAgICB3aGlsZSAobG9vcERpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICBsb29wRGljdCA9IGxvb3BEaWN0LmdldCgiUGFyZW50Iik7CiAgICAgIGlmICghKGxvb3BEaWN0IGluc3RhbmNlb2YgRGljdCkgfHwgbG9vcERpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMobG9vcERpY3Qub2JqSWQpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGxvb3BEaWN0Lm9iaklkKSB7CiAgICAgICAgdmlzaXRlZC5wdXQobG9vcERpY3Qub2JqSWQpOwogICAgICB9CiAgICAgIGlmIChsb29wRGljdC5oYXMoIlQiKSkgewogICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGxvb3BEaWN0LmdldCgiVCIpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWVsZE5hbWUuam9pbigiLiIpOwogIH0KICBnZXQgd2lkdGgoKSB7CiAgICByZXR1cm4gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTsKICB9CiAgZ2V0IGhlaWdodCgpIHsKICAgIHJldHVybiB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogIH0KfQpjbGFzcyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDE7CiAgICB0aGlzLnJhd1dpZHRoID0gMTsKICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgdGhpcy5kYXNoQXJyYXkgPSBbM107CiAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSAwOwogICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IDA7CiAgfQogIHNldFdpZHRoKHdpZHRoLCByZWN0ID0gWzAsIDAsIDAsIDBdKSB7CiAgICBpZiAod2lkdGggaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgICAgdGhpcy5yYXdXaWR0aCA9IHdpZHRoOwogICAgICAgIGNvbnN0IG1heFdpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIDI7CiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7CiAgICAgICAgaWYgKG1heFdpZHRoID4gMCAmJiBtYXhIZWlnaHQgPiAwICYmICh3aWR0aCA+IG1heFdpZHRoIHx8IHdpZHRoID4gbWF4SGVpZ2h0KSkgewogICAgICAgICAgd2FybihgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7d2lkdGh9YCk7CiAgICAgICAgICB3aWR0aCA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgIH0KICB9CiAgc2V0U3R5bGUoc3R5bGUpIHsKICAgIGlmICghKHN0eWxlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3dpdGNoIChzdHlsZS5uYW1lKSB7CiAgICAgIGNhc2UgIlMiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJEIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkIiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkkiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJVIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHNldERhc2hBcnJheShkYXNoQXJyYXksIGZvcmNlU3R5bGUgPSBmYWxzZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZGFzaEFycmF5KSkgewogICAgICBsZXQgaXNWYWxpZCA9IHRydWU7CiAgICAgIGxldCBhbGxaZXJvcyA9IHRydWU7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkYXNoQXJyYXkpIHsKICAgICAgICBjb25zdCB2YWxpZE51bWJlciA9ICtlbGVtZW50ID49IDA7CiAgICAgICAgaWYgKCF2YWxpZE51bWJlcikgewogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID4gMCkgewogICAgICAgICAgYWxsWmVyb3MgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRhc2hBcnJheS5sZW5ndGggPT09IDAgfHwgaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHsKICAgICAgICB0aGlzLmRhc2hBcnJheSA9IGRhc2hBcnJheTsKICAgICAgICBpZiAoZm9yY2VTdHlsZSkgewogICAgICAgICAgdGhpcy5zZXRTdHlsZShOYW1lLmdldCgiRCIpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy53aWR0aCA9IDA7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGFzaEFycmF5KSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgfQogIH0KICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSByYWRpdXM7CiAgICB9CiAgfQogIHNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gcmFkaXVzOwogICAgfQogIH0KfQpjbGFzcyBNYXJrdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgaWYgKGRpY3QuaGFzKCJJUlQiKSkgewogICAgICBjb25zdCByYXdJUlQgPSBkaWN0LmdldFJhdygiSVJUIik7CiAgICAgIHRoaXMuZGF0YS5pblJlcGx5VG8gPSByYXdJUlQgaW5zdGFuY2VvZiBSZWYgPyByYXdJUlQudG9TdHJpbmcoKSA6IG51bGw7CiAgICAgIGNvbnN0IHJ0ID0gZGljdC5nZXQoIlJUIik7CiAgICAgIHRoaXMuZGF0YS5yZXBseVR5cGUgPSBydCBpbnN0YW5jZW9mIE5hbWUgPyBydC5uYW1lIDogQW5ub3RhdGlvblJlcGx5VHlwZS5SRVBMWTsKICAgIH0KICAgIGxldCBwb3B1cFJlZiA9IG51bGw7CiAgICBpZiAodGhpcy5kYXRhLnJlcGx5VHlwZSA9PT0gQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkgewogICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiSVJUIik7CiAgICAgIHRoaXMuc2V0VGl0bGUocGFyZW50LmdldCgiVCIpKTsKICAgICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldCgiQ29udGVudHMiKSk7CiAgICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgICBpZiAoIXBhcmVudC5oYXMoIkNyZWF0aW9uRGF0ZSIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUocGFyZW50LmdldCgiQ3JlYXRpb25EYXRlIikpOwogICAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSB0aGlzLmNyZWF0aW9uRGF0ZTsKICAgICAgfQogICAgICBpZiAoIXBhcmVudC5oYXMoIk0iKSkgewogICAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50LmdldCgiTSIpKTsKICAgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKICAgICAgfQogICAgICBwb3B1cFJlZiA9IHBhcmVudC5nZXRSYXcoIlBvcHVwIik7CiAgICAgIGlmICghcGFyZW50LmhhcygiQyIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldENvbG9yKHBhcmVudC5nZXRBcnJheSgiQyIpKTsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSB0aGlzLmNvbG9yOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEudGl0bGVPYmogPSB0aGlzLl90aXRsZTsKICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTsKICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IHRoaXMuY3JlYXRpb25EYXRlOwogICAgICBwb3B1cFJlZiA9IGRpY3QuZ2V0UmF3KCJQb3B1cCIpOwogICAgICBpZiAoIWRpY3QuaGFzKCJDIikpIHsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSBudWxsOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBwb3B1cFJlZiBpbnN0YW5jZW9mIFJlZiA/IHBvcHVwUmVmLnRvU3RyaW5nKCkgOiBudWxsOwogICAgaWYgKGRpY3QuaGFzKCJSQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5yaWNoVGV4dCA9IFhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwoZGljdC5nZXQoIlJDIikpOwogICAgfQogIH0KICBzZXRDcmVhdGlvbkRhdGUoY3JlYXRpb25EYXRlKSB7CiAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IHR5cGVvZiBjcmVhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gY3JlYXRpb25EYXRlIDogbnVsbDsKICB9CiAgX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgIHhyZWYsCiAgICBleHRyYSwKICAgIHN0cm9rZUNvbG9yLAogICAgZmlsbENvbG9yLAogICAgYmxlbmRNb2RlLAogICAgc3Ryb2tlQWxwaGEsCiAgICBmaWxsQWxwaGEsCiAgICBwb2ludHNDYWxsYmFjawogIH0pIHsKICAgIGNvbnN0IGJib3ggPSB0aGlzLmRhdGEucmVjdCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgIGNvbnN0IGJ1ZmZlciA9IFsicSJdOwogICAgaWYgKGV4dHJhKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGV4dHJhKTsKICAgIH0KICAgIGlmIChzdHJva2VDb2xvcikgewogICAgICBidWZmZXIucHVzaChgJHtzdHJva2VDb2xvclswXX0gJHtzdHJva2VDb2xvclsxXX0gJHtzdHJva2VDb2xvclsyXX0gUkdgKTsKICAgIH0KICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgYnVmZmVyLnB1c2goYCR7ZmlsbENvbG9yWzBdfSAke2ZpbGxDb2xvclsxXX0gJHtmaWxsQ29sb3JbMl19IHJnYCk7CiAgICB9CiAgICBjb25zdCBwb2ludHNBcnJheSA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzIHx8IEZsb2F0MzJBcnJheS5mcm9tKFt0aGlzLnJlY3RhbmdsZVswXSwgdGhpcy5yZWN0YW5nbGVbM10sIHRoaXMucmVjdGFuZ2xlWzJdLCB0aGlzLnJlY3RhbmdsZVszXSwgdGhpcy5yZWN0YW5nbGVbMF0sIHRoaXMucmVjdGFuZ2xlWzFdLCB0aGlzLnJlY3RhbmdsZVsyXSwgdGhpcy5yZWN0YW5nbGVbMV1dKTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50c0FycmF5Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDgpIHsKICAgICAgY29uc3QgcG9pbnRzID0gcG9pbnRzQ2FsbGJhY2soYnVmZmVyLCBwb2ludHNBcnJheS5zdWJhcnJheShpLCBpICsgOCkpOwogICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCguLi5wb2ludHMsIGJib3gpOwogICAgfQogICAgYnVmZmVyLnB1c2goIlEiKTsKICAgIGNvbnN0IGZvcm1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShidWZmZXIuam9pbigiICIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW0uZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgZm9ybURpY3Quc2V0KCJGbTAiLCBhcHBlYXJhbmNlU3RyZWFtKTsKICAgIGNvbnN0IGdzRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgaWYgKGJsZW5kTW9kZSkgewogICAgICBnc0RpY3Quc2V0KCJCTSIsIE5hbWUuZ2V0KGJsZW5kTW9kZSkpOwogICAgfQogICAgaWYgKHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiQ0EiLCBzdHJva2VBbHBoYSk7CiAgICB9CiAgICBpZiAodHlwZW9mIGZpbGxBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiY2EiLCBmaWxsQWxwaGEpOwogICAgfQogICAgY29uc3Qgc3RhdGVEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBzdGF0ZURpY3Quc2V0KCJHUzAiLCBnc0RpY3QpOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBzdGF0ZURpY3QpOwogICAgcmVzb3VyY2VzLnNldCgiWE9iamVjdCIsIGZvcm1EaWN0KTsKICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIkJCb3giLCBiYm94KTsKICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5ldyBTdHJpbmdTdHJlYW0oIi9HUzAgZ3MgL0ZtMCBEbyIpOwogICAgdGhpcy5hcHBlYXJhbmNlLmRpY3QgPSBhcHBlYXJhbmNlRGljdDsKICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UsIGFwcGVhcmFuY2VTdHJlYW0pOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCBwYXJhbXMpIHsKICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBhbm5vdGF0aW9uLnJlZiB8fD0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgIGNvbnN0IGFwID0gYXdhaXQgdGhpcy5jcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcyk7CiAgICBsZXQgYW5ub3RhdGlvbkRpY3Q7CiAgICBpZiAoYXApIHsKICAgICAgY29uc3QgYXBSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBhbm5vdGF0aW9uRGljdCA9IHRoaXMuY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICAgICAgYXBSZWYKICAgICAgfSk7CiAgICAgIGNoYW5nZXMucHV0KGFwUmVmLCB7CiAgICAgICAgZGF0YTogYXAKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBhbm5vdGF0aW9uRGljdCA9IHRoaXMuY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7fSk7CiAgICB9CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihhbm5vdGF0aW9uLnBhcmVudFRyZWVJZCkpIHsKICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdHJ1Y3RQYXJlbnQiLCBhbm5vdGF0aW9uLnBhcmVudFRyZWVJZCk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dChhbm5vdGF0aW9uUmVmLCB7CiAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHJlZjogYW5ub3RhdGlvblJlZgogICAgfTsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgcGFyYW1zKSB7CiAgICBjb25zdCBhcCA9IGF3YWl0IHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSB0aGlzLmNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgYXAgPyB7CiAgICAgIGFwCiAgICB9IDoge30pOwogICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IG5ldyB0aGlzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih7CiAgICAgIGRpY3Q6IGFubm90YXRpb25EaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgZXZhbHVhdG9yT3B0aW9uczogcGFyYW1zLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgaWYgKGFubm90YXRpb24ucmVmKSB7CiAgICAgIG5ld0Fubm90YXRpb24ucmVmID0gbmV3QW5ub3RhdGlvbi5yZWZUb1JlcGxhY2UgPSBhbm5vdGF0aW9uLnJlZjsKICAgIH0KICAgIHJldHVybiBuZXdBbm5vdGF0aW9uOwogIH0KfQpjbGFzcyBXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICB0aGlzLl9uZWVkQXBwZWFyYW5jZXMgPSBwYXJhbXMubmVlZEFwcGVhcmFuY2VzOwogICAgZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLldJREdFVDsKICAgIGlmIChkYXRhLmZpZWxkTmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGRhdGEuZmllbGROYW1lID0gdGhpcy5fY29uc3RydWN0RmllbGROYW1lKGRpY3QpOwogICAgfQogICAgaWYgKGRhdGEuYWN0aW9ucyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGRhdGEuYWN0aW9ucyA9IGNvbGxlY3RBY3Rpb25zKHhyZWYsIGRpY3QsIEFubm90YXRpb25BY3Rpb25FdmVudFR5cGUpOwogICAgfQogICAgbGV0IGZpZWxkVmFsdWUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiViIsCiAgICAgIGdldEFycmF5OiB0cnVlCiAgICB9KTsKICAgIGRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShmaWVsZFZhbHVlKTsKICAgIGNvbnN0IGRlZmF1bHRGaWVsZFZhbHVlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRWIiwKICAgICAgZ2V0QXJyYXk6IHRydWUKICAgIH0pOwogICAgZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShkZWZhdWx0RmllbGRWYWx1ZSk7CiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25HbG9iYWxzLnhmYURhdGFzZXRzKSB7CiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl90aXRsZS5zdHI7CiAgICAgIGlmIChwYXRoKSB7CiAgICAgICAgdGhpcy5faGFzVmFsdWVGcm9tWEZBID0gdHJ1ZTsKICAgICAgICBkYXRhLmZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlID0gYW5ub3RhdGlvbkdsb2JhbHMueGZhRGF0YXNldHMuZ2V0VmFsdWUocGF0aCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmaWVsZFZhbHVlID09PSB1bmRlZmluZWQgJiYgZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSAhPT0gbnVsbCkgewogICAgICBkYXRhLmZpZWxkVmFsdWUgPSBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlOwogICAgfQogICAgZGF0YS5hbHRlcm5hdGl2ZVRleHQgPSBzdHJpbmdUb1BERlN0cmluZyhkaWN0LmdldCgiVFUiKSB8fCAiIik7CiAgICB0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKHBhcmFtcyk7CiAgICBkYXRhLmhhc0FwcGVhcmFuY2UgfHw9IHRoaXMuX25lZWRBcHBlYXJhbmNlcyAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IG51bGw7CiAgICBjb25zdCBmaWVsZFR5cGUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiRlQiCiAgICB9KTsKICAgIGRhdGEuZmllbGRUeXBlID0gZmllbGRUeXBlIGluc3RhbmNlb2YgTmFtZSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IGxvY2FsUmVzb3VyY2VzID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRSIgogICAgfSk7CiAgICBjb25zdCBhY3JvRm9ybVJlc291cmNlcyA9IGFubm90YXRpb25HbG9iYWxzLmFjcm9Gb3JtLmdldCgiRFIiKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VSZXNvdXJjZXMgPSB0aGlzLmFwcGVhcmFuY2U/LmRpY3QuZ2V0KCJSZXNvdXJjZXMiKTsKICAgIHRoaXMuX2ZpZWxkUmVzb3VyY2VzID0gewogICAgICBsb2NhbFJlc291cmNlcywKICAgICAgYWNyb0Zvcm1SZXNvdXJjZXMsCiAgICAgIGFwcGVhcmFuY2VSZXNvdXJjZXMsCiAgICAgIG1lcmdlZFJlc291cmNlczogRGljdC5tZXJnZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBkaWN0QXJyYXk6IFtsb2NhbFJlc291cmNlcywgYXBwZWFyYW5jZVJlc291cmNlcywgYWNyb0Zvcm1SZXNvdXJjZXNdLAogICAgICAgIG1lcmdlU3ViRGljdHM6IHRydWUKICAgICAgfSkKICAgIH07CiAgICBkYXRhLmZpZWxkRmxhZ3MgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiRmYiCiAgICB9KTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRhLmZpZWxkRmxhZ3MpIHx8IGRhdGEuZmllbGRGbGFncyA8IDApIHsKICAgICAgZGF0YS5maWVsZEZsYWdzID0gMDsKICAgIH0KICAgIGRhdGEucGFzc3dvcmQgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKTsKICAgIGRhdGEucmVhZE9ubHkgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFQURPTkxZKTsKICAgIGRhdGEucmVxdWlyZWQgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFUVVJUkVEKTsKICAgIGRhdGEuaGlkZGVuID0gdGhpcy5faGFzRmxhZyhkYXRhLmFubm90YXRpb25GbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKSB8fCB0aGlzLl9oYXNGbGFnKGRhdGEuYW5ub3RhdGlvbkZsYWdzLCBBbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOwogIH0KICBfZGVjb2RlRm9ybVZhbHVlKGZvcm1WYWx1ZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlKSkgewogICAgICByZXR1cm4gZm9ybVZhbHVlLmZpbHRlcihpdGVtID0+IHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikubWFwKGl0ZW0gPT4gc3RyaW5nVG9QREZTdHJpbmcoaXRlbSkpOwogICAgfSBlbHNlIGlmIChmb3JtVmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHJldHVybiBzdHJpbmdUb1BERlN0cmluZyhmb3JtVmFsdWUubmFtZSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiBzdHJpbmdUb1BERlN0cmluZyhmb3JtVmFsdWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGhhc0ZpZWxkRmxhZyhmbGFnKSB7CiAgICByZXR1cm4gISEodGhpcy5kYXRhLmZpZWxkRmxhZ3MgJiBmbGFnKTsKICB9CiAgX2lzVmlld2FibGUoZmxhZ3MpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBtdXN0QmVWaWV3ZWQoYW5ub3RhdGlvblN0b3JhZ2UsIHJlbmRlckZvcm1zKSB7CiAgICBpZiAocmVuZGVyRm9ybXMpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld2FibGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgJiYgIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgQW5ub3RhdGlvbkZsYWcuTk9WSUVXKTsKICB9CiAgZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGxldCByb3RhdGlvbiA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ucm90YXRpb247CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICByZXR1cm4gcm90YXRpb24gPT09IDAgPyBJREVOVElUWV9NQVRSSVggOiBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpOwogIH0KICBnZXRCb3JkZXJBbmRCYWNrZ3JvdW5kQXBwZWFyYW5jZXMoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGxldCByb3RhdGlvbiA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ucm90YXRpb247CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICBpZiAoIXRoaXMuYmFja2dyb3VuZENvbG9yICYmICF0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGNvbnN0IHJlY3QgPSByb3RhdGlvbiA9PT0gMCB8fCByb3RhdGlvbiA9PT0gMTgwID8gYDAgMCAke3RoaXMud2lkdGh9ICR7dGhpcy5oZWlnaHR9IHJlYCA6IGAwIDAgJHt0aGlzLmhlaWdodH0gJHt0aGlzLndpZHRofSByZWA7CiAgICBsZXQgc3RyID0gIiI7CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgc3RyID0gYCR7Z2V0UGRmQ29sb3IodGhpcy5iYWNrZ3JvdW5kQ29sb3IsIHRydWUpfSAke3JlY3R9IGYgYDsKICAgIH0KICAgIGlmICh0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCB8fCAxOwogICAgICBzdHIgKz0gYCR7Ym9yZGVyV2lkdGh9IHcgJHtnZXRQZGZDb2xvcih0aGlzLmJvcmRlckNvbG9yLCBmYWxzZSl9ICR7cmVjdH0gUyBgOwogICAgfQogICAgcmV0dXJuIHN0cjsKICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVMgJiYgISh0aGlzIGluc3RhbmNlb2YgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbikgJiYgIXRoaXMuZGF0YS5ub0hUTUwgJiYgIXRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3Q6IG5ldyBPcGVyYXRvckxpc3QoKSwKICAgICAgICBzZXBhcmF0ZUZvcm06IHRydWUsCiAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBpZiAoIXRoaXMuX2hhc1RleHQpIHsKICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgfQogICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIGlmICh0aGlzLmFwcGVhcmFuY2UgJiYgY29udGVudCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBjb25zdCBvcExpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICBpZiAoIXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlIHx8IGNvbnRlbnQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3QsCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGlzVXNpbmdPd25DYW52YXMgPSAhISh0aGlzLmRhdGEuaGFzT3duQ2FudmFzICYmIGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7CiAgICBjb25zdCBtYXRyaXggPSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCBiYm94ID0gWzAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeCh0aGlzLmRhdGEucmVjdCwgYmJveCwgbWF0cml4KTsKICAgIGxldCBvcHRpb25hbENvbnRlbnQ7CiAgICBpZiAodGhpcy5vYykgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCBldmFsdWF0b3IucGFyc2VNYXJrZWRDb250ZW50UHJvcHModGhpcy5vYywgbnVsbCk7CiAgICB9CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbkFubm90YXRpb24sIFt0aGlzLmRhdGEuaWQsIHRoaXMuZGF0YS5yZWN0LCB0cmFuc2Zvcm0sIHRoaXMuZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpLCBpc1VzaW5nT3duQ2FudmFzXSk7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGNvbnRlbnQpOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzOiB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdDogb3BMaXN0CiAgICB9KTsKICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kQW5ub3RhdGlvbiwgW10pOwogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb3BMaXN0LAogICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICBzZXBhcmF0ZUNhbnZhczogaXNVc2luZ093bkNhbnZhcwogICAgfTsKICB9CiAgX2dldE1LRGljdChyb3RhdGlvbikgewogICAgY29uc3QgbWsgPSBuZXcgRGljdChudWxsKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBtay5zZXQoIlIiLCByb3RhdGlvbik7CiAgICB9CiAgICBpZiAodGhpcy5ib3JkZXJDb2xvcikgewogICAgICBtay5zZXQoIkJDIiwgZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmJvcmRlckNvbG9yKSk7CiAgICB9CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgbWsuc2V0KCJCRyIsIGdldFBkZkNvbG9yQXJyYXkodGhpcy5iYWNrZ3JvdW5kQ29sb3IpKTsKICAgIH0KICAgIHJldHVybiBtay5zaXplID4gMCA/IG1rIDogbnVsbDsKICB9CiAgYW1lbmRTYXZlZERpY3QoYW5ub3RhdGlvblN0b3JhZ2UsIGRpY3QpIHt9CiAgc2V0VmFsdWUoZGljdCwgdmFsdWUsIHhyZWYsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHsKICAgICAgZGljdDogcGFyZW50RGljdCwKICAgICAgcmVmOiBwYXJlbnRSZWYKICAgIH0gPSBnZXRQYXJlbnRUb1VwZGF0ZShkaWN0LCB0aGlzLnJlZiwgeHJlZik7CiAgICBpZiAoIXBhcmVudERpY3QpIHsKICAgICAgZGljdC5zZXQoIlYiLCB2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKCFjaGFuZ2VzLmhhcyhwYXJlbnRSZWYpKSB7CiAgICAgIGNvbnN0IG5ld1BhcmVudERpY3QgPSBwYXJlbnREaWN0LmNsb25lKCk7CiAgICAgIG5ld1BhcmVudERpY3Quc2V0KCJWIiwgdmFsdWUpOwogICAgICBjaGFuZ2VzLnB1dChwYXJlbnRSZWYsIHsKICAgICAgICBkYXRhOiBuZXdQYXJlbnREaWN0CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3UGFyZW50RGljdDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2VFbnRyeT8udmFsdWUsCiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5Py5yb3RhdGlvbjsKICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiByb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFsdWUgfHw9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5maWVsZFZhbHVlKSAmJiBpc0FycmF5RXF1YWwodmFsdWUsIHRoaXMuZGF0YS5maWVsZFZhbHVlKSAmJiBmbGFncyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGxldCBhcHBlYXJhbmNlID0gbnVsbDsKICAgIGlmICghdGhpcy5fbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIGFwcGVhcmFuY2UgPSBhd2FpdCB0aGlzLl9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgUmVuZGVyaW5nSW50ZW50RmxhZy5TQVZFLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICAgIGlmIChhcHBlYXJhbmNlID09PSBudWxsICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSB7fQogICAgbGV0IG5lZWRBcHBlYXJhbmNlcyA9IGZhbHNlOwogICAgaWYgKGFwcGVhcmFuY2U/Lm5lZWRBcHBlYXJhbmNlcykgewogICAgICBuZWVkQXBwZWFyYW5jZXMgPSB0cnVlOwogICAgICBhcHBlYXJhbmNlID0gbnVsbDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgeHJlZgogICAgfSA9IGV2YWx1YXRvcjsKICAgIGNvbnN0IG9yaWdpbmFsRGljdCA9IHhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShvcmlnaW5hbERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmlnaW5hbERpY3QuZ2V0S2V5cygpKSB7CiAgICAgIGlmIChrZXkgIT09ICJBUCIpIHsKICAgICAgICBkaWN0LnNldChrZXksIG9yaWdpbmFsRGljdC5nZXRSYXcoa2V5KSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmbGFncyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGRpY3Quc2V0KCJGIiwgZmxhZ3MpOwogICAgICBpZiAoYXBwZWFyYW5jZSA9PT0gbnVsbCAmJiAhbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgICAgY29uc3QgYXAgPSBvcmlnaW5hbERpY3QuZ2V0UmF3KCJBUCIpOwogICAgICAgIGlmIChhcCkgewogICAgICAgICAgZGljdC5zZXQoIkFQIiwgYXApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgeGZhID0gewogICAgICBwYXRoOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICB2YWx1ZQogICAgfTsKICAgIGNvbnN0IG5ld1BhcmVudERpY3QgPSB0aGlzLnNldFZhbHVlKGRpY3QsIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHN0cmluZ1RvQXNjaWlPclVURjE2QkUpIDogc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh2YWx1ZSksIHhyZWYsIGNoYW5nZXMpOwogICAgdGhpcy5hbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgbmV3UGFyZW50RGljdCB8fCBkaWN0KTsKICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0LAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlcwogICAgfSk7CiAgICBpZiAoYXBwZWFyYW5jZSAhPT0gbnVsbCkgewogICAgICBjb25zdCBuZXdSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBjb25zdCBBUCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBkaWN0LnNldCgiQVAiLCBBUCk7CiAgICAgIEFQLnNldCgiTiIsIG5ld1JlZik7CiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldFNhdmVGaWVsZFJlc291cmNlcyh4cmVmKTsKICAgICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gYXBwZWFyYW5jZVN0cmVhbS5kaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiQkJveCIsIFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pOwogICAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IHRoaXMuZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgICBpZiAocm90YXRpb25NYXRyaXggIT09IElERU5USVRZX01BVFJJWCkgewogICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiTWF0cml4Iiwgcm90YXRpb25NYXRyaXgpOwogICAgICB9CiAgICAgIGNoYW5nZXMucHV0KG5ld1JlZiwgewogICAgICAgIGRhdGE6IGFwcGVhcmFuY2VTdHJlYW0sCiAgICAgICAgeGZhOiBudWxsLAogICAgICAgIG5lZWRBcHBlYXJhbmNlczogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBkaWN0LnNldCgiTSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogIH0KICBhc3luYyBfZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk7CiAgICBsZXQgdmFsdWUsIHJvdGF0aW9uOwogICAgaWYgKHN0b3JhZ2VFbnRyeSkgewogICAgICB2YWx1ZSA9IHN0b3JhZ2VFbnRyeS5mb3JtYXR0ZWRWYWx1ZSB8fCBzdG9yYWdlRW50cnkudmFsdWU7CiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5LnJvdGF0aW9uOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIGlmICghdGhpcy5faGFzVmFsdWVGcm9tWEZBIHx8IHRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9USBFTUNgOwogICAgICB9CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7CiAgICAgIHZhbHVlID0gdmFsdWVbMF07CiAgICB9CiAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiwgIkV4cGVjdGVkIGB2YWx1ZWAgdG8gYmUgYSBzdHJpbmcuIik7CiAgICB2YWx1ZSA9IHZhbHVlLnRyaW1FbmQoKTsKICAgIGlmICh0aGlzLmRhdGEuY29tYm8pIHsKICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5kYXRhLm9wdGlvbnMuZmluZCgoewogICAgICAgIGV4cG9ydFZhbHVlCiAgICAgIH0pID0+IHZhbHVlID09PSBleHBvcnRWYWx1ZSk7CiAgICAgIHZhbHVlID0gb3B0aW9uPy5kaXNwbGF5VmFsdWUgfHwgdmFsdWU7CiAgICB9CiAgICBpZiAodmFsdWUgPT09ICIiKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfVEgRU1DYDsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGxldCBsaW5lQ291bnQgPSAtMTsKICAgIGxldCBsaW5lczsKICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7CiAgICAgIGxpbmVzID0gdmFsdWUuc3BsaXQoL1xyXG4/fFxuLykubWFwKGxpbmUgPT4gbGluZS5ub3JtYWxpemUoIk5GQyIpKTsKICAgICAgbGluZUNvdW50ID0gbGluZXMubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgbGluZXMgPSBbdmFsdWUucmVwbGFjZSgvXHJcbj98XG4vLCAiIikubm9ybWFsaXplKCJORkMiKV07CiAgICB9CiAgICBjb25zdCBkZWZhdWx0UGFkZGluZyA9IDE7CiAgICBjb25zdCBkZWZhdWx0SFBhZGRpbmcgPSAyOwogICAgbGV0IHsKICAgICAgd2lkdGg6IHRvdGFsV2lkdGgsCiAgICAgIGhlaWdodDogdG90YWxIZWlnaHQKICAgIH0gPSB0aGlzOwogICAgaWYgKHJvdGF0aW9uID09PSA5MCB8fCByb3RhdGlvbiA9PT0gMjcwKSB7CiAgICAgIFt0b3RhbFdpZHRoLCB0b3RhbEhlaWdodF0gPSBbdG90YWxIZWlnaHQsIHRvdGFsV2lkdGhdOwogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBsZXQgZm9udCA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSwgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTsKICAgIGxldCBkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHQ7CiAgICBjb25zdCBlbmNvZGVkTGluZXMgPSBbXTsKICAgIGxldCBlbmNvZGluZ0Vycm9yID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpOwogICAgICBpZiAoZW5jb2RlZFN0cmluZy5sZW5ndGggPiAxKSB7CiAgICAgICAgZW5jb2RpbmdFcnJvciA9IHRydWU7CiAgICAgIH0KICAgICAgZW5jb2RlZExpbmVzLnB1c2goZW5jb2RlZFN0cmluZy5qb2luKCIiKSk7CiAgICB9CiAgICBpZiAoZW5jb2RpbmdFcnJvciAmJiBpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZWVkQXBwZWFyYW5jZXM6IHRydWUKICAgICAgfTsKICAgIH0KICAgIGlmIChlbmNvZGluZ0Vycm9yICYmIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmRhdGEuY29tYiA/ICJtb25vc3BhY2UiIDogInNhbnMtc2VyaWYiOwogICAgICBjb25zdCBmYWtlVW5pY29kZUZvbnQgPSBuZXcgRmFrZVVuaWNvZGVGb250KGV2YWx1YXRvci54cmVmLCBmb250RmFtaWx5KTsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gZmFrZVVuaWNvZGVGb250LmNyZWF0ZUZvbnRSZXNvdXJjZXMobGluZXMuam9pbigiIikpOwogICAgICBjb25zdCBuZXdGb250ID0gcmVzb3VyY2VzLmdldFJhdygiRm9udCIpOwogICAgICBpZiAodGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLmhhcygiRm9udCIpKSB7CiAgICAgICAgY29uc3Qgb2xkRm9udCA9IHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBuZXdGb250LmdldEtleXMoKSkgewogICAgICAgICAgb2xkRm9udC5zZXQoa2V5LCBuZXdGb250LmdldFJhdyhrZXkpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLnNldCgiRm9udCIsIG5ld0ZvbnQpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnROYW1lID0gZmFrZVVuaWNvZGVGb250LmZvbnROYW1lLm5hbWU7CiAgICAgIGZvbnQgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgICBmb250TmFtZSwKICAgICAgICBmb250U2l6ZTogMAogICAgICB9LCByZXNvdXJjZXMpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbmNvZGVkTGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGVuY29kZWRMaW5lc1tpXSA9IHN0cmluZ1RvVVRGMTZTdHJpbmcobGluZXNbaV0pOwogICAgICB9CiAgICAgIGNvbnN0IHNhdmVkRGVmYXVsdEFwcGVhcmFuY2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplID0gMDsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250TmFtZSA9IGZvbnROYW1lOwogICAgICBbZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnRTaXplLCBsaW5lSGVpZ2h0XSA9IHRoaXMuX2NvbXB1dGVGb250U2l6ZSh0b3RhbEhlaWdodCAtIDIgKiBkZWZhdWx0UGFkZGluZywgdG90YWxXaWR0aCAtIDIgKiBkZWZhdWx0SFBhZGRpbmcsIHZhbHVlLCBmb250LCBsaW5lQ291bnQpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gc2F2ZWREZWZhdWx0QXBwZWFyYW5jZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICB3YXJuKCJfZ2V0QXBwZWFyYW5jZTogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGFubm90YXRpb24gbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5LiIpOwogICAgICB9CiAgICAgIFtkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHRdID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKHRvdGFsSGVpZ2h0IC0gMiAqIGRlZmF1bHRQYWRkaW5nLCB0b3RhbFdpZHRoIC0gMiAqIGRlZmF1bHRIUGFkZGluZywgdmFsdWUsIGZvbnQsIGxpbmVDb3VudCk7CiAgICB9CiAgICBsZXQgZGVzY2VudCA9IGZvbnQuZGVzY2VudDsKICAgIGlmIChpc05hTihkZXNjZW50KSkgewogICAgICBkZXNjZW50ID0gQkFTRUxJTkVfRkFDVE9SICogbGluZUhlaWdodDsKICAgIH0gZWxzZSB7CiAgICAgIGRlc2NlbnQgPSBNYXRoLm1heChCQVNFTElORV9GQUNUT1IgKiBsaW5lSGVpZ2h0LCBNYXRoLmFicyhkZXNjZW50KSAqIGZvbnRTaXplKTsKICAgIH0KICAgIGNvbnN0IGRlZmF1bHRWUGFkZGluZyA9IE1hdGgubWluKE1hdGguZmxvb3IoKHRvdGFsSGVpZ2h0IC0gZm9udFNpemUpIC8gMiksIGRlZmF1bHRQYWRkaW5nKTsKICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50OwogICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGVuY29kZWRMaW5lcywgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0LCBhbGlnbm1lbnQsIGRlZmF1bHRIUGFkZGluZywgZGVmYXVsdFZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBmb250LCBlbmNvZGVkTGluZXNbMF0sIGZvbnRTaXplLCB0b3RhbFdpZHRoLCB0b3RhbEhlaWdodCwgZGVmYXVsdEhQYWRkaW5nLCBkZWZhdWx0VlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBkZWZhdWx0VlBhZGRpbmcgKyBkZXNjZW50OwogICAgaWYgKGFsaWdubWVudCA9PT0gMCB8fCBhbGlnbm1lbnQgPiAyKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGRlZmF1bHRIUGFkZGluZyl9ICR7bnVtYmVyVG9TdHJpbmcoYm90dG9tUGFkZGluZyl9IFRtICgke2VzY2FwZVN0cmluZyhlbmNvZGVkTGluZXNbMF0pfSkgVGpgICsgIiBFVCBRIEVNQyI7CiAgICB9CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBjb25zdCByZW5kZXJlZFRleHQgPSB0aGlzLl9yZW5kZXJUZXh0KGVuY29kZWRMaW5lc1swXSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgcHJldkluZm8sIGRlZmF1bHRIUGFkZGluZywgYm90dG9tUGFkZGluZyk7CiAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31CVCBgICsgZGVmYXVsdEFwcGVhcmFuY2UgKyBgIDEgMCAwIDEgMCAwIFRtICR7cmVuZGVyZWRUZXh0fWAgKyAiIEVUIFEgRU1DIjsKICB9CiAgc3RhdGljIGFzeW5jIF9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIGFwcGVhcmFuY2VEYXRhLCByZXNvdXJjZXMpIHsKICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsKICAgICAgZm9udDogbnVsbCwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7CiAgICAgIGZvbnROYW1lLAogICAgICBmb250U2l6ZQogICAgfSA9IGFwcGVhcmFuY2VEYXRhOwogICAgYXdhaXQgZXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbZm9udE5hbWUgJiYgTmFtZS5nZXQoZm9udE5hbWUpLCBmb250U2l6ZV0sIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBudWxsKTsKICAgIHJldHVybiBpbml0aWFsU3RhdGUuZm9udDsKICB9CiAgX2dldFRleHRXaWR0aCh0ZXh0LCBmb250KSB7CiAgICByZXR1cm4gTWF0aC5zdW1QcmVjaXNlKGZvbnQuY2hhcnNUb0dseXBocyh0ZXh0KS5tYXAoZyA9PiBnLndpZHRoKSkgLyAxMDAwOwogIH0KICBfY29tcHV0ZUZvbnRTaXplKGhlaWdodCwgd2lkdGgsIHRleHQsIGZvbnQsIGxpbmVDb3VudCkgewogICAgbGV0IHsKICAgICAgZm9udFNpemUKICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgbGV0IGxpbmVIZWlnaHQgPSAoZm9udFNpemUgfHwgMTIpICogTElORV9GQUNUT1IsCiAgICAgIG51bWJlck9mTGluZXMgPSBNYXRoLnJvdW5kKGhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgaWYgKCFmb250U2l6ZSkgewogICAgICBjb25zdCByb3VuZFdpdGhUd29EaWdpdHMgPSB4ID0+IE1hdGguZmxvb3IoeCAqIDEwMCkgLyAxMDA7CiAgICAgIGlmIChsaW5lQ291bnQgPT09IC0xKSB7CiAgICAgICAgY29uc3QgdGV4dFdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpOwogICAgICAgIGZvbnRTaXplID0gcm91bmRXaXRoVHdvRGlnaXRzKE1hdGgubWluKGhlaWdodCAvIExJTkVfRkFDVE9SLCB3aWR0aCAvIHRleHRXaWR0aCkpOwogICAgICAgIG51bWJlck9mTGluZXMgPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXHJcbj98XG4vKTsKICAgICAgICBjb25zdCBjYWNoZWRMaW5lcyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgY29uc3QgZW5jb2RlZCA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpLmpvaW4oIiIpOwogICAgICAgICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWQpOwogICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZm9udC5nZXRDaGFyUG9zaXRpb25zKGVuY29kZWQpOwogICAgICAgICAgY2FjaGVkTGluZXMucHVzaCh7CiAgICAgICAgICAgIGxpbmU6IGVuY29kZWQsCiAgICAgICAgICAgIGdseXBocywKICAgICAgICAgICAgcG9zaXRpb25zCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNUb29CaWcgPSBmc2l6ZSA9PiB7CiAgICAgICAgICBsZXQgdG90YWxIZWlnaHQgPSAwOwogICAgICAgICAgZm9yIChjb25zdCBjYWNoZSBvZiBjYWNoZWRMaW5lcykgewogICAgICAgICAgICBjb25zdCBjaHVua3MgPSB0aGlzLl9zcGxpdExpbmUobnVsbCwgZm9udCwgZnNpemUsIHdpZHRoLCBjYWNoZSk7CiAgICAgICAgICAgIHRvdGFsSGVpZ2h0ICs9IGNodW5rcy5sZW5ndGggKiBmc2l6ZTsKICAgICAgICAgICAgaWYgKHRvdGFsSGVpZ2h0ID4gaGVpZ2h0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIG51bWJlck9mTGluZXMgPSBNYXRoLm1heChudW1iZXJPZkxpbmVzLCBsaW5lQ291bnQpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lczsKICAgICAgICAgIGZvbnRTaXplID0gcm91bmRXaXRoVHdvRGlnaXRzKGxpbmVIZWlnaHQgLyBMSU5FX0ZBQ1RPUik7CiAgICAgICAgICBpZiAoaXNUb29CaWcoZm9udFNpemUpKSB7CiAgICAgICAgICAgIG51bWJlck9mTGluZXMrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGZvbnROYW1lLAogICAgICAgIGZvbnRDb2xvcgogICAgICB9ID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YTsKICAgICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgZm9udFNpemUsCiAgICAgICAgZm9udE5hbWUsCiAgICAgICAgZm9udENvbG9yCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIFt0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGhlaWdodCAvIG51bWJlck9mTGluZXNdOwogIH0KICBfcmVuZGVyVGV4dCh0ZXh0LCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgYWxpZ25tZW50LCBwcmV2SW5mbywgaFBhZGRpbmcsIHZQYWRkaW5nKSB7CiAgICBsZXQgc2hpZnQ7CiAgICBpZiAoYWxpZ25tZW50ID09PSAxKSB7CiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpICogZm9udFNpemU7CiAgICAgIHNoaWZ0ID0gKHRvdGFsV2lkdGggLSB3aWR0aCkgLyAyOwogICAgfSBlbHNlIGlmIChhbGlnbm1lbnQgPT09IDIpIHsKICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9nZXRUZXh0V2lkdGgodGV4dCwgZm9udCkgKiBmb250U2l6ZTsKICAgICAgc2hpZnQgPSB0b3RhbFdpZHRoIC0gd2lkdGggLSBoUGFkZGluZzsKICAgIH0gZWxzZSB7CiAgICAgIHNoaWZ0ID0gaFBhZGRpbmc7CiAgICB9CiAgICBjb25zdCBzaGlmdFN0ciA9IG51bWJlclRvU3RyaW5nKHNoaWZ0IC0gcHJldkluZm8uc2hpZnQpOwogICAgcHJldkluZm8uc2hpZnQgPSBzaGlmdDsKICAgIHZQYWRkaW5nID0gbnVtYmVyVG9TdHJpbmcodlBhZGRpbmcpOwogICAgcmV0dXJuIGAke3NoaWZ0U3RyfSAke3ZQYWRkaW5nfSBUZCAoJHtlc2NhcGVTdHJpbmcodGV4dCl9KSBUamA7CiAgfQogIF9nZXRTYXZlRmllbGRSZXNvdXJjZXMoeHJlZikgewogICAgY29uc3QgewogICAgICBsb2NhbFJlc291cmNlcywKICAgICAgYXBwZWFyYW5jZVJlc291cmNlcywKICAgICAgYWNyb0Zvcm1SZXNvdXJjZXMKICAgIH0gPSB0aGlzLl9maWVsZFJlc291cmNlczsKICAgIGNvbnN0IGZvbnROYW1lID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YT8uZm9udE5hbWU7CiAgICBpZiAoIWZvbnROYW1lKSB7CiAgICAgIHJldHVybiBsb2NhbFJlc291cmNlcyB8fCBEaWN0LmVtcHR5OwogICAgfQogICAgZm9yIChjb25zdCByZXNvdXJjZXMgb2YgW2xvY2FsUmVzb3VyY2VzLCBhcHBlYXJhbmNlUmVzb3VyY2VzXSkgewogICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGNvbnN0IGxvY2FsRm9udCA9IHJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgICBpZiAobG9jYWxGb250IGluc3RhbmNlb2YgRGljdCAmJiBsb2NhbEZvbnQuaGFzKGZvbnROYW1lKSkgewogICAgICAgICAgcmV0dXJuIHJlc291cmNlczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChhY3JvRm9ybVJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgYWNyb0Zvcm1Gb250ID0gYWNyb0Zvcm1SZXNvdXJjZXMuZ2V0KCJGb250Iik7CiAgICAgIGlmIChhY3JvRm9ybUZvbnQgaW5zdGFuY2VvZiBEaWN0ICYmIGFjcm9Gb3JtRm9udC5oYXMoZm9udE5hbWUpKSB7CiAgICAgICAgY29uc3Qgc3ViRm9udERpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgICBzdWJGb250RGljdC5zZXQoZm9udE5hbWUsIGFjcm9Gb3JtRm9udC5nZXRSYXcoZm9udE5hbWUpKTsKICAgICAgICBjb25zdCBzdWJSZXNvdXJjZXNEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgICAgc3ViUmVzb3VyY2VzRGljdC5zZXQoIkZvbnQiLCBzdWJGb250RGljdCk7CiAgICAgICAgcmV0dXJuIERpY3QubWVyZ2UoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGRpY3RBcnJheTogW3N1YlJlc291cmNlc0RpY3QsIGxvY2FsUmVzb3VyY2VzXSwKICAgICAgICAgIG1lcmdlU3ViRGljdHM6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxvY2FsUmVzb3VyY2VzIHx8IERpY3QuZW1wdHk7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgaWYgKGRpY3QuaGFzKCJQTUQiKSkgewogICAgICB0aGlzLmZsYWdzIHw9IEFubm90YXRpb25GbGFnLkhJRERFTjsKICAgICAgdGhpcy5kYXRhLmhpZGRlbiA9IHRydWU7CiAgICAgIHdhcm4oIkJhcmNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLnJlYWRPbmx5ICYmICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5maWVsZFZhbHVlICE9PSAic3RyaW5nIikgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9ICIiOwogICAgfQogICAgbGV0IGFsaWdubWVudCA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJRIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxpZ25tZW50KSB8fCBhbGlnbm1lbnQgPCAwIHx8IGFsaWdubWVudCA+IDIpIHsKICAgICAgYWxpZ25tZW50ID0gbnVsbDsKICAgIH0KICAgIHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ID0gYWxpZ25tZW50OwogICAgbGV0IG1heGltdW1MZW5ndGggPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiTWF4TGVuIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHsKICAgICAgbWF4aW11bUxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmRhdGEubWF4TGVuID0gbWF4aW11bUxlbmd0aDsKICAgIHRoaXMuZGF0YS5tdWx0aUxpbmUgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7CiAgICB0aGlzLmRhdGEuY29tYiA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuQ09NQikgJiYgIXRoaXMuZGF0YS5tdWx0aUxpbmUgJiYgIXRoaXMuZGF0YS5wYXNzd29yZCAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJiB0aGlzLmRhdGEubWF4TGVuICE9PSAwOwogICAgdGhpcy5kYXRhLmRvTm90U2Nyb2xsID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5ET05PVFNDUk9MTCk7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiAhIXRoaXMuYXBwZWFyYW5jZSAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzOwogIH0KICBfZ2V0Q29tYkFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnQsIHRleHQsIGZvbnRTaXplLCB3aWR0aCwgaGVpZ2h0LCBoUGFkZGluZywgdlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBjb21iV2lkdGggPSB3aWR0aCAvIHRoaXMuZGF0YS5tYXhMZW47CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBjb25zdCBidWYgPSBbXTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IGZvbnQuZ2V0Q2hhclBvc2l0aW9ucyh0ZXh0KTsKICAgIGZvciAoY29uc3QgW3N0YXJ0LCBlbmRdIG9mIHBvc2l0aW9ucykgewogICAgICBidWYucHVzaChgKCR7ZXNjYXBlU3RyaW5nKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKX0pIFRqYCk7CiAgICB9CiAgICBjb25zdCByZW5kZXJlZENvbWIgPSBidWYuam9pbihgICR7bnVtYmVyVG9TdHJpbmcoY29tYldpZHRoKX0gMCBUZCBgKTsKICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGhQYWRkaW5nKX0gJHtudW1iZXJUb1N0cmluZyh2UGFkZGluZyArIGRlc2NlbnQpfSBUbSAke3JlbmRlcmVkQ29tYn1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBsaW5lcywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBoZWlnaHQsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3QgYnVmID0gW107CiAgICBjb25zdCB0b3RhbFdpZHRoID0gd2lkdGggLSAyICogaFBhZGRpbmc7CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgY29uc3QgY2h1bmtzID0gdGhpcy5fc3BsaXRMaW5lKGxpbmUsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoKTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY2h1bmtzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tqXTsKICAgICAgICBjb25zdCB2U2hpZnQgPSBpID09PSAwICYmIGogPT09IDAgPyAtdlBhZGRpbmcgLSAobGluZUhlaWdodCAtIGRlc2NlbnQpIDogLWxpbmVIZWlnaHQ7CiAgICAgICAgYnVmLnB1c2godGhpcy5fcmVuZGVyVGV4dChjaHVuaywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBhbGlnbm1lbnQsIHByZXZJbmZvLCBoUGFkZGluZywgdlNoaWZ0KSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKTsKICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKCJcbiIpOwogICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9QlQgYCArIGRlZmF1bHRBcHBlYXJhbmNlICsgYCAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoZWlnaHQpfSBUbSAke3JlbmRlcmVkVGV4dH1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoLCBjYWNoZSA9IHt9KSB7CiAgICBsaW5lID0gY2FjaGUubGluZSB8fCBsaW5lOwogICAgY29uc3QgZ2x5cGhzID0gY2FjaGUuZ2x5cGhzIHx8IGZvbnQuY2hhcnNUb0dseXBocyhsaW5lKTsKICAgIGlmIChnbHlwaHMubGVuZ3RoIDw9IDEpIHsKICAgICAgcmV0dXJuIFtsaW5lXTsKICAgIH0KICAgIGNvbnN0IHBvc2l0aW9ucyA9IGNhY2hlLnBvc2l0aW9ucyB8fCBmb250LmdldENoYXJQb3NpdGlvbnMobGluZSk7CiAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgbGV0IGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zSW5TdHJpbmdFbmQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zID0gLTEsCiAgICAgIHN0YXJ0Q2h1bmsgPSAwLAogICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcG9zaXRpb25zW2ldOwogICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tpXTsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIGlmIChnbHlwaC51bmljb2RlID09PSAiICIpIHsKICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMTsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50V2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSBzdGFydDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kID0gZW5kOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgaWYgKGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgIT09IC0xKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsYXN0U3BhY2VQb3NJblN0cmluZ0VuZCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kOwogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvcyArIDE7CiAgICAgICAgICBsYXN0U3BhY2VQb3NJblN0cmluZ1N0YXJ0ID0gLTE7CiAgICAgICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFdpZHRoICs9IGdseXBoV2lkdGg7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydENodW5rIDwgbGluZS5sZW5ndGgpIHsKICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgbGluZS5sZW5ndGgpKTsKICAgIH0KICAgIHJldHVybiBjaHVua3M7CiAgfQogIGFzeW5jIGV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpIHsKICAgIGF3YWl0IHN1cGVyLmV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpOwogICAgY29uc3QgdGV4dCA9IHRoaXMuZGF0YS50ZXh0Q29udGVudDsKICAgIGlmICghdGV4dCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhbGxUZXh0ID0gdGV4dC5qb2luKCJcbiIpOwogICAgaWYgKGFsbFRleHQgPT09IHRoaXMuZGF0YS5maWVsZFZhbHVlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJlZ2V4ID0gYWxsVGV4dC5yZXBsYWNlQWxsKC8oWy4qKz9eJHt9KCl8W1xdXFxdKXwoXHMrKS9nLCAoX20sIHAxKSA9PiBwMSA/IGBcXCR7cDF9YCA6ICJcXHMrIik7CiAgICBpZiAobmV3IFJlZ0V4cChgXlxccyoke3JlZ2V4fVxccyokYCkudGVzdCh0aGlzLmRhdGEuZmllbGRWYWx1ZSkpIHsKICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUuc3BsaXQoIlxuIik7CiAgICB9CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgcmV0dXJuIHsKICAgICAgaWQ6IHRoaXMuZGF0YS5pZCwKICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSB8fCAiIiwKICAgICAgbXVsdGlsaW5lOiB0aGlzLmRhdGEubXVsdGlMaW5lLAogICAgICBwYXNzd29yZDogdGhpcy5kYXRhLnBhc3N3b3JkLAogICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW4sCiAgICAgIGNvbWI6IHRoaXMuZGF0YS5jb21iLAogICAgICBlZGl0YWJsZTogIXRoaXMuZGF0YS5yZWFkT25seSwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgIHBhZ2U6IHRoaXMuZGF0YS5wYWdlSW5kZXgsCiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLmRhdGEuYm9yZGVyQ29sb3IsCiAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIHR5cGU6ICJ0ZXh0IgogICAgfTsKICB9Cn0KY2xhc3MgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBudWxsOwogICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDsKICAgIGNvbnN0IGlzUmFkaW8gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSwKICAgICAgaXNQdXNoQnV0dG9uID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKTsKICAgIHRoaXMuZGF0YS5jaGVja0JveCA9ICFpc1JhZGlvICYmICFpc1B1c2hCdXR0b247CiAgICB0aGlzLmRhdGEucmFkaW9CdXR0b24gPSBpc1JhZGlvICYmICFpc1B1c2hCdXR0b247CiAgICB0aGlzLmRhdGEucHVzaEJ1dHRvbiA9IGlzUHVzaEJ1dHRvbjsKICAgIHRoaXMuZGF0YS5pc1Rvb2x0aXBPbmx5ID0gZmFsc2U7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgIHRoaXMuX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpOwogICAgfSBlbHNlIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHsKICAgICAgdGhpcy5fcHJvY2Vzc1JhZGlvQnV0dG9uKHBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CiAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0cnVlOwogICAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICAgIHRoaXMuX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcyk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJJbnZhbGlkIGZpZWxkIGZsYWdzIGZvciBidXR0b24gd2lkZ2V0IGFubm90YXRpb24iKTsKICAgIH0KICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGZhbHNlLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBsZXQgdmFsdWUgPSBudWxsOwogICAgbGV0IHJvdGF0aW9uID0gbnVsbDsKICAgIGlmIChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgICAgdmFsdWUgPSBzdG9yYWdlRW50cnkgPyBzdG9yYWdlRW50cnkudmFsdWUgOiBudWxsOwogICAgICByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeSA/IHN0b3JhZ2VFbnRyeS5yb3RhdGlvbiA6IG51bGw7CiAgICB9CiAgICBpZiAodmFsdWUgPT09IG51bGwgJiYgdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmNoZWNrQm94ID8gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZSA6IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlID0gdmFsdWUgPyB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlIDogdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlOwogICAgaWYgKGFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc2F2ZWRBcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlOwogICAgICBjb25zdCBzYXZlZE1hdHJpeCA9IGxvb2t1cE1hdHJpeChhcHBlYXJhbmNlLmRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBJREVOVElUWV9NQVRSSVgpOwogICAgICBpZiAocm90YXRpb24pIHsKICAgICAgICBhcHBlYXJhbmNlLmRpY3Quc2V0KCJNYXRyaXgiLCB0aGlzLmdldFJvdGF0aW9uTWF0cml4KGFubm90YXRpb25TdG9yYWdlKSk7CiAgICAgIH0KICAgICAgdGhpcy5hcHBlYXJhbmNlID0gYXBwZWFyYW5jZTsKICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IHNhdmVkQXBwZWFyYW5jZTsKICAgICAgYXBwZWFyYW5jZS5kaWN0LnNldCgiTWF0cml4Iiwgc2F2ZWRNYXRyaXgpOwogICAgICByZXR1cm4gb3BlcmF0b3JMaXN0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgfTsKICB9CiAgYXN5bmMgc2F2ZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlLCBjaGFuZ2VzKSB7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgIHRoaXMuX3NhdmVDaGVja2JveChldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlLCBjaGFuZ2VzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuZGF0YS5yYWRpb0J1dHRvbikgewogICAgICB0aGlzLl9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcyk7CiAgICB9CiAgfQogIGFzeW5jIF9zYXZlQ2hlY2tib3goZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGxldCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGljdCA9IGRpY3QuY2xvbmUoKTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgIH0KICAgIGNvbnN0IHhmYSA9IHsKICAgICAgcGF0aDogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgdmFsdWU6IHZhbHVlID8gdGhpcy5kYXRhLmV4cG9ydFZhbHVlIDogIiIKICAgIH07CiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiAiT2ZmIik7CiAgICB0aGlzLnNldFZhbHVlKGRpY3QsIG5hbWUsIGV2YWx1YXRvci54cmVmLCBjaGFuZ2VzKTsKICAgIGRpY3Quc2V0KCJBUyIsIG5hbWUpOwogICAgZGljdC5zZXQoIk0iLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgIGlmIChmbGFncyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGRpY3Quc2V0KCJGIiwgZmxhZ3MpOwogICAgfQogICAgY29uc3QgbWF5YmVNSyA9IHRoaXMuX2dldE1LRGljdChyb3RhdGlvbik7CiAgICBpZiAobWF5YmVNSykgewogICAgICBkaWN0LnNldCgiTUsiLCBtYXliZU1LKTsKICAgIH0KICAgIGNoYW5nZXMucHV0KHRoaXMucmVmLCB7CiAgICAgIGRhdGE6IGRpY3QsCiAgICAgIHhmYSwKICAgICAgbmVlZEFwcGVhcmFuY2VzOiBmYWxzZQogICAgfSk7CiAgfQogIGFzeW5jIF9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGxldCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGljdCA9IGRpY3QuY2xvbmUoKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGNvbnN0IHhmYSA9IHsKICAgICAgcGF0aDogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgdmFsdWU6IHZhbHVlID8gdGhpcy5kYXRhLmJ1dHRvblZhbHVlIDogIiIKICAgIH07CiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgOiAiT2ZmIik7CiAgICBpZiAodmFsdWUpIHsKICAgICAgdGhpcy5zZXRWYWx1ZShkaWN0LCBuYW1lLCBldmFsdWF0b3IueHJlZiwgY2hhbmdlcyk7CiAgICB9CiAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBpZiAoZmxhZ3MgIT09IHVuZGVmaW5lZCkgewogICAgICBkaWN0LnNldCgiRiIsIGZsYWdzKTsKICAgIH0KICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0LAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlczogZmFsc2UKICAgIH0pOwogIH0KICBfZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgdHlwZSkgewogICAgY29uc3QgewogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0CiAgICB9ID0gdGhpczsKICAgIGNvbnN0IGJib3ggPSBbMCwgMCwgd2lkdGgsIGhlaWdodF07CiAgICBjb25zdCBGT05UX1JBVElPID0gMC44OwogICAgY29uc3QgZm9udFNpemUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAqIEZPTlRfUkFUSU87CiAgICBsZXQgbWV0cmljcywgY2hhcjsKICAgIGlmICh0eXBlID09PSAiY2hlY2siKSB7CiAgICAgIG1ldHJpY3MgPSB7CiAgICAgICAgd2lkdGg6IDAuNzU1ICogZm9udFNpemUsCiAgICAgICAgaGVpZ2h0OiAwLjcwNSAqIGZvbnRTaXplCiAgICAgIH07CiAgICAgIGNoYXIgPSAiXHgzMyI7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJkaXNjIikgewogICAgICBtZXRyaWNzID0gewogICAgICAgIHdpZHRoOiAwLjc5MSAqIGZvbnRTaXplLAogICAgICAgIGhlaWdodDogMC43MDUgKiBmb250U2l6ZQogICAgICB9OwogICAgICBjaGFyID0gIlx4NkMiOwogICAgfSBlbHNlIHsKICAgICAgdW5yZWFjaGFibGUoYF9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UgLSB1bnN1cHBvcnRlZCB0eXBlOiAke3R5cGV9YCk7CiAgICB9CiAgICBjb25zdCB4U2hpZnQgPSBudW1iZXJUb1N0cmluZygod2lkdGggLSBtZXRyaWNzLndpZHRoKSAvIDIpOwogICAgY29uc3QgeVNoaWZ0ID0gbnVtYmVyVG9TdHJpbmcoKGhlaWdodCAtIG1ldHJpY3MuaGVpZ2h0KSAvIDIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGBxIEJUIC9QZGZKc1phRGIgJHtmb250U2l6ZX0gVGYgMCBnICR7eFNoaWZ0fSAke3lTaGlmdH0gVGQgKCR7Y2hhcn0pIFRqIEVUIFFgOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdChwYXJhbXMueHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgYmJveCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAxLCAwLCAwXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHBhcmFtcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgRGljdChwYXJhbXMueHJlZik7CiAgICBmb250LnNldCgiUGRmSnNaYURiIiwgdGhpcy5mYWxsYmFja0ZvbnREaWN0KTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZS5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5jaGVja2VkQXBwZWFyYW5jZSk7CiAgfQogIF9wcm9jZXNzQ2hlY2tCb3gocGFyYW1zKSB7CiAgICBjb25zdCBjdXN0b21BcHBlYXJhbmNlID0gcGFyYW1zLmRpY3QuZ2V0KCJBUCIpOwogICAgaWYgKCEoY3VzdG9tQXBwZWFyYW5jZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2UgPSBjdXN0b21BcHBlYXJhbmNlLmdldCgiTiIpOwogICAgaWYgKCEobm9ybWFsQXBwZWFyYW5jZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFzVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUocGFyYW1zLmRpY3QuZ2V0KCJBUyIpKTsKICAgIGlmICh0eXBlb2YgYXNWYWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBhc1ZhbHVlOwogICAgfQogICAgY29uc3QgeWVzID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09IG51bGwgJiYgdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09ICJPZmYiID8gdGhpcy5kYXRhLmZpZWxkVmFsdWUgOiAiWWVzIjsKICAgIGNvbnN0IGV4cG9ydFZhbHVlcyA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0S2V5cygpOwogICAgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggPT09IDApIHsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIHllcyk7CiAgICB9IGVsc2UgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggPT09IDEpIHsKICAgICAgaWYgKGV4cG9ydFZhbHVlc1swXSA9PT0gIk9mZiIpIHsKICAgICAgICBleHBvcnRWYWx1ZXMucHVzaCh5ZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGV4cG9ydFZhbHVlcy51bnNoaWZ0KCJPZmYiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChleHBvcnRWYWx1ZXMuaW5jbHVkZXMoeWVzKSkgewogICAgICBleHBvcnRWYWx1ZXMubGVuZ3RoID0gMDsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIHllcyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBvdGhlclllcyA9IGV4cG9ydFZhbHVlcy5maW5kKHYgPT4gdiAhPT0gIk9mZiIpOwogICAgICBleHBvcnRWYWx1ZXMubGVuZ3RoID0gMDsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIG90aGVyWWVzKTsKICAgIH0KICAgIGlmICghZXhwb3J0VmFsdWVzLmluY2x1ZGVzKHRoaXMuZGF0YS5maWVsZFZhbHVlKSkgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9ICJPZmYiOwogICAgfQogICAgdGhpcy5kYXRhLmV4cG9ydFZhbHVlID0gZXhwb3J0VmFsdWVzWzFdOwogICAgY29uc3QgY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuZXhwb3J0VmFsdWUpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IGNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IHVuY2hlY2tlZEFwcGVhcmFuY2UgOiBudWxsOwogICAgaWYgKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgImNoZWNrIik7CiAgICB9CiAgICBpZiAodGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfQogICAgdGhpcy5fZmFsbGJhY2tGb250RGljdCA9IHRoaXMuZmFsbGJhY2tGb250RGljdDsKICAgIGlmICh0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPT09IG51bGwpIHsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlID0gIk9mZiI7CiAgICB9CiAgfQogIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7CiAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBudWxsOwogICAgY29uc3QgZmllbGRQYXJlbnQgPSBwYXJhbXMuZGljdC5nZXQoIlBhcmVudCIpOwogICAgaWYgKGZpZWxkUGFyZW50IGluc3RhbmNlb2YgRGljdCkgewogICAgICB0aGlzLnBhcmVudCA9IHBhcmFtcy5kaWN0LmdldFJhdygiUGFyZW50Iik7CiAgICAgIGNvbnN0IGZpZWxkUGFyZW50VmFsdWUgPSBmaWVsZFBhcmVudC5nZXQoIlYiKTsKICAgICAgaWYgKGZpZWxkUGFyZW50VmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoZmllbGRQYXJlbnRWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGFwcGVhcmFuY2VTdGF0ZXMgPSBwYXJhbXMuZGljdC5nZXQoIkFQIik7CiAgICBpZiAoIShhcHBlYXJhbmNlU3RhdGVzIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CiAgICBpZiAoIShub3JtYWxBcHBlYXJhbmNlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBrZXkgb2Ygbm9ybWFsQXBwZWFyYW5jZS5nZXRLZXlzKCkpIHsKICAgICAgaWYgKGtleSAhPT0gIk9mZiIpIHsKICAgICAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoa2V5KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuYnV0dG9uVmFsdWUpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IGNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IHVuY2hlY2tlZEFwcGVhcmFuY2UgOiBudWxsOwogICAgaWYgKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgImRpc2MiKTsKICAgIH0KICAgIGlmICh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSk7CiAgICB9CiAgICB0aGlzLl9mYWxsYmFja0ZvbnREaWN0ID0gdGhpcy5mYWxsYmFja0ZvbnREaWN0OwogICAgaWYgKHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA9PT0gbnVsbCkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPSAiT2ZmIjsKICAgIH0KICB9CiAgX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGlmICghZGljdC5oYXMoIkEiKSAmJiAhZGljdC5oYXMoIkFBIikgJiYgIXRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQpIHsKICAgICAgd2FybigiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRhdGEuaXNUb29sdGlwT25seSA9ICFkaWN0LmhhcygiQSIpICYmICFkaWN0LmhhcygiQUEiKTsKICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7CiAgICAgIGRlc3REaWN0OiBkaWN0LAogICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSwKICAgICAgZG9jQmFzZVVybDogYW5ub3RhdGlvbkdsb2JhbHMuYmFzZVVybCwKICAgICAgZG9jQXR0YWNobWVudHM6IGFubm90YXRpb25HbG9iYWxzLmF0dGFjaG1lbnRzCiAgICB9KTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBsZXQgdHlwZSA9ICJidXR0b24iOwogICAgbGV0IGV4cG9ydFZhbHVlczsKICAgIGlmICh0aGlzLmRhdGEuY2hlY2tCb3gpIHsKICAgICAgdHlwZSA9ICJjaGVja2JveCI7CiAgICAgIGV4cG9ydFZhbHVlcyA9IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnJhZGlvQnV0dG9uKSB7CiAgICAgIHR5cGUgPSAicmFkaW9idXR0b24iOwogICAgICBleHBvcnRWYWx1ZXMgPSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICB9CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWUgfHwgIk9mZiIsCiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLAogICAgICBleHBvcnRWYWx1ZXMsCiAgICAgIGVkaXRhYmxlOiAhdGhpcy5kYXRhLnJlYWRPbmx5LAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBhY3Rpb25zOiB0aGlzLmRhdGEuYWN0aW9ucywKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuZGF0YS5ib3JkZXJDb2xvciwKICAgICAgZmlsbENvbG9yOiB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLAogICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbiwKICAgICAgdHlwZQogICAgfTsKICB9CiAgZ2V0IGZhbGxiYWNrRm9udERpY3QoKSB7CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QoKTsKICAgIGRpY3Quc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KCJaYXBmRGluZ2JhdHMiKSk7CiAgICBkaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7CiAgICBkaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7CiAgICBkaWN0LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiWmFwZkRpbmdiYXRzRW5jb2RpbmciKSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmYWxsYmFja0ZvbnREaWN0IiwgZGljdCk7CiAgfQp9CmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmluZGljZXMgPSBkaWN0LmdldEFycmF5KCJJIik7CiAgICB0aGlzLmhhc0luZGljZXMgPSBBcnJheS5pc0FycmF5KHRoaXMuaW5kaWNlcykgJiYgdGhpcy5pbmRpY2VzLmxlbmd0aCA+IDA7CiAgICB0aGlzLmRhdGEub3B0aW9ucyA9IFtdOwogICAgY29uc3Qgb3B0aW9ucyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJPcHQiCiAgICB9KTsKICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IG9wdGlvbiA9IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25zW2ldKTsKICAgICAgICBjb25zdCBpc09wdGlvbkFycmF5ID0gQXJyYXkuaXNBcnJheShvcHRpb24pOwogICAgICAgIHRoaXMuZGF0YS5vcHRpb25zW2ldID0gewogICAgICAgICAgZXhwb3J0VmFsdWU6IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblswXSkgOiBvcHRpb24pLAogICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoaXNPcHRpb25BcnJheSA/IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25bMV0pIDogb3B0aW9uKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpcy5oYXNJbmRpY2VzKSB7CiAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBbdGhpcy5kYXRhLmZpZWxkVmFsdWVdOwogICAgICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuZmllbGRWYWx1ZSkgewogICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107CiAgICAgIGNvbnN0IGlpID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoOwogICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5pbmRpY2VzKSB7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaSkgJiYgaSA+PSAwICYmIGkgPCBpaSkgewogICAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUucHVzaCh0aGlzLmRhdGEub3B0aW9uc1tpXS5leHBvcnRWYWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoID09PSAwICYmIHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgdGhpcy5kYXRhLm9wdGlvbnMgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZS5tYXAodmFsdWUgPT4gKHsKICAgICAgICBleHBvcnRWYWx1ZTogdmFsdWUsCiAgICAgICAgZGlzcGxheVZhbHVlOiB2YWx1ZQogICAgICB9KSk7CiAgICB9CiAgICB0aGlzLmRhdGEuY29tYm8gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLkNPTUJPKTsKICAgIHRoaXMuZGF0YS5tdWx0aVNlbGVjdCA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuTVVMVElTRUxFQ1QpOwogICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgY29uc3QgdHlwZSA9IHRoaXMuZGF0YS5jb21ibyA/ICJjb21ib2JveCIgOiAibGlzdGJveCI7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDAgPyB0aGlzLmRhdGEuZmllbGRWYWx1ZVswXSA6IG51bGw7CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUsCiAgICAgIGVkaXRhYmxlOiAhdGhpcy5kYXRhLnJlYWRPbmx5LAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgbnVtSXRlbXM6IHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCwKICAgICAgbXVsdGlwbGVTZWxlY3Rpb246IHRoaXMuZGF0YS5tdWx0aVNlbGVjdCwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBhY3Rpb25zOiB0aGlzLmRhdGEuYWN0aW9ucywKICAgICAgaXRlbXM6IHRoaXMuZGF0YS5vcHRpb25zLAogICAgICBwYWdlOiB0aGlzLmRhdGEucGFnZUluZGV4LAogICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICBmaWxsQ29sb3I6IHRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3IsCiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAogICAgICB0eXBlCiAgICB9OwogIH0KICBhbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgZGljdCkgewogICAgaWYgKCF0aGlzLmhhc0luZGljZXMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IHZhbHVlcyA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8udmFsdWU7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgewogICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICAgIH0KICAgIGNvbnN0IGluZGljZXMgPSBbXTsKICAgIGNvbnN0IHsKICAgICAgb3B0aW9ucwogICAgfSA9IHRoaXMuZGF0YTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSBvcHRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgaWYgKG9wdGlvbnNbaV0uZXhwb3J0VmFsdWUgPT09IHZhbHVlc1tqXSkgewogICAgICAgIGluZGljZXMucHVzaChpKTsKICAgICAgICBqICs9IDE7CiAgICAgIH0KICAgIH0KICAgIGRpY3Quc2V0KCJJIiwgaW5kaWNlcyk7CiAgfQogIGFzeW5jIF9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHRoaXMuZGF0YS5jb21ibykgewogICAgICByZXR1cm4gc3VwZXIuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGxldCBleHBvcnRlZFZhbHVlLCByb3RhdGlvbjsKICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGlmIChzdG9yYWdlRW50cnkpIHsKICAgICAgcm90YXRpb24gPSBzdG9yYWdlRW50cnkucm90YXRpb247CiAgICAgIGV4cG9ydGVkVmFsdWUgPSBzdG9yYWdlRW50cnkudmFsdWU7CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlID09PSB1bmRlZmluZWQgJiYgIXRoaXMuX25lZWRBcHBlYXJhbmNlcykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChleHBvcnRlZFZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgZXhwb3J0ZWRWYWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShleHBvcnRlZFZhbHVlKSkgewogICAgICBleHBvcnRlZFZhbHVlID0gW2V4cG9ydGVkVmFsdWVdOwogICAgfQogICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSAxOwogICAgY29uc3QgZGVmYXVsdEhQYWRkaW5nID0gMjsKICAgIGxldCB7CiAgICAgIHdpZHRoOiB0b3RhbFdpZHRoLAogICAgICBoZWlnaHQ6IHRvdGFsSGVpZ2h0CiAgICB9ID0gdGhpczsKICAgIGlmIChyb3RhdGlvbiA9PT0gOTAgfHwgcm90YXRpb24gPT09IDI3MCkgewogICAgICBbdG90YWxXaWR0aCwgdG90YWxIZWlnaHRdID0gW3RvdGFsSGVpZ2h0LCB0b3RhbFdpZHRoXTsKICAgIH0KICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDsKICAgIGNvbnN0IHZhbHVlSW5kaWNlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZXhwb3J0VmFsdWUKICAgICAgfSA9IHRoaXMuZGF0YS5vcHRpb25zW2ldOwogICAgICBpZiAoZXhwb3J0ZWRWYWx1ZS5pbmNsdWRlcyhleHBvcnRWYWx1ZSkpIHsKICAgICAgICB2YWx1ZUluZGljZXMucHVzaChpKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBjb25zdCBmb250ID0gYXdhaXQgV2lkZ2V0QW5ub3RhdGlvbi5fZ2V0Rm9udERhdGEoZXZhbHVhdG9yLCB0YXNrLCB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLCB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMpOwogICAgbGV0IGRlZmF1bHRBcHBlYXJhbmNlOwogICAgbGV0IHsKICAgICAgZm9udFNpemUKICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgaWYgKCFmb250U2l6ZSkgewogICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gKHRvdGFsSGVpZ2h0IC0gZGVmYXVsdFBhZGRpbmcpIC8gbGluZUNvdW50OwogICAgICBsZXQgbGluZVdpZHRoID0gLTE7CiAgICAgIGxldCB2YWx1ZTsKICAgICAgZm9yIChjb25zdCB7CiAgICAgICAgZGlzcGxheVZhbHVlCiAgICAgIH0gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHsKICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2dldFRleHRXaWR0aChkaXNwbGF5VmFsdWUsIGZvbnQpOwogICAgICAgIGlmICh3aWR0aCA+IGxpbmVXaWR0aCkgewogICAgICAgICAgbGluZVdpZHRoID0gd2lkdGg7CiAgICAgICAgICB2YWx1ZSA9IGRpc3BsYXlWYWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgW2RlZmF1bHRBcHBlYXJhbmNlLCBmb250U2l6ZV0gPSB0aGlzLl9jb21wdXRlRm9udFNpemUobGluZUhlaWdodCwgdG90YWxXaWR0aCAtIDIgKiBkZWZhdWx0SFBhZGRpbmcsIHZhbHVlLCBmb250LCAtMSk7CiAgICB9IGVsc2UgewogICAgICBkZWZhdWx0QXBwZWFyYW5jZSA9IHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlOwogICAgfQogICAgY29uc3QgbGluZUhlaWdodCA9IGZvbnRTaXplICogTElORV9GQUNUT1I7CiAgICBjb25zdCB2UGFkZGluZyA9IChsaW5lSGVpZ2h0IC0gZm9udFNpemUpIC8gMjsKICAgIGNvbnN0IG51bWJlck9mVmlzaWJsZUxpbmVzID0gTWF0aC5mbG9vcih0b3RhbEhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgbGV0IGZpcnN0SW5kZXggPSAwOwogICAgaWYgKHZhbHVlSW5kaWNlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IG1pbkluZGV4ID0gTWF0aC5taW4oLi4udmFsdWVJbmRpY2VzKTsKICAgICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi52YWx1ZUluZGljZXMpOwogICAgICBmaXJzdEluZGV4ID0gTWF0aC5tYXgoMCwgbWF4SW5kZXggLSBudW1iZXJPZlZpc2libGVMaW5lcyArIDEpOwogICAgICBpZiAoZmlyc3RJbmRleCA+IG1pbkluZGV4KSB7CiAgICAgICAgZmlyc3RJbmRleCA9IG1pbkluZGV4OwogICAgICB9CiAgICB9CiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihmaXJzdEluZGV4ICsgbnVtYmVyT2ZWaXNpYmxlTGluZXMgKyAxLCBsaW5lQ291bnQpOwogICAgY29uc3QgYnVmID0gWyIvVHggQk1DIHEiLCBgMSAxICR7dG90YWxXaWR0aH0gJHt0b3RhbEhlaWdodH0gcmUgVyBuYF07CiAgICBpZiAodmFsdWVJbmRpY2VzLmxlbmd0aCkgewogICAgICBidWYucHVzaCgiMC42MDAwMDYgMC43NTY4NjYgMC44NTQ5MDQgcmciKTsKICAgICAgZm9yIChjb25zdCBpbmRleCBvZiB2YWx1ZUluZGljZXMpIHsKICAgICAgICBpZiAoZmlyc3RJbmRleCA8PSBpbmRleCAmJiBpbmRleCA8IGVuZCkgewogICAgICAgICAgYnVmLnB1c2goYDEgJHt0b3RhbEhlaWdodCAtIChpbmRleCAtIGZpcnN0SW5kZXggKyAxKSAqIGxpbmVIZWlnaHR9ICR7dG90YWxXaWR0aH0gJHtsaW5lSGVpZ2h0fSByZSBmYCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBidWYucHVzaCgiQlQiLCBkZWZhdWx0QXBwZWFyYW5jZSwgYDEgMCAwIDEgMCAke3RvdGFsSGVpZ2h0fSBUbWApOwogICAgY29uc3QgcHJldkluZm8gPSB7CiAgICAgIHNoaWZ0OiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IGZpcnN0SW5kZXg7IGkgPCBlbmQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZGlzcGxheVZhbHVlCiAgICAgIH0gPSB0aGlzLmRhdGEub3B0aW9uc1tpXTsKICAgICAgY29uc3QgdnBhZGRpbmcgPSBpID09PSBmaXJzdEluZGV4ID8gdlBhZGRpbmcgOiAwOwogICAgICBidWYucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGRpc3BsYXlWYWx1ZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIDAsIHByZXZJbmZvLCBkZWZhdWx0SFBhZGRpbmcsIC1saW5lSGVpZ2h0ICsgdnBhZGRpbmcpKTsKICAgIH0KICAgIGJ1Zi5wdXNoKCJFVCBRIEVNQyIpOwogICAgcmV0dXJuIGJ1Zi5qb2luKCJcbiIpOwogIH0KfQpjbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBudWxsOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSAhdGhpcy5kYXRhLmhhc093bkNhbnZhczsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZTogbnVsbCwKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgdHlwZTogInNpZ25hdHVyZSIKICAgIH07CiAgfQp9CmNsYXNzIFRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBjb25zdCBERUZBVUxUX0lDT05fU0laRSA9IDIyOwogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5ub1JvdGF0ZSA9IHRydWU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVEVYVDsKICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEubmFtZSA9ICJOb0ljb24iOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnJlY3RbMV0gPSB0aGlzLmRhdGEucmVjdFszXSAtIERFRkFVTFRfSUNPTl9TSVpFOwogICAgICB0aGlzLmRhdGEucmVjdFsyXSA9IHRoaXMuZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7CiAgICAgIHRoaXMuZGF0YS5uYW1lID0gZGljdC5oYXMoIk5hbWUiKSA/IGRpY3QuZ2V0KCJOYW1lIikubmFtZSA6ICJOb3RlIjsKICAgIH0KICAgIGlmIChkaWN0LmhhcygiU3RhdGUiKSkgewogICAgICB0aGlzLmRhdGEuc3RhdGUgPSBkaWN0LmdldCgiU3RhdGUiKSB8fCBudWxsOwogICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IGRpY3QuZ2V0KCJTdGF0ZU1vZGVsIikgfHwgbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgTGlua0Fubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIGFubm90YXRpb25HbG9iYWxzCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuTElOSzsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50czsKICAgIH0KICAgIHRoaXMuZGF0YS5ib3JkZXJDb2xvciB8fD0gdGhpcy5kYXRhLmNvbG9yOwogICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgZGVzdERpY3Q6IGRpY3QsCiAgICAgIHJlc3VsdE9iajogdGhpcy5kYXRhLAogICAgICBkb2NCYXNlVXJsOiBhbm5vdGF0aW9uR2xvYmFscy5iYXNlVXJsLAogICAgICBkb2NBdHRhY2htZW50czogYW5ub3RhdGlvbkdsb2JhbHMuYXR0YWNobWVudHMKICAgIH0pOwogIH0KfQpjbGFzcyBQb3B1cEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT1BVUDsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGlmICh0aGlzLndpZHRoID09PSAwIHx8IHRoaXMuaGVpZ2h0ID09PSAwKSB7CiAgICAgIHRoaXMuZGF0YS5yZWN0ID0gbnVsbDsKICAgIH0KICAgIGxldCBwYXJlbnRJdGVtID0gZGljdC5nZXQoIlBhcmVudCIpOwogICAgaWYgKCFwYXJlbnRJdGVtKSB7CiAgICAgIHdhcm4oIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRhdGEucGFyZW50UmVjdCA9IGxvb2t1cE5vcm1hbFJlY3QocGFyZW50SXRlbS5nZXRBcnJheSgiUmVjdCIpLCBudWxsKTsKICAgIGNvbnN0IHJ0ID0gcGFyZW50SXRlbS5nZXQoIlJUIik7CiAgICBpZiAoaXNOYW1lKHJ0LCBBbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSkgewogICAgICBwYXJlbnRJdGVtID0gcGFyZW50SXRlbS5nZXQoIklSVCIpOwogICAgfQogICAgaWYgKCFwYXJlbnRJdGVtLmhhcygiTSIpKSB7CiAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShwYXJlbnRJdGVtLmdldCgiTSIpKTsKICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLm1vZGlmaWNhdGlvbkRhdGU7CiAgICB9CiAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKCJDIikpIHsKICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50SXRlbS5nZXRBcnJheSgiQyIpKTsKICAgICAgdGhpcy5kYXRhLmNvbG9yID0gdGhpcy5jb2xvcjsKICAgIH0KICAgIGlmICghdGhpcy52aWV3YWJsZSkgewogICAgICBjb25zdCBwYXJlbnRGbGFncyA9IHBhcmVudEl0ZW0uZ2V0KCJGIik7CiAgICAgIGlmICh0aGlzLl9pc1ZpZXdhYmxlKHBhcmVudEZsYWdzKSkgewogICAgICAgIHRoaXMuc2V0RmxhZ3MocGFyZW50RmxhZ3MpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnNldFRpdGxlKHBhcmVudEl0ZW0uZ2V0KCJUIikpOwogICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICB0aGlzLnNldENvbnRlbnRzKHBhcmVudEl0ZW0uZ2V0KCJDb250ZW50cyIpKTsKICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgaWYgKHBhcmVudEl0ZW0uaGFzKCJSQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5yaWNoVGV4dCA9IFhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwocGFyZW50SXRlbS5nZXQoIlJDIikpOwogICAgfQogICAgdGhpcy5kYXRhLm9wZW4gPSAhIWRpY3QuZ2V0KCJPcGVuIik7CiAgfQp9CmNsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEuaXNFZGl0YWJsZSA9ICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgY29uc3QgewogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgZXZhbHVhdG9yT3B0aW9ucywKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkZSRUVURVhUOwogICAgdGhpcy5zZXREZWZhdWx0QXBwZWFyYW5jZShwYXJhbXMpOwogICAgdGhpcy5faGFzQXBwZWFyYW5jZSA9ICEhdGhpcy5hcHBlYXJhbmNlOwogICAgaWYgKHRoaXMuX2hhc0FwcGVhcmFuY2UpIHsKICAgICAgY29uc3QgewogICAgICAgIGZvbnRDb2xvciwKICAgICAgICBmb250U2l6ZQogICAgICB9ID0gcGFyc2VBcHBlYXJhbmNlU3RyZWFtKHRoaXMuYXBwZWFyYW5jZSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250Q29sb3IgPSBmb250Q29sb3I7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgPSBmb250U2l6ZSB8fCAxMDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgfHw9IDEwOwogICAgICBjb25zdCB7CiAgICAgICAgZm9udENvbG9yLAogICAgICAgIGZvbnRTaXplCiAgICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgICBpZiAodGhpcy5fY29udGVudHMuc3RyKSB7CiAgICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGhpcy5fY29udGVudHMuc3RyLnNwbGl0KC9cclxuP3xcbi8pLm1hcChsaW5lID0+IGxpbmUudHJpbUVuZCgpKTsKICAgICAgICBjb25zdCB7CiAgICAgICAgICBjb29yZHMsCiAgICAgICAgICBiYm94LAogICAgICAgICAgbWF0cml4CiAgICAgICAgfSA9IEZha2VVbmljb2RlRm9udC5nZXRGaXJzdFBvc2l0aW9uSW5mbyh0aGlzLnJlY3RhbmdsZSwgdGhpcy5yb3RhdGlvbiwgZm9udFNpemUpOwogICAgICAgIHRoaXMuZGF0YS50ZXh0UG9zaXRpb24gPSB0aGlzLl90cmFuc2Zvcm1Qb2ludChjb29yZHMsIGJib3gsIG1hdHJpeCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBwYXJhbXMuZGljdC5nZXQoIkNBIik7CiAgICAgICAgY29uc3QgZmFrZVVuaWNvZGVGb250ID0gbmV3IEZha2VVbmljb2RlRm9udCh4cmVmLCAic2Fucy1zZXJpZiIpOwogICAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGZha2VVbmljb2RlRm9udC5jcmVhdGVBcHBlYXJhbmNlKHRoaXMuX2NvbnRlbnRzLnN0ciwgdGhpcy5yZWN0YW5nbGUsIHRoaXMucm90YXRpb24sIGZvbnRTaXplLCBmb250Q29sb3IsIHN0cm9rZUFscGhhKTsKICAgICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJGcmVlVGV4dEFubm90YXRpb246IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBhbm5vdGF0aW9uIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseS4iKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgaGFzVGV4dENvbnRlbnQoKSB7CiAgICByZXR1cm4gdGhpcy5faGFzQXBwZWFyYW5jZTsKICB9CiAgc3RhdGljIGNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgewogICAgYXBSZWYsCiAgICBhcAogIH0pIHsKICAgIGNvbnN0IHsKICAgICAgY29sb3IsCiAgICAgIGZvbnRTaXplLAogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlciwKICAgICAgdmFsdWUKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgZnJlZXRleHQgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgZnJlZXRleHQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkFubm90IikpOwogICAgZnJlZXRleHQuc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZyZWVUZXh0IikpOwogICAgaWYgKG9sZEFubm90YXRpb24pIHsKICAgICAgZnJlZXRleHQuc2V0KCJNIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICAgIGZyZWV0ZXh0LmRlbGV0ZSgiUkMiKTsKICAgIH0gZWxzZSB7CiAgICAgIGZyZWV0ZXh0LnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICB9CiAgICBmcmVldGV4dC5zZXQoIlJlY3QiLCByZWN0KTsKICAgIGNvbnN0IGRhID0gYC9IZWx2ICR7Zm9udFNpemV9IFRmICR7Z2V0UGRmQ29sb3IoY29sb3IsIHRydWUpfWA7CiAgICBmcmVldGV4dC5zZXQoIkRBIiwgZGEpOwogICAgZnJlZXRleHQuc2V0KCJDb250ZW50cyIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodmFsdWUpKTsKICAgIGZyZWV0ZXh0LnNldCgiRiIsIDQpOwogICAgZnJlZXRleHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgZnJlZXRleHQuc2V0KCJSb3RhdGUiLCByb3RhdGlvbik7CiAgICBpZiAodXNlcikgewogICAgICBmcmVldGV4dC5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHVzZXIpKTsKICAgIH0KICAgIGlmIChhcFJlZiB8fCBhcCkgewogICAgICBjb25zdCBuID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGZyZWV0ZXh0LnNldCgiQVAiLCBuKTsKICAgICAgaWYgKGFwUmVmKSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmcmVldGV4dDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oYW5ub3RhdGlvbiwgeHJlZiwgcGFyYW1zKSB7CiAgICBjb25zdCB7CiAgICAgIGJhc2VGb250UmVmLAogICAgICBldmFsdWF0b3IsCiAgICAgIHRhc2sKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBmb250U2l6ZSwKICAgICAgcmVjdCwKICAgICAgcm90YXRpb24sCiAgICAgIHZhbHVlCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgZm9udCA9IG5ldyBEaWN0KHhyZWYpOwogICAgaWYgKGJhc2VGb250UmVmKSB7CiAgICAgIGZvbnQuc2V0KCJIZWx2IiwgYmFzZUZvbnRSZWYpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgYmFzZUZvbnQgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgYmFzZUZvbnQuc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSk7CiAgICAgIGJhc2VGb250LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250IikpOwogICAgICBiYXNlRm9udC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiVHlwZTEiKSk7CiAgICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpOwogICAgICBmb250LnNldCgiSGVsdiIsIGJhc2VGb250KTsKICAgIH0KICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGNvbnN0IGhlbHYgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgZm9udE5hbWU6ICJIZWx2IiwKICAgICAgZm9udFNpemUKICAgIH0sIHJlc291cmNlcyk7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDsKICAgIGxldCB3ID0geDIgLSB4MTsKICAgIGxldCBoID0geTIgLSB5MTsKICAgIGlmIChyb3RhdGlvbiAlIDE4MCAhPT0gMCkgewogICAgICBbdywgaF0gPSBbaCwgd107CiAgICB9CiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KCJcbiIpOwogICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7CiAgICBsZXQgdG90YWxXaWR0aCA9IC1JbmZpbml0eTsKICAgIGNvbnN0IGVuY29kZWRMaW5lcyA9IFtdOwogICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykgewogICAgICBjb25zdCBlbmNvZGVkID0gaGVsdi5lbmNvZGVTdHJpbmcobGluZSk7CiAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCA+IDEpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBsaW5lID0gZW5jb2RlZC5qb2luKCIiKTsKICAgICAgZW5jb2RlZExpbmVzLnB1c2gobGluZSk7CiAgICAgIGxldCBsaW5lV2lkdGggPSAwOwogICAgICBjb25zdCBnbHlwaHMgPSBoZWx2LmNoYXJzVG9HbHlwaHMobGluZSk7CiAgICAgIGZvciAoY29uc3QgZ2x5cGggb2YgZ2x5cGhzKSB7CiAgICAgICAgbGluZVdpZHRoICs9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIH0KICAgICAgdG90YWxXaWR0aCA9IE1hdGgubWF4KHRvdGFsV2lkdGgsIGxpbmVXaWR0aCk7CiAgICB9CiAgICBsZXQgaHNjYWxlID0gMTsKICAgIGlmICh0b3RhbFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gdG90YWxXaWR0aDsKICAgIH0KICAgIGxldCB2c2NhbGUgPSAxOwogICAgY29uc3QgbGluZUhlaWdodCA9IExJTkVfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBsaW5lQXNjZW50ID0gKExJTkVfRkFDVE9SIC0gTElORV9ERVNDRU5UX0ZBQ1RPUikgKiBmb250U2l6ZTsKICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gbGluZUhlaWdodCAqIGxpbmVzLmxlbmd0aDsKICAgIGlmICh0b3RhbEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIHRvdGFsSGVpZ2h0OwogICAgfQogICAgY29uc3QgZnNjYWxlID0gTWF0aC5taW4oaHNjYWxlLCB2c2NhbGUpOwogICAgY29uc3QgbmV3Rm9udFNpemUgPSBmb250U2l6ZSAqIGZzY2FsZTsKICAgIGxldCBmaXJzdFBvaW50LCBjbGlwQm94LCBtYXRyaXg7CiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBtYXRyaXggPSBbMSwgMCwgMCwgMV07CiAgICAgICAgY2xpcEJveCA9IFtyZWN0WzBdLCByZWN0WzFdLCB3LCBoXTsKICAgICAgICBmaXJzdFBvaW50ID0gW3JlY3RbMF0sIHJlY3RbM10gLSBsaW5lQXNjZW50XTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA5MDoKICAgICAgICBtYXRyaXggPSBbMCwgMSwgLTEsIDBdOwogICAgICAgIGNsaXBCb3ggPSBbcmVjdFsxXSwgLXJlY3RbMl0sIHcsIGhdOwogICAgICAgIGZpcnN0UG9pbnQgPSBbcmVjdFsxXSwgLXJlY3RbMF0gLSBsaW5lQXNjZW50XTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxODA6CiAgICAgICAgbWF0cml4ID0gWy0xLCAwLCAwLCAtMV07CiAgICAgICAgY2xpcEJveCA9IFstcmVjdFsyXSwgLXJlY3RbM10sIHcsIGhdOwogICAgICAgIGZpcnN0UG9pbnQgPSBbLXJlY3RbMl0sIC1yZWN0WzFdIC0gbGluZUFzY2VudF07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjcwOgogICAgICAgIG1hdHJpeCA9IFswLCAtMSwgMSwgMF07CiAgICAgICAgY2xpcEJveCA9IFstcmVjdFszXSwgcmVjdFswXSwgdywgaF07CiAgICAgICAgZmlyc3RQb2ludCA9IFstcmVjdFszXSwgcmVjdFsyXSAtIGxpbmVBc2NlbnRdOwogICAgICAgIGJyZWFrOwogICAgfQogICAgY29uc3QgYnVmZmVyID0gWyJxIiwgYCR7bWF0cml4LmpvaW4oIiAiKX0gMCAwIGNtYCwgYCR7Y2xpcEJveC5qb2luKCIgIil9IHJlIFcgbmAsIGBCVGAsIGAke2dldFBkZkNvbG9yKGNvbG9yLCB0cnVlKX1gLCBgMCBUYyAvSGVsdiAke251bWJlclRvU3RyaW5nKG5ld0ZvbnRTaXplKX0gVGZgXTsKICAgIGJ1ZmZlci5wdXNoKGAke2ZpcnN0UG9pbnQuam9pbigiICIpfSBUZCAoJHtlc2NhcGVTdHJpbmcoZW5jb2RlZExpbmVzWzBdKX0pIFRqYCk7CiAgICBjb25zdCB2U2hpZnQgPSBudW1iZXJUb1N0cmluZyhsaW5lSGVpZ2h0KTsKICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IGVuY29kZWRMaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBlbmNvZGVkTGluZXNbaV07CiAgICAgIGJ1ZmZlci5wdXNoKGAwIC0ke3ZTaGlmdH0gVGQgKCR7ZXNjYXBlU3RyaW5nKGxpbmUpfSkgVGpgKTsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKCJFVCIsICJRIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYnVmZmVyLmpvaW4oIlxuIik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJGb3JtVHlwZSIsIDEpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIHJlY3QpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJNYXRyaXgiLCBbMSwgMCwgMCwgMSwgLXJlY3RbMF0sIC1yZWN0WzFdXSk7CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQp9CmNsYXNzIExpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuTElORTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCBsaW5lQ29vcmRpbmF0ZXMgPSBsb29rdXBSZWN0KGRpY3QuZ2V0QXJyYXkoIkwiKSwgWzAsIDAsIDAsIDBdKTsKICAgIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXMgPSBVdGlsLm5vcm1hbGl6ZVJlY3QobGluZUNvb3JkaW5hdGVzKTsKICAgIHRoaXMuc2V0TGluZUVuZGluZ3MoZGljdC5nZXRBcnJheSgiTEUiKSk7CiAgICB0aGlzLmRhdGEubGluZUVuZGluZ3MgPSB0aGlzLmxpbmVFbmRpbmdzOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgY29uc3QgYm9yZGVyV2lkdGggPSB0aGlzLmJvcmRlclN0eWxlLndpZHRoIHx8IDEsCiAgICAgICAgYm9yZGVyQWRqdXN0ID0gMiAqIGJvcmRlcldpZHRoOwogICAgICBjb25zdCBiYm94ID0gW3RoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMF0gLSBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0gLSBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMl0gKyBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbM10gKyBib3JkZXJBZGp1c3RdOwogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgIHRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgYnVmZmVyLnB1c2goYCR7bGluZUNvb3JkaW5hdGVzWzBdfSAke2xpbmVDb29yZGluYXRlc1sxXX0gbWAsIGAke2xpbmVDb29yZGluYXRlc1syXX0gJHtsaW5lQ29vcmRpbmF0ZXNbM119IGxgLCAiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0gLSBib3JkZXJXaWR0aCwgcG9pbnRzWzddIC0gYm9yZGVyV2lkdGgsIHBvaW50c1syXSArIGJvcmRlcldpZHRoLCBwb2ludHNbM10gKyBib3JkZXJXaWR0aF07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KY2xhc3MgU3F1YXJlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNRVUFSRTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBpbnRlcmlvckNvbG9yID0gZ2V0UmdiQ29sb3IoZGljdC5nZXRBcnJheSgiSUMiKSwgbnVsbCk7CiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGludGVyaW9yQ29sb3IgPyBnZXRQZGZDb2xvckFycmF5KGludGVyaW9yQ29sb3IpIDogbnVsbDsKICAgICAgY29uc3QgZmlsbEFscGhhID0gZmlsbENvbG9yID8gc3Ryb2tlQWxwaGEgOiBudWxsOwogICAgICBpZiAodGhpcy5ib3JkZXJTdHlsZS53aWR0aCA9PT0gMCAmJiAhZmlsbENvbG9yKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHt0aGlzLmJvcmRlclN0eWxlLndpZHRofSB3YCwKICAgICAgICBzdHJva2VDb2xvciwKICAgICAgICBmaWxsQ29sb3IsCiAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgZmlsbEFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbNF0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHkgPSBwb2ludHNbNV0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gcG9pbnRzWzZdIC0gcG9pbnRzWzRdIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aDsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHBvaW50c1szXSAtIHBvaW50c1s3XSAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGg7CiAgICAgICAgICBidWZmZXIucHVzaChgJHt4fSAke3l9ICR7d2lkdGh9ICR7aGVpZ2h0fSByZWApOwogICAgICAgICAgaWYgKGZpbGxDb2xvcikgewogICAgICAgICAgICBidWZmZXIucHVzaCgiQiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfQpjbGFzcyBDaXJjbGVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgaWYgKHRoaXMuYm9yZGVyU3R5bGUud2lkdGggPT09IDAgJiYgIWZpbGxDb2xvcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjb250cm9sUG9pbnRzRGlzdGFuY2UgPSA0IC8gMyAqIE1hdGgudGFuKE1hdGguUEkgLyAoMiAqIDQpKTsKICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZXh0cmE6IGAke3RoaXMuYm9yZGVyU3R5bGUud2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgY29uc3QgeDAgPSBwb2ludHNbMF0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHkwID0gcG9pbnRzWzFdIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCAvIDI7CiAgICAgICAgICBjb25zdCB4MSA9IHBvaW50c1s2XSAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeTEgPSBwb2ludHNbN10gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHhNaWQgPSB4MCArICh4MSAtIHgwKSAvIDI7CiAgICAgICAgICBjb25zdCB5TWlkID0geTAgKyAoeTEgLSB5MCkgLyAyOwogICAgICAgICAgY29uc3QgeE9mZnNldCA9ICh4MSAtIHgwKSAvIDIgKiBjb250cm9sUG9pbnRzRGlzdGFuY2U7CiAgICAgICAgICBjb25zdCB5T2Zmc2V0ID0gKHkxIC0geTApIC8gMiAqIGNvbnRyb2xQb2ludHNEaXN0YW5jZTsKICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3hNaWR9ICR7eTF9IG1gLCBgJHt4TWlkICsgeE9mZnNldH0gJHt5MX0gJHt4MX0gJHt5TWlkICsgeU9mZnNldH0gJHt4MX0gJHt5TWlkfSBjYCwgYCR7eDF9ICR7eU1pZCAtIHlPZmZzZXR9ICR7eE1pZCArIHhPZmZzZXR9ICR7eTB9ICR7eE1pZH0gJHt5MH0gY2AsIGAke3hNaWQgLSB4T2Zmc2V0fSAke3kwfSAke3gwfSAke3lNaWQgLSB5T2Zmc2V0fSAke3gwfSAke3lNaWR9IGNgLCBgJHt4MH0gJHt5TWlkICsgeU9mZnNldH0gJHt4TWlkIC0geE9mZnNldH0gJHt5MX0gJHt4TWlkfSAke3kxfSBjYCwgImgiKTsKICAgICAgICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIkIiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzddLCBwb2ludHNbMl0sIHBvaW50c1szXV07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgdGhpcy5kYXRhLnZlcnRpY2VzID0gbnVsbDsKICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb2x5Z29uQW5ub3RhdGlvbikpIHsKICAgICAgdGhpcy5zZXRMaW5lRW5kaW5ncyhkaWN0LmdldEFycmF5KCJMRSIpKTsKICAgICAgdGhpcy5kYXRhLmxpbmVFbmRpbmdzID0gdGhpcy5saW5lRW5kaW5nczsKICAgIH0KICAgIGNvbnN0IHJhd1ZlcnRpY2VzID0gZGljdC5nZXRBcnJheSgiVmVydGljZXMiKTsKICAgIGlmICghaXNOdW1iZXJBcnJheShyYXdWZXJ0aWNlcywgbnVsbCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdmVydGljZXMgPSB0aGlzLmRhdGEudmVydGljZXMgPSBGbG9hdDMyQXJyYXkuZnJvbShyYXdWZXJ0aWNlcyk7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCh2ZXJ0aWNlc1tpXSAtIGJvcmRlckFkanVzdCwgdmVydGljZXNbaSArIDFdIC0gYm9yZGVyQWRqdXN0LCB2ZXJ0aWNlc1tpXSArIGJvcmRlckFkanVzdCwgdmVydGljZXNbaSArIDFdICsgYm9yZGVyQWRqdXN0LCBiYm94KTsKICAgICAgfQogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgIHRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7dmVydGljZXNbaV19ICR7dmVydGljZXNbaSArIDFdfSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIucHVzaCgiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1s3XSwgcG9pbnRzWzJdLCBwb2ludHNbM11dOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQp9CmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uIGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT0xZR09OOwogIH0KfQpjbGFzcyBDYXJldEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5DQVJFVDsKICB9Cn0KY2xhc3MgSW5rQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5JTks7CiAgICB0aGlzLmRhdGEuaW5rTGlzdHMgPSBbXTsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCByYXdJbmtMaXN0cyA9IGRpY3QuZ2V0QXJyYXkoIklua0xpc3QiKTsKICAgIGlmICghQXJyYXkuaXNBcnJheShyYXdJbmtMaXN0cykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmF3SW5rTGlzdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmF3SW5rTGlzdHNbaV0pKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaW5rTGlzdCA9IG5ldyBGbG9hdDMyQXJyYXkocmF3SW5rTGlzdHNbaV0ubGVuZ3RoKTsKICAgICAgdGhpcy5kYXRhLmlua0xpc3RzLnB1c2goaW5rTGlzdCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhd0lua0xpc3RzW2ldLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgICBjb25zdCB4ID0geHJlZi5mZXRjaElmUmVmKHJhd0lua0xpc3RzW2ldW2pdKSwKICAgICAgICAgIHkgPSB4cmVmLmZldGNoSWZSZWYocmF3SW5rTGlzdHNbaV1baiArIDFdKTsKICAgICAgICBpZiAodHlwZW9mIHggPT09ICJudW1iZXIiICYmIHR5cGVvZiB5ID09PSAibnVtYmVyIikgewogICAgICAgICAgaW5rTGlzdFtqXSA9IHg7CiAgICAgICAgICBpbmtMaXN0W2ogKyAxXSA9IHk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgIFV0aWwucmVjdEJvdW5kaW5nQm94KGlua0xpc3RbaV0gLSBib3JkZXJBZGp1c3QsIGlua0xpc3RbaSArIDFdIC0gYm9yZGVyQWRqdXN0LCBpbmtMaXN0W2ldICsgYm9yZGVyQWRqdXN0LCBpbmtMaXN0W2kgKyAxXSArIGJvcmRlckFkanVzdCwgYmJveCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghVXRpbC5pbnRlcnNlY3QodGhpcy5yZWN0YW5nbGUsIGJib3gpKSB7CiAgICAgICAgdGhpcy5yZWN0YW5nbGUgPSBiYm94OwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHtib3JkZXJXaWR0aH0gd2AsCiAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgZm9yIChjb25zdCBpbmtMaXN0IG9mIHRoaXMuZGF0YS5pbmtMaXN0cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgICAgICBidWZmZXIucHVzaChgJHtpbmtMaXN0W2ldfSAke2lua0xpc3RbaSArIDFdfSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICBzdGF0aWMgY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICBhcFJlZiwKICAgIGFwCiAgfSkgewogICAgY29uc3QgewogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICBjb2xvciwKICAgICAgb3BhY2l0eSwKICAgICAgcGF0aHMsCiAgICAgIG91dGxpbmVzLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdGhpY2tuZXNzLAogICAgICB1c2VyCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGluayA9IG9sZEFubm90YXRpb24gfHwgbmV3IERpY3QoeHJlZik7CiAgICBpbmsuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkFubm90IikpOwogICAgaW5rLnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJJbmsiKSk7CiAgICBpbmsuc2V0KG9sZEFubm90YXRpb24gPyAiTSIgOiAiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBpbmsuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBpbmsuc2V0KCJJbmtMaXN0Iiwgb3V0bGluZXM/LnBvaW50cyB8fCBwYXRocy5wb2ludHMpOwogICAgaW5rLnNldCgiRiIsIDQpOwogICAgaW5rLnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaWYgKHVzZXIpIHsKICAgICAgaW5rLnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodXNlcikpOwogICAgfQogICAgaWYgKG91dGxpbmVzKSB7CiAgICAgIGluay5zZXQoIklUIiwgTmFtZS5nZXQoIklua0hpZ2hsaWdodCIpKTsKICAgIH0KICAgIGNvbnN0IGJzID0gbmV3IERpY3QoeHJlZik7CiAgICBpbmsuc2V0KCJCUyIsIGJzKTsKICAgIGJzLnNldCgiVyIsIHRoaWNrbmVzcyk7CiAgICBpbmsuc2V0KCJDIiwgZ2V0UGRmQ29sb3JBcnJheShjb2xvcikpOwogICAgaW5rLnNldCgiQ0EiLCBvcGFjaXR5KTsKICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgIGluay5zZXQoIkFQIiwgbik7CiAgICBpZiAoYXBSZWYpIHsKICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICB9IGVsc2UgewogICAgICBuLnNldCgiTiIsIGFwKTsKICAgIH0KICAgIHJldHVybiBpbms7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgaWYgKGFubm90YXRpb24ub3V0bGluZXMpIHsKICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbUZvckhpZ2hsaWdodChhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgfQogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgcGF0aHMsCiAgICAgIHRoaWNrbmVzcywKICAgICAgb3BhY2l0eQogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBhcHBlYXJhbmNlQnVmZmVyID0gW2Ake3RoaWNrbmVzc30gdyAxIEogMSBqYCwgYCR7Z2V0UGRmQ29sb3IoY29sb3IsIGZhbHNlKX1gXTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaCgiL1IwIGdzIik7CiAgICB9CiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2YgcGF0aHMubGluZXMpIHsKICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICAgIGZvciAobGV0IGkgPSA2LCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikgewogICAgICAgIGlmIChpc05hTihvdXRsaW5lW2ldKSkgewogICAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW2MxeCwgYzF5LCBjMngsIGMyeSwgeCwgeV0gPSBvdXRsaW5lLnNsaWNlKGksIGkgKyA2KTsKICAgICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3V0bGluZS5sZW5ndGggPT09IDYpIHsKICAgICAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goYCR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs0XSl9ICR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs1XSl9IGxgKTsKICAgICAgfQogICAgfQogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKCJTIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBjb25zdCByMCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICByMC5zZXQoIkNBIiwgb3BhY2l0eSk7CiAgICAgIHIwLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJFeHRHU3RhdGUiKSk7CiAgICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICB9CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtRm9ySGlnaGxpZ2h0KGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgb3V0bGluZXM6IHsKICAgICAgICBvdXRsaW5lCiAgICAgIH0sCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YCwgIi9SMCBncyJdOwogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHsKICAgICAgaWYgKGlzTmFOKG91dGxpbmVbaV0pKSB7CiAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XSA9IG91dGxpbmUuc2xpY2UoaSwgaSArIDYpOwogICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICB9CiAgICB9CiAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goImggZiIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VCdWZmZXIuam9pbigiXG4iKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgcmVjdCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgY29uc3QgcjAgPSBuZXcgRGljdCh4cmVmKTsKICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgcjAuc2V0KCJCTSIsIE5hbWUuZ2V0KCJNdWx0aXBseSIpKTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIHIwLnNldCgiY2EiLCBvcGFjaXR5KTsKICAgICAgcjAuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkhJR0hMSUdIVDsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5hcHBlYXJhbmNlPy5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlIHx8ICFyZXNvdXJjZXM/LmhhcygiRXh0R1N0YXRlIikpIHsKICAgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgICB3YXJuKCJIaWdobGlnaHRBbm5vdGF0aW9uIC0gaWdub3JpbmcgYnVpbHQtaW4gYXBwZWFyYW5jZSBzdHJlYW0uIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzEsIDEsIDBdOwogICAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBmaWxsQ29sb3IsCiAgICAgICAgICBibGVuZE1vZGU6ICJNdWx0aXBseSIsCiAgICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3BvaW50c1swXX0gJHtwb2ludHNbMV19IG1gLCBgJHtwb2ludHNbMl19ICR7cG9pbnRzWzNdfSBsYCwgYCR7cG9pbnRzWzZdfSAke3BvaW50c1s3XX0gbGAsIGAke3BvaW50c1s0XX0gJHtwb2ludHNbNV19IGxgLCAiZiIpOwogICAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzddLCBwb2ludHNbMl0sIHBvaW50c1szXV07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiA9IG51bGw7CiAgICB9CiAgfQogIHN0YXRpYyBjcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHsKICAgIGFwUmVmLAogICAgYXAKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICBvcGFjaXR5LAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlciwKICAgICAgcXVhZFBvaW50cwogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBoaWdobGlnaHQgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgaGlnaGxpZ2h0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJBbm5vdCIpKTsKICAgIGhpZ2hsaWdodC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiSGlnaGxpZ2h0IikpOwogICAgaGlnaGxpZ2h0LnNldChvbGRBbm5vdGF0aW9uID8gIk0iIDogIkNyZWF0aW9uRGF0ZSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogICAgaGlnaGxpZ2h0LnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBoaWdobGlnaHQuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBoaWdobGlnaHQuc2V0KCJGIiwgNCk7CiAgICBoaWdobGlnaHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgaGlnaGxpZ2h0LnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaGlnaGxpZ2h0LnNldCgiUXVhZFBvaW50cyIsIHF1YWRQb2ludHMpOwogICAgaGlnaGxpZ2h0LnNldCgiQyIsIGdldFBkZkNvbG9yQXJyYXkoY29sb3IpKTsKICAgIGhpZ2hsaWdodC5zZXQoIkNBIiwgb3BhY2l0eSk7CiAgICBpZiAodXNlcikgewogICAgICBoaWdobGlnaHQuc2V0KCJUIiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh1c2VyKSk7CiAgICB9CiAgICBpZiAoYXBSZWYgfHwgYXApIHsKICAgICAgY29uc3QgbiA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBoaWdobGlnaHQuc2V0KCJBUCIsIG4pOwogICAgICBuLnNldCgiTiIsIGFwUmVmIHx8IGFwKTsKICAgIH0KICAgIHJldHVybiBoaWdobGlnaHQ7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgb3V0bGluZXMsCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YCwgIi9SMCBncyJdOwogICAgY29uc3QgYnVmZmVyID0gW107CiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2Ygb3V0bGluZXMpIHsKICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgIGJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbMF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbMV0pfSBtYCk7CiAgICAgIGZvciAobGV0IGkgPSAyLCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIGJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaV0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDFdKX0gbGApOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKCJoIik7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChidWZmZXIuam9pbigiXG4iKSk7CiAgICB9CiAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goImYqIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICBjb25zdCBleHRHU3RhdGUgPSBuZXcgRGljdCh4cmVmKTsKICAgIHJlc291cmNlcy5zZXQoIkV4dEdTdGF0ZSIsIGV4dEdTdGF0ZSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBjb25zdCByMCA9IG5ldyBEaWN0KHhyZWYpOwogICAgZXh0R1N0YXRlLnNldCgiUjAiLCByMCk7CiAgICByMC5zZXQoIkJNIiwgTmFtZS5nZXQoIk11bHRpcGx5IikpOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgcjAuc2V0KCJjYSIsIG9wYWNpdHkpOwogICAgICByMC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgfQogICAgY29uc3QgYXAgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KfQpjbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOwogICAgY29uc3QgcXVhZFBvaW50cyA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhkaWN0LCBudWxsKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBleHRyYTogIltdIDAgZCAwLjU3MSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3BvaW50c1s0XX0gJHtwb2ludHNbNV0gKyAxLjN9IG1gLCBgJHtwb2ludHNbNl19ICR7cG9pbnRzWzddICsgMS4zfSBsYCwgIlMiKTsKICAgICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1s3XSwgcG9pbnRzWzJdLCBwb2ludHNbM11dOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBudWxsOwogICAgfQogIH0KfQpjbGFzcyBTcXVpZ2dseUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSB0aGlzLmRhdGEucXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMoZGljdCwgbnVsbCk7CiAgICBpZiAocXVhZFBvaW50cykgewogICAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgICB4cmVmLAogICAgICAgICAgZXh0cmE6ICJbXSAwIGQgMSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGR5ID0gKHBvaW50c1sxXSAtIHBvaW50c1s1XSkgLyA2OwogICAgICAgICAgICBsZXQgc2hpZnQgPSBkeTsKICAgICAgICAgICAgbGV0IHggPSBwb2ludHNbNF07CiAgICAgICAgICAgIGNvbnN0IHkgPSBwb2ludHNbNV07CiAgICAgICAgICAgIGNvbnN0IHhFbmQgPSBwb2ludHNbNl07CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3h9ICR7eSArIHNoaWZ0fSBtYCk7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICB4ICs9IDI7CiAgICAgICAgICAgICAgc2hpZnQgPSBzaGlmdCA9PT0gMCA/IGR5IDogMDsKICAgICAgICAgICAgICBidWZmZXIucHVzaChgJHt4fSAke3kgKyBzaGlmdH0gbGApOwogICAgICAgICAgICB9IHdoaWxlICh4IDwgeEVuZCk7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzRdLCB5IC0gMiAqIGR5LCB4RW5kLCB5ICsgMiAqIGR5XTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNUUklLRU9VVDsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSB0aGlzLmRhdGEucXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMoZGljdCwgbnVsbCk7CiAgICBpZiAocXVhZFBvaW50cykgewogICAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgICB4cmVmLAogICAgICAgICAgZXh0cmE6ICJbXSAwIGQgMSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAkeyhwb2ludHNbMF0gKyBwb2ludHNbNF0pIC8gMn0gYCArIGAkeyhwb2ludHNbMV0gKyBwb2ludHNbNV0pIC8gMn0gbWAsIGAkeyhwb2ludHNbMl0gKyBwb2ludHNbNl0pIC8gMn0gYCArIGAkeyhwb2ludHNbM10gKyBwb2ludHNbN10pIC8gMn0gbGAsICJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgU3RhbXBBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgI3NhdmVkSGFzT3duQ2FudmFzID0gbnVsbDsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TVEFNUDsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEuaXNFZGl0YWJsZSA9ICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogIH0KICBtdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzID0gbnVsbCkgewogICAgaWYgKGlzRWRpdGluZykgewogICAgICBpZiAoIXRoaXMuZGF0YS5pc0VkaXRhYmxlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdGhpcy4jc2F2ZWRIYXNPd25DYW52YXMgPz89IHRoaXMuZGF0YS5oYXNPd25DYW52YXM7CiAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0cnVlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0aGlzLiNzYXZlZEhhc093bkNhbnZhcyAhPT0gbnVsbCkgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy4jc2F2ZWRIYXNPd25DYW52YXM7CiAgICAgIHRoaXMuI3NhdmVkSGFzT3duQ2FudmFzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiAhbW9kaWZpZWRJZHM/Lmhhcyh0aGlzLmRhdGEuaWQpOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoYml0bWFwLCB4cmVmKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH0gPSBiaXRtYXA7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgewogICAgICBhbHBoYTogdHJ1ZQogICAgfSk7CiAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7CiAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhOwogICAgY29uc3QgYnVmMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIpOwogICAgY29uc3QgaGFzQWxwaGEgPSBidWYzMi5zb21lKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8geCA9PiB4ID4+PiAyNCAhPT0gMHhmZiA6IHggPT4gKHggJiAweGZmKSAhPT0gMHhmZik7CiAgICBpZiAoaGFzQWxwaGEpIHsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJ3aGl0ZSI7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOwogICAgfQogICAgY29uc3QganBlZ0J1ZmZlclByb21pc2UgPSBjYW52YXMuY29udmVydFRvQmxvYih7CiAgICAgIHR5cGU6ICJpbWFnZS9qcGVnIiwKICAgICAgcXVhbGl0eTogMQogICAgfSkudGhlbihibG9iID0+IGJsb2IuYXJyYXlCdWZmZXIoKSk7CiAgICBjb25zdCB4b2JqZWN0TmFtZSA9IE5hbWUuZ2V0KCJYT2JqZWN0Iik7CiAgICBjb25zdCBpbWFnZU5hbWUgPSBOYW1lLmdldCgiSW1hZ2UiKTsKICAgIGNvbnN0IGltYWdlID0gbmV3IERpY3QoeHJlZik7CiAgICBpbWFnZS5zZXQoIlR5cGUiLCB4b2JqZWN0TmFtZSk7CiAgICBpbWFnZS5zZXQoIlN1YnR5cGUiLCBpbWFnZU5hbWUpOwogICAgaW1hZ2Uuc2V0KCJCaXRzUGVyQ29tcG9uZW50IiwgOCk7CiAgICBpbWFnZS5zZXQoIkNvbG9yU3BhY2UiLCBOYW1lLmdldCgiRGV2aWNlUkdCIikpOwogICAgaW1hZ2Uuc2V0KCJGaWx0ZXIiLCBOYW1lLmdldCgiRENURGVjb2RlIikpOwogICAgaW1hZ2Uuc2V0KCJCQm94IiwgWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTsKICAgIGltYWdlLnNldCgiV2lkdGgiLCB3aWR0aCk7CiAgICBpbWFnZS5zZXQoIkhlaWdodCIsIGhlaWdodCk7CiAgICBsZXQgc21hc2tTdHJlYW0gPSBudWxsOwogICAgaWYgKGhhc0FscGhhKSB7CiAgICAgIGNvbnN0IGFscGhhQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnVmMzIubGVuZ3RoKTsKICAgICAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgYWxwaGFCdWZmZXJbaV0gPSBidWYzMltpXSA+Pj4gMjQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ1ZjMyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGFscGhhQnVmZmVyW2ldID0gYnVmMzJbaV0gJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBzbWFzayA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBzbWFzay5zZXQoIlR5cGUiLCB4b2JqZWN0TmFtZSk7CiAgICAgIHNtYXNrLnNldCgiU3VidHlwZSIsIGltYWdlTmFtZSk7CiAgICAgIHNtYXNrLnNldCgiQml0c1BlckNvbXBvbmVudCIsIDgpOwogICAgICBzbWFzay5zZXQoIkNvbG9yU3BhY2UiLCBOYW1lLmdldCgiRGV2aWNlR3JheSIpKTsKICAgICAgc21hc2suc2V0KCJXaWR0aCIsIHdpZHRoKTsKICAgICAgc21hc2suc2V0KCJIZWlnaHQiLCBoZWlnaHQpOwogICAgICBzbWFza1N0cmVhbSA9IG5ldyBTdHJlYW0oYWxwaGFCdWZmZXIsIDAsIDAsIHNtYXNrKTsKICAgIH0KICAgIGNvbnN0IGltYWdlU3RyZWFtID0gbmV3IFN0cmVhbShhd2FpdCBqcGVnQnVmZmVyUHJvbWlzZSwgMCwgMCwgaW1hZ2UpOwogICAgcmV0dXJuIHsKICAgICAgaW1hZ2VTdHJlYW0sCiAgICAgIHNtYXNrU3RyZWFtLAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0CiAgICB9OwogIH0KICBzdGF0aWMgY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICBhcFJlZiwKICAgIGFwCiAgfSkgewogICAgY29uc3QgewogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlcgogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBzdGFtcCA9IG9sZEFubm90YXRpb24gfHwgbmV3IERpY3QoeHJlZik7CiAgICBzdGFtcC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiQW5ub3QiKSk7CiAgICBzdGFtcC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiU3RhbXAiKSk7CiAgICBzdGFtcC5zZXQob2xkQW5ub3RhdGlvbiA/ICJNIiA6ICJDcmVhdGlvbkRhdGUiLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgIHN0YW1wLnNldCgiUmVjdCIsIHJlY3QpOwogICAgc3RhbXAuc2V0KCJGIiwgNCk7CiAgICBzdGFtcC5zZXQoIkJvcmRlciIsIFswLCAwLCAwXSk7CiAgICBzdGFtcC5zZXQoIlJvdGF0ZSIsIHJvdGF0aW9uKTsKICAgIGlmICh1c2VyKSB7CiAgICAgIHN0YW1wLnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodXNlcikpOwogICAgfQogICAgaWYgKGFwUmVmIHx8IGFwKSB7CiAgICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgICAgc3RhbXAuc2V0KCJBUCIsIG4pOwogICAgICBpZiAoYXBSZWYpIHsKICAgICAgICBuLnNldCgiTiIsIGFwUmVmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuLnNldCgiTiIsIGFwKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YW1wOwogIH0KICBzdGF0aWMgYXN5bmMgI2NyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW1Gb3JEcmF3aW5nKGFubm90YXRpb24sIHhyZWYpIHsKICAgIGNvbnN0IHsKICAgICAgYXJlQ29udG91cnMsCiAgICAgIGNvbG9yLAogICAgICByZWN0LAogICAgICBsaW5lcywKICAgICAgdGhpY2tuZXNzCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGFwcGVhcmFuY2VCdWZmZXIgPSBbYCR7dGhpY2tuZXNzfSB3IDEgSiAxIGpgLCBgJHtnZXRQZGZDb2xvcihjb2xvciwgYXJlQ29udG91cnMpfWBdOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChgJHtudW1iZXJUb1N0cmluZyhsaW5lWzRdKX0gJHtudW1iZXJUb1N0cmluZyhsaW5lWzVdKX0gbWApOwogICAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHsKICAgICAgICBpZiAoaXNOYU4obGluZVtpXSkpIHsKICAgICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChgJHtudW1iZXJUb1N0cmluZyhsaW5lW2kgKyA0XSl9ICR7bnVtYmVyVG9TdHJpbmcobGluZVtpICsgNV0pfSBsYCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IFtjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHldID0gbGluZS5zbGljZShpLCBpICsgNik7CiAgICAgICAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goW2MxeCwgYzF5LCBjMngsIGMyeSwgeCwgeV0ubWFwKG51bWJlclRvU3RyaW5nKS5qb2luKCIgIikgKyAiIGMiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSA2KSB7CiAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKGxpbmVbNV0pfSBsYCk7CiAgICAgIH0KICAgIH0KICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChhcmVDb250b3VycyA/ICJGIiA6ICJTIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgY29uc3QgYXAgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpIHsKICAgIGlmIChhbm5vdGF0aW9uLm9sZEFubm90YXRpb24pIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoYW5ub3RhdGlvbi5pc1NpZ25hdHVyZSkgewogICAgICByZXR1cm4gdGhpcy4jY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbUZvckRyYXdpbmcoYW5ub3RhdGlvbiwgeHJlZik7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIHJvdGF0aW9uCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHsKICAgICAgaW1hZ2VSZWYsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH0gPSBwYXJhbXMuaW1hZ2U7CiAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgRGljdCh4cmVmKTsKICAgIGNvbnN0IHhvYmplY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIHJlc291cmNlcy5zZXQoIlhPYmplY3QiLCB4b2JqZWN0KTsKICAgIHhvYmplY3Quc2V0KCJJbTAiLCBpbWFnZVJlZik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYHEgJHt3aWR0aH0gMCAwICR7aGVpZ2h0fSAwIDAgY20gL0ltMCBEbyBRYDsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgd2lkdGgsIGhlaWdodCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlU3BlYyhkaWN0LmdldCgiRlMiKSwgeHJlZik7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEuZmlsZSA9IGZpbGUuc2VyaWFsaXphYmxlOwogICAgY29uc3QgbmFtZSA9IGRpY3QuZ2V0KCJOYW1lIik7CiAgICB0aGlzLmRhdGEubmFtZSA9IG5hbWUgaW5zdGFuY2VvZiBOYW1lID8gc3RyaW5nVG9QREZTdHJpbmcobmFtZS5uYW1lKSA6ICJQdXNoUGluIjsKICAgIGNvbnN0IGZpbGxBbHBoYSA9IGRpY3QuZ2V0KCJjYSIpOwogICAgdGhpcy5kYXRhLmZpbGxBbHBoYSA9IHR5cGVvZiBmaWxsQWxwaGEgPT09ICJudW1iZXIiICYmIGZpbGxBbHBoYSA+PSAwICYmIGZpbGxBbHBoYSA8PSAxID8gZmlsbEFscGhhIDogbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NhbGN1bGF0ZV9tZDUuanMKCmNvbnN0IFBBUkFNUyA9IHsKICBnZXQgcigpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInIiLCBuZXcgVWludDhBcnJheShbNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxXSkpOwogIH0sCiAgZ2V0IGsoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJrIiwgbmV3IEludDMyQXJyYXkoWy02ODA4NzY5MzYsIC0zODk1NjQ1ODYsIDYwNjEwNTgxOSwgLTEwNDQ1MjUzMzAsIC0xNzY0MTg4OTcsIDEyMDAwODA0MjYsIC0xNDczMjMxMzQxLCAtNDU3MDU5ODMsIDE3NzAwMzU0MTYsIC0xOTU4NDE0NDE3LCAtNDIwNjMsIC0xOTkwNDA0MTYyLCAxODA0NjAzNjgyLCAtNDAzNDExMDEsIC0xNTAyMDAyMjkwLCAxMjM2NTM1MzI5LCAtMTY1Nzk2NTEwLCAtMTA2OTUwMTYzMiwgNjQzNzE3NzEzLCAtMzczODk3MzAyLCAtNzAxNTU4NjkxLCAzODAxNjA4MywgLTY2MDQ3ODMzNSwgLTQwNTUzNzg0OCwgNTY4NDQ2NDM4LCAtMTAxOTgwMzY5MCwgLTE4NzM2Mzk2MSwgMTE2MzUzMTUwMSwgLTE0NDQ2ODE0NjcsIC01MTQwMzc4NCwgMTczNTMyODQ3MywgLTE5MjY2MDc3MzQsIC0zNzg1NTgsIC0yMDIyNTc0NDYzLCAxODM5MDMwNTYyLCAtMzUzMDk1NTYsIC0xNTMwOTkyMDYwLCAxMjcyODkzMzUzLCAtMTU1NDk3NjMyLCAtMTA5NDczMDY0MCwgNjgxMjc5MTc0LCAtMzU4NTM3MjIyLCAtNzIyNTIxOTc5LCA3NjAyOTE4OSwgLTY0MDM2NDQ4NywgLTQyMTgxNTgzNSwgNTMwNzQyNTIwLCAtOTk1MzM4NjUxLCAtMTk4NjMwODQ0LCAxMTI2ODkxNDE1LCAtMTQxNjM1NDkwNSwgLTU3NDM0MDU1LCAxNzAwNDg1NTcxLCAtMTg5NDk4NjYwNiwgLTEwNTE1MjMsIC0yMDU0OTIyNzk5LCAxODczMzEzMzU5LCAtMzA2MTE3NDQsIC0xNTYwMTk4MzgwLCAxMzA5MTUxNjQ5LCAtMTQ1NTIzMDcwLCAtMTEyMDIxMDM3OSwgNzE4Nzg3MjU5LCAtMzQzNDg1NTUxXSkpOwogIH0KfTsKZnVuY3Rpb24gY2FsY3VsYXRlTUQ1KGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CiAgbGV0IGgwID0gMTczMjU4NDE5MywKICAgIGgxID0gLTI3MTczMzg3OSwKICAgIGgyID0gLTE3MzI1ODQxOTQsCiAgICBoMyA9IDI3MTczMzg3ODsKICBjb25zdCBwYWRkZWRMZW5ndGggPSBsZW5ndGggKyA3MiAmIH42MzsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogIGxldCBpLCBqOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgfQogIHBhZGRlZFtpKytdID0gMHg4MDsKICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgaSArPSAzOwogIGNvbnN0IHcgPSBuZXcgSW50MzJBcnJheSgxNik7CiAgY29uc3QgewogICAgaywKICAgIHIKICB9ID0gUEFSQU1TOwogIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraiwgaSArPSA0KSB7CiAgICAgIHdbal0gPSBwYWRkZWRbaV0gfCBwYWRkZWRbaSArIDFdIDw8IDggfCBwYWRkZWRbaSArIDJdIDw8IDE2IHwgcGFkZGVkW2kgKyAzXSA8PCAyNDsKICAgIH0KICAgIGxldCBhID0gaDAsCiAgICAgIGIgPSBoMSwKICAgICAgYyA9IGgyLAogICAgICBkID0gaDMsCiAgICAgIGYsCiAgICAgIGc7CiAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikgewogICAgICBpZiAoaiA8IDE2KSB7CiAgICAgICAgZiA9IGIgJiBjIHwgfmIgJiBkOwogICAgICAgIGcgPSBqOwogICAgICB9IGVsc2UgaWYgKGogPCAzMikgewogICAgICAgIGYgPSBkICYgYiB8IH5kICYgYzsKICAgICAgICBnID0gNSAqIGogKyAxICYgMTU7CiAgICAgIH0gZWxzZSBpZiAoaiA8IDQ4KSB7CiAgICAgICAgZiA9IGIgXiBjIF4gZDsKICAgICAgICBnID0gMyAqIGogKyA1ICYgMTU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZiA9IGMgXiAoYiB8IH5kKTsKICAgICAgICBnID0gNyAqIGogJiAxNTsKICAgICAgfQogICAgICBjb25zdCB0bXAgPSBkLAogICAgICAgIHJvdGF0ZUFyZyA9IGEgKyBmICsga1tqXSArIHdbZ10gfCAwLAogICAgICAgIHJvdGF0ZSA9IHJbal07CiAgICAgIGQgPSBjOwogICAgICBjID0gYjsKICAgICAgYiA9IGIgKyAocm90YXRlQXJnIDw8IHJvdGF0ZSB8IHJvdGF0ZUFyZyA+Pj4gMzIgLSByb3RhdGUpIHwgMDsKICAgICAgYSA9IHRtcDsKICAgIH0KICAgIGgwID0gaDAgKyBhIHwgMDsKICAgIGgxID0gaDEgKyBiIHwgMDsKICAgIGgyID0gaDIgKyBjIHwgMDsKICAgIGgzID0gaDMgKyBkIHwgMDsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtoMCAmIDB4RkYsIGgwID4+IDggJiAweEZGLCBoMCA+PiAxNiAmIDB4RkYsIGgwID4+PiAyNCAmIDB4RkYsIGgxICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4+IDI0ICYgMHhGRiwgaDIgJiAweEZGLCBoMiA+PiA4ICYgMHhGRiwgaDIgPj4gMTYgJiAweEZGLCBoMiA+Pj4gMjQgJiAweEZGLCBoMyAmIDB4RkYsIGgzID4+IDggJiAweEZGLCBoMyA+PiAxNiAmIDB4RkYsIGgzID4+PiAyNCAmIDB4RkZdKTsKfQoKOy8vIC4vc3JjL2NvcmUvZGF0YXNldF9yZWFkZXIuanMKCgoKZnVuY3Rpb24gZGVjb2RlU3RyaW5nKHN0cikgewogIHRyeSB7CiAgICByZXR1cm4gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cik7CiAgfSBjYXRjaCAoZXgpIHsKICAgIHdhcm4oYFVURi04IGRlY29kaW5nIGZhaWxlZDogIiR7ZXh9Ii5gKTsKICAgIHJldHVybiBzdHI7CiAgfQp9CmNsYXNzIERhdGFzZXRYTUxQYXJzZXIgZXh0ZW5kcyBTaW1wbGVYTUxQYXJzZXIgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKG9wdGlvbnMpOwogICAgdGhpcy5ub2RlID0gbnVsbDsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIGNvbnN0IG5vZGUgPSBzdXBlci5vbkVuZEVsZW1lbnQobmFtZSk7CiAgICBpZiAobm9kZSAmJiBuYW1lID09PSAieGZhOmRhdGFzZXRzIikgewogICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICB0aHJvdyBuZXcgRXJyb3IoIkFib3J0aW5nIERhdGFzZXRYTUxQYXJzZXIuIik7CiAgICB9CiAgfQp9CmNsYXNzIERhdGFzZXRSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIGlmIChkYXRhLmRhdGFzZXRzKSB7CiAgICAgIHRoaXMubm9kZSA9IG5ldyBTaW1wbGVYTUxQYXJzZXIoewogICAgICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICAgICAgfSkucGFyc2VGcm9tU3RyaW5nKGRhdGEuZGF0YXNldHMpLmRvY3VtZW50RWxlbWVudDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBEYXRhc2V0WE1MUGFyc2VyKHsKICAgICAgICBoYXNBdHRyaWJ1dGVzOiB0cnVlCiAgICAgIH0pOwogICAgICB0cnkgewogICAgICAgIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoZGF0YVsieGRwOnhkcCJdKTsKICAgICAgfSBjYXRjaCB7fQogICAgICB0aGlzLm5vZGUgPSBwYXJzZXIubm9kZTsKICAgIH0KICB9CiAgZ2V0VmFsdWUocGF0aCkgewogICAgaWYgKCF0aGlzLm5vZGUgfHwgIXBhdGgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZS5zZWFyY2hOb2RlKHBhcnNlWEZBUGF0aChwYXRoKSwgMCk7CiAgICBpZiAoIW5vZGUpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29uc3QgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQ7CiAgICBpZiAoZmlyc3Q/Lm5vZGVOYW1lID09PSAidmFsdWUiKSB7CiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBkZWNvZGVTdHJpbmcoY2hpbGQudGV4dENvbnRlbnQpKTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVTdHJpbmcobm9kZS50ZXh0Q29udGVudCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jYWxjdWxhdGVfc2hhX290aGVyLmpzCgpjbGFzcyBXb3JkNjQgewogIGNvbnN0cnVjdG9yKGhpZ2hJbnRlZ2VyLCBsb3dJbnRlZ2VyKSB7CiAgICB0aGlzLmhpZ2ggPSBoaWdoSW50ZWdlciB8IDA7CiAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwOwogIH0KICBhbmQod29yZCkgewogICAgdGhpcy5oaWdoICY9IHdvcmQuaGlnaDsKICAgIHRoaXMubG93ICY9IHdvcmQubG93OwogIH0KICB4b3Iod29yZCkgewogICAgdGhpcy5oaWdoIF49IHdvcmQuaGlnaDsKICAgIHRoaXMubG93IF49IHdvcmQubG93OwogIH0KICBzaGlmdFJpZ2h0KHBsYWNlcykgewogICAgaWYgKHBsYWNlcyA+PSAzMikgewogICAgICB0aGlzLmxvdyA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIC0gMzIgfCAwOwogICAgICB0aGlzLmhpZ2ggPSAwOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb3cgPSB0aGlzLmxvdyA+Pj4gcGxhY2VzIHwgdGhpcy5oaWdoIDw8IDMyIC0gcGxhY2VzOwogICAgICB0aGlzLmhpZ2ggPSB0aGlzLmhpZ2ggPj4+IHBsYWNlcyB8IDA7CiAgICB9CiAgfQogIHJvdGF0ZVJpZ2h0KHBsYWNlcykgewogICAgbGV0IGxvdywgaGlnaDsKICAgIGlmIChwbGFjZXMgJiAzMikgewogICAgICBoaWdoID0gdGhpcy5sb3c7CiAgICAgIGxvdyA9IHRoaXMuaGlnaDsKICAgIH0gZWxzZSB7CiAgICAgIGxvdyA9IHRoaXMubG93OwogICAgICBoaWdoID0gdGhpcy5oaWdoOwogICAgfQogICAgcGxhY2VzICY9IDMxOwogICAgdGhpcy5sb3cgPSBsb3cgPj4+IHBsYWNlcyB8IGhpZ2ggPDwgMzIgLSBwbGFjZXM7CiAgICB0aGlzLmhpZ2ggPSBoaWdoID4+PiBwbGFjZXMgfCBsb3cgPDwgMzIgLSBwbGFjZXM7CiAgfQogIG5vdCgpIHsKICAgIHRoaXMuaGlnaCA9IH50aGlzLmhpZ2g7CiAgICB0aGlzLmxvdyA9IH50aGlzLmxvdzsKICB9CiAgYWRkKHdvcmQpIHsKICAgIGNvbnN0IGxvd0FkZCA9ICh0aGlzLmxvdyA+Pj4gMCkgKyAod29yZC5sb3cgPj4+IDApOwogICAgbGV0IGhpZ2hBZGQgPSAodGhpcy5oaWdoID4+PiAwKSArICh3b3JkLmhpZ2ggPj4+IDApOwogICAgaWYgKGxvd0FkZCA+IDB4ZmZmZmZmZmYpIHsKICAgICAgaGlnaEFkZCArPSAxOwogICAgfQogICAgdGhpcy5sb3cgPSBsb3dBZGQgfCAwOwogICAgdGhpcy5oaWdoID0gaGlnaEFkZCB8IDA7CiAgfQogIGNvcHlUbyhieXRlcywgb2Zmc2V0KSB7CiAgICBieXRlc1tvZmZzZXRdID0gdGhpcy5oaWdoID4+PiAyNCAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyAxXSA9IHRoaXMuaGlnaCA+PiAxNiAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyAyXSA9IHRoaXMuaGlnaCA+PiA4ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDNdID0gdGhpcy5oaWdoICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDRdID0gdGhpcy5sb3cgPj4+IDI0ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDVdID0gdGhpcy5sb3cgPj4gMTYgJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgNl0gPSB0aGlzLmxvdyA+PiA4ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDddID0gdGhpcy5sb3cgJiAweGZmOwogIH0KICBhc3NpZ24od29yZCkgewogICAgdGhpcy5oaWdoID0gd29yZC5oaWdoOwogICAgdGhpcy5sb3cgPSB3b3JkLmxvdzsKICB9Cn0KY29uc3QgY2FsY3VsYXRlX3NoYV9vdGhlcl9QQVJBTVMgPSB7CiAgZ2V0IGsoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJrIiwgW25ldyBXb3JkNjQoMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiksIG5ldyBXb3JkNjQoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksIG5ldyBXb3JkNjQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBXb3JkNjQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksIG5ldyBXb3JkNjQoMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCksIG5ldyBXb3JkNjQoMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSksIG5ldyBXb3JkNjQoMHg5MjNmODJhNCwgMHhhZjE5NGY5YiksIG5ldyBXb3JkNjQoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksIG5ldyBXb3JkNjQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBXb3JkNjQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksIG5ldyBXb3JkNjQoMHgyNDMxODViZSwgMHg0ZWU0YjI4YyksIG5ldyBXb3JkNjQoMHg1NTBjN2RjMywgMHhkNWZmYjRlMiksIG5ldyBXb3JkNjQoMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiksIG5ldyBXb3JkNjQoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksIG5ldyBXb3JkNjQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBXb3JkNjQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksIG5ldyBXb3JkNjQoMHhlNDliNjljMSwgMHg5ZWYxNGFkMiksIG5ldyBXb3JkNjQoMHhlZmJlNDc4NiwgMHgzODRmMjVlMyksIG5ldyBXb3JkNjQoMHgwZmMxOWRjNiwgMHg4YjhjZDViNSksIG5ldyBXb3JkNjQoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksIG5ldyBXb3JkNjQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBXb3JkNjQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksIG5ldyBXb3JkNjQoMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCksIG5ldyBXb3JkNjQoMHg3NmY5ODhkYSwgMHg4MzExNTNiNSksIG5ldyBXb3JkNjQoMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiksIG5ldyBXb3JkNjQoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksIG5ldyBXb3JkNjQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBXb3JkNjQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksIG5ldyBXb3JkNjQoMHhjNmUwMGJmMywgMHgzZGE4OGZjMiksIG5ldyBXb3JkNjQoMHhkNWE3OTE0NywgMHg5MzBhYTcyNSksIG5ldyBXb3JkNjQoMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiksIG5ldyBXb3JkNjQoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksIG5ldyBXb3JkNjQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBXb3JkNjQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksIG5ldyBXb3JkNjQoMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCksIG5ldyBXb3JkNjQoMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiksIG5ldyBXb3JkNjQoMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSksIG5ldyBXb3JkNjQoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksIG5ldyBXb3JkNjQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBXb3JkNjQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksIG5ldyBXb3JkNjQoMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCksIG5ldyBXb3JkNjQoMHhhODFhNjY0YiwgMHhiYzQyMzAwMSksIG5ldyBXb3JkNjQoMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSksIG5ldyBXb3JkNjQoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksIG5ldyBXb3JkNjQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBXb3JkNjQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksIG5ldyBXb3JkNjQoMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSksIG5ldyBXb3JkNjQoMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCksIG5ldyBXb3JkNjQoMHgxOWE0YzExNiwgMHhiOGQyZDBjOCksIG5ldyBXb3JkNjQoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksIG5ldyBXb3JkNjQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBXb3JkNjQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksIG5ldyBXb3JkNjQoMHgzOTFjMGNiMywgMHhjNWM5NWE2MyksIG5ldyBXb3JkNjQoMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiksIG5ldyBXb3JkNjQoMHg1YjljY2E0ZiwgMHg3NzYzZTM3MyksIG5ldyBXb3JkNjQoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksIG5ldyBXb3JkNjQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBXb3JkNjQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksIG5ldyBXb3JkNjQoMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiksIG5ldyBXb3JkNjQoMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyksIG5ldyBXb3JkNjQoMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCksIG5ldyBXb3JkNjQoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksIG5ldyBXb3JkNjQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBXb3JkNjQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksIG5ldyBXb3JkNjQoMHhjYTI3M2VjZSwgMHhlYTI2NjE5YyksIG5ldyBXb3JkNjQoMHhkMTg2YjhjNywgMHgyMWMwYzIwNyksIG5ldyBXb3JkNjQoMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSksIG5ldyBXb3JkNjQoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksIG5ldyBXb3JkNjQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBXb3JkNjQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksIG5ldyBXb3JkNjQoMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSksIG5ldyBXb3JkNjQoMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiksIG5ldyBXb3JkNjQoMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCksIG5ldyBXb3JkNjQoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksIG5ldyBXb3JkNjQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBXb3JkNjQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksIG5ldyBXb3JkNjQoMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiksIG5ldyBXb3JkNjQoMHg1OTdmMjk5YywgMHhmYzY1N2UyYSksIG5ldyBXb3JkNjQoMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYyksIG5ldyBXb3JkNjQoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNyldKTsKICB9Cn07CmZ1bmN0aW9uIGNoKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CiAgcmVzdWx0LmFzc2lnbih4KTsKICByZXN1bHQuYW5kKHkpOwogIHRtcC5hc3NpZ24oeCk7CiAgdG1wLm5vdCgpOwogIHRtcC5hbmQoeik7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIG1haihyZXN1bHQsIHgsIHksIHosIHRtcCkgewogIHJlc3VsdC5hc3NpZ24oeCk7CiAgcmVzdWx0LmFuZCh5KTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5hbmQoeik7CiAgcmVzdWx0Lnhvcih0bXApOwogIHRtcC5hc3NpZ24oeSk7CiAgdG1wLmFuZCh6KTsKICByZXN1bHQueG9yKHRtcCk7Cn0KZnVuY3Rpb24gc2lnbWEocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgyOCk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoMzQpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5yb3RhdGVSaWdodCgzOSk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIHNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgxNCk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoMTgpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5yb3RhdGVSaWdodCg0MSk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIGxpdHRsZVNpZ21hKHJlc3VsdCwgeCwgdG1wKSB7CiAgcmVzdWx0LmFzc2lnbih4KTsKICByZXN1bHQucm90YXRlUmlnaHQoMSk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoOCk7CiAgcmVzdWx0Lnhvcih0bXApOwogIHRtcC5hc3NpZ24oeCk7CiAgdG1wLnNoaWZ0UmlnaHQoNyk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgxOSk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoNjEpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5zaGlmdFJpZ2h0KDYpOwogIHJlc3VsdC54b3IodG1wKTsKfQpmdW5jdGlvbiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIG1vZGUzODQgPSBmYWxzZSkgewogIGxldCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDc7CiAgaWYgKCFtb2RlMzg0KSB7CiAgICBoMCA9IG5ldyBXb3JkNjQoMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCk7CiAgICBoMSA9IG5ldyBXb3JkNjQoMHhiYjY3YWU4NSwgMHg4NGNhYTczYik7CiAgICBoMiA9IG5ldyBXb3JkNjQoMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYik7CiAgICBoMyA9IG5ldyBXb3JkNjQoMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSk7CiAgICBoNCA9IG5ldyBXb3JkNjQoMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSk7CiAgICBoNSA9IG5ldyBXb3JkNjQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZik7CiAgICBoNiA9IG5ldyBXb3JkNjQoMHgxZjgzZDlhYiwgMHhmYjQxYmQ2Yik7CiAgICBoNyA9IG5ldyBXb3JkNjQoMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSk7CiAgfSBlbHNlIHsKICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTsKICAgIGgxID0gbmV3IFdvcmQ2NCgweDYyOWEyOTJhLCAweDM2N2NkNTA3KTsKICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTsKICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTsKICAgIGg0ID0gbmV3IFdvcmQ2NCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKTsKICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTsKICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTsKICAgIGg3ID0gbmV3IFdvcmQ2NCgweDQ3YjU0ODFkLCAweGJlZmE0ZmE0KTsKICB9CiAgY29uc3QgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyAxNykgLyAxMjgpICogMTI4OwogIGNvbnN0IHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKICB9CiAgcGFkZGVkW2krK10gPSAweDgwOwogIGNvbnN0IG4gPSBwYWRkZWRMZW5ndGggLSAxNjsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBpICs9IDExOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICBjb25zdCB3ID0gbmV3IEFycmF5KDgwKTsKICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykgewogICAgd1tpXSA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgfQogIGNvbnN0IHsKICAgIGsKICB9ID0gY2FsY3VsYXRlX3NoYV9vdGhlcl9QQVJBTVM7CiAgbGV0IGEgPSBuZXcgV29yZDY0KDAsIDApLAogICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICBjID0gbmV3IFdvcmQ2NCgwLCAwKTsKICBsZXQgZCA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICBlID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIGYgPSBuZXcgV29yZDY0KDAsIDApOwogIGxldCBnID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIGggPSBuZXcgV29yZDY0KDAsIDApOwogIGNvbnN0IHQxID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIHQyID0gbmV3IFdvcmQ2NCgwLCAwKTsKICBjb25zdCB0bXAxID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIHRtcDIgPSBuZXcgV29yZDY0KDAsIDApOwogIGxldCB0bXAzOwogIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICB3W2pdLmhpZ2ggPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKICAgICAgd1tqXS5sb3cgPSBwYWRkZWRbaSArIDRdIDw8IDI0IHwgcGFkZGVkW2kgKyA1XSA8PCAxNiB8IHBhZGRlZFtpICsgNl0gPDwgOCB8IHBhZGRlZFtpICsgN107CiAgICAgIGkgKz0gODsKICAgIH0KICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikgewogICAgICB0bXAzID0gd1tqXTsKICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7CiAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTsKICAgICAgbGl0dGxlU2lnbWEodG1wMSwgd1tqIC0gMTVdLCB0bXAyKTsKICAgICAgdG1wMy5hZGQodG1wMSk7CiAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7CiAgICB9CiAgICBhLmFzc2lnbihoMCk7CiAgICBiLmFzc2lnbihoMSk7CiAgICBjLmFzc2lnbihoMik7CiAgICBkLmFzc2lnbihoMyk7CiAgICBlLmFzc2lnbihoNCk7CiAgICBmLmFzc2lnbihoNSk7CiAgICBnLmFzc2lnbihoNik7CiAgICBoLmFzc2lnbihoNyk7CiAgICBmb3IgKGogPSAwOyBqIDwgODA7ICsraikgewogICAgICB0MS5hc3NpZ24oaCk7CiAgICAgIHNpZ21hUHJpbWUodG1wMSwgZSwgdG1wMik7CiAgICAgIHQxLmFkZCh0bXAxKTsKICAgICAgY2godG1wMSwgZSwgZiwgZywgdG1wMik7CiAgICAgIHQxLmFkZCh0bXAxKTsKICAgICAgdDEuYWRkKGtbal0pOwogICAgICB0MS5hZGQod1tqXSk7CiAgICAgIHNpZ21hKHQyLCBhLCB0bXAyKTsKICAgICAgbWFqKHRtcDEsIGEsIGIsIGMsIHRtcDIpOwogICAgICB0Mi5hZGQodG1wMSk7CiAgICAgIHRtcDMgPSBoOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBkLmFkZCh0MSk7CiAgICAgIGUgPSBkOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhOwogICAgICB0bXAzLmFzc2lnbih0MSk7CiAgICAgIHRtcDMuYWRkKHQyKTsKICAgICAgYSA9IHRtcDM7CiAgICB9CiAgICBoMC5hZGQoYSk7CiAgICBoMS5hZGQoYik7CiAgICBoMi5hZGQoYyk7CiAgICBoMy5hZGQoZCk7CiAgICBoNC5hZGQoZSk7CiAgICBoNS5hZGQoZik7CiAgICBoNi5hZGQoZyk7CiAgICBoNy5hZGQoaCk7CiAgfQogIGxldCByZXN1bHQ7CiAgaWYgKCFtb2RlMzg0KSB7CiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg2NCk7CiAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOwogICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOwogICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgaDUuY29weVRvKHJlc3VsdCwgNDApOwogICAgaDYuY29weVRvKHJlc3VsdCwgNDgpOwogICAgaDcuY29weVRvKHJlc3VsdCwgNTYpOwogIH0gZWxzZSB7CiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg0OCk7CiAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOwogICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOwogICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgaDUuY29weVRvKHJlc3VsdCwgNDApOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTM4NChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgewogIHJldHVybiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOwp9Cgo7Ly8gLi9zcmMvY29yZS9jYWxjdWxhdGVfc2hhMjU2LmpzCgpjb25zdCBjYWxjdWxhdGVfc2hhMjU2X1BBUkFNUyA9IHsKICBnZXQgaygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImsiLCBbMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCwgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NywgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMl0pOwogIH0KfTsKZnVuY3Rpb24gcm90cih4LCBuKSB7CiAgcmV0dXJuIHggPj4+IG4gfCB4IDw8IDMyIC0gbjsKfQpmdW5jdGlvbiBjYWxjdWxhdGVfc2hhMjU2X2NoKHgsIHksIHopIHsKICByZXR1cm4geCAmIHkgXiB+eCAmIHo7Cn0KZnVuY3Rpb24gY2FsY3VsYXRlX3NoYTI1Nl9tYWooeCwgeSwgeikgewogIHJldHVybiB4ICYgeSBeIHggJiB6IF4geSAmIHo7Cn0KZnVuY3Rpb24gY2FsY3VsYXRlX3NoYTI1Nl9zaWdtYSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgMikgXiByb3RyKHgsIDEzKSBeIHJvdHIoeCwgMjIpOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfc2lnbWFQcmltZSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgNikgXiByb3RyKHgsIDExKSBeIHJvdHIoeCwgMjUpOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfbGl0dGxlU2lnbWEoeCkgewogIHJldHVybiByb3RyKHgsIDcpIF4gcm90cih4LCAxOCkgXiB4ID4+PiAzOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfbGl0dGxlU2lnbWFQcmltZSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgMTcpIF4gcm90cih4LCAxOSkgXiB4ID4+PiAxMDsKfQpmdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTYoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHsKICBsZXQgaDAgPSAweDZhMDllNjY3LAogICAgaDEgPSAweGJiNjdhZTg1LAogICAgaDIgPSAweDNjNmVmMzcyLAogICAgaDMgPSAweGE1NGZmNTNhLAogICAgaDQgPSAweDUxMGU1MjdmLAogICAgaDUgPSAweDliMDU2ODhjLAogICAgaDYgPSAweDFmODNkOWFiLAogICAgaDcgPSAweDViZTBjZDE5OwogIGNvbnN0IHBhZGRlZExlbmd0aCA9IE1hdGguY2VpbCgobGVuZ3RoICsgOSkgLyA2NCkgKiA2NDsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogIGxldCBpLCBqOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgfQogIHBhZGRlZFtpKytdID0gMHg4MDsKICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBpICs9IDM7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4+IDI5ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAyMSAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMTMgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDUgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoIDw8IDMgJiAweGZmOwogIGNvbnN0IHcgPSBuZXcgVWludDMyQXJyYXkoNjQpOwogIGNvbnN0IHsKICAgIGsKICB9ID0gY2FsY3VsYXRlX3NoYTI1Nl9QQVJBTVM7CiAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHdbal0gPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKICAgICAgaSArPSA0OwogICAgfQogICAgZm9yIChqID0gMTY7IGogPCA2NDsgKytqKSB7CiAgICAgIHdbal0gPSBjYWxjdWxhdGVfc2hhMjU2X2xpdHRsZVNpZ21hUHJpbWUod1tqIC0gMl0pICsgd1tqIC0gN10gKyBjYWxjdWxhdGVfc2hhMjU2X2xpdHRsZVNpZ21hKHdbaiAtIDE1XSkgKyB3W2ogLSAxNl0gfCAwOwogICAgfQogICAgbGV0IGEgPSBoMCwKICAgICAgYiA9IGgxLAogICAgICBjID0gaDIsCiAgICAgIGQgPSBoMywKICAgICAgZSA9IGg0LAogICAgICBmID0gaDUsCiAgICAgIGcgPSBoNiwKICAgICAgaCA9IGg3LAogICAgICB0MSwKICAgICAgdDI7CiAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikgewogICAgICB0MSA9IGggKyBjYWxjdWxhdGVfc2hhMjU2X3NpZ21hUHJpbWUoZSkgKyBjYWxjdWxhdGVfc2hhMjU2X2NoKGUsIGYsIGcpICsga1tqXSArIHdbal07CiAgICAgIHQyID0gY2FsY3VsYXRlX3NoYTI1Nl9zaWdtYShhKSArIGNhbGN1bGF0ZV9zaGEyNTZfbWFqKGEsIGIsIGMpOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBlID0gZCArIHQxIHwgMDsKICAgICAgZCA9IGM7CiAgICAgIGMgPSBiOwogICAgICBiID0gYTsKICAgICAgYSA9IHQxICsgdDIgfCAwOwogICAgfQogICAgaDAgPSBoMCArIGEgfCAwOwogICAgaDEgPSBoMSArIGIgfCAwOwogICAgaDIgPSBoMiArIGMgfCAwOwogICAgaDMgPSBoMyArIGQgfCAwOwogICAgaDQgPSBoNCArIGUgfCAwOwogICAgaDUgPSBoNSArIGYgfCAwOwogICAgaDYgPSBoNiArIGcgfCAwOwogICAgaDcgPSBoNyArIGggfCAwOwogIH0KICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2gwID4+IDI0ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgJiAweEZGLCBoMSA+PiAyNCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxICYgMHhGRiwgaDIgPj4gMjQgJiAweEZGLCBoMiA+PiAxNiAmIDB4RkYsIGgyID4+IDggJiAweEZGLCBoMiAmIDB4RkYsIGgzID4+IDI0ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgJiAweEZGLCBoNCA+PiAyNCAmIDB4RkYsIGg0ID4+IDE2ICYgMHhGRiwgaDQgPj4gOCAmIDB4RkYsIGg0ICYgMHhGRiwgaDUgPj4gMjQgJiAweEZGLCBoNSA+PiAxNiAmIDB4RkYsIGg1ID4+IDggJiAweEZGLCBoNSAmIDB4RkYsIGg2ID4+IDI0ICYgMHhGRiwgaDYgPj4gMTYgJiAweEZGLCBoNiA+PiA4ICYgMHhGRiwgaDYgJiAweEZGLCBoNyA+PiAyNCAmIDB4RkYsIGg3ID4+IDE2ICYgMHhGRiwgaDcgPj4gOCAmIDB4RkYsIGg3ICYgMHhGRl0pOwp9Cgo7Ly8gLi9zcmMvY29yZS9kZWNyeXB0X3N0cmVhbS5qcwoKY29uc3QgY2h1bmtTaXplID0gNTEyOwpjbGFzcyBEZWNyeXB0U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBkZWNyeXB0KSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgdGhpcy5kZWNyeXB0ID0gZGVjcnlwdDsKICAgIHRoaXMubmV4dENodW5rID0gbnVsbDsKICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgbGV0IGNodW5rOwogICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHsKICAgICAgY2h1bmsgPSB0aGlzLm5leHRDaHVuazsKICAgIH0gZWxzZSB7CiAgICAgIGNodW5rID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoY2h1bmtTaXplKTsKICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CiAgICB9CiAgICBpZiAoIWNodW5rPy5sZW5ndGgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLm5leHRDaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CiAgICBjb25zdCBoYXNNb3JlRGF0YSA9IHRoaXMubmV4dENodW5rPy5sZW5ndGggPiAwOwogICAgY29uc3QgZGVjcnlwdCA9IHRoaXMuZGVjcnlwdDsKICAgIGNodW5rID0gZGVjcnlwdChjaHVuaywgIWhhc01vcmVEYXRhKTsKICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoLAogICAgICBuZXdMZW5ndGggPSBidWZmZXJMZW5ndGggKyBjaHVuay5sZW5ndGgsCiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jcnlwdG8uanMKCgoKCgoKY2xhc3MgQVJDRm91ckNpcGhlciB7CiAgY29uc3RydWN0b3Ioa2V5KSB7CiAgICB0aGlzLmEgPSAwOwogICAgdGhpcy5iID0gMDsKICAgIGNvbnN0IHMgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgY29uc3Qga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgc1tpXSA9IGk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICBjb25zdCB0bXAgPSBzW2ldOwogICAgICBqID0gaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSAmIDB4ZmY7CiAgICAgIHNbaV0gPSBzW2pdOwogICAgICBzW2pdID0gdG1wOwogICAgfQogICAgdGhpcy5zID0gczsKICB9CiAgZW5jcnlwdEJsb2NrKGRhdGEpIHsKICAgIGxldCBhID0gdGhpcy5hLAogICAgICBiID0gdGhpcy5iOwogICAgY29uc3QgcyA9IHRoaXMuczsKICAgIGNvbnN0IG4gPSBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgYSA9IGEgKyAxICYgMHhmZjsKICAgICAgY29uc3QgdG1wID0gc1thXTsKICAgICAgYiA9IGIgKyB0bXAgJiAweGZmOwogICAgICBjb25zdCB0bXAyID0gc1tiXTsKICAgICAgc1thXSA9IHRtcDI7CiAgICAgIHNbYl0gPSB0bXA7CiAgICAgIG91dHB1dFtpXSA9IGRhdGFbaV0gXiBzW3RtcCArIHRtcDIgJiAweGZmXTsKICAgIH0KICAgIHRoaXMuYSA9IGE7CiAgICB0aGlzLmIgPSBiOwogICAgcmV0dXJuIG91dHB1dDsKICB9CiAgZGVjcnlwdEJsb2NrKGRhdGEpIHsKICAgIHJldHVybiB0aGlzLmVuY3J5cHRCbG9jayhkYXRhKTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZGF0YSk7CiAgfQp9CmNsYXNzIE51bGxDaXBoZXIgewogIGRlY3J5cHRCbG9jayhkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KY2xhc3MgQUVTQmFzZUNpcGhlciB7CiAgX3MgPSBuZXcgVWludDhBcnJheShbMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwgMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwgMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwgMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwgMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwgMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwgMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNl0pOwogIF9pbnZfcyA9IG5ldyBVaW50OEFycmF5KFsweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkLCAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLCAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhLCAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LCAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLCAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlLCAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwLCAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LCAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLCAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkXSk7CiAgX21peCA9IG5ldyBVaW50MzJBcnJheShbMHgwMDAwMDAwMCwgMHgwZTA5MGQwYiwgMHgxYzEyMWExNiwgMHgxMjFiMTcxZCwgMHgzODI0MzQyYywgMHgzNjJkMzkyNywgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSwgMHg0ODZjNWM3NCwgMHg0NjY1NTE3ZiwgMHg1NDdlNDY2MiwgMHg1YTc3NGI2OSwgMHhlMDkwZDBiMCwgMHhlZTk5ZGRiYiwgMHhmYzgyY2FhNiwgMHhmMjhiYzdhZCwgMHhkOGI0ZTQ5YywgMHhkNmJkZTk5NywgMHhjNGE2ZmU4YSwgMHhjYWFmZjM4MSwgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZiwgMHhiNGVlOTZkMiwgMHhiYWU3OWJkOSwgMHhkYjNiYmI3YiwgMHhkNTMyYjY3MCwgMHhjNzI5YTE2ZCwgMHhjOTIwYWM2NiwgMHhlMzFmOGY1NywgMHhlZDE2ODI1YywgMHhmZjBkOTU0MSwgMHhmMTA0OTg0YSwgMHhhYjczZDMyMywgMHhhNTdhZGUyOCwgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMiwgMHgzYmFiNmJjYiwgMHgzNWEyNjZjMCwgMHgyN2I5NzFkZCwgMHgyOWIwN2NkNiwgMHgwMzhmNWZlNywgMHgwZDg2NTJlYywgMHgxZjlkNDVmMSwgMHgxMTk0NDhmYSwgMHg0YmUzMDM5MywgMHg0NWVhMGU5OCwgMHg1N2YxMTk4NSwgMHg1OWY4MTQ4ZSwgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCwgMHhiMTY0NzdlMCwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwgMHg5YjViNTRkMSwgMHg4OTQwNDNjYywgMHg4NzQ5NGVjNywgMHhkZDNlMDVhZSwgMHhkMzM3MDhhNSwgMHhjMTJjMWZiOCwgMHhjZjI1MTJiMywgMHhlNTFhMzE4MiwgMHhlYjEzM2M4OSwgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YiwgMHg3NWMyODk2YSwgMHg3YmNiODQ2MSwgMHg2OWQwOTM3YywgMHg2N2Q5OWU3NywgMHgzZGFlZDUxZSwgMHgzM2E3ZDgxNSwgMHgyMWJjY2YwOCwgMHgyZmI1YzIwMywgMHgwNThhZTEzMiwgMHgwYjgzZWMzOSwgMHgxOTk4ZmIyNCwgMHgxNzkxZjYyZiwgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSwgMHg1MjdiZjhiNywgMHg1YzcyZjViYywgMHgwNjA1YmVkNSwgMHgwODBjYjNkZSwgMHgxYTE3YTRjMywgMHgxNDFlYTljOCwgMHgzZTIxOGFmOSwgMHgzMDI4ODdmMiwgMHgyMjMzOTBlZiwgMHgyYzNhOWRlNCwgMHg5NmRkMDYzZCwgMHg5OGQ0MGIzNiwgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYywgMHhlNjk1NmU2NSwgMHhlODljNjM2ZSwgMHhmYTg3NzQ3MywgMHhmNDhlNzk3OCwgMHhkZWIxNWE0OSwgMHhkMGI4NTc0MiwgMHhjMmEzNDA1ZiwgMHhjY2FhNGQ1NCwgMHg0MWVjZGFmNywgMHg0ZmU1ZDdmYywgMHg1ZGZlYzBlMSwgMHg1M2Y3Y2RlYSwgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCwgMHgyZGI2YThiOSwgMHgyM2JmYTViMiwgMHgwOTgwODY4MywgMHgwNzg5OGI4OCwgMHgxNTkyOWM5NSwgMHgxYjliOTE5ZSwgMHhhMTdjMGE0NywgMHhhZjc1MDc0YywgMHhiZDZlMTA1MSwgMHhiMzY3MWQ1YSwgMHg5OTU4M2U2YiwgMHg5NzUxMzM2MCwgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMiwgMHhlOTEwNTYzMywgMHhlNzE5NWIzOCwgMHhmNTAyNGMyNSwgMHhmYjBiNDEyZSwgMHg5YWQ3NjE4YywgMHg5NGRlNmM4NywgMHg4NmM1N2I5YSwgMHg4OGNjNzY5MSwgMHhhMmYzNTVhMCwgMHhhY2ZhNThhYiwgMHhiZWUxNGZiNiwgMHhiMGU4NDJiZCwgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMywgMHhjZWE5MjdlZSwgMHhjMGEwMmFlNSwgMHg3YTQ3YjEzYywgMHg3NDRlYmMzNywgMHg2NjU1YWIyYSwgMHg2ODVjYTYyMSwgMHg0MjYzODUxMCwgMHg0YzZhODgxYiwgMHg1ZTcxOWYwNiwgMHg1MDc4OTIwZCwgMHgwYTBmZDk2NCwgMHgwNDA2ZDQ2ZiwgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSwgMHhlYzlhYjcwMSwgMHhlMjkzYmEwYSwgMHhmMDg4YWQxNywgMHhmZTgxYTAxYywgMHhkNGJlODMyZCwgMHhkYWI3OGUyNiwgMHhjOGFjOTkzYiwgMHhjNmE1OTQzMCwgMHg5Y2QyZGY1OSwgMHg5MmRiZDI1MiwgMHg4MGMwYzU0ZiwgMHg4ZWM5Yzg0NCwgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSwgMHgxMDE4N2RhNywgMHgxZTExNzBhYywgMHgzNDJlNTM5ZCwgMHgzYTI3NWU5NiwgMHgyODNjNDk4YiwgMHgyNjM1NDQ4MCwgMHg3YzQyMGZlOSwgMHg3MjRiMDJlMiwgMHg2MDUwMTVmZiwgMHg2ZTU5MThmNCwgMHg0NDY2M2JjNSwgMHg0YTZmMzZjZSwgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NywgMHgwZjg1Mzg1NiwgMHgwMThjMzU1ZCwgMHgxMzk3MjI0MCwgMHgxZDllMmY0YiwgMHg0N2U5NjQyMiwgMHg0OWUwNjkyOSwgMHg1YmZiN2UzNCwgMHg1NWYyNzMzZiwgMHg3ZmNkNTAwZSwgMHg3MWM0NWQwNSwgMHg2M2RmNGExOCwgMHg2ZGQ2NDcxMywgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCwgMHhmMzA3ZjJmMCwgMHhmZDBlZmZmYiwgMHhhNzc5YjQ5MiwgMHhhOTcwYjk5OSwgMHhiYjZiYWU4NCwgMHhiNTYyYTM4ZiwgMHg5ZjVkODBiZSwgMHg5MTU0OGRiNSwgMHg4MzRmOWFhOCwgMHg4ZDQ2OTdhM10pOwogIF9taXhDb2wgPSBuZXcgVWludDhBcnJheSgyNTYpLm1hcCgoXywgaSkgPT4gaSA8IDEyOCA/IGkgPDwgMSA6IGkgPDwgMSBeIDB4MWIpOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICB0aGlzLmJ1ZmZlclBvc2l0aW9uID0gMDsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIHVucmVhY2hhYmxlKCJDYW5ub3QgY2FsbCBgX2V4cGFuZEtleWAgb24gdGhlIGJhc2UgY2xhc3MiKTsKICB9CiAgX2RlY3J5cHQoaW5wdXQsIGtleSkgewogICAgbGV0IHQsIHUsIHY7CiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHN0YXRlLnNldChpbnB1dCk7CiAgICBmb3IgKGxldCBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgfQogICAgZm9yIChsZXQgaSA9IHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiAtIDE7IGkgPj0gMTsgLS1pKSB7CiAgICAgIHQgPSBzdGF0ZVsxM107CiAgICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldOwogICAgICBzdGF0ZVs5XSA9IHN0YXRlWzVdOwogICAgICBzdGF0ZVs1XSA9IHN0YXRlWzFdOwogICAgICBzdGF0ZVsxXSA9IHQ7CiAgICAgIHQgPSBzdGF0ZVsxNF07CiAgICAgIHUgPSBzdGF0ZVsxMF07CiAgICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdOwogICAgICBzdGF0ZVsxMF0gPSBzdGF0ZVsyXTsKICAgICAgc3RhdGVbNl0gPSB0OwogICAgICBzdGF0ZVsyXSA9IHU7CiAgICAgIHQgPSBzdGF0ZVsxNV07CiAgICAgIHUgPSBzdGF0ZVsxMV07CiAgICAgIHYgPSBzdGF0ZVs3XTsKICAgICAgc3RhdGVbMTVdID0gc3RhdGVbM107CiAgICAgIHN0YXRlWzExXSA9IHQ7CiAgICAgIHN0YXRlWzddID0gdTsKICAgICAgc3RhdGVbM10gPSB2OwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBzdGF0ZVtqXSA9IHRoaXMuX2ludl9zW3N0YXRlW2pdXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykgewogICAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKICAgICAgICBjb25zdCBzMCA9IHRoaXMuX21peFtzdGF0ZVtqXV07CiAgICAgICAgY29uc3QgczEgPSB0aGlzLl9taXhbc3RhdGVbaiArIDFdXTsKICAgICAgICBjb25zdCBzMiA9IHRoaXMuX21peFtzdGF0ZVtqICsgMl1dOwogICAgICAgIGNvbnN0IHMzID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAzXV07CiAgICAgICAgdCA9IHMwIF4gczEgPj4+IDggXiBzMSA8PCAyNCBeIHMyID4+PiAxNiBeIHMyIDw8IDE2IF4gczMgPj4+IDI0IF4gczMgPDwgODsKICAgICAgICBzdGF0ZVtqXSA9IHQgPj4+IDI0ICYgMHhmZjsKICAgICAgICBzdGF0ZVtqICsgMV0gPSB0ID4+IDE2ICYgMHhmZjsKICAgICAgICBzdGF0ZVtqICsgMl0gPSB0ID4+IDggJiAweGZmOwogICAgICAgIHN0YXRlW2ogKyAzXSA9IHQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICB0ID0gc3RhdGVbMTNdOwogICAgc3RhdGVbMTNdID0gc3RhdGVbOV07CiAgICBzdGF0ZVs5XSA9IHN0YXRlWzVdOwogICAgc3RhdGVbNV0gPSBzdGF0ZVsxXTsKICAgIHN0YXRlWzFdID0gdDsKICAgIHQgPSBzdGF0ZVsxNF07CiAgICB1ID0gc3RhdGVbMTBdOwogICAgc3RhdGVbMTRdID0gc3RhdGVbNl07CiAgICBzdGF0ZVsxMF0gPSBzdGF0ZVsyXTsKICAgIHN0YXRlWzZdID0gdDsKICAgIHN0YXRlWzJdID0gdTsKICAgIHQgPSBzdGF0ZVsxNV07CiAgICB1ID0gc3RhdGVbMTFdOwogICAgdiA9IHN0YXRlWzddOwogICAgc3RhdGVbMTVdID0gc3RhdGVbM107CiAgICBzdGF0ZVsxMV0gPSB0OwogICAgc3RhdGVbN10gPSB1OwogICAgc3RhdGVbM10gPSB2OwogICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHN0YXRlW2pdID0gdGhpcy5faW52X3Nbc3RhdGVbal1dOwogICAgICBzdGF0ZVtqXSBePSBrZXlbal07CiAgICB9CiAgICByZXR1cm4gc3RhdGU7CiAgfQogIF9lbmNyeXB0KGlucHV0LCBrZXkpIHsKICAgIGNvbnN0IHMgPSB0aGlzLl9zOwogICAgbGV0IHQsIHUsIHY7CiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHN0YXRlLnNldChpbnB1dCk7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2pdOwogICAgfQogICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb247IGkrKykgewogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBzdGF0ZVtqXSA9IHNbc3RhdGVbal1dOwogICAgICB9CiAgICAgIHYgPSBzdGF0ZVsxXTsKICAgICAgc3RhdGVbMV0gPSBzdGF0ZVs1XTsKICAgICAgc3RhdGVbNV0gPSBzdGF0ZVs5XTsKICAgICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107CiAgICAgIHN0YXRlWzEzXSA9IHY7CiAgICAgIHYgPSBzdGF0ZVsyXTsKICAgICAgdSA9IHN0YXRlWzZdOwogICAgICBzdGF0ZVsyXSA9IHN0YXRlWzEwXTsKICAgICAgc3RhdGVbNl0gPSBzdGF0ZVsxNF07CiAgICAgIHN0YXRlWzEwXSA9IHY7CiAgICAgIHN0YXRlWzE0XSA9IHU7CiAgICAgIHYgPSBzdGF0ZVszXTsKICAgICAgdSA9IHN0YXRlWzddOwogICAgICB0ID0gc3RhdGVbMTFdOwogICAgICBzdGF0ZVszXSA9IHN0YXRlWzE1XTsKICAgICAgc3RhdGVbN10gPSB2OwogICAgICBzdGF0ZVsxMV0gPSB1OwogICAgICBzdGF0ZVsxNV0gPSB0OwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKICAgICAgICBjb25zdCBzMCA9IHN0YXRlW2pdOwogICAgICAgIGNvbnN0IHMxID0gc3RhdGVbaiArIDFdOwogICAgICAgIGNvbnN0IHMyID0gc3RhdGVbaiArIDJdOwogICAgICAgIGNvbnN0IHMzID0gc3RhdGVbaiArIDNdOwogICAgICAgIHQgPSBzMCBeIHMxIF4gczIgXiBzMzsKICAgICAgICBzdGF0ZVtqXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MwIF4gczFdOwogICAgICAgIHN0YXRlW2ogKyAxXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MxIF4gczJdOwogICAgICAgIHN0YXRlW2ogKyAyXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MyIF4gczNdOwogICAgICAgIHN0YXRlW2ogKyAzXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MzIF4gczBdOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBrID0gaSAqIDE2OyBqIDwgMTY7ICsraiwgKytrKSB7CiAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgICB9CiAgICB9CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gPSBzW3N0YXRlW2pdXTsKICAgIH0KICAgIHYgPSBzdGF0ZVsxXTsKICAgIHN0YXRlWzFdID0gc3RhdGVbNV07CiAgICBzdGF0ZVs1XSA9IHN0YXRlWzldOwogICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107CiAgICBzdGF0ZVsxM10gPSB2OwogICAgdiA9IHN0YXRlWzJdOwogICAgdSA9IHN0YXRlWzZdOwogICAgc3RhdGVbMl0gPSBzdGF0ZVsxMF07CiAgICBzdGF0ZVs2XSA9IHN0YXRlWzE0XTsKICAgIHN0YXRlWzEwXSA9IHY7CiAgICBzdGF0ZVsxNF0gPSB1OwogICAgdiA9IHN0YXRlWzNdOwogICAgdSA9IHN0YXRlWzddOwogICAgdCA9IHN0YXRlWzExXTsKICAgIHN0YXRlWzNdID0gc3RhdGVbMTVdOwogICAgc3RhdGVbN10gPSB2OwogICAgc3RhdGVbMTFdID0gdTsKICAgIHN0YXRlWzE1XSA9IHQ7CiAgICBmb3IgKGxldCBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH0KICBfZGVjcnlwdEJsb2NrMihkYXRhLCBmaW5hbGl6ZSkgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBsZXQgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGxldCBpdiA9IHRoaXMuaXY7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKICAgICAgKytidWZmZXJMZW5ndGg7CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHBsYWluID0gdGhpcy5fZGVjcnlwdChidWZmZXIsIHRoaXMuX2tleSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIHBsYWluW2pdIF49IGl2W2pdOwogICAgICB9CiAgICAgIGl2ID0gYnVmZmVyOwogICAgICByZXN1bHQucHVzaChwbGFpbik7CiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLml2ID0gaXY7CiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICB9CiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMTYgKiByZXN1bHQubGVuZ3RoOwogICAgaWYgKGZpbmFsaXplKSB7CiAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHJlc3VsdC5hdCgtMSk7CiAgICAgIGxldCBwc0xlbiA9IGxhc3RCbG9ja1sxNV07CiAgICAgIGlmIChwc0xlbiA8PSAxNikgewogICAgICAgIGZvciAobGV0IGkgPSAxNSwgaWkgPSAxNiAtIHBzTGVuOyBpID49IGlpOyAtLWkpIHsKICAgICAgICAgIGlmIChsYXN0QmxvY2tbaV0gIT09IHBzTGVuKSB7CiAgICAgICAgICAgIHBzTGVuID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG91dHB1dExlbmd0aCAtPSBwc0xlbjsKICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gbGFzdEJsb2NrLnN1YmFycmF5KDAsIDE2IC0gcHNMZW4pOwogICAgICB9CiAgICB9CiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7CiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQogIGRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSwgaXYgPSBudWxsKSB7CiAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBpZiAoaXYpIHsKICAgICAgdGhpcy5pdiA9IGl2OwogICAgfSBlbHNlIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGJ1ZmZlckxlbmd0aCA8IDE2ICYmIGkgPCBzb3VyY2VMZW5ndGg7ICsraSwgKytidWZmZXJMZW5ndGgpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CiAgICAgIH0KICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7CiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogICAgICB9CiAgICAgIHRoaXMuaXYgPSBidWZmZXI7CiAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KDE2KTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogICAgdGhpcy5kZWNyeXB0QmxvY2sgPSB0aGlzLl9kZWNyeXB0QmxvY2syOwogICAgcmV0dXJuIHRoaXMuZGVjcnlwdEJsb2NrKGRhdGEsIGZpbmFsaXplKTsKICB9CiAgZW5jcnlwdChkYXRhLCBpdikgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBsZXQgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGl2IHx8PSBuZXcgVWludDhBcnJheSgxNik7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKICAgICAgKytidWZmZXJMZW5ndGg7CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIGJ1ZmZlcltqXSBePSBpdltqXTsKICAgICAgfQogICAgICBjb25zdCBjaXBoZXIgPSB0aGlzLl9lbmNyeXB0KGJ1ZmZlciwgdGhpcy5fa2V5KTsKICAgICAgaXYgPSBjaXBoZXI7CiAgICAgIHJlc3VsdC5wdXNoKGNpcGhlcik7CiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLml2ID0gaXY7CiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICB9CiAgICBjb25zdCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7CiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7CiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQp9CmNsYXNzIEFFUzEyOENpcGhlciBleHRlbmRzIEFFU0Jhc2VDaXBoZXIgewogIF9yY29uID0gbmV3IFVpbnQ4QXJyYXkoWzB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGRdKTsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxMDsKICAgIHRoaXMuX2tleVNpemUgPSAxNjA7CiAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIGNvbnN0IGIgPSAxNzY7CiAgICBjb25zdCBzID0gdGhpcy5fczsKICAgIGNvbnN0IHJjb24gPSB0aGlzLl9yY29uOwogICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYik7CiAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7CiAgICBmb3IgKGxldCBqID0gMTYsIGkgPSAxOyBqIDwgYjsgKytpKSB7CiAgICAgIGxldCB0MSA9IHJlc3VsdFtqIC0gM107CiAgICAgIGxldCB0MiA9IHJlc3VsdFtqIC0gMl07CiAgICAgIGxldCB0MyA9IHJlc3VsdFtqIC0gMV07CiAgICAgIGxldCB0NCA9IHJlc3VsdFtqIC0gNF07CiAgICAgIHQxID0gc1t0MV07CiAgICAgIHQyID0gc1t0Ml07CiAgICAgIHQzID0gc1t0M107CiAgICAgIHQ0ID0gc1t0NF07CiAgICAgIHQxIF49IHJjb25baV07CiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgKytuKSB7CiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQyIF49IHJlc3VsdFtqIC0gMTZdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MyBePSByZXN1bHRbaiAtIDE2XTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpjbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxNDsKICAgIHRoaXMuX2tleVNpemUgPSAyMjQ7CiAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIGNvbnN0IGIgPSAyNDA7CiAgICBjb25zdCBzID0gdGhpcy5fczsKICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGIpOwogICAgcmVzdWx0LnNldChjaXBoZXJLZXkpOwogICAgbGV0IHIgPSAxOwogICAgbGV0IHQxLCB0MiwgdDMsIHQ0OwogICAgZm9yIChsZXQgaiA9IDMyLCBpID0gMTsgaiA8IGI7ICsraSkgewogICAgICBpZiAoaiAlIDMyID09PSAxNikgewogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgIH0gZWxzZSBpZiAoaiAlIDMyID09PSAwKSB7CiAgICAgICAgdDEgPSByZXN1bHRbaiAtIDNdOwogICAgICAgIHQyID0gcmVzdWx0W2ogLSAyXTsKICAgICAgICB0MyA9IHJlc3VsdFtqIC0gMV07CiAgICAgICAgdDQgPSByZXN1bHRbaiAtIDRdOwogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgICAgdDEgXj0gcjsKICAgICAgICBpZiAoKHIgPDw9IDEpID49IDI1NikgewogICAgICAgICAgciA9IChyIF4gMHgxYikgJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBuID0gMDsgbiA8IDQ7ICsrbikgewogICAgICAgIHJlc3VsdFtqXSA9IHQxIF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MiBePSByZXN1bHRbaiAtIDMyXTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQ0IF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KY2xhc3MgUERGQmFzZSB7CiAgX2hhc2gocGFzc3dvcmQsIGlucHV0LCB1c2VyQnl0ZXMpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYF9oYXNoYCBjYWxsZWQiKTsKICB9CiAgY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1c2VyQnl0ZXMsIG93bmVyUGFzc3dvcmQpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldChvd25lclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJWYWxpZGF0aW9uU2FsdC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CiAgICByZXR1cm4gaXNBcnJheUVxdWFsKHJlc3VsdCwgb3duZXJQYXNzd29yZCk7CiAgfQogIGNoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJQYXNzd29yZCkgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTsKICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CiAgICBoYXNoRGF0YS5zZXQodXNlclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKICAgIHJldHVybiBpc0FycmF5RXF1YWwocmVzdWx0LCB1c2VyUGFzc3dvcmQpOwogIH0KICBnZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1c2VyQnl0ZXMsIG93bmVyRW5jcnlwdGlvbikgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CiAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhvd25lckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpOwogIH0KICBnZXRVc2VyS2V5KHBhc3N3b3JkLCB1c2VyS2V5U2FsdCwgdXNlckVuY3J5cHRpb24pIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KHVzZXJLZXlTYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKICAgIGNvbnN0IGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKHVzZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9Cn0KY2xhc3MgUERGMTcgZXh0ZW5kcyBQREZCYXNlIHsKICBfaGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykgewogICAgcmV0dXJuIGNhbGN1bGF0ZVNIQTI1NihpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKTsKICB9Cn0KY2xhc3MgUERGMjAgZXh0ZW5kcyBQREZCYXNlIHsKICBfaGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykgewogICAgbGV0IGsgPSBjYWxjdWxhdGVTSEEyNTYoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCkuc3ViYXJyYXkoMCwgMzIpOwogICAgbGV0IGUgPSBbMF07CiAgICBsZXQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IDY0IHx8IGUuYXQoLTEpID4gaSAtIDMyKSB7CiAgICAgIGNvbnN0IGNvbWJpbmVkTGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoICsgay5sZW5ndGggKyB1c2VyQnl0ZXMubGVuZ3RoLAogICAgICAgIGNvbWJpbmVkQXJyYXkgPSBuZXcgVWludDhBcnJheShjb21iaW5lZExlbmd0aCk7CiAgICAgIGxldCB3cml0ZU9mZnNldCA9IDA7CiAgICAgIGNvbWJpbmVkQXJyYXkuc2V0KHBhc3N3b3JkLCB3cml0ZU9mZnNldCk7CiAgICAgIHdyaXRlT2Zmc2V0ICs9IHBhc3N3b3JkLmxlbmd0aDsKICAgICAgY29tYmluZWRBcnJheS5zZXQoaywgd3JpdGVPZmZzZXQpOwogICAgICB3cml0ZU9mZnNldCArPSBrLmxlbmd0aDsKICAgICAgY29tYmluZWRBcnJheS5zZXQodXNlckJ5dGVzLCB3cml0ZU9mZnNldCk7CiAgICAgIGNvbnN0IGsxID0gbmV3IFVpbnQ4QXJyYXkoY29tYmluZWRMZW5ndGggKiA2NCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBwb3MgPSAwOyBqIDwgNjQ7IGorKywgcG9zICs9IGNvbWJpbmVkTGVuZ3RoKSB7CiAgICAgICAgazEuc2V0KGNvbWJpbmVkQXJyYXksIHBvcyk7CiAgICAgIH0KICAgICAgY29uc3QgY2lwaGVyID0gbmV3IEFFUzEyOENpcGhlcihrLnN1YmFycmF5KDAsIDE2KSk7CiAgICAgIGUgPSBjaXBoZXIuZW5jcnlwdChrMSwgay5zdWJhcnJheSgxNiwgMzIpKTsKICAgICAgY29uc3QgcmVtYWluZGVyID0gTWF0aC5zdW1QcmVjaXNlKGUuc2xpY2UoMCwgMTYpKSAlIDM7CiAgICAgIGlmIChyZW1haW5kZXIgPT09IDApIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMjU2KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDEpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMzg0KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDIpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBNTEyKGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfQogICAgICBpKys7CiAgICB9CiAgICByZXR1cm4gay5zdWJhcnJheSgwLCAzMik7CiAgfQp9CmNsYXNzIENpcGhlclRyYW5zZm9ybSB7CiAgY29uc3RydWN0b3Ioc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsIHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKSB7CiAgICB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yID0gc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7CiAgICB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yID0gc3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I7CiAgfQogIGNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCkgewogICAgY29uc3QgY2lwaGVyID0gbmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IoKTsKICAgIHJldHVybiBuZXcgRGVjcnlwdFN0cmVhbShzdHJlYW0sIGxlbmd0aCwgZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRGVjcnlwdFN0cmVhbShkYXRhLCBmaW5hbGl6ZSkgewogICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CiAgICB9KTsKICB9CiAgZGVjcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgbGV0IGRhdGEgPSBzdHJpbmdUb0J5dGVzKHMpOwogICAgZGF0YSA9IGNpcGhlci5kZWNyeXB0QmxvY2soZGF0YSwgdHJ1ZSk7CiAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhkYXRhKTsKICB9CiAgZW5jcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHsKICAgICAgY29uc3Qgc3RyTGVuID0gcy5sZW5ndGg7CiAgICAgIGNvbnN0IHBhZCA9IDE2IC0gc3RyTGVuICUgMTY7CiAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYWQpLnJlcGVhdChwYWQpOwogICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpdik7CiAgICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgICAgZGF0YSA9IGNpcGhlci5lbmNyeXB0KGRhdGEsIGl2KTsKICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBkYXRhLmxlbmd0aCk7CiAgICAgIGJ1Zi5zZXQoaXYpOwogICAgICBidWYuc2V0KGRhdGEsIDE2KTsKICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTsKICAgIH0KICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhKTsKICAgIHJldHVybiBieXRlc1RvU3RyaW5nKGRhdGEpOwogIH0KfQpjbGFzcyBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5IHsKICBzdGF0aWMgZ2V0IF9kZWZhdWx0UGFzc3dvcmRCeXRlcygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9kZWZhdWx0UGFzc3dvcmRCeXRlcyIsIG5ldyBVaW50OEFycmF5KFsweDI4LCAweGJmLCAweDRlLCAweDVlLCAweDRlLCAweDc1LCAweDhhLCAweDQxLCAweDY0LCAweDAwLCAweDRlLCAweDU2LCAweGZmLCAweGZhLCAweDAxLCAweDA4LCAweDJlLCAweDJlLCAweDAwLCAweGI2LCAweGQwLCAweDY4LCAweDNlLCAweDgwLCAweDJmLCAweDBjLCAweGE5LCAweGZlLCAweDY0LCAweDUzLCAweDY5LCAweDdhXSkpOwogIH0KICAjY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIHVzZXJQYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyS2V5U2FsdCwgb3duZXJFbmNyeXB0aW9uLCB1c2VyRW5jcnlwdGlvbiwgcGVybXMpIHsKICAgIGlmIChwYXNzd29yZCkgewogICAgICBjb25zdCBwYXNzd29yZExlbmd0aCA9IE1hdGgubWluKDEyNywgcGFzc3dvcmQubGVuZ3RoKTsKICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZC5zdWJhcnJheSgwLCBwYXNzd29yZExlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICBwYXNzd29yZCA9IFtdOwogICAgfQogICAgY29uc3QgcGRmQWxnb3JpdGhtID0gcmV2aXNpb24gPT09IDYgPyBuZXcgUERGMjAoKSA6IG5ldyBQREYxNygpOwogICAgaWYgKHBkZkFsZ29yaXRobS5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpKSB7CiAgICAgIHJldHVybiBwZGZBbGdvcml0aG0uZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKTsKICAgIH0gZWxzZSBpZiAocGFzc3dvcmQubGVuZ3RoICYmIHBkZkFsZ29yaXRobS5jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVCeXRlcywgb3duZXJQYXNzd29yZCkpIHsKICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIG93bmVyRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgI3ByZXBhcmVLZXlEYXRhKGZpbGVJZCwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSkgewogICAgY29uc3QgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KGhhc2hEYXRhU2l6ZSk7CiAgICBsZXQgaSA9IDAsCiAgICAgIGosCiAgICAgIG47CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgICBmb3IgKDsgaSA8IG47ICsraSkgewogICAgICAgIGhhc2hEYXRhW2ldID0gcGFzc3dvcmRbaV07CiAgICAgIH0KICAgIH0KICAgIGogPSAwOwogICAgd2hpbGUgKGkgPCAzMikgewogICAgICBoYXNoRGF0YVtpKytdID0gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeS5fZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKICAgIH0KICAgIGhhc2hEYXRhLnNldChvd25lclBhc3N3b3JkLCBpKTsKICAgIGkgKz0gb3duZXJQYXNzd29yZC5sZW5ndGg7CiAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDggJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDE2ICYgMHhmZjsKICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyA+Pj4gMjQgJiAweGZmOwogICAgaGFzaERhdGEuc2V0KGZpbGVJZCwgaSk7CiAgICBpICs9IGZpbGVJZC5sZW5ndGg7CiAgICBpZiAocmV2aXNpb24gPj0gNCAmJiAhZW5jcnlwdE1ldGFkYXRhKSB7CiAgICAgIGhhc2hEYXRhLmZpbGwoMHhmZiwgaSwgaSArIDQpOwogICAgICBpICs9IDQ7CiAgICB9CiAgICBsZXQgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CiAgICBjb25zdCBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwga2V5TGVuZ3RoSW5CeXRlcyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBoYXNoLnN1YmFycmF5KDAsIGtleUxlbmd0aEluQnl0ZXMpOwogICAgbGV0IGNpcGhlciwgY2hlY2tEYXRhOwogICAgaWYgKHJldmlzaW9uID49IDMpIHsKICAgICAgaSA9IDA7CiAgICAgIGhhc2hEYXRhLnNldChDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Ll9kZWZhdWx0UGFzc3dvcmRCeXRlcywgaSk7CiAgICAgIGkgKz0gMzI7CiAgICAgIGhhc2hEYXRhLnNldChmaWxlSWQsIGkpOwogICAgICBpICs9IGZpbGVJZC5sZW5ndGg7CiAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOwogICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpOwogICAgICBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7CiAgICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKTsKICAgICAgZm9yIChqID0gMTsgaiA8PSAxOTsgKytqKSB7CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHsKICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBlbmNyeXB0aW9uS2V5W2tdIF4gajsKICAgICAgICB9CiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CiAgICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhjaGVja0RhdGEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihlbmNyeXB0aW9uS2V5KTsKICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Ll9kZWZhdWx0UGFzc3dvcmRCeXRlcyk7CiAgICB9CiAgICByZXR1cm4gY2hlY2tEYXRhLmV2ZXJ5KChkYXRhLCBrKSA9PiB1c2VyUGFzc3dvcmRba10gPT09IGRhdGEpID8gZW5jcnlwdGlvbktleSA6IG51bGw7CiAgfQogICNkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMzIpOwogICAgbGV0IGkgPSAwOwogICAgY29uc3QgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgZm9yICg7IGkgPCBuOyArK2kpIHsKICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTsKICAgIH0KICAgIGxldCBqID0gMDsKICAgIHdoaWxlIChpIDwgMzIpIHsKICAgICAgaGFzaERhdGFbaSsrXSA9IENpcGhlclRyYW5zZm9ybUZhY3RvcnkuX2RlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107CiAgICB9CiAgICBsZXQgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CiAgICBjb25zdCBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwgaGFzaC5sZW5ndGgpOwogICAgICB9CiAgICB9CiAgICBsZXQgY2lwaGVyLCB1c2VyUGFzc3dvcmQ7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICB1c2VyUGFzc3dvcmQgPSBvd25lclBhc3N3b3JkOwogICAgICBjb25zdCBkZXJpdmVkS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5TGVuZ3RoSW5CeXRlcyk7CiAgICAgIGZvciAoaiA9IDE5OyBqID49IDA7IGotLSkgewogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5TGVuZ3RoSW5CeXRlczsgKytrKSB7CiAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gaGFzaFtrXSBeIGo7CiAgICAgICAgfQogICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpOwogICAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sodXNlclBhc3N3b3JkKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKSk7CiAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sob3duZXJQYXNzd29yZCk7CiAgICB9CiAgICByZXR1cm4gdXNlclBhc3N3b3JkOwogIH0KICAjYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGVuY3J5cHRpb25LZXksIGlzQWVzID0gZmFsc2UpIHsKICAgIGNvbnN0IG4gPSBlbmNyeXB0aW9uS2V5Lmxlbmd0aDsKICAgIGNvbnN0IGtleSA9IG5ldyBVaW50OEFycmF5KG4gKyA5KTsKICAgIGtleS5zZXQoZW5jcnlwdGlvbktleSk7CiAgICBsZXQgaSA9IG47CiAgICBrZXlbaSsrXSA9IG51bSAmIDB4ZmY7CiAgICBrZXlbaSsrXSA9IG51bSA+PiA4ICYgMHhmZjsKICAgIGtleVtpKytdID0gbnVtID4+IDE2ICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuID4+IDggJiAweGZmOwogICAgaWYgKGlzQWVzKSB7CiAgICAgIGtleVtpKytdID0gMHg3MzsKICAgICAga2V5W2krK10gPSAweDQxOwogICAgICBrZXlbaSsrXSA9IDB4NmM7CiAgICAgIGtleVtpKytdID0gMHg1NDsKICAgIH0KICAgIGNvbnN0IGhhc2ggPSBjYWxjdWxhdGVNRDUoa2V5LCAwLCBpKTsKICAgIHJldHVybiBoYXNoLnN1YmFycmF5KDAsIE1hdGgubWluKG4gKyA1LCAxNikpOwogIH0KICAjYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihjZiwgbmFtZSwgbnVtLCBnZW4sIGtleSkgewogICAgaWYgKCEobmFtZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS4iKTsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgY3J5cHRGaWx0ZXIgPSBjZi5nZXQobmFtZS5uYW1lKTsKICAgIGNvbnN0IGNmbSA9IGNyeXB0RmlsdGVyPy5nZXQoIkNGTSIpOwogICAgaWYgKCFjZm0gfHwgY2ZtLm5hbWUgPT09ICJOb25lIikgewogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBuZXcgTnVsbENpcGhlcigpOwogICAgICB9OwogICAgfQogICAgaWYgKGNmbS5uYW1lID09PSAiVjIiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKHNlbGYuI2J1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIGZhbHNlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMiIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzEyOENpcGhlcihzZWxmLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwga2V5LCB0cnVlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMyIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgICB9OwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNyeXB0byBtZXRob2QiKTsKICB9CiAgY29uc3RydWN0b3IoZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgewogICAgY29uc3QgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIpOwogICAgaWYgKCFpc05hbWUoZmlsdGVyLCAiU3RhbmRhcmQiKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoInVua25vd24gZW5jcnlwdGlvbiBtZXRob2QiKTsKICAgIH0KICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICAgIGNvbnN0IGFsZ29yaXRobSA9IGRpY3QuZ2V0KCJWIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0gIT09IDEgJiYgYWxnb3JpdGhtICE9PSAyICYmIGFsZ29yaXRobSAhPT0gNCAmJiBhbGdvcml0aG0gIT09IDUpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpOwogICAgfQogICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CiAgICBsZXQga2V5TGVuZ3RoID0gZGljdC5nZXQoIkxlbmd0aCIpOwogICAgaWYgKCFrZXlMZW5ndGgpIHsKICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7CiAgICAgICAga2V5TGVuZ3RoID0gNDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgY2ZEaWN0ID0gZGljdC5nZXQoIkNGIik7CiAgICAgICAgY29uc3Qgc3RyZWFtQ3J5cHRvTmFtZSA9IGRpY3QuZ2V0KCJTdG1GIik7CiAgICAgICAgaWYgKGNmRGljdCBpbnN0YW5jZW9mIERpY3QgJiYgc3RyZWFtQ3J5cHRvTmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgY29uc3QgaGFuZGxlckRpY3QgPSBjZkRpY3QuZ2V0KHN0cmVhbUNyeXB0b05hbWUubmFtZSk7CiAgICAgICAgICBrZXlMZW5ndGggPSBoYW5kbGVyRGljdD8uZ2V0KCJMZW5ndGgiKSB8fCAxMjg7CiAgICAgICAgICBpZiAoa2V5TGVuZ3RoIDwgNDApIHsKICAgICAgICAgICAga2V5TGVuZ3RoIDw8PSAzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQga2V5IGxlbmd0aCIpOwogICAgfQogICAgY29uc3Qgb3duZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk8iKSksCiAgICAgIHVzZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlUiKSk7CiAgICBjb25zdCBvd25lclBhc3N3b3JkID0gb3duZXJCeXRlcy5zdWJhcnJheSgwLCAzMik7CiAgICBjb25zdCB1c2VyUGFzc3dvcmQgPSB1c2VyQnl0ZXMuc3ViYXJyYXkoMCwgMzIpOwogICAgY29uc3QgZmxhZ3MgPSBkaWN0LmdldCgiUCIpOwogICAgY29uc3QgcmV2aXNpb24gPSBkaWN0LmdldCgiUiIpOwogICAgY29uc3QgZW5jcnlwdE1ldGFkYXRhID0gKGFsZ29yaXRobSA9PT0gNCB8fCBhbGdvcml0aG0gPT09IDUpICYmIGRpY3QuZ2V0KCJFbmNyeXB0TWV0YWRhdGEiKSAhPT0gZmFsc2U7CiAgICB0aGlzLmVuY3J5cHRNZXRhZGF0YSA9IGVuY3J5cHRNZXRhZGF0YTsKICAgIGNvbnN0IGZpbGVJZEJ5dGVzID0gc3RyaW5nVG9CeXRlcyhmaWxlSWQpOwogICAgbGV0IHBhc3N3b3JkQnl0ZXM7CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgaWYgKHJldmlzaW9uID09PSA2KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHBhc3N3b3JkID0gdXRmOFN0cmluZ1RvU3RyaW5nKHBhc3N3b3JkKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHdhcm4oIkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk6IFVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC4iKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFzc3dvcmRCeXRlcyA9IHN0cmluZ1RvQnl0ZXMocGFzc3dvcmQpOwogICAgfQogICAgbGV0IGVuY3J5cHRpb25LZXk7CiAgICBpZiAoYWxnb3JpdGhtICE9PSA1KSB7CiAgICAgIGVuY3J5cHRpb25LZXkgPSB0aGlzLiNwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgcGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG93bmVyVmFsaWRhdGlvblNhbHQgPSBvd25lckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IG93bmVyS2V5U2FsdCA9IG93bmVyQnl0ZXMuc3ViYXJyYXkoNDAsIDQ4KTsKICAgICAgY29uc3QgdUJ5dGVzID0gdXNlckJ5dGVzLnN1YmFycmF5KDAsIDQ4KTsKICAgICAgY29uc3QgdXNlclZhbGlkYXRpb25TYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IHVzZXJLZXlTYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDQwLCA0OCk7CiAgICAgIGNvbnN0IG93bmVyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk9FIikpOwogICAgICBjb25zdCB1c2VyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlVFIikpOwogICAgICBjb25zdCBwZXJtcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlBlcm1zIikpOwogICAgICBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCBvd25lcktleVNhbHQsIHVCeXRlcywgdXNlclBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJLZXlTYWx0LCBvd25lckVuY3J5cHRpb24sIHVzZXJFbmNyeXB0aW9uLCBwZXJtcyk7CiAgICB9CiAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHsKICAgICAgaWYgKCFwYXNzd29yZCkgewogICAgICAgIHRocm93IG5ldyBQYXNzd29yZEV4Y2VwdGlvbigiTm8gcGFzc3dvcmQgZ2l2ZW4iLCBQYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKICAgICAgfQogICAgICBjb25zdCBkZWNvZGVkUGFzc3dvcmQgPSB0aGlzLiNkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgcmV2aXNpb24sIGtleUxlbmd0aCk7CiAgICAgIGVuY3J5cHRpb25LZXkgPSB0aGlzLiNwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgZGVjb2RlZFBhc3N3b3JkLCBvd25lclBhc3N3b3JkLCB1c2VyUGFzc3dvcmQsIGZsYWdzLCByZXZpc2lvbiwga2V5TGVuZ3RoLCBlbmNyeXB0TWV0YWRhdGEpOwogICAgfQogICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7CiAgICAgIHRocm93IG5ldyBQYXNzd29yZEV4Y2VwdGlvbigiSW5jb3JyZWN0IFBhc3N3b3JkIiwgUGFzc3dvcmRSZXNwb25zZXMuSU5DT1JSRUNUX1BBU1NXT1JEKTsKICAgIH0KICAgIGlmIChhbGdvcml0aG0gPT09IDQgJiYgZW5jcnlwdGlvbktleS5sZW5ndGggPCAxNikgewogICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIHRoaXMuZW5jcnlwdGlvbktleS5zZXQoZW5jcnlwdGlvbktleSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5OwogICAgfQogICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7CiAgICAgIGNvbnN0IGNmID0gZGljdC5nZXQoIkNGIik7CiAgICAgIGlmIChjZiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjZi5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICB9CiAgICAgIHRoaXMuY2YgPSBjZjsKICAgICAgdGhpcy5zdG1mID0gZGljdC5nZXQoIlN0bUYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5zdHJmID0gZGljdC5nZXQoIlN0ckYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldCgiRUZGIikgfHwgdGhpcy5zdG1mOwogICAgfQogIH0KICBjcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pIHsKICAgIGlmICh0aGlzLmFsZ29yaXRobSA9PT0gNCB8fCB0aGlzLmFsZ29yaXRobSA9PT0gNSkgewogICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybSh0aGlzLiNidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsIHRoaXMuc3RyZiwgbnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSksIHRoaXMuI2J1aWxkQ2lwaGVyQ29uc3RydWN0b3IodGhpcy5jZiwgdGhpcy5zdG1mLCBudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5KSk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5LCBmYWxzZSk7CiAgICBjb25zdCBjaXBoZXJDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGtleSk7CiAgICB9OwogICAgcmV0dXJuIG5ldyBDaXBoZXJUcmFuc2Zvcm0oY2lwaGVyQ29uc3RydWN0b3IsIGNpcGhlckNvbnN0cnVjdG9yKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hyZWYuanMKCgoKCgoKY2xhc3MgWFJlZiB7CiAgI2ZpcnN0WFJlZlN0bVBvcyA9IG51bGw7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBwZGZNYW5hZ2VyKSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLmVudHJpZXMgPSBbXTsKICAgIHRoaXMuX3hyZWZTdG1zID0gbmV3IFNldCgpOwogICAgdGhpcy5fY2FjaGVNYXAgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9wZW5kaW5nUmVmcyA9IG5ldyBSZWZTZXQoKTsKICAgIHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0gPSBudWxsOwogICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gbnVsbDsKICAgIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUgPSBudWxsOwogIH0KICBnZXROZXdQZXJzaXN0ZW50UmVmKG9iaikgewogICAgaWYgKHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0gPT09IG51bGwpIHsKICAgICAgdGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSA9IHRoaXMuZW50cmllcy5sZW5ndGggfHwgMTsKICAgIH0KICAgIGNvbnN0IG51bSA9IHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0rKzsKICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIG9iaik7CiAgICByZXR1cm4gUmVmLmdldChudW0sIDApOwogIH0KICBnZXROZXdUZW1wb3JhcnlSZWYoKSB7CiAgICBpZiAodGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID09PSBudWxsKSB7CiAgICAgIHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSA9IHRoaXMuZW50cmllcy5sZW5ndGggfHwgMTsKICAgICAgaWYgKHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0pIHsKICAgICAgICB0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlID0gbmV3IE1hcCgpOwogICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW07IGkgPCB0aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtOyBpKyspIHsKICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUuc2V0KGksIHRoaXMuX2NhY2hlTWFwLmdldChpKSk7CiAgICAgICAgICB0aGlzLl9jYWNoZU1hcC5kZWxldGUoaSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gUmVmLmdldCh0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0rKywgMCk7CiAgfQogIHJlc2V0TmV3VGVtcG9yYXJ5UmVmKCkgewogICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gbnVsbDsKICAgIGlmICh0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlKSB7CiAgICAgIGZvciAoY29uc3QgW251bSwgb2JqXSBvZiB0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlKSB7CiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgICAgfQogICAgfQogICAgdGhpcy5fcGVyc2lzdGVudFJlZnNDYWNoZSA9IG51bGw7CiAgfQogIHNldFN0YXJ0WFJlZihzdGFydFhSZWYpIHsKICAgIHRoaXMuc3RhcnRYUmVmUXVldWUgPSBbc3RhcnRYUmVmXTsKICB9CiAgcGFyc2UocmVjb3ZlcnlNb2RlID0gZmFsc2UpIHsKICAgIGxldCB0cmFpbGVyRGljdDsKICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CiAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5yZWFkWFJlZigpOwogICAgfSBlbHNlIHsKICAgICAgd2FybigiSW5kZXhpbmcgYWxsIFBERiBvYmplY3RzIik7CiAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5pbmRleE9iamVjdHMoKTsKICAgIH0KICAgIHRyYWlsZXJEaWN0LmFzc2lnblhyZWYodGhpcyk7CiAgICB0aGlzLnRyYWlsZXIgPSB0cmFpbGVyRGljdDsKICAgIGxldCBlbmNyeXB0OwogICAgdHJ5IHsKICAgICAgZW5jcnlwdCA9IHRyYWlsZXJEaWN0LmdldCgiRW5jcnlwdCIpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiRW5jcnlwdCIgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgfQogICAgaWYgKGVuY3J5cHQgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGlkcyA9IHRyYWlsZXJEaWN0LmdldCgiSUQiKTsKICAgICAgY29uc3QgZmlsZUlkID0gaWRzPy5sZW5ndGggPyBpZHNbMF0gOiAiIjsKICAgICAgZW5jcnlwdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICB0aGlzLmVuY3J5cHQgPSBuZXcgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShlbmNyeXB0LCBmaWxlSWQsIHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCk7CiAgICB9CiAgICBsZXQgcm9vdDsKICAgIHRyeSB7CiAgICAgIHJvb3QgPSB0cmFpbGVyRGljdC5nZXQoIlJvb3QiKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgWFJlZi5wYXJzZSAtIEludmFsaWQgIlJvb3QiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIGlmIChyb290IGluc3RhbmNlb2YgRGljdCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHBhZ2VzID0gcm9vdC5nZXQoIlBhZ2VzIik7CiAgICAgICAgaWYgKHBhZ2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICAgIHRocm93IGV4OwogICAgICAgIH0KICAgICAgICB3YXJuKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiUGFnZXMiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgICAgfQogICAgfQogICAgaWYgKCFyZWNvdmVyeU1vZGUpIHsKICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogICAgfQogICAgdGhyb3cgbmV3IEludmFsaWRQREZFeGNlcHRpb24oIkludmFsaWQgUm9vdCByZWZlcmVuY2UuIik7CiAgfQogIHByb2Nlc3NYUmVmVGFibGUocGFyc2VyKSB7CiAgICBpZiAoISgidGFibGVTdGF0ZSIgaW4gdGhpcykpIHsKICAgICAgdGhpcy50YWJsZVN0YXRlID0gewogICAgICAgIGVudHJ5TnVtOiAwLAogICAgICAgIHN0cmVhbVBvczogcGFyc2VyLmxleGVyLnN0cmVhbS5wb3MsCiAgICAgICAgcGFyc2VyQnVmMTogcGFyc2VyLmJ1ZjEsCiAgICAgICAgcGFyc2VyQnVmMjogcGFyc2VyLmJ1ZjIKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IG9iaiA9IHRoaXMucmVhZFhSZWZUYWJsZShwYXJzZXIpOwogICAgaWYgKCFpc0NtZChvYmosICJ0cmFpbGVyIikpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBmaW5kIHRyYWlsZXIgZGljdGlvbmFyeSIpOwogICAgfQogICAgbGV0IGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkgJiYgZGljdC5kaWN0KSB7CiAgICAgIGRpY3QgPSBkaWN0LmRpY3Q7CiAgICB9CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTsKICAgIH0KICAgIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGU7CiAgICByZXR1cm4gZGljdDsKICB9CiAgcmVhZFhSZWZUYWJsZShwYXJzZXIpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHBhcnNlci5sZXhlci5zdHJlYW07CiAgICBjb25zdCB0YWJsZVN0YXRlID0gdGhpcy50YWJsZVN0YXRlOwogICAgc3RyZWFtLnBvcyA9IHRhYmxlU3RhdGUuc3RyZWFtUG9zOwogICAgcGFyc2VyLmJ1ZjEgPSB0YWJsZVN0YXRlLnBhcnNlckJ1ZjE7CiAgICBwYXJzZXIuYnVmMiA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMjsKICAgIGxldCBvYmo7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoISgiZmlyc3RFbnRyeU51bSIgaW4gdGFibGVTdGF0ZSkgfHwgISgiZW50cnlDb3VudCIgaW4gdGFibGVTdGF0ZSkpIHsKICAgICAgICBpZiAoaXNDbWQob2JqID0gcGFyc2VyLmdldE9iaigpLCAidHJhaWxlciIpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtID0gb2JqOwogICAgICAgIHRhYmxlU3RhdGUuZW50cnlDb3VudCA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgfQogICAgICBsZXQgZmlyc3QgPSB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW07CiAgICAgIGNvbnN0IGNvdW50ID0gdGFibGVTdGF0ZS5lbnRyeUNvdW50OwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiB3cm9uZyB0eXBlcyBpbiBzdWJzZWN0aW9uIGhlYWRlciIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSB0YWJsZVN0YXRlLmVudHJ5TnVtOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgICB0YWJsZVN0YXRlLmVudHJ5TnVtID0gaTsKICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjEgPSBwYXJzZXIuYnVmMTsKICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjIgPSBwYXJzZXIuYnVmMjsKICAgICAgICBjb25zdCBlbnRyeSA9IHt9OwogICAgICAgIGVudHJ5Lm9mZnNldCA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBlbnRyeS5nZW4gPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENtZCkgewogICAgICAgICAgc3dpdGNoICh0eXBlLmNtZCkgewogICAgICAgICAgICBjYXNlICJmIjoKICAgICAgICAgICAgICBlbnRyeS5mcmVlID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAibiI6CiAgICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGVudHJ5Lm9mZnNldCkgfHwgIU51bWJlci5pc0ludGVnZXIoZW50cnkuZ2VuKSB8fCAhKGVudHJ5LmZyZWUgfHwgZW50cnkudW5jb21wcmVzc2VkKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluIFhSZWYgc3Vic2VjdGlvbjogJHtmaXJzdH0sICR7Y291bnR9YCk7CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSAwICYmIGVudHJ5LmZyZWUgJiYgZmlyc3QgPT09IDEpIHsKICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbaSArIGZpcnN0XSkgewogICAgICAgICAgdGhpcy5lbnRyaWVzW2kgKyBmaXJzdF0gPSBlbnRyeTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGFibGVTdGF0ZS5lbnRyeU51bSA9IDA7CiAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYxID0gcGFyc2VyLmJ1ZjE7CiAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyOwogICAgICBkZWxldGUgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtOwogICAgICBkZWxldGUgdGFibGVTdGF0ZS5lbnRyeUNvdW50OwogICAgfQogICAgaWYgKHRoaXMuZW50cmllc1swXSAmJiAhdGhpcy5lbnRyaWVzWzBdLmZyZWUpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBwcm9jZXNzWFJlZlN0cmVhbShzdHJlYW0pIHsKICAgIGlmICghKCJzdHJlYW1TdGF0ZSIgaW4gdGhpcykpIHsKICAgICAgY29uc3QgewogICAgICAgIGRpY3QsCiAgICAgICAgcG9zCiAgICAgIH0gPSBzdHJlYW07CiAgICAgIGNvbnN0IGJ5dGVXaWR0aHMgPSBkaWN0LmdldCgiVyIpOwogICAgICBjb25zdCByYW5nZSA9IGRpY3QuZ2V0KCJJbmRleCIpIHx8IFswLCBkaWN0LmdldCgiU2l6ZSIpXTsKICAgICAgdGhpcy5zdHJlYW1TdGF0ZSA9IHsKICAgICAgICBlbnRyeVJhbmdlczogcmFuZ2UsCiAgICAgICAgYnl0ZVdpZHRocywKICAgICAgICBlbnRyeU51bTogMCwKICAgICAgICBzdHJlYW1Qb3M6IHBvcwogICAgICB9OwogICAgfQogICAgdGhpcy5yZWFkWFJlZlN0cmVhbShzdHJlYW0pOwogICAgZGVsZXRlIHRoaXMuc3RyZWFtU3RhdGU7CiAgICByZXR1cm4gc3RyZWFtLmRpY3Q7CiAgfQogIHJlYWRYUmVmU3RyZWFtKHN0cmVhbSkgewogICAgY29uc3Qgc3RyZWFtU3RhdGUgPSB0aGlzLnN0cmVhbVN0YXRlOwogICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXRlLnN0cmVhbVBvczsKICAgIGNvbnN0IFt0eXBlRmllbGRXaWR0aCwgb2Zmc2V0RmllbGRXaWR0aCwgZ2VuZXJhdGlvbkZpZWxkV2lkdGhdID0gc3RyZWFtU3RhdGUuYnl0ZVdpZHRoczsKICAgIGNvbnN0IGVudHJ5UmFuZ2VzID0gc3RyZWFtU3RhdGUuZW50cnlSYW5nZXM7CiAgICB3aGlsZSAoZW50cnlSYW5nZXMubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBbZmlyc3QsIG5dID0gZW50cnlSYW5nZXM7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIobikpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiByYW5nZSBmaWVsZHM6ICR7Zmlyc3R9LCAke259YCk7CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHR5cGVGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihvZmZzZXRGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihnZW5lcmF0aW9uRmllbGRXaWR0aCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke2ZpcnN0fSwgJHtufWApOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSBzdHJlYW1TdGF0ZS5lbnRyeU51bTsgaSA8IG47ICsraSkgewogICAgICAgIHN0cmVhbVN0YXRlLmVudHJ5TnVtID0gaTsKICAgICAgICBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICAgIGxldCB0eXBlID0gMCwKICAgICAgICAgIG9mZnNldCA9IDAsCiAgICAgICAgICBnZW5lcmF0aW9uID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHR5cGVGaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IHR5cGVCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmICh0eXBlQnl0ZSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgYnl0ZVdpZHRocyAndHlwZScuIik7CiAgICAgICAgICB9CiAgICAgICAgICB0eXBlID0gdHlwZSA8PCA4IHwgdHlwZUJ5dGU7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlRmllbGRXaWR0aCA9PT0gMCkgewogICAgICAgICAgdHlwZSA9IDE7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2Zmc2V0RmllbGRXaWR0aDsgKytqKSB7CiAgICAgICAgICBjb25zdCBvZmZzZXRCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmIChvZmZzZXRCeXRlID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdvZmZzZXQnLiIpOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IDw8IDggfCBvZmZzZXRCeXRlOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGdlbmVyYXRpb25GaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IGdlbmVyYXRpb25CeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmIChnZW5lcmF0aW9uQnl0ZSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgYnl0ZVdpZHRocyAnZ2VuZXJhdGlvbicuIik7CiAgICAgICAgICB9CiAgICAgICAgICBnZW5lcmF0aW9uID0gZ2VuZXJhdGlvbiA8PCA4IHwgZ2VuZXJhdGlvbkJ5dGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVudHJ5ID0ge307CiAgICAgICAgZW50cnkub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIGVudHJ5LmdlbiA9IGdlbmVyYXRpb247CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGVudHJ5LmZyZWUgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFhSZWYgZW50cnkgdHlwZTogJHt0eXBlfWApOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tmaXJzdCArIGldKSB7CiAgICAgICAgICB0aGlzLmVudHJpZXNbZmlyc3QgKyBpXSA9IGVudHJ5OwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW1TdGF0ZS5lbnRyeU51bSA9IDA7CiAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgIGVudHJ5UmFuZ2VzLnNwbGljZSgwLCAyKTsKICAgIH0KICB9CiAgaW5kZXhPYmplY3RzKCkgewogICAgY29uc3QgVEFCID0gMHg5LAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIFNQQUNFID0gMHgyMDsKICAgIGNvbnN0IFBFUkNFTlQgPSAweDI1LAogICAgICBMVCA9IDB4M2M7CiAgICBmdW5jdGlvbiByZWFkVG9rZW4oZGF0YSwgb2Zmc2V0KSB7CiAgICAgIGxldCB0b2tlbiA9ICIiLAogICAgICAgIGNoID0gZGF0YVtvZmZzZXRdOwogICAgICB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUiAmJiBjaCAhPT0gTFQpIHsKICAgICAgICBpZiAoKytvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0b2tlbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgICBjaCA9IGRhdGFbb2Zmc2V0XTsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBmdW5jdGlvbiBza2lwVW50aWwoZGF0YSwgb2Zmc2V0LCB3aGF0KSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHdoYXQubGVuZ3RoLAogICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgICAgbGV0IHNraXBwZWQgPSAwOwogICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YUxlbmd0aCkgewogICAgICAgIGxldCBpID0gMDsKICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBkYXRhW29mZnNldCArIGldID09PSB3aGF0W2ldKSB7CiAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgICAgIGlmIChpID49IGxlbmd0aCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG9mZnNldCsrOwogICAgICAgIHNraXBwZWQrKzsKICAgICAgfQogICAgICByZXR1cm4gc2tpcHBlZDsKICAgIH0KICAgIGNvbnN0IGdFbmRvYmpSZWdFeHAgPSAvXGIoZW5kb2JqfFxkK1xzK1xkK1xzK29ianx4cmVmfHRyYWlsZXJccyo8PClcYi9nOwogICAgY29uc3QgZ1N0YXJ0eHJlZlJlZ0V4cCA9IC9cYihzdGFydHhyZWZ8XGQrXHMrXGQrXHMrb2JqKVxiL2c7CiAgICBjb25zdCBvYmpSZWdFeHAgPSAvXihcZCspXHMrKFxkKylccytvYmpcYi87CiAgICBjb25zdCB0cmFpbGVyQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE2LCAxMTQsIDk3LCAxMDUsIDEwOCwgMTAxLCAxMTRdKTsKICAgIGNvbnN0IHN0YXJ0eHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExNSwgMTE2LCA5NywgMTE0LCAxMTYsIDEyMCwgMTE0LCAxMDEsIDEwMl0pOwogICAgY29uc3QgeHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzQ3LCA4OCwgODIsIDEwMSwgMTAyXSk7CiAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKICAgIHRoaXMuX2NhY2hlTWFwLmNsZWFyKCk7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKICAgIHN0cmVhbS5wb3MgPSAwOwogICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLmdldEJ5dGVzKCksCiAgICAgIGJ1ZmZlclN0ciA9IGJ5dGVzVG9TdHJpbmcoYnVmZmVyKSwKICAgICAgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKICAgIGxldCBwb3NpdGlvbiA9IHN0cmVhbS5zdGFydDsKICAgIGNvbnN0IHRyYWlsZXJzID0gW10sCiAgICAgIHhyZWZTdG1zID0gW107CiAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKICAgICAgbGV0IGNoID0gYnVmZmVyW3Bvc2l0aW9uXTsKICAgICAgaWYgKGNoID09PSBUQUIgfHwgY2ggPT09IExGIHx8IGNoID09PSBDUiB8fCBjaCA9PT0gU1BBQ0UpIHsKICAgICAgICArK3Bvc2l0aW9uOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gUEVSQ0VOVCkgewogICAgICAgIGRvIHsKICAgICAgICAgICsrcG9zaXRpb247CiAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2ggPSBidWZmZXJbcG9zaXRpb25dOwogICAgICAgIH0gd2hpbGUgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHRva2VuID0gcmVhZFRva2VuKGJ1ZmZlciwgcG9zaXRpb24pOwogICAgICBsZXQgbTsKICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoInhyZWYiKSAmJiAodG9rZW4ubGVuZ3RoID09PSA0IHx8IC9ccy8udGVzdCh0b2tlbls0XSkpKSB7CiAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHRyYWlsZXJCeXRlcyk7CiAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7CiAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTsKICAgICAgfSBlbHNlIGlmIChtID0gb2JqUmVnRXhwLmV4ZWModG9rZW4pKSB7CiAgICAgICAgY29uc3QgbnVtID0gbVsxXSB8IDAsCiAgICAgICAgICBnZW4gPSBtWzJdIHwgMDsKICAgICAgICBjb25zdCBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOwogICAgICAgIGxldCBjb250ZW50TGVuZ3RoLAogICAgICAgICAgdXBkYXRlRW50cmllcyA9IGZhbHNlOwogICAgICAgIGlmICghdGhpcy5lbnRyaWVzW251bV0pIHsKICAgICAgICAgIHVwZGF0ZUVudHJpZXMgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbnRyaWVzW251bV0uZ2VuID09PSBnZW4pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MpKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcGFyc2VyLmdldE9iaigpOwogICAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gdHJ1ZTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhcnNlckVPRkV4Y2VwdGlvbikgewogICAgICAgICAgICAgIHdhcm4oYGluZGV4T2JqZWN0cyAtLSBjaGVja2luZyBvYmplY3QgKCR7dG9rZW59KTogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodXBkYXRlRW50cmllcykgewogICAgICAgICAgdGhpcy5lbnRyaWVzW251bV0gPSB7CiAgICAgICAgICAgIG9mZnNldDogcG9zaXRpb24gLSBzdHJlYW0uc3RhcnQsCiAgICAgICAgICAgIGdlbiwKICAgICAgICAgICAgdW5jb21wcmVzc2VkOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBnRW5kb2JqUmVnRXhwLmxhc3RJbmRleCA9IHN0YXJ0UG9zOwogICAgICAgIGNvbnN0IG1hdGNoID0gZ0VuZG9ialJlZ0V4cC5leGVjKGJ1ZmZlclN0cik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBjb25zdCBlbmRQb3MgPSBnRW5kb2JqUmVnRXhwLmxhc3RJbmRleCArIDE7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZW5kUG9zIC0gcG9zaXRpb247CiAgICAgICAgICBpZiAobWF0Y2hbMV0gIT09ICJlbmRvYmoiKSB7CiAgICAgICAgICAgIHdhcm4oYGluZGV4T2JqZWN0czogRm91bmQgIiR7bWF0Y2hbMV19IiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgYCArICdjYXVzZWQgYnkgbWlzc2luZyAiZW5kb2JqIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBtYXRjaFsxXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gbGVuZ3RoIC0gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBidWZmZXIuc3ViYXJyYXkocG9zaXRpb24sIHBvc2l0aW9uICsgY29udGVudExlbmd0aCk7CiAgICAgICAgY29uc3QgeHJlZlRhZ09mZnNldCA9IHNraXBVbnRpbChjb250ZW50LCAwLCB4cmVmQnl0ZXMpOwogICAgICAgIGlmICh4cmVmVGFnT2Zmc2V0IDwgY29udGVudExlbmd0aCAmJiBjb250ZW50W3hyZWZUYWdPZmZzZXQgKyA1XSA8IDY0KSB7CiAgICAgICAgICB4cmVmU3Rtcy5wdXNoKHBvc2l0aW9uIC0gc3RyZWFtLnN0YXJ0KTsKICAgICAgICAgIHRoaXMuX3hyZWZTdG1zLmFkZChwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CiAgICAgIH0gZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidHJhaWxlciIpICYmICh0b2tlbi5sZW5ndGggPT09IDcgfHwgL1xzLy50ZXN0KHRva2VuWzddKSkpIHsKICAgICAgICB0cmFpbGVycy5wdXNoKHBvc2l0aW9uKTsKICAgICAgICBjb25zdCBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOwogICAgICAgIGxldCBjb250ZW50TGVuZ3RoOwogICAgICAgIGdTdGFydHhyZWZSZWdFeHAubGFzdEluZGV4ID0gc3RhcnRQb3M7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBnU3RhcnR4cmVmUmVnRXhwLmV4ZWMoYnVmZmVyU3RyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIGNvbnN0IGVuZFBvcyA9IGdTdGFydHhyZWZSZWdFeHAubGFzdEluZGV4ICsgMTsKICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBlbmRQb3MgLSBwb3NpdGlvbjsKICAgICAgICAgIGlmIChtYXRjaFsxXSAhPT0gInN0YXJ0eHJlZiIpIHsKICAgICAgICAgICAgd2FybihgaW5kZXhPYmplY3RzOiBGb3VuZCAiJHttYXRjaFsxXX0iIGFmdGVyICJ0cmFpbGVyIiwgYCArICdjYXVzZWQgYnkgbWlzc2luZyAic3RhcnR4cmVmIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBtYXRjaFsxXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gbGVuZ3RoIC0gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb24gKz0gdG9rZW4ubGVuZ3RoICsgMTsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCB4cmVmU3RtIG9mIHhyZWZTdG1zKSB7CiAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaCh4cmVmU3RtKTsKICAgICAgdGhpcy5yZWFkWFJlZih0cnVlKTsKICAgIH0KICAgIGNvbnN0IHRyYWlsZXJEaWN0cyA9IFtdOwogICAgbGV0IGlzRW5jcnlwdGVkID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IHRyYWlsZXIgb2YgdHJhaWxlcnMpIHsKICAgICAgc3RyZWFtLnBvcyA9IHRyYWlsZXI7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSwKICAgICAgICByZWNvdmVyeU1vZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGNvbnN0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKCFpc0NtZChvYmosICJ0cmFpbGVyIikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBkaWN0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0cmFpbGVyRGljdHMucHVzaChkaWN0KTsKICAgICAgaWYgKGRpY3QuaGFzKCJFbmNyeXB0IikpIHsKICAgICAgICBpc0VuY3J5cHRlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFpbGVyRGljdCwgdHJhaWxlckVycm9yOwogICAgZm9yIChjb25zdCBkaWN0IG9mIFsuLi50cmFpbGVyRGljdHMsICJnZW5GYWxsYmFjayIsIC4uLnRyYWlsZXJEaWN0c10pIHsKICAgICAgaWYgKGRpY3QgPT09ICJnZW5GYWxsYmFjayIpIHsKICAgICAgICBpZiAoIXRyYWlsZXJFcnJvcikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGV0IHZhbGlkUGFnZXNEaWN0ID0gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgcm9vdERpY3QgPSBkaWN0LmdldCgiUm9vdCIpOwogICAgICAgIGlmICghKHJvb3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0RpY3QgPSByb290RGljdC5nZXQoIlBhZ2VzIik7CiAgICAgICAgaWYgKCEocGFnZXNEaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0NvdW50ID0gcGFnZXNEaWN0LmdldCgiQ291bnQiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihwYWdlc0NvdW50KSkgewogICAgICAgICAgdmFsaWRQYWdlc0RpY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICB0cmFpbGVyRXJyb3IgPSBleDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodmFsaWRQYWdlc0RpY3QgJiYgKCFpc0VuY3J5cHRlZCB8fCBkaWN0LmhhcygiRW5jcnlwdCIpKSAmJiBkaWN0LmhhcygiSUQiKSkgewogICAgICAgIHJldHVybiBkaWN0OwogICAgICB9CiAgICAgIHRyYWlsZXJEaWN0ID0gZGljdDsKICAgIH0KICAgIGlmICh0cmFpbGVyRGljdCkgewogICAgICByZXR1cm4gdHJhaWxlckRpY3Q7CiAgICB9CiAgICBpZiAodGhpcy50b3BEaWN0KSB7CiAgICAgIHJldHVybiB0aGlzLnRvcERpY3Q7CiAgICB9CiAgICBpZiAoIXRyYWlsZXJEaWN0cy5sZW5ndGgpIHsKICAgICAgZm9yIChjb25zdCBbbnVtLCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkgewogICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWYgPSBSZWYuZ2V0KG51bSwgZW50cnkuZ2VuKTsKICAgICAgICBsZXQgb2JqOwogICAgICAgIHRyeSB7CiAgICAgICAgICBvYmogPSB0aGlzLmZldGNoKHJlZik7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICAgIG9iaiA9IG9iai5kaWN0OwogICAgICAgIH0KICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJSb290IikpIHsKICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgSW52YWxpZFBERkV4Y2VwdGlvbigiSW52YWxpZCBQREYgc3RydWN0dXJlLiIpOwogIH0KICByZWFkWFJlZihyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBjb25zdCBzdGFydFhSZWZQYXJzZWRDYWNoZSA9IG5ldyBTZXQoKTsKICAgIHdoaWxlICh0aGlzLnN0YXJ0WFJlZlF1ZXVlLmxlbmd0aCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHN0YXJ0WFJlZiA9IHRoaXMuc3RhcnRYUmVmUXVldWVbMF07CiAgICAgICAgaWYgKHN0YXJ0WFJlZlBhcnNlZENhY2hlLmhhcyhzdGFydFhSZWYpKSB7CiAgICAgICAgICB3YXJuKCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLiIpOwogICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHN0YXJ0WFJlZlBhcnNlZENhY2hlLmFkZChzdGFydFhSZWYpOwogICAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFhSZWYgKyBzdHJlYW0uc3RhcnQ7CiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgbGV0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBsZXQgZGljdDsKICAgICAgICBpZiAoaXNDbWQob2JqLCAieHJlZiIpKSB7CiAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlRhYmxlKHBhcnNlcik7CiAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgewogICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OwogICAgICAgICAgfQogICAgICAgICAgb2JqID0gZGljdC5nZXQoIlhSZWZTdG0iKTsKICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgJiYgIXRoaXMuX3hyZWZTdG1zLmhhcyhvYmopKSB7CiAgICAgICAgICAgIHRoaXMuX3hyZWZTdG1zLmFkZChvYmopOwogICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTsKICAgICAgICAgICAgdGhpcy4jZmlyc3RYUmVmU3RtUG9zID8/PSBvYmo7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZXIuZ2V0T2JqKCkpIHx8ICFpc0NtZChwYXJzZXIuZ2V0T2JqKCksICJvYmoiKSB8fCAhKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgc3RyZWFtIik7CiAgICAgICAgICB9CiAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlN0cmVhbShvYmopOwogICAgICAgICAgaWYgKCF0aGlzLnRvcERpY3QpIHsKICAgICAgICAgICAgdGhpcy50b3BEaWN0ID0gZGljdDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghZGljdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkZhaWxlZCB0byByZWFkIFhSZWYgc3RyZWFtIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXIiKTsKICAgICAgICB9CiAgICAgICAgb2JqID0gZGljdC5nZXQoIlByZXYiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTsKICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKG9iai5udW0pOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIGluZm8oIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiICsgZSk7CiAgICAgIH0KICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOwogICAgfQogICAgaWYgKHRoaXMudG9wRGljdCkgewogICAgICByZXR1cm4gdGhpcy50b3BEaWN0OwogICAgfQogICAgaWYgKHJlY292ZXJ5TW9kZSkgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogIH0KICBnZXQgbGFzdFhSZWZTdHJlYW1Qb3MoKSB7CiAgICByZXR1cm4gdGhpcy4jZmlyc3RYUmVmU3RtUG9zID8/ICh0aGlzLl94cmVmU3Rtcy5zaXplID4gMCA/IE1hdGgubWF4KC4uLnRoaXMuX3hyZWZTdG1zKSA6IG51bGwpOwogIH0KICBnZXRFbnRyeShpKSB7CiAgICBjb25zdCB4cmVmRW50cnkgPSB0aGlzLmVudHJpZXNbaV07CiAgICBpZiAoeHJlZkVudHJ5ICYmICF4cmVmRW50cnkuZnJlZSAmJiB4cmVmRW50cnkub2Zmc2V0KSB7CiAgICAgIHJldHVybiB4cmVmRW50cnk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmZldGNoKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiBvYmo7CiAgfQogIGZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKICAgIGlmICghKHJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZSIpOwogICAgfQogICAgY29uc3QgbnVtID0gcmVmLm51bTsKICAgIGNvbnN0IGNhY2hlRW50cnkgPSB0aGlzLl9jYWNoZU1hcC5nZXQobnVtKTsKICAgIGlmIChjYWNoZUVudHJ5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKGNhY2hlRW50cnkgaW5zdGFuY2VvZiBEaWN0ICYmICFjYWNoZUVudHJ5Lm9iaklkKSB7CiAgICAgICAgY2FjaGVFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpOwogICAgICB9CiAgICAgIHJldHVybiBjYWNoZUVudHJ5OwogICAgfQogICAgbGV0IHhyZWZFbnRyeSA9IHRoaXMuZ2V0RW50cnkobnVtKTsKICAgIGlmICh4cmVmRW50cnkgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKICAgIH0KICAgIGlmICh0aGlzLl9wZW5kaW5nUmVmcy5oYXMocmVmKSkgewogICAgICB0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUocmVmKTsKICAgICAgd2FybihgSWdub3JpbmcgY2lyY3VsYXIgcmVmZXJlbmNlOiAke3JlZn0uYCk7CiAgICAgIHJldHVybiBDSVJDVUxBUl9SRUY7CiAgICB9CiAgICB0aGlzLl9wZW5kaW5nUmVmcy5wdXQocmVmKTsKICAgIHRyeSB7CiAgICAgIHhyZWZFbnRyeSA9IHhyZWZFbnRyeS51bmNvbXByZXNzZWQgPyB0aGlzLmZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pIDogdGhpcy5mZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICAgIHRoaXMuX3BlbmRpbmdSZWZzLnJlbW92ZShyZWYpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgdGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKHJlZik7CiAgICAgIHRocm93IGV4OwogICAgfQogICAgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgeHJlZkVudHJ5Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CiAgICB9IGVsc2UgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgeHJlZkVudHJ5LmRpY3Qub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiB4cmVmRW50cnk7CiAgfQogIGZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZSkgewogICAgY29uc3QgZ2VuID0gcmVmLmdlbjsKICAgIGxldCBudW0gPSByZWYubnVtOwogICAgaWYgKHhyZWZFbnRyeS5nZW4gIT09IGdlbikgewogICAgICBjb25zdCBtc2cgPSBgSW5jb25zaXN0ZW50IGdlbmVyYXRpb24gaW4gWFJlZjogJHtyZWZ9YDsKICAgICAgaWYgKHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayAmJiB4cmVmRW50cnkuZ2VuIDwgZ2VuKSB7CiAgICAgICAgd2Fybihtc2cpOwogICAgICAgIHJldHVybiB0aGlzLmZldGNoVW5jb21wcmVzc2VkKFJlZi5nZXQobnVtLCB4cmVmRW50cnkuZ2VuKSwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgICB9CiAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24obXNnKTsKICAgIH0KICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oeHJlZkVudHJ5Lm9mZnNldCArIHRoaXMuc3RyZWFtLnN0YXJ0KTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IHRoaXMsCiAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBvYmoxID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3Qgb2JqMiA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajMgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqMSAhPT0gbnVtIHx8IG9iajIgIT09IGdlbiB8fCAhKG9iajMgaW5zdGFuY2VvZiBDbWQpKSB7CiAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTsKICAgIH0KICAgIGlmIChvYmozLmNtZCAhPT0gIm9iaiIpIHsKICAgICAgaWYgKG9iajMuY21kLnN0YXJ0c1dpdGgoIm9iaiIpKSB7CiAgICAgICAgbnVtID0gcGFyc2VJbnQob2JqMy5jbWQuc3Vic3RyaW5nKDMpLCAxMCk7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSkgewogICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOwogICAgfQogICAgeHJlZkVudHJ5ID0gdGhpcy5lbmNyeXB0ICYmICFzdXBwcmVzc0VuY3J5cHRpb24gPyBwYXJzZXIuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pKSA6IHBhcnNlci5nZXRPYmooKTsKICAgIGlmICghKHhyZWZFbnRyeSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIHhyZWZFbnRyeSk7CiAgICB9CiAgICByZXR1cm4geHJlZkVudHJ5OwogIH0KICBmZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBjb25zdCB0YWJsZU9mZnNldCA9IHhyZWZFbnRyeS5vZmZzZXQ7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmZldGNoKFJlZi5nZXQodGFibGVPZmZzZXQsIDApKTsKICAgIGlmICghKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiYmFkIE9ialN0bSBzdHJlYW0iKTsKICAgIH0KICAgIGNvbnN0IGZpcnN0ID0gc3RyZWFtLmRpY3QuZ2V0KCJGaXJzdCIpOwogICAgY29uc3QgbiA9IHN0cmVhbS5kaWN0LmdldCgiTiIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZmlyc3QgYW5kIG4gcGFyYW1ldGVycyBmb3IgT2JqU3RtIHN0cmVhbSIpOwogICAgfQogICAgbGV0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IHRoaXMsCiAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBudW1zID0gbmV3IEFycmF5KG4pOwogICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBBcnJheShuKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGNvbnN0IG51bSA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYGludmFsaWQgb2JqZWN0IG51bWJlciBpbiB0aGUgT2JqU3RtIHN0cmVhbTogJHtudW19YCk7CiAgICAgIH0KICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke29mZnNldH1gKTsKICAgICAgfQogICAgICBudW1zW2ldID0gbnVtOwogICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0OwogICAgfQogICAgY29uc3Qgc3RhcnQgPSAoc3RyZWFtLnN0YXJ0IHx8IDApICsgZmlyc3Q7CiAgICBjb25zdCBlbnRyaWVzID0gbmV3IEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gaSA8IG4gLSAxID8gb2Zmc2V0c1tpICsgMV0gLSBvZmZzZXRzW2ldIDogdW5kZWZpbmVkOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW0uIik7CiAgICAgIH0KICAgICAgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgbGV4ZXI6IG5ldyBMZXhlcihzdHJlYW0ubWFrZVN1YlN0cmVhbShzdGFydCArIG9mZnNldHNbaV0sIGxlbmd0aCwgc3RyZWFtLmRpY3QpKSwKICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgICB9KTsKICAgICAgY29uc3Qgb2JqID0gcGFyc2VyLmdldE9iaigpOwogICAgICBlbnRyaWVzW2ldID0gb2JqOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IG51bSA9IG51bXNbaV0sCiAgICAgICAgZW50cnkgPSB0aGlzLmVudHJpZXNbbnVtXTsKICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5Lm9mZnNldCA9PT0gdGFibGVPZmZzZXQgJiYgZW50cnkuZ2VuID09PSBpKSB7CiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgICAgfQogICAgfQogICAgeHJlZkVudHJ5ID0gZW50cmllc1t4cmVmRW50cnkuZ2VuXTsKICAgIGlmICh4cmVmRW50cnkgPT09IHVuZGVmaW5lZCkgewogICAgICB0aHJvdyBuZXcgWFJlZkVudHJ5RXhjZXB0aW9uKGBCYWQgKGNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOwogICAgfQogICAgcmV0dXJuIHhyZWZFbnRyeTsKICB9CiAgYXN5bmMgZmV0Y2hJZlJlZkFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmZldGNoQXN5bmMob2JqLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgYXN5bmMgZmV0Y2hBc3luYyhyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMuZmV0Y2gocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICBhd2FpdCB0aGlzLnBkZk1hbmFnZXIucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOwogICAgICByZXR1cm4gdGhpcy5mZXRjaEFzeW5jKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICB9CiAgZ2V0Q2F0YWxvZ09iaigpIHsKICAgIHJldHVybiB0aGlzLnJvb3Q7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9kb2N1bWVudC5qcwoKCgoKCgoKCgoKCgoKCgoKCgoKY29uc3QgTEVUVEVSX1NJWkVfTUVESUFCT1ggPSBbMCwgMCwgNjEyLCA3OTJdOwpjbGFzcyBQYWdlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBwZGZNYW5hZ2VyLAogICAgeHJlZiwKICAgIHBhZ2VJbmRleCwKICAgIHBhZ2VEaWN0LAogICAgcmVmLAogICAgZ2xvYmFsSWRGYWN0b3J5LAogICAgZm9udENhY2hlLAogICAgYnVpbHRJbkNNYXBDYWNoZSwKICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgIGdsb2JhbEltYWdlQ2FjaGUsCiAgICBzeXN0ZW1Gb250Q2FjaGUsCiAgICBub25CbGVuZE1vZGVzU2V0LAogICAgeGZhRmFjdG9yeQogIH0pIHsKICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKICAgIHRoaXMucGFnZURpY3QgPSBwYWdlRGljdDsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLnJlZiA9IHJlZjsKICAgIHRoaXMuZm9udENhY2hlID0gZm9udENhY2hlOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlID0gYnVpbHRJbkNNYXBDYWNoZTsKICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlID0gc3RhbmRhcmRGb250RGF0YUNhY2hlOwogICAgdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUgPSBnbG9iYWxDb2xvclNwYWNlQ2FjaGU7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBnbG9iYWxJbWFnZUNhY2hlOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUgPSBzeXN0ZW1Gb250Q2FjaGU7CiAgICB0aGlzLm5vbkJsZW5kTW9kZXNTZXQgPSBub25CbGVuZE1vZGVzU2V0OwogICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gbnVsbDsKICAgIHRoaXMueGZhRmFjdG9yeSA9IHhmYUZhY3Rvcnk7CiAgICBjb25zdCBpZENvdW50ZXJzID0gewogICAgICBvYmo6IDAKICAgIH07CiAgICB0aGlzLl9sb2NhbElkRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgZ2xvYmFsSWRGYWN0b3J5IHsKICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cGFnZUluZGV4fV8keysraWRDb3VudGVycy5vYmp9YDsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UGFnZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cmVmLnRvU3RyaW5nKCl9YDsKICAgICAgfQogICAgfTsKICB9CiAgX2dldEluaGVyaXRhYmxlUHJvcGVydHkoa2V5LCBnZXRBcnJheSA9IGZhbHNlKSB7CiAgICBjb25zdCB2YWx1ZSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0OiB0aGlzLnBhZ2VEaWN0LAogICAgICBrZXksCiAgICAgIGdldEFycmF5LAogICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQogICAgfSk7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEgfHwgISh2YWx1ZVswXSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiB2YWx1ZVswXTsKICAgIH0KICAgIHJldHVybiBEaWN0Lm1lcmdlKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBkaWN0QXJyYXk6IHZhbHVlCiAgICB9KTsKICB9CiAgZ2V0IGNvbnRlbnQoKSB7CiAgICByZXR1cm4gdGhpcy5wYWdlRGljdC5nZXRBcnJheSgiQ29udGVudHMiKTsKICB9CiAgZ2V0IHJlc291cmNlcygpIHsKICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJlc291cmNlcyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmVzb3VyY2VzIiwgcmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCA/IHJlc291cmNlcyA6IERpY3QuZW1wdHkpOwogIH0KICBfZ2V0Qm91bmRpbmdCb3gobmFtZSkgewogICAgaWYgKHRoaXMueGZhRGF0YSkgewogICAgICByZXR1cm4gdGhpcy54ZmFEYXRhLmJib3g7CiAgICB9CiAgICBjb25zdCBib3ggPSBsb29rdXBOb3JtYWxSZWN0KHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkobmFtZSwgdHJ1ZSksIG51bGwpOwogICAgaWYgKGJveCkgewogICAgICBpZiAoYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIGJveDsKICAgICAgfQogICAgICB3YXJuKGBFbXB0eSwgb3IgaW52YWxpZCwgLyR7bmFtZX0gZW50cnkuYCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0IG1lZGlhQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWVkaWFCb3giLCB0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKSB8fCBMRVRURVJfU0laRV9NRURJQUJPWCk7CiAgfQogIGdldCBjcm9wQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY3JvcEJveCIsIHRoaXMuX2dldEJvdW5kaW5nQm94KCJDcm9wQm94IikgfHwgdGhpcy5tZWRpYUJveCk7CiAgfQogIGdldCB1c2VyVW5pdCgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMucGFnZURpY3QuZ2V0KCJVc2VyVW5pdCIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlclVuaXQiLCB0eXBlb2Ygb2JqID09PSAibnVtYmVyIiAmJiBvYmogPiAwID8gb2JqIDogMS4wKTsKICB9CiAgZ2V0IHZpZXcoKSB7CiAgICBjb25zdCB7CiAgICAgIGNyb3BCb3gsCiAgICAgIG1lZGlhQm94CiAgICB9ID0gdGhpczsKICAgIGlmIChjcm9wQm94ICE9PSBtZWRpYUJveCAmJiAhaXNBcnJheUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkgewogICAgICBjb25zdCBib3ggPSBVdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7CiAgICAgIGlmIChib3ggJiYgYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmlldyIsIGJveCk7CiAgICAgIH0KICAgICAgd2FybigiRW1wdHkgL0Nyb3BCb3ggYW5kIC9NZWRpYUJveCBpbnRlcnNlY3Rpb24uIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2aWV3IiwgbWVkaWFCb3gpOwogIH0KICBnZXQgcm90YXRlKCkgewogICAgbGV0IHJvdGF0ZSA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJvdGF0ZSIpIHx8IDA7CiAgICBpZiAocm90YXRlICUgOTAgIT09IDApIHsKICAgICAgcm90YXRlID0gMDsKICAgIH0gZWxzZSBpZiAocm90YXRlID49IDM2MCkgewogICAgICByb3RhdGUgJT0gMzYwOwogICAgfSBlbHNlIGlmIChyb3RhdGUgPCAwKSB7CiAgICAgIHJvdGF0ZSA9IChyb3RhdGUgJSAzNjAgKyAzNjApICUgMzYwOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicm90YXRlIiwgcm90YXRlKTsKICB9CiAgX29uU3ViU3RyZWFtRXJyb3IocmVhc29uLCBvYmpJZCkgewogICAgaWYgKHRoaXMuZXZhbHVhdG9yT3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgd2FybihgZ2V0Q29udGVudFN0cmVhbSAtIGlnbm9yaW5nIHN1Yi1zdHJlYW0gKCR7b2JqSWR9KTogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IHJlYXNvbjsKICB9CiAgYXN5bmMgZ2V0Q29udGVudFN0cmVhbSgpIHsKICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJjb250ZW50Iik7CiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkgewogICAgICByZXR1cm4gbmV3IFN0cmVhbXNTZXF1ZW5jZVN0cmVhbShjb250ZW50LCB0aGlzLl9vblN1YlN0cmVhbUVycm9yLmJpbmQodGhpcykpOwogICAgfQogICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7CiAgfQogIGdldCB4ZmFEYXRhKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YSIsIHRoaXMueGZhRmFjdG9yeSA/IHsKICAgICAgYmJveDogdGhpcy54ZmFGYWN0b3J5LmdldEJvdW5kaW5nQm94KHRoaXMucGFnZUluZGV4KQogICAgfSA6IG51bGwpOwogIH0KICBhc3luYyAjcmVwbGFjZUlkQnlSZWYoYW5ub3RhdGlvbnMsIGRlbGV0ZWRBbm5vdGF0aW9ucywgZXhpc3RpbmdBbm5vdGF0aW9ucykgewogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbi5pZCkgewogICAgICAgIGNvbnN0IHJlZiA9IFJlZi5mcm9tU3RyaW5nKGFubm90YXRpb24uaWQpOwogICAgICAgIGlmICghcmVmKSB7CiAgICAgICAgICB3YXJuKGBBIG5vbi1saW5rZWQgYW5ub3RhdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQ6ICR7YW5ub3RhdGlvbi5pZH1gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbi5kZWxldGVkKSB7CiAgICAgICAgICBkZWxldGVkQW5ub3RhdGlvbnMucHV0KHJlZiwgcmVmKTsKICAgICAgICAgIGlmIChhbm5vdGF0aW9uLnBvcHVwUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IHBvcHVwUmVmID0gUmVmLmZyb21TdHJpbmcoYW5ub3RhdGlvbi5wb3B1cFJlZik7CiAgICAgICAgICAgIGlmIChwb3B1cFJlZikgewogICAgICAgICAgICAgIGRlbGV0ZWRBbm5vdGF0aW9ucy5wdXQocG9wdXBSZWYsIHBvcHVwUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nQW5ub3RhdGlvbnM/LnB1dChyZWYpOwogICAgICAgIGFubm90YXRpb24ucmVmID0gcmVmOwogICAgICAgIHByb21pc2VzLnB1c2godGhpcy54cmVmLmZldGNoQXN5bmMocmVmKS50aGVuKG9iaiA9PiB7CiAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICBhbm5vdGF0aW9uLm9sZEFubm90YXRpb24gPSBvYmouY2xvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICB3YXJuKGBDYW5ub3QgZmV0Y2ggXGBvbGRBbm5vdGF0aW9uXGAgZm9yOiAke3JlZn0uYCk7CiAgICAgICAgfSkpOwogICAgICAgIGRlbGV0ZSBhbm5vdGF0aW9uLmlkOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykgewogICAgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlhGQTogQ2Fubm90IHNhdmUgbmV3IGFubm90YXRpb25zLiIpOwogICAgfQogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IGRlbGV0ZWRBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgY29uc3QgZXhpc3RpbmdBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXQoKTsKICAgIGF3YWl0IHRoaXMuI3JlcGxhY2VJZEJ5UmVmKGFubm90YXRpb25zLCBkZWxldGVkQW5ub3RhdGlvbnMsIGV4aXN0aW5nQW5ub3RhdGlvbnMpOwogICAgY29uc3QgcGFnZURpY3QgPSB0aGlzLnBhZ2VEaWN0OwogICAgY29uc3QgYW5ub3RhdGlvbnNBcnJheSA9IHRoaXMuYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhIGluc3RhbmNlb2YgUmVmICYmIGRlbGV0ZWRBbm5vdGF0aW9ucy5oYXMoYSkpKTsKICAgIGNvbnN0IG5ld0RhdGEgPSBhd2FpdCBBbm5vdGF0aW9uRmFjdG9yeS5zYXZlTmV3QW5ub3RhdGlvbnMocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMsIGNoYW5nZXMpOwogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZgogICAgfSBvZiBuZXdEYXRhLmFubm90YXRpb25zKSB7CiAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBSZWYgJiYgIWV4aXN0aW5nQW5ub3RhdGlvbnMuaGFzKHJlZikpIHsKICAgICAgICBhbm5vdGF0aW9uc0FycmF5LnB1c2gocmVmKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IHBhZ2VEaWN0LmNsb25lKCk7CiAgICBkaWN0LnNldCgiQW5ub3RzIiwgYW5ub3RhdGlvbnNBcnJheSk7CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0CiAgICB9KTsKICAgIGZvciAoY29uc3QgZGVsZXRlZFJlZiBvZiBkZWxldGVkQW5ub3RhdGlvbnMpIHsKICAgICAgY2hhbmdlcy5wdXQoZGVsZXRlZFJlZiwgewogICAgICAgIGRhdGE6IG51bGwKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIHNhdmUoaGFuZGxlciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IHRoaXMuX3BhcnNlZEFubm90YXRpb25zOwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBwcm9taXNlcy5wdXNoKGFubm90YXRpb24uc2F2ZShwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIHdhcm4oInNhdmUgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIGFzeW5jIGxvYWRSZXNvdXJjZXMoa2V5cykgewogICAgYXdhaXQgKHRoaXMucmVzb3VyY2VzUHJvbWlzZSA/Pz0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAicmVzb3VyY2VzIikpOwogICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcih0aGlzLnJlc291cmNlcywga2V5cywgdGhpcy54cmVmKTsKICAgIGF3YWl0IG9iamVjdExvYWRlci5sb2FkKCk7CiAgfQogIGFzeW5jIGdldE9wZXJhdG9yTGlzdCh7CiAgICBoYW5kbGVyLAogICAgc2luaywKICAgIHRhc2ssCiAgICBpbnRlbnQsCiAgICBjYWNoZUtleSwKICAgIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCwKICAgIG1vZGlmaWVkSWRzID0gbnVsbAogIH0pIHsKICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7CiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiQ29sb3JTcGFjZSIsICJFeHRHU3RhdGUiLCAiRm9udCIsICJQYXR0ZXJuIiwgIlByb3BlcnRpZXMiLCAiU2hhZGluZyIsICJYT2JqZWN0Il0pOwogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IG5ld0Fubm90c0J5UGFnZSA9ICF0aGlzLnhmYUZhY3RvcnkgPyBnZXROZXdBbm5vdGF0aW9uc01hcChhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogICAgY29uc3QgbmV3QW5ub3RzID0gbmV3QW5ub3RzQnlQYWdlPy5nZXQodGhpcy5wYWdlSW5kZXgpOwogICAgbGV0IG5ld0Fubm90YXRpb25zUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIGxldCBkZWxldGVkQW5ub3RhdGlvbnMgPSBudWxsOwogICAgaWYgKG5ld0Fubm90cykgewogICAgICBjb25zdCBhbm5vdGF0aW9uR2xvYmFsc1Byb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJhbm5vdGF0aW9uR2xvYmFscyIpOwogICAgICBsZXQgaW1hZ2VQcm9taXNlczsKICAgICAgY29uc3QgbWlzc2luZ0JpdG1hcHMgPSBuZXcgU2V0KCk7CiAgICAgIGZvciAoY29uc3QgewogICAgICAgIGJpdG1hcElkLAogICAgICAgIGJpdG1hcAogICAgICB9IG9mIG5ld0Fubm90cykgewogICAgICAgIGlmIChiaXRtYXBJZCAmJiAhYml0bWFwICYmICFtaXNzaW5nQml0bWFwcy5oYXMoYml0bWFwSWQpKSB7CiAgICAgICAgICBtaXNzaW5nQml0bWFwcy5hZGQoYml0bWFwSWQpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQKICAgICAgfSA9IHRoaXMuZXZhbHVhdG9yT3B0aW9uczsKICAgICAgaWYgKG1pc3NpbmdCaXRtYXBzLnNpemUgPiAwKSB7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbldpdGhCaXRtYXBzID0gbmV3QW5ub3RzLnNsaWNlKCk7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCBhbm5vdGF0aW9uXSBvZiBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChBbm5vdGF0aW9uRWRpdG9yUHJlZml4KSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmJpdG1hcCAmJiBtaXNzaW5nQml0bWFwcy5oYXMoYW5ub3RhdGlvbi5iaXRtYXBJZCkpIHsKICAgICAgICAgICAgYW5ub3RhdGlvbldpdGhCaXRtYXBzLnB1c2goYW5ub3RhdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9uV2l0aEJpdG1hcHMsIHRoaXMueHJlZiwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpOwogICAgICB9IGVsc2UgewogICAgICAgIGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhuZXdBbm5vdHMsIHRoaXMueHJlZiwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpOwogICAgICB9CiAgICAgIGRlbGV0ZWRBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXQoKTsKICAgICAgbmV3QW5ub3RhdGlvbnNQcm9taXNlID0gUHJvbWlzZS5hbGwoW2Fubm90YXRpb25HbG9iYWxzUHJvbWlzZSwgdGhpcy4jcmVwbGFjZUlkQnlSZWYobmV3QW5ub3RzLCBkZWxldGVkQW5ub3RhdGlvbnMsIG51bGwpXSkudGhlbigoW2Fubm90YXRpb25HbG9iYWxzXSkgPT4gewogICAgICAgIGlmICghYW5ub3RhdGlvbkdsb2JhbHMpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkucHJpbnROZXdBbm5vdGF0aW9ucyhhbm5vdGF0aW9uR2xvYmFscywgcGFydGlhbEV2YWx1YXRvciwgdGFzaywgbmV3QW5ub3RzLCBpbWFnZVByb21pc2VzKTsKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBwYWdlTGlzdFByb21pc2UgPSBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2VdKS50aGVuKGFzeW5jIChbY29udGVudFN0cmVhbV0pID0+IHsKICAgICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdChpbnRlbnQsIHNpbmspOwogICAgICBoYW5kbGVyLnNlbmQoIlN0YXJ0UmVuZGVyUGFnZSIsIHsKICAgICAgICB0cmFuc3BhcmVuY3k6IHBhcnRpYWxFdmFsdWF0b3IuaGFzQmxlbmRNb2Rlcyh0aGlzLnJlc291cmNlcywgdGhpcy5ub25CbGVuZE1vZGVzU2V0KSwKICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICAgIGNhY2hlS2V5CiAgICAgIH0pOwogICAgICBhd2FpdCBwYXJ0aWFsRXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgICAgc3RyZWFtOiBjb250ZW50U3RyZWFtLAogICAgICAgIHRhc2ssCiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdAogICAgICB9KTsKICAgICAgcmV0dXJuIG9wTGlzdDsKICAgIH0pOwogICAgbGV0IFtwYWdlT3BMaXN0LCBhbm5vdGF0aW9ucywgbmV3QW5ub3RhdGlvbnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3BhZ2VMaXN0UHJvbWlzZSwgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMsIG5ld0Fubm90YXRpb25zUHJvbWlzZV0pOwogICAgaWYgKG5ld0Fubm90YXRpb25zKSB7CiAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhLnJlZiAmJiBkZWxldGVkQW5ub3RhdGlvbnMuaGFzKGEucmVmKSkpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBuZXdBbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IG5ld0Fubm90YXRpb25zW2ldOwogICAgICAgIGlmIChuZXdBbm5vdGF0aW9uLnJlZlRvUmVwbGFjZSkgewogICAgICAgICAgY29uc3QgaiA9IGFubm90YXRpb25zLmZpbmRJbmRleChhID0+IGEucmVmICYmIGlzUmVmc0VxdWFsKGEucmVmLCBuZXdBbm5vdGF0aW9uLnJlZlRvUmVwbGFjZSkpOwogICAgICAgICAgaWYgKGogPj0gMCkgewogICAgICAgICAgICBhbm5vdGF0aW9ucy5zcGxpY2UoaiwgMSwgbmV3QW5ub3RhdGlvbik7CiAgICAgICAgICAgIG5ld0Fubm90YXRpb25zLnNwbGljZShpLS0sIDEpOwogICAgICAgICAgICBpaS0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChuZXdBbm5vdGF0aW9ucyk7CiAgICB9CiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwIHx8IGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRElTQUJMRSkgewogICAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUpOwogICAgICByZXR1cm4gewogICAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAogICAgICB9OwogICAgfQogICAgY29uc3QgcmVuZGVyRm9ybXMgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0ZPUk1TKSwKICAgICAgaXNFZGl0aW5nID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5JU19FRElUSU5HKSwKICAgICAgaW50ZW50QW55ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLAogICAgICBpbnRlbnREaXNwbGF5ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKSwKICAgICAgaW50ZW50UHJpbnQgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTsKICAgIGNvbnN0IG9wTGlzdFByb21pc2VzID0gW107CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgaWYgKGludGVudEFueSB8fCBpbnRlbnREaXNwbGF5ICYmIGFubm90YXRpb24ubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgJiYgYW5ub3RhdGlvbi5tdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzKSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLm11c3RCZVByaW50ZWQoYW5ub3RhdGlvblN0b3JhZ2UpKSB7CiAgICAgICAgb3BMaXN0UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvcExpc3Q6IG51bGwsCiAgICAgICAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgICAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgICAgICAgfTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG9wTGlzdHMgPSBhd2FpdCBQcm9taXNlLmFsbChvcExpc3RQcm9taXNlcyk7CiAgICBsZXQgZm9ybSA9IGZhbHNlLAogICAgICBjYW52YXMgPSBmYWxzZTsKICAgIGZvciAoY29uc3QgewogICAgICBvcExpc3QsCiAgICAgIHNlcGFyYXRlRm9ybSwKICAgICAgc2VwYXJhdGVDYW52YXMKICAgIH0gb2Ygb3BMaXN0cykgewogICAgICBwYWdlT3BMaXN0LmFkZE9wTGlzdChvcExpc3QpOwogICAgICBmb3JtIHx8PSBzZXBhcmF0ZUZvcm07CiAgICAgIGNhbnZhcyB8fD0gc2VwYXJhdGVDYW52YXM7CiAgICB9CiAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUsIHsKICAgICAgZm9ybSwKICAgICAgY2FudmFzCiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAogICAgfTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KHsKICAgIGhhbmRsZXIsCiAgICB0YXNrLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiwKICAgIHNpbmsKICB9KSB7CiAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpOwogICAgY29uc3QgcmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJGb250IiwgIlByb3BlcnRpZXMiLCAiWE9iamVjdCJdKTsKICAgIGNvbnN0IGxhbmdQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImxhbmciKTsKICAgIGNvbnN0IFtjb250ZW50U3RyZWFtLCwgbGFuZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2UsIGxhbmdQcm9taXNlXSk7CiAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IFBhcnRpYWxFdmFsdWF0b3IoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGhhbmRsZXIsCiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgIGlkRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLmdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICBzeXN0ZW1Gb250Q2FjaGU6IHRoaXMuc3lzdGVtRm9udENhY2hlLAogICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCiAgICAgIHRhc2ssCiAgICAgIHJlc291cmNlczogdGhpcy5yZXNvdXJjZXMsCiAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiwKICAgICAgc2luaywKICAgICAgdmlld0JveDogdGhpcy52aWV3LAogICAgICBsYW5nCiAgICB9KTsKICB9CiAgYXN5bmMgZ2V0U3RydWN0VHJlZSgpIHsKICAgIGNvbnN0IHN0cnVjdFRyZWVSb290ID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInN0cnVjdFRyZWVSb290Iik7CiAgICBpZiAoIXN0cnVjdFRyZWVSb290KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYXdhaXQgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnM7CiAgICBjb25zdCBzdHJ1Y3RUcmVlID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiX3BhcnNlU3RydWN0VHJlZSIsIFtzdHJ1Y3RUcmVlUm9vdF0pOwogICAgcmV0dXJuIHRoaXMucGRmTWFuYWdlci5lbnN1cmUoc3RydWN0VHJlZSwgInNlcmlhbGl6YWJsZSIpOwogIH0KICBfcGFyc2VTdHJ1Y3RUcmVlKHN0cnVjdFRyZWVSb290KSB7CiAgICBjb25zdCB0cmVlID0gbmV3IFN0cnVjdFRyZWVQYWdlKHN0cnVjdFRyZWVSb290LCB0aGlzLnBhZ2VEaWN0KTsKICAgIHRyZWUucGFyc2UodGhpcy5yZWYpOwogICAgcmV0dXJuIHRyZWU7CiAgfQogIGFzeW5jIGdldEFubm90YXRpb25zRGF0YShoYW5kbGVyLCB0YXNrLCBpbnRlbnQpIHsKICAgIGNvbnN0IGFubm90YXRpb25zID0gYXdhaXQgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnM7CiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKICAgIH0KICAgIGNvbnN0IGFubm90YXRpb25zRGF0YSA9IFtdLAogICAgICB0ZXh0Q29udGVudFByb21pc2VzID0gW107CiAgICBsZXQgcGFydGlhbEV2YWx1YXRvcjsKICAgIGNvbnN0IGludGVudEFueSA9ICEhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5ZKSwKICAgICAgaW50ZW50RGlzcGxheSA9ICEhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksCiAgICAgIGludGVudFByaW50ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgY29uc3QgaXNWaXNpYmxlID0gaW50ZW50QW55IHx8IGludGVudERpc3BsYXkgJiYgYW5ub3RhdGlvbi52aWV3YWJsZTsKICAgICAgaWYgKGlzVmlzaWJsZSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLnByaW50YWJsZSkgewogICAgICAgIGFubm90YXRpb25zRGF0YS5wdXNoKGFubm90YXRpb24uZGF0YSk7CiAgICAgIH0KICAgICAgaWYgKGFubm90YXRpb24uaGFzVGV4dENvbnRlbnQgJiYgaXNWaXNpYmxlKSB7CiAgICAgICAgcGFydGlhbEV2YWx1YXRvciB8fD0gbmV3IFBhcnRpYWxFdmFsdWF0b3IoewogICAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgICAgaGFuZGxlciwKICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgICAgIH0pOwogICAgICAgIHRleHRDb250ZW50UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmV4dHJhY3RUZXh0Q29udGVudChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBbLUluZmluaXR5LCAtSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eV0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIHdhcm4oYGdldEFubm90YXRpb25zRGF0YSAtIGlnbm9yaW5nIHRleHRDb250ZW50IGR1cmluZyAiJHt0YXNrLm5hbWV9IiB0YXNrOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGF3YWl0IFByb21pc2UuYWxsKHRleHRDb250ZW50UHJvbWlzZXMpOwogICAgcmV0dXJuIGFubm90YXRpb25zRGF0YTsKICB9CiAgZ2V0IGFubm90YXRpb25zKCkgewogICAgY29uc3QgYW5ub3RzID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiQW5ub3RzIik7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhbm5vdGF0aW9ucyIsIEFycmF5LmlzQXJyYXkoYW5ub3RzKSA/IGFubm90cyA6IFtdKTsKICB9CiAgZ2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpIHsKICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJhbm5vdGF0aW9ucyIpLnRoZW4oYXN5bmMgYW5ub3RzID0+IHsKICAgICAgaWYgKGFubm90cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYW5ub3RzOwogICAgICB9CiAgICAgIGNvbnN0IFthbm5vdGF0aW9uR2xvYmFscywgZmllbGRPYmplY3RzXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJhbm5vdGF0aW9uR2xvYmFscyIpLCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJmaWVsZE9iamVjdHMiKV0pOwogICAgICBpZiAoIWFubm90YXRpb25HbG9iYWxzKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGNvbnN0IG9ycGhhbkZpZWxkcyA9IGZpZWxkT2JqZWN0cz8ub3JwaGFuRmllbGRzOwogICAgICBjb25zdCBhbm5vdGF0aW9uUHJvbWlzZXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uUmVmIG9mIGFubm90cykgewogICAgICAgIGFubm90YXRpb25Qcm9taXNlcy5wdXNoKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh0aGlzLnhyZWYsIGFubm90YXRpb25SZWYsIGFubm90YXRpb25HbG9iYWxzLCB0aGlzLl9sb2NhbElkRmFjdG9yeSwgZmFsc2UsIG9ycGhhbkZpZWxkcywgdGhpcy5yZWYpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIHdhcm4oYF9wYXJzZWRBbm5vdGF0aW9uczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgY29uc3Qgc29ydGVkQW5ub3RhdGlvbnMgPSBbXTsKICAgICAgbGV0IHBvcHVwQW5ub3RhdGlvbnMsIHdpZGdldEFubm90YXRpb25zOwogICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYXdhaXQgUHJvbWlzZS5hbGwoYW5ub3RhdGlvblByb21pc2VzKSkgewogICAgICAgIGlmICghYW5ub3RhdGlvbikgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgV2lkZ2V0QW5ub3RhdGlvbikgewogICAgICAgICAgKHdpZGdldEFubm90YXRpb25zIHx8PSBbXSkucHVzaChhbm5vdGF0aW9uKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBvcHVwQW5ub3RhdGlvbikgewogICAgICAgICAgKHBvcHVwQW5ub3RhdGlvbnMgfHw9IFtdKS5wdXNoKGFubm90YXRpb24pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7CiAgICAgIH0KICAgICAgaWYgKHdpZGdldEFubm90YXRpb25zKSB7CiAgICAgICAgc29ydGVkQW5ub3RhdGlvbnMucHVzaCguLi53aWRnZXRBbm5vdGF0aW9ucyk7CiAgICAgIH0KICAgICAgaWYgKHBvcHVwQW5ub3RhdGlvbnMpIHsKICAgICAgICBzb3J0ZWRBbm5vdGF0aW9ucy5wdXNoKC4uLnBvcHVwQW5ub3RhdGlvbnMpOwogICAgICB9CiAgICAgIHJldHVybiBzb3J0ZWRBbm5vdGF0aW9uczsKICAgIH0pOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiX3BhcnNlZEFubm90YXRpb25zIiwgcHJvbWlzZSk7CiAgfQogIGdldCBqc0FjdGlvbnMoKSB7CiAgICBjb25zdCBhY3Rpb25zID0gY29sbGVjdEFjdGlvbnModGhpcy54cmVmLCB0aGlzLnBhZ2VEaWN0LCBQYWdlQWN0aW9uRXZlbnRUeXBlKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImpzQWN0aW9ucyIsIGFjdGlvbnMpOwogIH0KfQpjb25zdCBQREZfSEVBREVSX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDI1LCAweDUwLCAweDQ0LCAweDQ2LCAweDJkXSk7CmNvbnN0IFNUQVJUWFJFRl9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHg3NCwgMHg3OCwgMHg3MiwgMHg2NSwgMHg2Nl0pOwpjb25zdCBFTkRPQkpfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NmUsIDB4NjQsIDB4NmYsIDB4NjIsIDB4NmFdKTsKZnVuY3Rpb24gZmluZChzdHJlYW0sIHNpZ25hdHVyZSwgbGltaXQgPSAxMDI0LCBiYWNrd2FyZHMgPSBmYWxzZSkgewogIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhsaW1pdCk7CiAgY29uc3Qgc2Nhbkxlbmd0aCA9IHNjYW5CeXRlcy5sZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7CiAgaWYgKHNjYW5MZW5ndGggPD0gMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoYmFja3dhcmRzKSB7CiAgICBjb25zdCBzaWduYXR1cmVFbmQgPSBzaWduYXR1cmVMZW5ndGggLSAxOwogICAgbGV0IHBvcyA9IHNjYW5CeXRlcy5sZW5ndGggLSAxOwogICAgd2hpbGUgKHBvcyA+PSBzaWduYXR1cmVFbmQpIHsKICAgICAgbGV0IGogPSAwOwogICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zIC0gal0gPT09IHNpZ25hdHVyZVtzaWduYXR1cmVFbmQgLSBqXSkgewogICAgICAgIGorKzsKICAgICAgfQogICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgICBzdHJlYW0ucG9zICs9IHBvcyAtIHNpZ25hdHVyZUVuZDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwb3MtLTsKICAgIH0KICB9IGVsc2UgewogICAgbGV0IHBvcyA9IDA7CiAgICB3aGlsZSAocG9zIDw9IHNjYW5MZW5ndGgpIHsKICAgICAgbGV0IGogPSAwOwogICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICAgIGorKzsKICAgICAgfQogICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgICBzdHJlYW0ucG9zICs9IHBvczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwb3MrKzsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CmNsYXNzIFBERkRvY3VtZW50IHsKICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCBzdHJlYW0pIHsKICAgIGlmIChzdHJlYW0ubGVuZ3RoIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEludmFsaWRQREZFeGNlcHRpb24oIlRoZSBQREYgZmlsZSBpcyBlbXB0eSwgaS5lLiBpdHMgc2l6ZSBpcyB6ZXJvIGJ5dGVzLiIpOwogICAgfQogICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy54cmVmID0gbmV3IFhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKTsKICAgIHRoaXMuX3BhZ2VQcm9taXNlcyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3ZlcnNpb24gPSBudWxsOwogICAgY29uc3QgaWRDb3VudGVycyA9IHsKICAgICAgZm9udDogMAogICAgfTsKICAgIHRoaXMuX2dsb2JhbElkRmFjdG9yeSA9IGNsYXNzIHsKICAgICAgc3RhdGljIGdldERvY0lkKCkgewogICAgICAgIHJldHVybiBgZ18ke3BkZk1hbmFnZXIuZG9jSWR9YDsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlRm9udElkKCkgewogICAgICAgIHJldHVybiBgZiR7KytpZENvdW50ZXJzLmZvbnR9YDsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlT2JqSWQoKSB7CiAgICAgICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlT2JqSWRgIGNhbGxlZC4iKTsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UGFnZU9iaklkKCkgewogICAgICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldFBhZ2VPYmpJZGAgY2FsbGVkLiIpOwogICAgICB9CiAgICB9OwogIH0KICBwYXJzZShyZWNvdmVyeU1vZGUpIHsKICAgIHRoaXMueHJlZi5wYXJzZShyZWNvdmVyeU1vZGUpOwogICAgdGhpcy5jYXRhbG9nID0gbmV3IENhdGFsb2codGhpcy5wZGZNYW5hZ2VyLCB0aGlzLnhyZWYpOwogIH0KICBnZXQgbGluZWFyaXphdGlvbigpIHsKICAgIGxldCBsaW5lYXJpemF0aW9uID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGxpbmVhcml6YXRpb24gPSBMaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9CiAgICAgIGluZm8oZXJyKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImxpbmVhcml6YXRpb24iLCBsaW5lYXJpemF0aW9uKTsKICB9CiAgZ2V0IHN0YXJ0WFJlZigpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgbGV0IHN0YXJ0WFJlZiA9IDA7CiAgICBpZiAodGhpcy5saW5lYXJpemF0aW9uKSB7CiAgICAgIHN0cmVhbS5yZXNldCgpOwogICAgICBpZiAoZmluZChzdHJlYW0sIEVORE9CSl9TSUdOQVRVUkUpKSB7CiAgICAgICAgc3RyZWFtLnNraXAoNik7CiAgICAgICAgbGV0IGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgd2hpbGUgKGlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICAgIHN0cmVhbS5wb3MrKzsKICAgICAgICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0WFJlZiA9IHN0cmVhbS5wb3MgLSBzdHJlYW0uc3RhcnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0ZXAgPSAxMDI0OwogICAgICBjb25zdCBzdGFydFhSZWZMZW5ndGggPSBTVEFSVFhSRUZfU0lHTkFUVVJFLmxlbmd0aDsKICAgICAgbGV0IGZvdW5kID0gZmFsc2UsCiAgICAgICAgcG9zID0gc3RyZWFtLmVuZDsKICAgICAgd2hpbGUgKCFmb3VuZCAmJiBwb3MgPiAwKSB7CiAgICAgICAgcG9zIC09IHN0ZXAgLSBzdGFydFhSZWZMZW5ndGg7CiAgICAgICAgaWYgKHBvcyA8IDApIHsKICAgICAgICAgIHBvcyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7CiAgICAgICAgZm91bmQgPSBmaW5kKHN0cmVhbSwgU1RBUlRYUkVGX1NJR05BVFVSRSwgc3RlcCwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgc3RyZWFtLnNraXAoOSk7CiAgICAgICAgbGV0IGNoOwogICAgICAgIGRvIHsKICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICB9IHdoaWxlIChpc1doaXRlU3BhY2UoY2gpKTsKICAgICAgICBsZXQgc3RyID0gIiI7CiAgICAgICAgd2hpbGUgKGNoID49IDB4MjAgJiYgY2ggPD0gMHgzOSkgewogICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICAgICAgY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgIH0KICAgICAgICBzdGFydFhSZWYgPSBwYXJzZUludChzdHIsIDEwKTsKICAgICAgICBpZiAoaXNOYU4oc3RhcnRYUmVmKSkgewogICAgICAgICAgc3RhcnRYUmVmID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInN0YXJ0WFJlZiIsIHN0YXJ0WFJlZik7CiAgfQogIGNoZWNrSGVhZGVyKCkgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBzdHJlYW0ucmVzZXQoKTsKICAgIGlmICghZmluZChzdHJlYW0sIFBERl9IRUFERVJfU0lHTkFUVVJFKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzdHJlYW0ubW92ZVN0YXJ0KCk7CiAgICBzdHJlYW0uc2tpcChQREZfSEVBREVSX1NJR05BVFVSRS5sZW5ndGgpOwogICAgbGV0IHZlcnNpb24gPSAiIiwKICAgICAgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgPiAweDIwICYmIHZlcnNpb24ubGVuZ3RoIDwgNykgewogICAgICB2ZXJzaW9uICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgaWYgKFBERl9WRVJTSU9OX1JFR0VYUC50ZXN0KHZlcnNpb24pKSB7CiAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uOwogICAgfSBlbHNlIHsKICAgICAgd2FybihgSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb246ICR7dmVyc2lvbn1gKTsKICAgIH0KICB9CiAgcGFyc2VTdGFydFhSZWYoKSB7CiAgICB0aGlzLnhyZWYuc2V0U3RhcnRYUmVmKHRoaXMuc3RhcnRYUmVmKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgbGV0IG51bSA9IDA7CiAgICBpZiAodGhpcy5jYXRhbG9nLmhhc0FjdHVhbE51bVBhZ2VzKSB7CiAgICAgIG51bSA9IHRoaXMuY2F0YWxvZy5udW1QYWdlczsKICAgIH0gZWxzZSBpZiAodGhpcy54ZmFGYWN0b3J5KSB7CiAgICAgIG51bSA9IHRoaXMueGZhRmFjdG9yeS5nZXROdW1QYWdlcygpOwogICAgfSBlbHNlIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHsKICAgICAgbnVtID0gdGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOwogICAgfSBlbHNlIHsKICAgICAgbnVtID0gdGhpcy5jYXRhbG9nLm51bVBhZ2VzOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibnVtUGFnZXMiLCBudW0pOwogIH0KICBfaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMsIHJlY3Vyc2lvbkRlcHRoID0gMCkgewogICAgY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTA7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KGZpZWxkID0+IHsKICAgICAgZmllbGQgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWVsZCk7CiAgICAgIGlmICghKGZpZWxkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgICAgaWYgKCsrcmVjdXJzaW9uRGVwdGggPiBSRUNVUlNJT05fTElNSVQpIHsKICAgICAgICAgIHdhcm4oIl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOiBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCByZWFjaGVkIik7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkLmdldCgiS2lkcyIpLCByZWN1cnNpb25EZXB0aCk7CiAgICAgIH0KICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBpc05hbWUoZmllbGQuZ2V0KCJGVCIpLCAiU2lnIik7CiAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGZpZWxkLmdldCgiUmVjdCIpOwogICAgICBjb25zdCBpc0ludmlzaWJsZSA9IEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUuZXZlcnkodmFsdWUgPT4gdmFsdWUgPT09IDApOwogICAgICByZXR1cm4gaXNTaWduYXR1cmUgJiYgaXNJbnZpc2libGU7CiAgICB9KTsKICB9CiAgZ2V0IF94ZmFTdHJlYW1zKCkgewogICAgY29uc3QgYWNyb0Zvcm0gPSB0aGlzLmNhdGFsb2cuYWNyb0Zvcm07CiAgICBpZiAoIWFjcm9Gb3JtKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeGZhID0gYWNyb0Zvcm0uZ2V0KCJYRkEiKTsKICAgIGNvbnN0IGVudHJpZXMgPSB7CiAgICAgICJ4ZHA6eGRwIjogIiIsCiAgICAgIHRlbXBsYXRlOiAiIiwKICAgICAgZGF0YXNldHM6ICIiLAogICAgICBjb25maWc6ICIiLAogICAgICBjb25uZWN0aW9uU2V0OiAiIiwKICAgICAgbG9jYWxlU2V0OiAiIiwKICAgICAgc3R5bGVzaGVldDogIiIsCiAgICAgICIveGRwOnhkcCI6ICIiCiAgICB9OwogICAgaWYgKHhmYSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gJiYgIXhmYS5pc0VtcHR5KSB7CiAgICAgIGVudHJpZXNbInhkcDp4ZHAiXSA9IHhmYTsKICAgICAgcmV0dXJuIGVudHJpZXM7CiAgICB9CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeGZhKSB8fCB4ZmEubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0geGZhLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgbGV0IG5hbWU7CiAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgbmFtZSA9ICJ4ZHA6eGRwIjsKICAgICAgfSBlbHNlIGlmIChpID09PSBpaSAtIDIpIHsKICAgICAgICBuYW1lID0gIi94ZHA6eGRwIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lID0geGZhW2ldOwogICAgICB9CiAgICAgIGlmICghZW50cmllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZih4ZmFbaSArIDFdKTsKICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHx8IGRhdGEuaXNFbXB0eSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGVudHJpZXNbbmFtZV0gPSBkYXRhOwogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIGdldCB4ZmFEYXRhc2V0cygpIHsKICAgIGNvbnN0IHN0cmVhbXMgPSB0aGlzLl94ZmFTdHJlYW1zOwogICAgaWYgKCFzdHJlYW1zKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYURhdGFzZXRzIiwgbnVsbCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGtleSBvZiBbImRhdGFzZXRzIiwgInhkcDp4ZHAiXSkgewogICAgICBjb25zdCBzdHJlYW0gPSBzdHJlYW1zW2tleV07CiAgICAgIGlmICghc3RyZWFtKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBzdHIgPSBzdHJpbmdUb1VURjhTdHJpbmcoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgICBjb25zdCBkYXRhID0gewogICAgICAgICAgW2tleV06IHN0cgogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YXNldHMiLCBuZXcgRGF0YXNldFJlYWRlcihkYXRhKSk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHdhcm4oIlhGQSAtIEludmFsaWQgdXRmLTggc3RyaW5nLiIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ4ZmFEYXRhc2V0cyIsIG51bGwpOwogIH0KICBnZXQgeGZhRGF0YSgpIHsKICAgIGNvbnN0IHN0cmVhbXMgPSB0aGlzLl94ZmFTdHJlYW1zOwogICAgaWYgKCFzdHJlYW1zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKGNvbnN0IFtrZXksIHN0cmVhbV0gb2YgT2JqZWN0LmVudHJpZXMoc3RyZWFtcykpIHsKICAgICAgaWYgKCFzdHJlYW0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGRhdGFba2V5XSA9IHN0cmluZ1RvVVRGOFN0cmluZyhzdHJlYW0uZ2V0U3RyaW5nKCkpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB3YXJuKCJYRkEgLSBJbnZhbGlkIHV0Zi04IHN0cmluZy4iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGdldCB4ZmFGYWN0b3J5KCkgewogICAgbGV0IGRhdGE7CiAgICBpZiAodGhpcy5wZGZNYW5hZ2VyLmVuYWJsZVhmYSAmJiB0aGlzLmNhdGFsb2cubmVlZHNSZW5kZXJpbmcgJiYgdGhpcy5mb3JtSW5mby5oYXNYZmEgJiYgIXRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0pIHsKICAgICAgZGF0YSA9IHRoaXMueGZhRGF0YTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYUZhY3RvcnkiLCBkYXRhID8gbmV3IFhGQUZhY3RvcnkoZGF0YSkgOiBudWxsKTsKICB9CiAgZ2V0IGlzUHVyZVhmYSgpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3RvcnkuaXNWYWxpZCgpIDogZmFsc2U7CiAgfQogIGdldCBodG1sRm9yWGZhKCkgewogICAgcmV0dXJuIHRoaXMueGZhRmFjdG9yeSA/IHRoaXMueGZhRmFjdG9yeS5nZXRQYWdlcygpIDogbnVsbDsKICB9CiAgYXN5bmMgbG9hZFhmYUltYWdlcygpIHsKICAgIGNvbnN0IHhmYUltYWdlc0RpY3QgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygieGZhSW1hZ2VzIik7CiAgICBpZiAoIXhmYUltYWdlc0RpY3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qga2V5cyA9IHhmYUltYWdlc0RpY3QuZ2V0S2V5cygpOwogICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcih4ZmFJbWFnZXNEaWN0LCBrZXlzLCB0aGlzLnhyZWYpOwogICAgYXdhaXQgb2JqZWN0TG9hZGVyLmxvYWQoKTsKICAgIGNvbnN0IHhmYUltYWdlcyA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKICAgICAgY29uc3Qgc3RyZWFtID0geGZhSW1hZ2VzRGljdC5nZXQoa2V5KTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICB4ZmFJbWFnZXMuc2V0KGtleSwgc3RyZWFtLmdldEJ5dGVzKCkpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnhmYUZhY3Rvcnkuc2V0SW1hZ2VzKHhmYUltYWdlcyk7CiAgfQogIGFzeW5jIGxvYWRYZmFGb250cyhoYW5kbGVyLCB0YXNrKSB7CiAgICBjb25zdCBhY3JvRm9ybSA9IGF3YWl0IHRoaXMucGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpOwogICAgaWYgKCFhY3JvRm9ybSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByZXNvdXJjZXMgPSBhd2FpdCBhY3JvRm9ybS5nZXRBc3luYygiRFIiKTsKICAgIGlmICghKHJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIocmVzb3VyY2VzLCBbIkZvbnQiXSwgdGhpcy54cmVmKTsKICAgIGF3YWl0IG9iamVjdExvYWRlci5sb2FkKCk7CiAgICBjb25zdCBmb250UmVzID0gcmVzb3VyY2VzLmdldCgiRm9udCIpOwogICAgaWYgKCEoZm9udFJlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMucGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zKTsKICAgIG9wdGlvbnMudXNlU3lzdGVtRm9udHMgPSBmYWxzZTsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiAtMSwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9nbG9iYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5jYXRhbG9nLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5jYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5jYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgb3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICBjb25zdCBwZGZGb250cyA9IFtdOwogICAgY29uc3QgaW5pdGlhbFN0YXRlID0gewogICAgICBnZXQgZm9udCgpIHsKICAgICAgICByZXR1cm4gcGRmRm9udHMuYXQoLTEpOwogICAgICB9LAogICAgICBzZXQgZm9udChmb250KSB7CiAgICAgICAgcGRmRm9udHMucHVzaChmb250KTsKICAgICAgfSwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgZm9yIChjb25zdCBbZm9udE5hbWUsIGZvbnRdIG9mIGZvbnRSZXMpIHsKICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGZvbnQuZ2V0KCJGb250RGVzY3JpcHRvciIpOwogICAgICBpZiAoIShkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgZm9udEZhbWlseSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250RmFtaWx5Iik7CiAgICAgIGZvbnRGYW1pbHkgPSBmb250RmFtaWx5LnJlcGxhY2VBbGwoL1sgXSsoXGQpL2csICIkMSIpOwogICAgICBjb25zdCBmb250V2VpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIkZvbnRXZWlnaHQiKTsKICAgICAgY29uc3QgaXRhbGljQW5nbGUgPSAtZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIik7CiAgICAgIGNvbnN0IGNzc0ZvbnRJbmZvID0gewogICAgICAgIGZvbnRGYW1pbHksCiAgICAgICAgZm9udFdlaWdodCwKICAgICAgICBpdGFsaWNBbmdsZQogICAgICB9OwogICAgICBpZiAoIXZhbGlkYXRlQ1NTRm9udChjc3NGb250SW5mbykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBwcm9taXNlcy5wdXNoKHBhcnRpYWxFdmFsdWF0b3IuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIFtOYW1lLmdldChmb250TmFtZSksIDFdLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbnVsbCwgY3NzRm9udEluZm8pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICB3YXJuKGBsb2FkWGZhRm9udHM6ICIke3JlYXNvbn0iLmApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9KSk7CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICBjb25zdCBtaXNzaW5nRm9udHMgPSB0aGlzLnhmYUZhY3Rvcnkuc2V0Rm9udHMocGRmRm9udHMpOwogICAgaWYgKCFtaXNzaW5nRm9udHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgb3B0aW9ucy5pZ25vcmVFcnJvcnMgPSB0cnVlOwogICAgcHJvbWlzZXMubGVuZ3RoID0gMDsKICAgIHBkZkZvbnRzLmxlbmd0aCA9IDA7CiAgICBjb25zdCByZWFsbHlNaXNzaW5nRm9udHMgPSBuZXcgU2V0KCk7CiAgICBmb3IgKGNvbnN0IG1pc3Npbmcgb2YgbWlzc2luZ0ZvbnRzKSB7CiAgICAgIGlmICghZ2V0WGZhRm9udE5hbWUoYCR7bWlzc2luZ30tUmVndWxhcmApKSB7CiAgICAgICAgcmVhbGx5TWlzc2luZ0ZvbnRzLmFkZChtaXNzaW5nKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlYWxseU1pc3NpbmdGb250cy5zaXplKSB7CiAgICAgIG1pc3NpbmdGb250cy5wdXNoKCJQZGZKUy1GYWxsYmFjayIpOwogICAgfQogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIG1pc3NpbmdGb250cykgewogICAgICBpZiAocmVhbGx5TWlzc2luZ0ZvbnRzLmhhcyhtaXNzaW5nKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZm9udEluZm8gb2YgW3sKICAgICAgICBuYW1lOiAiUmVndWxhciIsCiAgICAgICAgZm9udFdlaWdodDogNDAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAwCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiQm9sZCIsCiAgICAgICAgZm9udFdlaWdodDogNzAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAwCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiSXRhbGljIiwKICAgICAgICBmb250V2VpZ2h0OiA0MDAsCiAgICAgICAgaXRhbGljQW5nbGU6IDEyCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiQm9sZEl0YWxpYyIsCiAgICAgICAgZm9udFdlaWdodDogNzAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAxMgogICAgICB9XSkgewogICAgICAgIGNvbnN0IG5hbWUgPSBgJHttaXNzaW5nfS0ke2ZvbnRJbmZvLm5hbWV9YDsKICAgICAgICBjb25zdCBkaWN0ID0gZ2V0WGZhRm9udERpY3QobmFtZSk7CiAgICAgICAgcHJvbWlzZXMucHVzaChwYXJ0aWFsRXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbTmFtZS5nZXQobmFtZSksIDFdLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgZGljdCwgewogICAgICAgICAgZm9udEZhbWlseTogbWlzc2luZywKICAgICAgICAgIGZvbnRXZWlnaHQ6IGZvbnRJbmZvLmZvbnRXZWlnaHQsCiAgICAgICAgICBpdGFsaWNBbmdsZTogZm9udEluZm8uaXRhbGljQW5nbGUKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKGBsb2FkWGZhRm9udHM6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSkpOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICB0aGlzLnhmYUZhY3RvcnkuYXBwZW5kRm9udHMocGRmRm9udHMsIHJlYWxseU1pc3NpbmdGb250cyk7CiAgfQogIGFzeW5jIHNlcmlhbGl6ZVhmYURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3Rvcnkuc2VyaWFsaXplRGF0YShhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogIH0KICBnZXQgdmVyc2lvbigpIHsKICAgIHJldHVybiB0aGlzLmNhdGFsb2cudmVyc2lvbiB8fCB0aGlzLl92ZXJzaW9uOwogIH0KICBnZXQgZm9ybUluZm8oKSB7CiAgICBjb25zdCBmb3JtSW5mbyA9IHsKICAgICAgaGFzRmllbGRzOiBmYWxzZSwKICAgICAgaGFzQWNyb0Zvcm06IGZhbHNlLAogICAgICBoYXNYZmE6IGZhbHNlLAogICAgICBoYXNTaWduYXR1cmVzOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IGFjcm9Gb3JtID0gdGhpcy5jYXRhbG9nLmFjcm9Gb3JtOwogICAgaWYgKCFhY3JvRm9ybSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IGZpZWxkcyA9IGFjcm9Gb3JtLmdldCgiRmllbGRzIik7CiAgICAgIGNvbnN0IGhhc0ZpZWxkcyA9IEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiBmaWVsZHMubGVuZ3RoID4gMDsKICAgICAgZm9ybUluZm8uaGFzRmllbGRzID0gaGFzRmllbGRzOwogICAgICBjb25zdCB4ZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpOwogICAgICBmb3JtSW5mby5oYXNYZmEgPSBBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDAgfHwgeGZhIGluc3RhbmNlb2YgQmFzZVN0cmVhbSAmJiAheGZhLmlzRW1wdHk7CiAgICAgIGNvbnN0IHNpZ0ZsYWdzID0gYWNyb0Zvcm0uZ2V0KCJTaWdGbGFncyIpOwogICAgICBjb25zdCBoYXNTaWduYXR1cmVzID0gISEoc2lnRmxhZ3MgJiAweDEpOwogICAgICBjb25zdCBoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzID0gaGFzU2lnbmF0dXJlcyAmJiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkcyk7CiAgICAgIGZvcm1JbmZvLmhhc0Fjcm9Gb3JtID0gaGFzRmllbGRzICYmICFoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOwogICAgICBmb3JtSW5mby5oYXNTaWduYXR1cmVzID0gaGFzU2lnbmF0dXJlczsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgQ2Fubm90IGZldGNoIGZvcm0gaW5mb3JtYXRpb246ICIke2V4fSIuYCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKICB9CiAgZ2V0IGRvY3VtZW50SW5mbygpIHsKICAgIGNvbnN0IGRvY0luZm8gPSB7CiAgICAgIFBERkZvcm1hdFZlcnNpb246IHRoaXMudmVyc2lvbiwKICAgICAgTGFuZ3VhZ2U6IHRoaXMuY2F0YWxvZy5sYW5nLAogICAgICBFbmNyeXB0RmlsdGVyTmFtZTogdGhpcy54cmVmLmVuY3J5cHQgPyB0aGlzLnhyZWYuZW5jcnlwdC5maWx0ZXJOYW1lIDogbnVsbCwKICAgICAgSXNMaW5lYXJpemVkOiAhIXRoaXMubGluZWFyaXphdGlvbiwKICAgICAgSXNBY3JvRm9ybVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0sCiAgICAgIElzWEZBUHJlc2VudDogdGhpcy5mb3JtSW5mby5oYXNYZmEsCiAgICAgIElzQ29sbGVjdGlvblByZXNlbnQ6ICEhdGhpcy5jYXRhbG9nLmNvbGxlY3Rpb24sCiAgICAgIElzU2lnbmF0dXJlc1ByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzU2lnbmF0dXJlcwogICAgfTsKICAgIGxldCBpbmZvRGljdDsKICAgIHRyeSB7CiAgICAgIGluZm9EaWN0ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIik7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9CiAgICAgIGluZm8oIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CiAgICB9CiAgICBpZiAoIShpbmZvRGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgImRvY3VtZW50SW5mbyIsIGRvY0luZm8pOwogICAgfQogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5mb0RpY3QpIHsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICJUaXRsZSI6CiAgICAgICAgY2FzZSAiQXV0aG9yIjoKICAgICAgICBjYXNlICJTdWJqZWN0IjoKICAgICAgICBjYXNlICJLZXl3b3JkcyI6CiAgICAgICAgY2FzZSAiQ3JlYXRvciI6CiAgICAgICAgY2FzZSAiUHJvZHVjZXIiOgogICAgICAgIGNhc2UgIkNyZWF0aW9uRGF0ZSI6CiAgICAgICAgY2FzZSAiTW9kRGF0ZSI6CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgICAgICBkb2NJbmZvW2tleV0gPSBzdHJpbmdUb1BERlN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVHJhcHBlZCI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIGRvY0luZm9ba2V5XSA9IHZhbHVlOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBsZXQgY3VzdG9tVmFsdWU7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gc3RyaW5nVG9QREZTdHJpbmcodmFsdWUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgICAgICBjdXN0b21WYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGN1c3RvbVZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgd2FybihgQmFkIHZhbHVlLCBmb3IgY3VzdG9tIGtleSAiJHtrZXl9IiwgaW4gSW5mbzogJHt2YWx1ZX0uYCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFkb2NJbmZvLkN1c3RvbSkgewogICAgICAgICAgICBkb2NJbmZvLkN1c3RvbSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICBkb2NJbmZvLkN1c3RvbVtrZXldID0gY3VzdG9tVmFsdWU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB3YXJuKGBCYWQgdmFsdWUsIGZvciBrZXkgIiR7a2V5fSIsIGluIEluZm86ICR7dmFsdWV9LmApOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZG9jdW1lbnRJbmZvIiwgZG9jSW5mbyk7CiAgfQogIGdldCBmaW5nZXJwcmludHMoKSB7CiAgICBjb25zdCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyA9IDEwMjQ7CiAgICBjb25zdCBFTVBUWV9GSU5HRVJQUklOVCA9ICJceDAwIi5yZXBlYXQoMTYpOwogICAgZnVuY3Rpb24gdmFsaWRhdGUoZGF0YSkgewogICAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICYmIGRhdGEubGVuZ3RoID09PSAxNiAmJiBkYXRhICE9PSBFTVBUWV9GSU5HRVJQUklOVDsKICAgIH0KICAgIGNvbnN0IGlkID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJRCIpOwogICAgbGV0IGhhc2hPcmlnaW5hbCwgaGFzaE1vZGlmaWVkOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpICYmIHZhbGlkYXRlKGlkWzBdKSkgewogICAgICBoYXNoT3JpZ2luYWwgPSBzdHJpbmdUb0J5dGVzKGlkWzBdKTsKICAgICAgaWYgKGlkWzFdICE9PSBpZFswXSAmJiB2YWxpZGF0ZShpZFsxXSkpIHsKICAgICAgICBoYXNoTW9kaWZpZWQgPSBzdHJpbmdUb0J5dGVzKGlkWzFdKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaE9yaWdpbmFsID0gY2FsY3VsYXRlTUQ1KHRoaXMuc3RyZWFtLmdldEJ5dGVSYW5nZSgwLCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyksIDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImZpbmdlcnByaW50cyIsIFt0b0hleFV0aWwoaGFzaE9yaWdpbmFsKSwgaGFzaE1vZGlmaWVkID8gdG9IZXhVdGlsKGhhc2hNb2RpZmllZCkgOiBudWxsXSk7CiAgfQogIGFzeW5jIF9nZXRMaW5lYXJpemF0aW9uUGFnZShwYWdlSW5kZXgpIHsKICAgIGNvbnN0IHsKICAgICAgY2F0YWxvZywKICAgICAgbGluZWFyaXphdGlvbiwKICAgICAgeHJlZgogICAgfSA9IHRoaXM7CiAgICBjb25zdCByZWYgPSBSZWYuZ2V0KGxpbmVhcml6YXRpb24ub2JqZWN0TnVtYmVyRmlyc3QsIDApOwogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKHJlZik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgbGV0IHR5cGUgPSBvYmouZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hbWUodHlwZSwgIlBhZ2UiKSB8fCAhb2JqLmhhcygiVHlwZSIpICYmICFvYmouaGFzKCJLaWRzIikgJiYgb2JqLmhhcygiQ29udGVudHMiKSkgewogICAgICAgICAgaWYgKCFjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5wdXQocmVmLCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghY2F0YWxvZy5wYWdlSW5kZXhDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VJbmRleENhY2hlLnB1dChyZWYsIDApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtvYmosIHJlZl07CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVGhlIExpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYF9nZXRMaW5lYXJpemF0aW9uUGFnZTogIiR7cmVhc29uLm1lc3NhZ2V9Ii5gKTsKICAgICAgcmV0dXJuIGNhdGFsb2cuZ2V0UGFnZURpY3QocGFnZUluZGV4KTsKICAgIH0KICB9CiAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKICAgIGNvbnN0IGNhY2hlZFByb21pc2UgPSB0aGlzLl9wYWdlUHJvbWlzZXMuZ2V0KHBhZ2VJbmRleCk7CiAgICBpZiAoY2FjaGVkUHJvbWlzZSkgewogICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgY2F0YWxvZywKICAgICAgbGluZWFyaXphdGlvbiwKICAgICAgeGZhRmFjdG9yeQogICAgfSA9IHRoaXM7CiAgICBsZXQgcHJvbWlzZTsKICAgIGlmICh4ZmFGYWN0b3J5KSB7CiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoW0RpY3QuZW1wdHksIG51bGxdKTsKICAgIH0gZWxzZSBpZiAobGluZWFyaXphdGlvbj8ucGFnZUZpcnN0ID09PSBwYWdlSW5kZXgpIHsKICAgICAgcHJvbWlzZSA9IHRoaXMuX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCk7CiAgICB9IGVsc2UgewogICAgICBwcm9taXNlID0gY2F0YWxvZy5nZXRQYWdlRGljdChwYWdlSW5kZXgpOwogICAgfQogICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoW3BhZ2VEaWN0LCByZWZdKSA9PiBuZXcgUGFnZSh7CiAgICAgIHBkZk1hbmFnZXI6IHRoaXMucGRmTWFuYWdlciwKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBwYWdlSW5kZXgsCiAgICAgIHBhZ2VEaWN0LAogICAgICByZWYsCiAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogY2F0YWxvZy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgbm9uQmxlbmRNb2Rlc1NldDogY2F0YWxvZy5ub25CbGVuZE1vZGVzU2V0LAogICAgICB4ZmFGYWN0b3J5CiAgICB9KSk7CiAgICB0aGlzLl9wYWdlUHJvbWlzZXMuc2V0KHBhZ2VJbmRleCwgcHJvbWlzZSk7CiAgICByZXR1cm4gcHJvbWlzZTsKICB9CiAgYXN5bmMgY2hlY2tGaXJzdFBhZ2UocmVjb3ZlcnlNb2RlID0gZmFsc2UpIHsKICAgIGlmIChyZWNvdmVyeU1vZGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy5nZXRQYWdlKDApOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24pIHsKICAgICAgICB0aGlzLl9wYWdlUHJvbWlzZXMuZGVsZXRlKDApOwogICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpOwogICAgICAgIHRocm93IG5ldyBYUmVmUGFyc2VFeGNlcHRpb24oKTsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBjaGVja0xhc3RQYWdlKHJlY292ZXJ5TW9kZSA9IGZhbHNlKSB7CiAgICBjb25zdCB7CiAgICAgIGNhdGFsb2csCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSB0aGlzOwogICAgY2F0YWxvZy5zZXRBY3R1YWxOdW1QYWdlcygpOwogICAgbGV0IG51bVBhZ2VzOwogICAgdHJ5IHsKICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3BkZk1hbmFnZXIuZW5zdXJlRG9jKCJ4ZmFGYWN0b3J5IiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJsaW5lYXJpemF0aW9uIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibnVtUGFnZXMiKV0pOwogICAgICBpZiAodGhpcy54ZmFGYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKHRoaXMubGluZWFyaXphdGlvbikgewogICAgICAgIG51bVBhZ2VzID0gdGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOwogICAgICB9IGVsc2UgewogICAgICAgIG51bVBhZ2VzID0gY2F0YWxvZy5udW1QYWdlczsKICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtUGFnZXMpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGNvdW50IGlzIG5vdCBhbiBpbnRlZ2VyLiIpOwogICAgICB9IGVsc2UgaWYgKG51bVBhZ2VzIDw9IDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy5nZXRQYWdlKG51bVBhZ2VzIC0gMSk7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgdGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZShudW1QYWdlcyAtIDEpOwogICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogICAgICB9CiAgICAgIHdhcm4oYGNoZWNrTGFzdFBhZ2UgLSBpbnZhbGlkIC9QYWdlcyB0cmVlIC9Db3VudDogJHtudW1QYWdlc30uYCk7CiAgICAgIGxldCBwYWdlc1RyZWU7CiAgICAgIHRyeSB7CiAgICAgICAgcGFnZXNUcmVlID0gYXdhaXQgY2F0YWxvZy5nZXRBbGxQYWdlRGljdHMocmVjb3ZlcnlNb2RlKTsKICAgICAgfSBjYXRjaCAocmVhc29uQWxsKSB7CiAgICAgICAgaWYgKHJlYXNvbkFsbCBpbnN0YW5jZW9mIFhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGNhdGFsb2cuc2V0QWN0dWFsTnVtUGFnZXMoMSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW3BhZ2VJbmRleCwgW3BhZ2VEaWN0LCByZWZdXSBvZiBwYWdlc1RyZWUpIHsKICAgICAgICBsZXQgcHJvbWlzZTsKICAgICAgICBpZiAocGFnZURpY3QgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVqZWN0KHBhZ2VEaWN0KTsKICAgICAgICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBQYWdlKHsKICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgICAgIHBhZ2VEaWN0LAogICAgICAgICAgICByZWYsCiAgICAgICAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICAgICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAogICAgICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgICAgbm9uQmxlbmRNb2Rlc1NldDogY2F0YWxvZy5ub25CbGVuZE1vZGVzU2V0LAogICAgICAgICAgICB4ZmFGYWN0b3J5OiBudWxsCiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5zZXQocGFnZUluZGV4LCBwcm9taXNlKTsKICAgICAgfQogICAgICBjYXRhbG9nLnNldEFjdHVhbE51bVBhZ2VzKHBhZ2VzVHJlZS5zaXplKTsKICAgIH0KICB9CiAgYXN5bmMgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CiAgICBjb25zdCB7CiAgICAgIGNhdGFsb2csCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSB0aGlzOwogICAgZm9yIChjb25zdCB0cmFuc2xhdGVkRm9udCBvZiBhd2FpdCBQcm9taXNlLmFsbChjYXRhbG9nLmZvbnRDYWNoZSkpIHsKICAgICAgaWYgKHRyYW5zbGF0ZWRGb250LmxvYWRlZE5hbWUgPT09IGlkKSB7CiAgICAgICAgdHJhbnNsYXRlZEZvbnQuZmFsbGJhY2soaGFuZGxlciwgcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5jYXRhbG9nID8gdGhpcy5jYXRhbG9nLmNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQpIDogY2xlYXJHbG9iYWxDYWNoZXMoKTsKICB9CiAgYXN5bmMgI2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwgcGFyZW50UmVmLCBmaWVsZFJlZiwgcHJvbWlzZXMsIGFubm90YXRpb25HbG9iYWxzLCB2aXNpdGVkUmVmcywgb3JwaGFuRmllbGRzKSB7CiAgICBjb25zdCB7CiAgICAgIHhyZWYKICAgIH0gPSB0aGlzOwogICAgaWYgKCEoZmllbGRSZWYgaW5zdGFuY2VvZiBSZWYpIHx8IHZpc2l0ZWRSZWZzLmhhcyhmaWVsZFJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmlzaXRlZFJlZnMucHV0KGZpZWxkUmVmKTsKICAgIGNvbnN0IGZpZWxkID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGZpZWxkUmVmKTsKICAgIGlmICghKGZpZWxkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IHN1YnR5cGUgPSBhd2FpdCBmaWVsZC5nZXRBc3luYygiU3VidHlwZSIpOwogICAgc3VidHlwZSA9IHN1YnR5cGUgaW5zdGFuY2VvZiBOYW1lID8gc3VidHlwZS5uYW1lIDogbnVsbDsKICAgIHN3aXRjaCAoc3VidHlwZSkgewogICAgICBjYXNlICJMaW5rIjoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZmllbGQuaGFzKCJUIikpIHsKICAgICAgY29uc3QgcGFydE5hbWUgPSBzdHJpbmdUb1BERlN0cmluZyhhd2FpdCBmaWVsZC5nZXRBc3luYygiVCIpKTsKICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICB9IGVsc2UgewogICAgICBsZXQgb2JqID0gZmllbGQ7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgb2JqID0gb2JqLmdldFJhdygiUGFyZW50IikgfHwgcGFyZW50UmVmOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIGlmICh2aXNpdGVkUmVmcy5oYXMob2JqKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIG9iaiA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhvYmopOwogICAgICAgIH0KICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChvYmouaGFzKCJUIikpIHsKICAgICAgICAgIGNvbnN0IHBhcnROYW1lID0gc3RyaW5nVG9QREZTdHJpbmcoYXdhaXQgb2JqLmdldEFzeW5jKCJUIikpOwogICAgICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChwYXJlbnRSZWYgJiYgIWZpZWxkLmhhcygiUGFyZW50IikgJiYgaXNOYW1lKGZpZWxkLmdldCgiU3VidHlwZSIpLCAiV2lkZ2V0IikpIHsKICAgICAgb3JwaGFuRmllbGRzLnB1dChmaWVsZFJlZiwgcGFyZW50UmVmKTsKICAgIH0KICAgIGlmICghcHJvbWlzZXMuaGFzKG5hbWUpKSB7CiAgICAgIHByb21pc2VzLnNldChuYW1lLCBbXSk7CiAgICB9CiAgICBwcm9taXNlcy5nZXQobmFtZSkucHVzaChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgZmllbGRSZWYsIGFubm90YXRpb25HbG9iYWxzLCBudWxsLCB0cnVlLCBvcnBoYW5GaWVsZHMsIG51bGwpLnRoZW4oYW5ub3RhdGlvbiA9PiBhbm5vdGF0aW9uPy5nZXRGaWVsZE9iamVjdCgpKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgIHdhcm4oYCNjb2xsZWN0RmllbGRPYmplY3RzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9KSk7CiAgICBpZiAoIWZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGtpZHMgPSBhd2FpdCBmaWVsZC5nZXRBc3luYygiS2lkcyIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgIGF3YWl0IHRoaXMuI2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwgZmllbGRSZWYsIGtpZCwgcHJvbWlzZXMsIGFubm90YXRpb25HbG9iYWxzLCB2aXNpdGVkUmVmcywgb3JwaGFuRmllbGRzKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgZmllbGRPYmplY3RzKCkgewogICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZvcm1JbmZvIikudGhlbihhc3luYyBmb3JtSW5mbyA9PiB7CiAgICAgIGlmICghZm9ybUluZm8uaGFzRmllbGRzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgW2Fubm90YXRpb25HbG9iYWxzLCBhY3JvRm9ybV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiYW5ub3RhdGlvbkdsb2JhbHMiKSwgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIildKTsKICAgICAgaWYgKCFhbm5vdGF0aW9uR2xvYmFscykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHZpc2l0ZWRSZWZzID0gbmV3IFJlZlNldCgpOwogICAgICBjb25zdCBhbGxGaWVsZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBjb25zdCBmaWVsZFByb21pc2VzID0gbmV3IE1hcCgpOwogICAgICBjb25zdCBvcnBoYW5GaWVsZHMgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgICAgZm9yIChjb25zdCBmaWVsZFJlZiBvZiBhd2FpdCBhY3JvRm9ybS5nZXRBc3luYygiRmllbGRzIikpIHsKICAgICAgICBhd2FpdCB0aGlzLiNjb2xsZWN0RmllbGRPYmplY3RzKCIiLCBudWxsLCBmaWVsZFJlZiwgZmllbGRQcm9taXNlcywgYW5ub3RhdGlvbkdsb2JhbHMsIHZpc2l0ZWRSZWZzLCBvcnBoYW5GaWVsZHMpOwogICAgICB9CiAgICAgIGNvbnN0IGFsbFByb21pc2VzID0gW107CiAgICAgIGZvciAoY29uc3QgW25hbWUsIHByb21pc2VzXSBvZiBmaWVsZFByb21pc2VzKSB7CiAgICAgICAgYWxsUHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmaWVsZHMgPT4gewogICAgICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhIWZpZWxkKTsKICAgICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBhbGxGaWVsZHNbbmFtZV0gPSBmaWVsZHM7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFsbFByb21pc2VzKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBhbGxGaWVsZHM6IG9iamVjdFNpemUoYWxsRmllbGRzKSA+IDAgPyBhbGxGaWVsZHMgOiBudWxsLAogICAgICAgIG9ycGhhbkZpZWxkcwogICAgICB9OwogICAgfSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmaWVsZE9iamVjdHMiLCBwcm9taXNlKTsKICB9CiAgZ2V0IGhhc0pTQWN0aW9ucygpIHsKICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJfcGFyc2VIYXNKU0FjdGlvbnMiKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImhhc0pTQWN0aW9ucyIsIHByb21pc2UpOwogIH0KICBhc3luYyBfcGFyc2VIYXNKU0FjdGlvbnMoKSB7CiAgICBjb25zdCBbY2F0YWxvZ0pzQWN0aW9ucywgZmllbGRPYmplY3RzXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIiksIHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpXSk7CiAgICBpZiAoY2F0YWxvZ0pzQWN0aW9ucykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChmaWVsZE9iamVjdHM/LmFsbEZpZWxkcykgewogICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhmaWVsZE9iamVjdHMuYWxsRmllbGRzKS5zb21lKGZpZWxkT2JqZWN0ID0+IGZpZWxkT2JqZWN0LnNvbWUob2JqZWN0ID0+IG9iamVjdC5hY3Rpb25zICE9PSBudWxsKSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYWxjdWxhdGlvbk9yZGVySWRzKCkgewogICAgY29uc3QgY2FsY3VsYXRpb25PcmRlciA9IHRoaXMuY2F0YWxvZy5hY3JvRm9ybT8uZ2V0KCJDTyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGNhbGN1bGF0aW9uT3JkZXIpIHx8IGNhbGN1bGF0aW9uT3JkZXIubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNhbGN1bGF0aW9uT3JkZXJJZHMiLCBudWxsKTsKICAgIH0KICAgIGNvbnN0IGlkcyA9IFtdOwogICAgZm9yIChjb25zdCBpZCBvZiBjYWxjdWxhdGlvbk9yZGVyKSB7CiAgICAgIGlmIChpZCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGlkcy5wdXNoKGlkLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYWxjdWxhdGlvbk9yZGVySWRzIiwgaWRzLmxlbmd0aCA/IGlkcyA6IG51bGwpOwogIH0KICBnZXQgYW5ub3RhdGlvbkdsb2JhbHMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhbm5vdGF0aW9uR2xvYmFscyIsIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUdsb2JhbHModGhpcy5wZGZNYW5hZ2VyKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wZGZfbWFuYWdlci5qcwoKCgoKCgoKCgpmdW5jdGlvbiBwYXJzZURvY0Jhc2VVcmwodXJsKSB7CiAgaWYgKHVybCkgewogICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCk7CiAgICBpZiAoYWJzb2x1dGVVcmwpIHsKICAgICAgcmV0dXJuIGFic29sdXRlVXJsLmhyZWY7CiAgICB9CiAgICB3YXJuKGBJbnZhbGlkIGFic29sdXRlIGRvY0Jhc2VVcmw6ICIke3VybH0iLmApOwogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoewogICAgZG9jQmFzZVVybCwKICAgIGRvY0lkLAogICAgZW5hYmxlWGZhLAogICAgZXZhbHVhdG9yT3B0aW9ucywKICAgIGhhbmRsZXIsCiAgICBwYXNzd29yZAogIH0pIHsKICAgIHRoaXMuX2RvY0Jhc2VVcmwgPSBwYXJzZURvY0Jhc2VVcmwoZG9jQmFzZVVybCk7CiAgICB0aGlzLl9kb2NJZCA9IGRvY0lkOwogICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKICAgIHRoaXMuZW5hYmxlWGZhID0gZW5hYmxlWGZhOwogICAgZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJj0gRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7CiAgICBldmFsdWF0b3JPcHRpb25zLmlzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkICYmPSBGZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICAgIHRoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoZXZhbHVhdG9yT3B0aW9ucyk7CiAgICBJbWFnZVJlc2l6ZXIuc2V0T3B0aW9ucyhldmFsdWF0b3JPcHRpb25zKTsKICAgIEpwZWdTdHJlYW0uc2V0T3B0aW9ucyhldmFsdWF0b3JPcHRpb25zKTsKICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgIC4uLmV2YWx1YXRvck9wdGlvbnMsCiAgICAgIGhhbmRsZXIKICAgIH07CiAgICBKcHhJbWFnZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogICAgSWNjQ29sb3JTcGFjZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogICAgQ215a0lDQ0Jhc2VkQ1Muc2V0T3B0aW9ucyhvcHRpb25zKTsKICB9CiAgZ2V0IGRvY0lkKCkgewogICAgcmV0dXJuIHRoaXMuX2RvY0lkOwogIH0KICBnZXQgcGFzc3dvcmQoKSB7CiAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmQ7CiAgfQogIGdldCBkb2NCYXNlVXJsKCkgewogICAgcmV0dXJuIHRoaXMuX2RvY0Jhc2VVcmw7CiAgfQogIGdldCBjYXRhbG9nKCkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZzsKICB9CiAgZW5zdXJlRG9jKHByb3AsIGFyZ3MpIHsKICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LCBwcm9wLCBhcmdzKTsKICB9CiAgZW5zdXJlWFJlZihwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC54cmVmLCBwcm9wLCBhcmdzKTsKICB9CiAgZW5zdXJlQ2F0YWxvZyhwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC5jYXRhbG9nLCBwcm9wLCBhcmdzKTsKICB9CiAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZUluZGV4KTsKICB9CiAgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5mb250RmFsbGJhY2soaWQsIGhhbmRsZXIpOwogIH0KICBsb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUZvbnRzKGhhbmRsZXIsIHRhc2spOwogIH0KICBsb2FkWGZhSW1hZ2VzKCkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUltYWdlcygpOwogIH0KICBzZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5zZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKTsKICB9CiAgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWQiKTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYHJlcXVlc3RSYW5nZWAgY2FsbGVkIik7CiAgfQogIHJlcXVlc3RMb2FkZWRTdHJlYW0obm9GZXRjaCA9IGZhbHNlKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0TG9hZGVkU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgc2VuZFByb2dyZXNzaXZlRGF0YShjaHVuaykgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkIik7CiAgfQogIHVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKSB7CiAgICB0aGlzLl9wYXNzd29yZCA9IHBhc3N3b3JkOwogIH0KICB0ZXJtaW5hdGUocmVhc29uKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZCIpOwogIH0KfQpjbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgc3VwZXIoYXJncyk7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGFyZ3Muc291cmNlKTsKICAgIHRoaXMucGRmRG9jdW1lbnQgPSBuZXcgUERGRG9jdW1lbnQodGhpcywgc3RyZWFtKTsKICAgIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoc3RyZWFtKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgY29uc3QgdmFsdWUgPSBvYmpbcHJvcF07CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogIH0KICByZXF1ZXN0TG9hZGVkU3RyZWFtKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2U7CiAgfQogIHRlcm1pbmF0ZShyZWFzb24pIHt9Cn0KY2xhc3MgTmV0d29ya1BkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgc3VwZXIoYXJncyk7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIgPSBuZXcgQ2h1bmtlZFN0cmVhbU1hbmFnZXIoYXJncy5zb3VyY2UsIHsKICAgICAgbXNnSGFuZGxlcjogYXJncy5oYW5kbGVyLAogICAgICBsZW5ndGg6IGFyZ3MubGVuZ3RoLAogICAgICBkaXNhYmxlQXV0b0ZldGNoOiBhcmdzLmRpc2FibGVBdXRvRmV0Y2gsCiAgICAgIHJhbmdlQ2h1bmtTaXplOiBhcmdzLnJhbmdlQ2h1bmtTaXplCiAgICB9KTsKICAgIHRoaXMucGRmRG9jdW1lbnQgPSBuZXcgUERGRG9jdW1lbnQodGhpcywgdGhpcy5zdHJlYW1NYW5hZ2VyLmdldFN0cmVhbSgpKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgdHJ5IHsKICAgICAgY29uc3QgdmFsdWUgPSBvYmpbcHJvcF07CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkob2JqLCBhcmdzKTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOwogICAgICByZXR1cm4gdGhpcy5lbnN1cmUob2JqLCBwcm9wLCBhcmdzKTsKICAgIH0KICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpOwogIH0KICByZXF1ZXN0TG9hZGVkU3RyZWFtKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5yZXF1ZXN0QWxsQ2h1bmtzKG5vRmV0Y2gpOwogIH0KICBzZW5kUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKSB7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIub25SZWNlaXZlRGF0YSh7CiAgICAgIGNodW5rCiAgICB9KTsKICB9CiAgdGVybWluYXRlKHJlYXNvbikgewogICAgdGhpcy5zdHJlYW1NYW5hZ2VyLmFib3J0KHJlYXNvbik7CiAgfQp9Cgo7Ly8gLi9zcmMvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qcwoKY29uc3QgQ2FsbGJhY2tLaW5kID0gewogIERBVEE6IDEsCiAgRVJST1I6IDIKfTsKY29uc3QgU3RyZWFtS2luZCA9IHsKICBDQU5DRUw6IDEsCiAgQ0FOQ0VMX0NPTVBMRVRFOiAyLAogIENMT1NFOiAzLAogIEVOUVVFVUU6IDQsCiAgRVJST1I6IDUsCiAgUFVMTDogNiwKICBQVUxMX0NPTVBMRVRFOiA3LAogIFNUQVJUX0NPTVBMRVRFOiA4Cn07CmZ1bmN0aW9uIG9uRm4oKSB7fQpmdW5jdGlvbiB3cmFwUmVhc29uKGV4KSB7CiAgaWYgKGV4IGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBJbnZhbGlkUERGRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgUGFzc3dvcmRFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBSZXNwb25zZUV4Y2VwdGlvbiB8fCBleCBpbnN0YW5jZW9mIFVua25vd25FcnJvckV4Y2VwdGlvbikgewogICAgcmV0dXJuIGV4OwogIH0KICBpZiAoIShleCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBleCA9PT0gIm9iamVjdCIgJiYgZXggIT09IG51bGwpKSB7CiAgICB1bnJlYWNoYWJsZSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgInJlYXNvbiIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTsKICB9CiAgc3dpdGNoIChleC5uYW1lKSB7CiAgICBjYXNlICJBYm9ydEV4Y2VwdGlvbiI6CiAgICAgIHJldHVybiBuZXcgQWJvcnRFeGNlcHRpb24oZXgubWVzc2FnZSk7CiAgICBjYXNlICJJbnZhbGlkUERGRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpOwogICAgY2FzZSAiUGFzc3dvcmRFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmNvZGUpOwogICAgY2FzZSAiUmVzcG9uc2VFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cywgZXgubWlzc2luZyk7CiAgICBjYXNlICJVbmtub3duRXJyb3JFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5kZXRhaWxzKTsKICB9CiAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXgudG9TdHJpbmcoKSk7Cn0KY2xhc3MgTWVzc2FnZUhhbmRsZXIgewogICNtZXNzYWdlQUMgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7CiAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lOwogICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKICAgIHRoaXMuY29tT2JqID0gY29tT2JqOwogICAgdGhpcy5jYWxsYmFja0lkID0gMTsKICAgIHRoaXMuc3RyZWFtSWQgPSAxOwogICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy4jb25NZXNzYWdlLmJpbmQodGhpcyksIHsKICAgICAgc2lnbmFsOiB0aGlzLiNtZXNzYWdlQUMuc2lnbmFsCiAgICB9KTsKICB9CiAgI29uTWVzc2FnZSh7CiAgICBkYXRhCiAgfSkgewogICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gdGhpcy5zb3VyY2VOYW1lKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChkYXRhLnN0cmVhbSkgewogICAgICB0aGlzLiNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDsKICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07CiAgICAgIGlmICghY2FwYWJpbGl0eSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdOwogICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHsKICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTsKICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHsKICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOwogICAgaWYgKCFhY3Rpb24pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTsKICAgIH0KICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHsKICAgICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLAogICAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgICBQcm9taXNlLnRyeShhY3Rpb24sIGRhdGEuZGF0YSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLAogICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAogICAgICAgICAgZGF0YTogcmVzdWx0CiAgICAgICAgfSk7CiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLAogICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAogICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7CiAgICAgIHRoaXMuI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFjdGlvbihkYXRhLmRhdGEpOwogIH0KICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7CiAgICBjb25zdCBhaCA9IHRoaXMuYWN0aW9uSGFuZGxlcjsKICAgIGlmIChhaFthY3Rpb25OYW1lXSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIiR7YWN0aW9uTmFtZX0iYCk7CiAgICB9CiAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7CiAgfQogIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CiAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAogICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCiAgICAgIGRhdGEKICAgIH0sIHRyYW5zZmVycyk7CiAgfQogIHNlbmRXaXRoUHJvbWlzZShhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHsKICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTsKICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF0gPSBjYXBhYmlsaXR5OwogICAgdHJ5IHsKICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsCiAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAogICAgICAgIGNhbGxiYWNrSWQsCiAgICAgICAgZGF0YQogICAgICB9LCB0cmFuc2ZlcnMpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgY2FwYWJpbGl0eS5yZWplY3QoZXgpOwogICAgfQogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgc2VuZFdpdGhTdHJlYW0oYWN0aW9uTmFtZSwgZGF0YSwgcXVldWVpbmdTdHJhdGVneSwgdHJhbnNmZXJzKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKywKICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZSA9IHRoaXMudGFyZ2V0TmFtZSwKICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7CiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHsKICAgICAgc3RhcnQ6IGNvbnRyb2xsZXIgPT4gewogICAgICAgIGNvbnN0IHN0YXJ0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdID0gewogICAgICAgICAgY29udHJvbGxlciwKICAgICAgICAgIHN0YXJ0Q2FsbDogc3RhcnRDYXBhYmlsaXR5LAogICAgICAgICAgcHVsbENhbGw6IG51bGwsCiAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLAogICAgICAgICAgaXNDbG9zZWQ6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIGRhdGEsCiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQogICAgICAgIH0sIHRyYW5zZmVycyk7CiAgICAgICAgcmV0dXJuIHN0YXJ0Q2FwYWJpbGl0eS5wcm9taXNlOwogICAgICB9LAogICAgICBwdWxsOiBjb250cm9sbGVyID0+IHsKICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0sCiAgICAgIGNhbmNlbDogcmVhc29uID0+IHsKICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CiAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5OwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0KICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpOwogIH0KICAjY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc2VsZiA9IHRoaXMsCiAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CiAgICBjb25zdCBzdHJlYW1TaW5rID0gewogICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7CiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTsKICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7CiAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7CiAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSwKICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgY2h1bmsKICAgICAgICB9LCB0cmFuc2ZlcnMpOwogICAgICB9LAogICAgICBjbG9zZSgpIHsKICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsCiAgICAgICAgICBzdHJlYW1JZAogICAgICAgIH0pOwogICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgfSwKICAgICAgZXJyb3IocmVhc29uKSB7CiAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCAiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICB9LAogICAgICBzaW5rQ2FwYWJpbGl0eTogUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCksCiAgICAgIG9uUHVsbDogbnVsbCwKICAgICAgb25DYW5jZWw6IG51bGwsCiAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSwKICAgICAgZGVzaXJlZFNpemU6IGRhdGEuZGVzaXJlZFNpemUsCiAgICAgIHJlYWR5OiBudWxsCiAgICB9OwogICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CiAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rOwogICAgUHJvbWlzZS50cnkoYWN0aW9uLCBkYXRhLmRhdGEsIHN0cmVhbVNpbmspLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsCiAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICB9KTsKICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAogICAgICAgIHN0cmVhbUlkLAogICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgIH0pOwogICAgfSk7CiAgfQogICNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciA9IHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLAogICAgICBzdHJlYW1TaW5rID0gdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CiAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTEw6CiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1TaW5rLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHsKICAgICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICBzdHJlYW1TaW5rLmRlc2lyZWRTaXplID0gZGF0YS5kZXNpcmVkU2l6ZTsKICAgICAgICBQcm9taXNlLnRyeShzdHJlYW1TaW5rLm9uUHVsbCB8fCBvbkZuKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAogICAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOgogICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCAiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOwogICAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUoZGF0YS5jaHVuayk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRToKICAgICAgICBhc3NlcnQoc3RyZWFtQ29udHJvbGxlciwgImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOgogICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCAiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOgogICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIH0KICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTDoKICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhUmVhc29uID0gd3JhcFJlYXNvbihkYXRhLnJlYXNvbik7CiAgICAgICAgUHJvbWlzZS50cnkoc3RyZWFtU2luay5vbkNhbmNlbCB8fCBvbkZuLCBkYXRhUmVhc29uKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLAogICAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVqZWN0KGRhdGFSZWFzb24pOwogICAgICAgIHN0cmVhbVNpbmsuaXNDYW5jZWxsZWQgPSB0cnVlOwogICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKTsKICAgIH0KICB9CiAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHsKICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbD8ucHJvbWlzZV0pOwogICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdOwogIH0KICBkZXN0cm95KCkgewogICAgdGhpcy4jbWVzc2FnZUFDPy5hYm9ydCgpOwogICAgdGhpcy4jbWVzc2FnZUFDID0gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3dyaXRlci5qcwoKCgoKCgoKYXN5bmMgZnVuY3Rpb24gd3JpdGVPYmplY3QocmVmLCBvYmosIGJ1ZmZlciwgewogIGVuY3J5cHQgPSBudWxsCn0pIHsKICBjb25zdCB0cmFuc2Zvcm0gPSBlbmNyeXB0Py5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0ocmVmLm51bSwgcmVmLmdlbik7CiAgYnVmZmVyLnB1c2goYCR7cmVmLm51bX0gJHtyZWYuZ2VufSBvYmpcbmApOwogIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBhd2FpdCB3cml0ZURpY3Qob2JqLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICBhd2FpdCB3cml0ZVN0cmVhbShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKSkgewogICAgYXdhaXQgd3JpdGVBcnJheShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9CiAgYnVmZmVyLnB1c2goIlxuZW5kb2JqXG4iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZURpY3QoZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBidWZmZXIucHVzaCgiPDwiKTsKICBmb3IgKGNvbnN0IGtleSBvZiBkaWN0LmdldEtleXMoKSkgewogICAgYnVmZmVyLnB1c2goYCAvJHtlc2NhcGVQREZOYW1lKGtleSl9IGApOwogICAgYXdhaXQgd3JpdGVWYWx1ZShkaWN0LmdldFJhdyhrZXkpLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCI+PiIpOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlU3RyZWFtKHN0cmVhbSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBsZXQgYnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICBjb25zdCB7CiAgICBkaWN0CiAgfSA9IHN0cmVhbTsKICBjb25zdCBbZmlsdGVyLCBwYXJhbXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2RpY3QuZ2V0QXN5bmMoIkZpbHRlciIpLCBkaWN0LmdldEFzeW5jKCJEZWNvZGVQYXJtcyIpXSk7CiAgY29uc3QgZmlsdGVyWmVybyA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGF3YWl0IGRpY3QueHJlZi5mZXRjaElmUmVmQXN5bmMoZmlsdGVyWzBdKSA6IGZpbHRlcjsKICBjb25zdCBpc0ZpbHRlclplcm9GbGF0ZURlY29kZSA9IGlzTmFtZShmaWx0ZXJaZXJvLCAiRmxhdGVEZWNvZGUiKTsKICBjb25zdCBNSU5fTEVOR1RIX0ZPUl9DT01QUkVTU0lORyA9IDI1NjsKICBpZiAoYnl0ZXMubGVuZ3RoID49IE1JTl9MRU5HVEhfRk9SX0NPTVBSRVNTSU5HIHx8IGlzRmlsdGVyWmVyb0ZsYXRlRGVjb2RlKSB7CiAgICB0cnkgewogICAgICBjb25zdCBjcyA9IG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZGVmbGF0ZSIpOwogICAgICBjb25zdCB3cml0ZXIgPSBjcy53cml0YWJsZS5nZXRXcml0ZXIoKTsKICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICB3cml0ZXIud3JpdGUoYnl0ZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IHdyaXRlci5yZWFkeTsKICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICBjb25zdCBidWYgPSBhd2FpdCBuZXcgUmVzcG9uc2UoY3MucmVhZGFibGUpLmFycmF5QnVmZmVyKCk7CiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgbGV0IG5ld0ZpbHRlciwgbmV3UGFyYW1zOwogICAgICBpZiAoIWZpbHRlcikgewogICAgICAgIG5ld0ZpbHRlciA9IE5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpOwogICAgICB9IGVsc2UgaWYgKCFpc0ZpbHRlclplcm9GbGF0ZURlY29kZSkgewogICAgICAgIG5ld0ZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgLi4uZmlsdGVyXSA6IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgZmlsdGVyXTsKICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICBuZXdQYXJhbXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBbbnVsbCwgLi4ucGFyYW1zXSA6IFtudWxsLCBwYXJhbXNdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmV3RmlsdGVyKSB7CiAgICAgICAgZGljdC5zZXQoIkZpbHRlciIsIG5ld0ZpbHRlcik7CiAgICAgIH0KICAgICAgaWYgKG5ld1BhcmFtcykgewogICAgICAgIGRpY3Quc2V0KCJEZWNvZGVQYXJtcyIsIG5ld1BhcmFtcyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGluZm8oYHdyaXRlU3RyZWFtIC0gY2Fubm90IGNvbXByZXNzIGRhdGE6ICIke2V4fSIuYCk7CiAgICB9CiAgfQogIGxldCBzdHJpbmcgPSBieXRlc1RvU3RyaW5nKGJ5dGVzKTsKICBpZiAodHJhbnNmb3JtKSB7CiAgICBzdHJpbmcgPSB0cmFuc2Zvcm0uZW5jcnlwdFN0cmluZyhzdHJpbmcpOwogIH0KICBkaWN0LnNldCgiTGVuZ3RoIiwgc3RyaW5nLmxlbmd0aCk7CiAgYXdhaXQgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIiwgc3RyaW5nLCAiXG5lbmRzdHJlYW0iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZUFycmF5KGFycmF5LCBidWZmZXIsIHRyYW5zZm9ybSkgewogIGJ1ZmZlci5wdXNoKCJbIik7CiAgbGV0IGZpcnN0ID0gdHJ1ZTsKICBmb3IgKGNvbnN0IHZhbCBvZiBhcnJheSkgewogICAgaWYgKCFmaXJzdCkgewogICAgICBidWZmZXIucHVzaCgiICIpOwogICAgfSBlbHNlIHsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGF3YWl0IHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCJdIik7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICBidWZmZXIucHVzaChgLyR7ZXNjYXBlUERGTmFtZSh2YWx1ZS5uYW1lKX1gKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmKSB7CiAgICBidWZmZXIucHVzaChgJHt2YWx1ZS5udW19ICR7dmFsdWUuZ2VufSBSYCk7CiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7CiAgICBhd2FpdCB3cml0ZUFycmF5KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIHZhbHVlID0gdHJhbnNmb3JtLmVuY3J5cHRTdHJpbmcodmFsdWUpOwogICAgfQogICAgYnVmZmVyLnB1c2goYCgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KWApOwogIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgewogICAgYnVmZmVyLnB1c2gobnVtYmVyVG9TdHJpbmcodmFsdWUpKTsKICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICBidWZmZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGljdCkgewogICAgYXdhaXQgd3JpdGVEaWN0KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIGF3YWl0IHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgYnVmZmVyLnB1c2goIm51bGwiKTsKICB9IGVsc2UgewogICAgd2FybihgVW5oYW5kbGVkIHZhbHVlIGluIHdyaXRlcjogJHt0eXBlb2YgdmFsdWV9LCBwbGVhc2UgZmlsZSBhIGJ1Zy5gKTsKICB9Cn0KZnVuY3Rpb24gd3JpdGVJbnQobnVtYmVyLCBzaXplLCBvZmZzZXQsIGJ1ZmZlcikgewogIGZvciAobGV0IGkgPSBzaXplICsgb2Zmc2V0IC0gMTsgaSA+IG9mZnNldCAtIDE7IGktLSkgewogICAgYnVmZmVyW2ldID0gbnVtYmVyICYgMHhmZjsKICAgIG51bWJlciA+Pj0gODsKICB9CiAgcmV0dXJuIG9mZnNldCArIHNpemU7Cn0KZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikgewogIGNvbnN0IGlpID0gc3RyaW5nLmxlbmd0aDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGlpOyBpKyspIHsKICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICB9CiAgcmV0dXJuIG9mZnNldCArIGlpOwp9CmZ1bmN0aW9uIGNvbXB1dGVNRDUoZmlsZXNpemUsIHhyZWZJbmZvKSB7CiAgY29uc3QgdGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApOwogIGNvbnN0IGZpbGVuYW1lID0geHJlZkluZm8uZmlsZW5hbWUgfHwgIiI7CiAgY29uc3QgbWQ1QnVmZmVyID0gW3RpbWUudG9TdHJpbmcoKSwgZmlsZW5hbWUsIGZpbGVzaXplLnRvU3RyaW5nKCksIC4uLk9iamVjdC52YWx1ZXMoeHJlZkluZm8uaW5mbyldOwogIGNvbnN0IG1kNUJ1ZmZlckxlbiA9IE1hdGguc3VtUHJlY2lzZShtZDVCdWZmZXIubWFwKHN0ciA9PiBzdHIubGVuZ3RoKSk7CiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShtZDVCdWZmZXJMZW4pOwogIGxldCBvZmZzZXQgPSAwOwogIGZvciAoY29uc3Qgc3RyIG9mIG1kNUJ1ZmZlcikgewogICAgb2Zmc2V0ID0gd3JpdGVTdHJpbmcoc3RyLCBvZmZzZXQsIGFycmF5KTsKICB9CiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoY2FsY3VsYXRlTUQ1KGFycmF5LCAwLCBhcnJheS5sZW5ndGgpKTsKfQpmdW5jdGlvbiB3cml0ZVhGQURhdGFGb3JBY3JvZm9ybShzdHIsIGNoYW5nZXMpIHsKICBjb25zdCB4bWwgPSBuZXcgU2ltcGxlWE1MUGFyc2VyKHsKICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICB9KS5wYXJzZUZyb21TdHJpbmcoc3RyKTsKICBmb3IgKGNvbnN0IHsKICAgIHhmYQogIH0gb2YgY2hhbmdlcykgewogICAgaWYgKCF4ZmEpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIHBhdGgsCiAgICAgIHZhbHVlCiAgICB9ID0geGZhOwogICAgaWYgKCFwYXRoKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3Qgbm9kZVBhdGggPSBwYXJzZVhGQVBhdGgocGF0aCk7CiAgICBsZXQgbm9kZSA9IHhtbC5kb2N1bWVudEVsZW1lbnQuc2VhcmNoTm9kZShub2RlUGF0aCwgMCk7CiAgICBpZiAoIW5vZGUgJiYgbm9kZVBhdGgubGVuZ3RoID4gMSkgewogICAgICBub2RlID0geG1sLmRvY3VtZW50RWxlbWVudC5zZWFyY2hOb2RlKFtub2RlUGF0aC5hdCgtMSldLCAwKTsKICAgIH0KICAgIGlmIChub2RlKSB7CiAgICAgIG5vZGUuY2hpbGROb2RlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHZhbCA9PiBuZXcgU2ltcGxlRE9NTm9kZSgidmFsdWUiLCB2YWwpKSA6IFtuZXcgU2ltcGxlRE9NTm9kZSgiI3RleHQiLCB2YWx1ZSldOwogICAgfSBlbHNlIHsKICAgICAgd2FybihgTm9kZSBub3QgZm91bmQgZm9yIHBhdGg6ICR7cGF0aH1gKTsKICAgIH0KICB9CiAgY29uc3QgYnVmZmVyID0gW107CiAgeG1sLmRvY3VtZW50RWxlbWVudC5kdW1wKGJ1ZmZlcik7CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQphc3luYyBmdW5jdGlvbiB1cGRhdGVBY3JvZm9ybSh7CiAgeHJlZiwKICBhY3JvRm9ybSwKICBhY3JvRm9ybVJlZiwKICBoYXNYZmEsCiAgaGFzWGZhRGF0YXNldHNFbnRyeSwKICB4ZmFEYXRhc2V0c1JlZiwKICBuZWVkQXBwZWFyYW5jZXMsCiAgY2hhbmdlcwp9KSB7CiAgaWYgKGhhc1hmYSAmJiAhaGFzWGZhRGF0YXNldHNFbnRyeSAmJiAheGZhRGF0YXNldHNSZWYpIHsKICAgIHdhcm4oIlhGQSAtIENhbm5vdCBzYXZlIGl0Iik7CiAgfQogIGlmICghbmVlZEFwcGVhcmFuY2VzICYmICghaGFzWGZhIHx8ICF4ZmFEYXRhc2V0c1JlZiB8fCBoYXNYZmFEYXRhc2V0c0VudHJ5KSkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBkaWN0ID0gYWNyb0Zvcm0uY2xvbmUoKTsKICBpZiAoaGFzWGZhICYmICFoYXNYZmFEYXRhc2V0c0VudHJ5KSB7CiAgICBjb25zdCBuZXdYZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpLnNsaWNlKCk7CiAgICBuZXdYZmEuc3BsaWNlKDIsIDAsICJkYXRhc2V0cyIpOwogICAgbmV3WGZhLnNwbGljZSgzLCAwLCB4ZmFEYXRhc2V0c1JlZik7CiAgICBkaWN0LnNldCgiWEZBIiwgbmV3WGZhKTsKICB9CiAgaWYgKG5lZWRBcHBlYXJhbmNlcykgewogICAgZGljdC5zZXQoIk5lZWRBcHBlYXJhbmNlcyIsIHRydWUpOwogIH0KICBjaGFuZ2VzLnB1dChhY3JvRm9ybVJlZiwgewogICAgZGF0YTogZGljdAogIH0pOwp9CmZ1bmN0aW9uIHVwZGF0ZVhGQSh7CiAgeGZhRGF0YSwKICB4ZmFEYXRhc2V0c1JlZiwKICBjaGFuZ2VzLAogIHhyZWYKfSkgewogIGlmICh4ZmFEYXRhID09PSBudWxsKSB7CiAgICBjb25zdCBkYXRhc2V0cyA9IHhyZWYuZmV0Y2hJZlJlZih4ZmFEYXRhc2V0c1JlZik7CiAgICB4ZmFEYXRhID0gd3JpdGVYRkFEYXRhRm9yQWNyb2Zvcm0oZGF0YXNldHMuZ2V0U3RyaW5nKCksIGNoYW5nZXMpOwogIH0KICBjb25zdCB4ZmFEYXRhU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbSh4ZmFEYXRhKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3QgPSBuZXcgRGljdCh4cmVmKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkVtYmVkZGVkRmlsZSIpKTsKICBjaGFuZ2VzLnB1dCh4ZmFEYXRhc2V0c1JlZiwgewogICAgZGF0YTogeGZhRGF0YVN0cmVhbQogIH0pOwp9CmFzeW5jIGZ1bmN0aW9uIGdldFhSZWZUYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSB7CiAgYnVmZmVyLnB1c2goInhyZWZcbiIpOwogIGNvbnN0IGluZGV4ZXMgPSBnZXRJbmRleGVzKG5ld1JlZnMpOwogIGxldCBpbmRleGVzUG9zaXRpb24gPSAwOwogIGZvciAoY29uc3QgewogICAgcmVmLAogICAgZGF0YQogIH0gb2YgbmV3UmVmcykgewogICAgaWYgKHJlZi5udW0gPT09IGluZGV4ZXNbaW5kZXhlc1Bvc2l0aW9uXSkgewogICAgICBidWZmZXIucHVzaChgJHtpbmRleGVzW2luZGV4ZXNQb3NpdGlvbl19ICR7aW5kZXhlc1tpbmRleGVzUG9zaXRpb24gKyAxXX1cbmApOwogICAgICBpbmRleGVzUG9zaXRpb24gKz0gMjsKICAgIH0KICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAke2Jhc2VPZmZzZXQudG9TdHJpbmcoKS5wYWRTdGFydCgxMCwgIjAiKX0gJHtNYXRoLm1pbihyZWYuZ2VuLCAweGZmZmYpLnRvU3RyaW5nKCkucGFkU3RhcnQoNSwgIjAiKX0gblxyXG5gKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwMDAwMDAwMDAwICR7TWF0aC5taW4ocmVmLmdlbiArIDEsIDB4ZmZmZikudG9TdHJpbmcoKS5wYWRTdGFydCg1LCAiMCIpfSBmXHJcbmApOwogICAgfQogIH0KICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBidWZmZXIucHVzaCgidHJhaWxlclxuIik7CiAgYXdhaXQgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlcik7CiAgYnVmZmVyLnB1c2goIlxuc3RhcnR4cmVmXG4iLCBiYXNlT2Zmc2V0LnRvU3RyaW5nKCksICJcbiUlRU9GXG4iKTsKfQpmdW5jdGlvbiBnZXRJbmRleGVzKG5ld1JlZnMpIHsKICBjb25zdCBpbmRleGVzID0gW107CiAgZm9yIChjb25zdCB7CiAgICByZWYKICB9IG9mIG5ld1JlZnMpIHsKICAgIGlmIChyZWYubnVtID09PSBpbmRleGVzLmF0KC0yKSArIGluZGV4ZXMuYXQoLTEpKSB7CiAgICAgIGluZGV4ZXNbaW5kZXhlcy5sZW5ndGggLSAxXSArPSAxOwogICAgfSBlbHNlIHsKICAgICAgaW5kZXhlcy5wdXNoKHJlZi5udW0sIDEpOwogICAgfQogIH0KICByZXR1cm4gaW5kZXhlczsKfQphc3luYyBmdW5jdGlvbiBnZXRYUmVmU3RyZWFtVGFibGUoeHJlZkluZm8sIGJhc2VPZmZzZXQsIG5ld1JlZnMsIG5ld1hyZWYsIGJ1ZmZlcikgewogIGNvbnN0IHhyZWZUYWJsZURhdGEgPSBbXTsKICBsZXQgbWF4T2Zmc2V0ID0gMDsKICBsZXQgbWF4R2VuID0gMDsKICBmb3IgKGNvbnN0IHsKICAgIHJlZiwKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIGxldCBnZW47CiAgICBtYXhPZmZzZXQgPSBNYXRoLm1heChtYXhPZmZzZXQsIGJhc2VPZmZzZXQpOwogICAgaWYgKGRhdGEgIT09IG51bGwpIHsKICAgICAgZ2VuID0gTWF0aC5taW4ocmVmLmdlbiwgMHhmZmZmKTsKICAgICAgeHJlZlRhYmxlRGF0YS5wdXNoKFsxLCBiYXNlT2Zmc2V0LCBnZW5dKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGdlbiA9IE1hdGgubWluKHJlZi5nZW4gKyAxLCAweGZmZmYpOwogICAgICB4cmVmVGFibGVEYXRhLnB1c2goWzAsIDAsIGdlbl0pOwogICAgfQogICAgbWF4R2VuID0gTWF0aC5tYXgobWF4R2VuLCBnZW4pOwogIH0KICBuZXdYcmVmLnNldCgiSW5kZXgiLCBnZXRJbmRleGVzKG5ld1JlZnMpKTsKICBjb25zdCBvZmZzZXRTaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4T2Zmc2V0KTsKICBjb25zdCBtYXhHZW5TaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4R2VuKTsKICBjb25zdCBzaXplcyA9IFsxLCBvZmZzZXRTaXplLCBtYXhHZW5TaXplXTsKICBuZXdYcmVmLnNldCgiVyIsIHNpemVzKTsKICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBjb25zdCBzdHJ1Y3RTaXplID0gTWF0aC5zdW1QcmVjaXNlKHNpemVzKTsKICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoc3RydWN0U2l6ZSAqIHhyZWZUYWJsZURhdGEubGVuZ3RoKTsKICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGRhdGEpOwogIHN0cmVhbS5kaWN0ID0gbmV3WHJlZjsKICBsZXQgb2Zmc2V0ID0gMDsKICBmb3IgKGNvbnN0IFt0eXBlLCBvYmpPZmZzZXQsIGdlbl0gb2YgeHJlZlRhYmxlRGF0YSkgewogICAgb2Zmc2V0ID0gd3JpdGVJbnQodHlwZSwgc2l6ZXNbMF0sIG9mZnNldCwgZGF0YSk7CiAgICBvZmZzZXQgPSB3cml0ZUludChvYmpPZmZzZXQsIHNpemVzWzFdLCBvZmZzZXQsIGRhdGEpOwogICAgb2Zmc2V0ID0gd3JpdGVJbnQoZ2VuLCBzaXplc1syXSwgb2Zmc2V0LCBkYXRhKTsKICB9CiAgYXdhaXQgd3JpdGVPYmplY3QoeHJlZkluZm8ubmV3UmVmLCBzdHJlYW0sIGJ1ZmZlciwge30pOwogIGJ1ZmZlci5wdXNoKCJzdGFydHhyZWZcbiIsIGJhc2VPZmZzZXQudG9TdHJpbmcoKSwgIlxuJSVFT0ZcbiIpOwp9CmZ1bmN0aW9uIGNvbXB1dGVJRHMoYmFzZU9mZnNldCwgeHJlZkluZm8sIG5ld1hyZWYpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh4cmVmSW5mby5maWxlSWRzKSAmJiB4cmVmSW5mby5maWxlSWRzLmxlbmd0aCA+IDApIHsKICAgIGNvbnN0IG1kNSA9IGNvbXB1dGVNRDUoYmFzZU9mZnNldCwgeHJlZkluZm8pOwogICAgbmV3WHJlZi5zZXQoIklEIiwgW3hyZWZJbmZvLmZpbGVJZHNbMF0sIG1kNV0pOwogIH0KfQpmdW5jdGlvbiBnZXRUcmFpbGVyRGljdCh4cmVmSW5mbywgY2hhbmdlcywgdXNlWHJlZlN0cmVhbSkgewogIGNvbnN0IG5ld1hyZWYgPSBuZXcgRGljdChudWxsKTsKICBuZXdYcmVmLnNldCgiUHJldiIsIHhyZWZJbmZvLnN0YXJ0WFJlZik7CiAgY29uc3QgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmOwogIGlmICh1c2VYcmVmU3RyZWFtKSB7CiAgICBjaGFuZ2VzLnB1dChyZWZGb3JYcmVmVGFibGUsIHsKICAgICAgZGF0YTogIiIKICAgIH0pOwogICAgbmV3WHJlZi5zZXQoIlNpemUiLCByZWZGb3JYcmVmVGFibGUubnVtICsgMSk7CiAgICBuZXdYcmVmLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYUmVmIikpOwogIH0gZWxzZSB7CiAgICBuZXdYcmVmLnNldCgiU2l6ZSIsIHJlZkZvclhyZWZUYWJsZS5udW0pOwogIH0KICBpZiAoeHJlZkluZm8ucm9vdFJlZiAhPT0gbnVsbCkgewogICAgbmV3WHJlZi5zZXQoIlJvb3QiLCB4cmVmSW5mby5yb290UmVmKTsKICB9CiAgaWYgKHhyZWZJbmZvLmluZm9SZWYgIT09IG51bGwpIHsKICAgIG5ld1hyZWYuc2V0KCJJbmZvIiwgeHJlZkluZm8uaW5mb1JlZik7CiAgfQogIGlmICh4cmVmSW5mby5lbmNyeXB0UmVmICE9PSBudWxsKSB7CiAgICBuZXdYcmVmLnNldCgiRW5jcnlwdCIsIHhyZWZJbmZvLmVuY3J5cHRSZWYpOwogIH0KICByZXR1cm4gbmV3WHJlZjsKfQphc3luYyBmdW5jdGlvbiB3cml0ZUNoYW5nZXMoY2hhbmdlcywgeHJlZiwgYnVmZmVyID0gW10pIHsKICBjb25zdCBuZXdSZWZzID0gW107CiAgZm9yIChjb25zdCBbcmVmLCB7CiAgICBkYXRhCiAgfV0gb2YgY2hhbmdlcy5pdGVtcygpKSB7CiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKICAgICAgbmV3UmVmcy5wdXNoKHsKICAgICAgICByZWYsCiAgICAgICAgZGF0YQogICAgICB9KTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBhd2FpdCB3cml0ZU9iamVjdChyZWYsIGRhdGEsIGJ1ZmZlciwgeHJlZik7CiAgICBuZXdSZWZzLnB1c2goewogICAgICByZWYsCiAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQogICAgfSk7CiAgICBidWZmZXIubGVuZ3RoID0gMDsKICB9CiAgcmV0dXJuIG5ld1JlZnMuc29ydCgoYSwgYikgPT4gYS5yZWYubnVtIC0gYi5yZWYubnVtKTsKfQphc3luYyBmdW5jdGlvbiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgb3JpZ2luYWxEYXRhLAogIHhyZWZJbmZvLAogIGNoYW5nZXMsCiAgeHJlZiA9IG51bGwsCiAgaGFzWGZhID0gZmFsc2UsCiAgeGZhRGF0YXNldHNSZWYgPSBudWxsLAogIGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZSwKICBuZWVkQXBwZWFyYW5jZXMsCiAgYWNyb0Zvcm1SZWYgPSBudWxsLAogIGFjcm9Gb3JtID0gbnVsbCwKICB4ZmFEYXRhID0gbnVsbCwKICB1c2VYcmVmU3RyZWFtID0gZmFsc2UKfSkgewogIGF3YWl0IHVwZGF0ZUFjcm9mb3JtKHsKICAgIHhyZWYsCiAgICBhY3JvRm9ybSwKICAgIGFjcm9Gb3JtUmVmLAogICAgaGFzWGZhLAogICAgaGFzWGZhRGF0YXNldHNFbnRyeSwKICAgIHhmYURhdGFzZXRzUmVmLAogICAgbmVlZEFwcGVhcmFuY2VzLAogICAgY2hhbmdlcwogIH0pOwogIGlmIChoYXNYZmEpIHsKICAgIHVwZGF0ZVhGQSh7CiAgICAgIHhmYURhdGEsCiAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICBjaGFuZ2VzLAogICAgICB4cmVmCiAgICB9KTsKICB9CiAgY29uc3QgbmV3WHJlZiA9IGdldFRyYWlsZXJEaWN0KHhyZWZJbmZvLCBjaGFuZ2VzLCB1c2VYcmVmU3RyZWFtKTsKICBjb25zdCBidWZmZXIgPSBbXTsKICBjb25zdCBuZXdSZWZzID0gYXdhaXQgd3JpdGVDaGFuZ2VzKGNoYW5nZXMsIHhyZWYsIGJ1ZmZlcik7CiAgbGV0IGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoOwogIGNvbnN0IGxhc3RCeXRlID0gb3JpZ2luYWxEYXRhLmF0KC0xKTsKICBpZiAobGFzdEJ5dGUgIT09IDB4MGEgJiYgbGFzdEJ5dGUgIT09IDB4MGQpIHsKICAgIGJ1ZmZlci5wdXNoKCJcbiIpOwogICAgYmFzZU9mZnNldCArPSAxOwogIH0KICBmb3IgKGNvbnN0IHsKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGRhdGEpOwogICAgfQogIH0KICBhd2FpdCAodXNlWHJlZlN0cmVhbSA/IGdldFhSZWZTdHJlYW1UYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSA6IGdldFhSZWZUYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSk7CiAgY29uc3QgdG90YWxMZW5ndGggPSBvcmlnaW5hbERhdGEubGVuZ3RoICsgTWF0aC5zdW1QcmVjaXNlKGJ1ZmZlci5tYXAoc3RyID0+IHN0ci5sZW5ndGgpKTsKICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICBhcnJheS5zZXQob3JpZ2luYWxEYXRhKTsKICBsZXQgb2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aDsKICBmb3IgKGNvbnN0IHN0ciBvZiBidWZmZXIpIHsKICAgIG9mZnNldCA9IHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7CiAgfQogIHJldHVybiBhcnJheTsKfQoKOy8vIC4vc3JjL2NvcmUvd29ya2VyX3N0cmVhbS5qcwoKY2xhc3MgUERGV29ya2VyU3RyZWFtIHsKICBjb25zdHJ1Y3Rvcihtc2dIYW5kbGVyKSB7CiAgICB0aGlzLl9tc2dIYW5kbGVyID0gbXNnSGFuZGxlcjsKICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOwogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOwogICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOwogIH0KICBnZXRGdWxsUmVhZGVyKCkgewogICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERldvcmtlclN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOwogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmVhZGVyKHRoaXMuX21zZ0hhbmRsZXIpOwogICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOwogIH0KICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCwgdGhpcy5fbXNnSGFuZGxlcik7CiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTsKICAgIHJldHVybiByZWFkZXI7CiAgfQogIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgewogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pOwogICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkgewogICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgICB9CiAgfQp9CmNsYXNzIFBERldvcmtlclN0cmVhbVJlYWRlciB7CiAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgewogICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7CiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOwogICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7CiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7CiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlOwogICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRSZWFkZXIiKTsKICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlJlYWRlckhlYWRlcnNSZWFkeSIpLnRoZW4oZGF0YSA9PiB7CiAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZGF0YS5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGRhdGEuaXNSYW5nZVN1cHBvcnRlZDsKICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGRhdGEuY29udGVudExlbmd0aDsKICAgIH0pOwogIH0KICBnZXQgaGVhZGVyc1JlYWR5KCkgewogICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKICB9CiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDsKICB9CiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOwogIH0KICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOwogIH0KICBhc3luYyByZWFkKCkgewogICAgY29uc3QgewogICAgICB2YWx1ZSwKICAgICAgZG9uZQogICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CiAgICBpZiAoZG9uZSkgewogICAgICByZXR1cm4gewogICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgZG9uZTogdHJ1ZQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgdmFsdWU6IHZhbHVlLmJ1ZmZlciwKICAgICAgZG9uZTogZmFsc2UKICAgIH07CiAgfQogIGNhbmNlbChyZWFzb24pIHsKICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKICB9Cn0KY2xhc3MgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIgewogIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQsIG1zZ0hhbmRsZXIpIHsKICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOwogICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmFuZ2VSZWFkZXIiLCB7CiAgICAgIGJlZ2luLAogICAgICBlbmQKICAgIH0pOwogICAgdGhpcy5fcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CiAgfQogIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgcmVhZCgpIHsKICAgIGNvbnN0IHsKICAgICAgdmFsdWUsCiAgICAgIGRvbmUKICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpOwogICAgaWYgKGRvbmUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgIGRvbmU6IHRydWUKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHZhbHVlOiB2YWx1ZS5idWZmZXIsCiAgICAgIGRvbmU6IGZhbHNlCiAgICB9OwogIH0KICBjYW5jZWwocmVhc29uKSB7CiAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS93b3JrZXIuanMKCgoKCgoKCgoKCmNsYXNzIFdvcmtlclRhc2sgewogIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICB0aGlzLnRlcm1pbmF0ZWQgPSBmYWxzZTsKICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTsKICB9CiAgZ2V0IGZpbmlzaGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgZmluaXNoKCkgewogICAgdGhpcy5fY2FwYWJpbGl0eS5yZXNvbHZlKCk7CiAgfQogIHRlcm1pbmF0ZSgpIHsKICAgIHRoaXMudGVybWluYXRlZCA9IHRydWU7CiAgfQogIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKSB7CiAgICBpZiAodGhpcy50ZXJtaW5hdGVkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHRhc2sgd2FzIHRlcm1pbmF0ZWQiKTsKICAgIH0KICB9Cn0KY2xhc3MgV29ya2VyTWVzc2FnZUhhbmRsZXIgewogIHN0YXRpYyB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgJiYgIWlzTm9kZUpTICYmIHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygc2VsZi5wb3N0TWVzc2FnZSA9PT0gImZ1bmN0aW9uIiAmJiAib25tZXNzYWdlIiBpbiBzZWxmKSB7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZyb21Qb3J0KHNlbGYpOwogICAgfQogIH0KICBzdGF0aWMgc2V0dXAoaGFuZGxlciwgcG9ydCkgewogICAgbGV0IHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gZmFsc2U7CiAgICBoYW5kbGVyLm9uKCJ0ZXN0IiwgZGF0YSA9PiB7CiAgICAgIGlmICh0ZXN0TWVzc2FnZVByb2Nlc3NlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IHRydWU7CiAgICAgIGhhbmRsZXIuc2VuZCgidGVzdCIsIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiY29uZmlndXJlIiwgZGF0YSA9PiB7CiAgICAgIHNldFZlcmJvc2l0eUxldmVsKGRhdGEudmVyYm9zaXR5KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RG9jUmVxdWVzdCIsIGRhdGEgPT4gdGhpcy5jcmVhdGVEb2N1bWVudEhhbmRsZXIoZGF0YSwgcG9ydCkpOwogIH0KICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGRvY1BhcmFtcywgcG9ydCkgewogICAgbGV0IHBkZk1hbmFnZXI7CiAgICBsZXQgdGVybWluYXRlZCA9IGZhbHNlOwogICAgbGV0IGNhbmNlbFhIUnMgPSBudWxsOwogICAgY29uc3QgV29ya2VyVGFza3MgPSBuZXcgU2V0KCk7CiAgICBjb25zdCB2ZXJib3NpdHkgPSBnZXRWZXJib3NpdHlMZXZlbCgpOwogICAgY29uc3QgewogICAgICBkb2NJZCwKICAgICAgYXBpVmVyc2lvbgogICAgfSA9IGRvY1BhcmFtczsKICAgIGNvbnN0IHdvcmtlclZlcnNpb24gPSAiNS4xLjkxIjsKICAgIGlmIChhcGlWZXJzaW9uICE9PSB3b3JrZXJWZXJzaW9uKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFQSSB2ZXJzaW9uICIke2FwaVZlcnNpb259IiBkb2VzIG5vdCBtYXRjaCBgICsgYHRoZSBXb3JrZXIgdmVyc2lvbiAiJHt3b3JrZXJWZXJzaW9ufSIuYCk7CiAgICB9CiAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdOwogICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBbXSkgewogICAgICBlbnVtZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKICAgIH0KICAgIGlmIChlbnVtZXJhYmxlUHJvcGVydGllcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYEFycmF5LnByb3RvdHlwZWAgY29udGFpbnMgdW5leHBlY3RlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXM6ICIgKyBlbnVtZXJhYmxlUHJvcGVydGllcy5qb2luKCIsICIpICsgIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLiIpOwogICAgfQogICAgY29uc3Qgd29ya2VySGFuZGxlck5hbWUgPSBkb2NJZCArICJfd29ya2VyIjsKICAgIGxldCBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHdvcmtlckhhbmRsZXJOYW1lLCBkb2NJZCwgcG9ydCk7CiAgICBmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCkgewogICAgICBpZiAodGVybWluYXRlZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIik7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0V29ya2VyVGFzayh0YXNrKSB7CiAgICAgIFdvcmtlclRhc2tzLmFkZCh0YXNrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmlzaFdvcmtlclRhc2sodGFzaykgewogICAgICB0YXNrLmZpbmlzaCgpOwogICAgICBXb3JrZXJUYXNrcy5kZWxldGUodGFzayk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBsb2FkRG9jdW1lbnQocmVjb3ZlcnlNb2RlKSB7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0hlYWRlciIpOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTsKICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoInBhcnNlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tGaXJzdFBhZ2UiLCBbcmVjb3ZlcnlNb2RlXSk7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0xhc3RQYWdlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBjb25zdCBpc1B1cmVYZmEgPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaXNQdXJlWGZhIik7CiAgICAgIGlmIChpc1B1cmVYZmEpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soImxvYWRYZmFGb250cyIpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5sb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykuY2F0Y2gocmVhc29uID0+IHt9KS50aGVuKCgpID0+IGZpbmlzaFdvcmtlclRhc2sodGFzaykpLCBwZGZNYW5hZ2VyLmxvYWRYZmFJbWFnZXMoKV0pOwogICAgICB9CiAgICAgIGNvbnN0IFtudW1QYWdlcywgZmluZ2VycHJpbnRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygibnVtUGFnZXMiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpbmdlcnByaW50cyIpXSk7CiAgICAgIGNvbnN0IGh0bWxGb3JYZmEgPSBpc1B1cmVYZmEgPyBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaHRtbEZvclhmYSIpIDogbnVsbDsKICAgICAgcmV0dXJuIHsKICAgICAgICBudW1QYWdlcywKICAgICAgICBmaW5nZXJwcmludHMsCiAgICAgICAgaHRtbEZvclhmYQogICAgICB9OwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcih7CiAgICAgIGRhdGEsCiAgICAgIHBhc3N3b3JkLAogICAgICBkaXNhYmxlQXV0b0ZldGNoLAogICAgICByYW5nZUNodW5rU2l6ZSwKICAgICAgbGVuZ3RoLAogICAgICBkb2NCYXNlVXJsLAogICAgICBlbmFibGVYZmEsCiAgICAgIGV2YWx1YXRvck9wdGlvbnMKICAgIH0pIHsKICAgICAgY29uc3QgcGRmTWFuYWdlckFyZ3MgPSB7CiAgICAgICAgc291cmNlOiBudWxsLAogICAgICAgIGRpc2FibGVBdXRvRmV0Y2gsCiAgICAgICAgZG9jQmFzZVVybCwKICAgICAgICBkb2NJZCwKICAgICAgICBlbmFibGVYZmEsCiAgICAgICAgZXZhbHVhdG9yT3B0aW9ucywKICAgICAgICBoYW5kbGVyLAogICAgICAgIGxlbmd0aCwKICAgICAgICBwYXNzd29yZCwKICAgICAgICByYW5nZUNodW5rU2l6ZQogICAgICB9OwogICAgICBpZiAoZGF0YSkgewogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IGRhdGE7CiAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFBkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICB9CiAgICAgIGNvbnN0IHBkZlN0cmVhbSA9IG5ldyBQREZXb3JrZXJTdHJlYW0oaGFuZGxlciksCiAgICAgICAgZnVsbFJlcXVlc3QgPSBwZGZTdHJlYW0uZ2V0RnVsbFJlYWRlcigpOwogICAgICBjb25zdCBwZGZNYW5hZ2VyQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICBsZXQgbmV3UGRmTWFuYWdlciwKICAgICAgICBjYWNoZWRDaHVua3MgPSBbXSwKICAgICAgICBsb2FkZWQgPSAwOwogICAgICBmdWxsUmVxdWVzdC5oZWFkZXJzUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1JhbmdlU3VwcG9ydGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZlN0cmVhbTsKICAgICAgICBwZGZNYW5hZ2VyQXJncy5sZW5ndGggPSBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoOwogICAgICAgIHBkZk1hbmFnZXJBcmdzLmRpc2FibGVBdXRvRmV0Y2ggfHw9IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkOwogICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgTmV0d29ya1BkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2FjaGVkQ2h1bmtzKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspOwogICAgICAgIH0KICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CiAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CiAgICAgIH0pOwogICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgY29uc3QgcmVhZENodW5rID0gZnVuY3Rpb24gKHsKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgZG9uZQogICAgICAgIH0pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICBpZiAoIW5ld1BkZk1hbmFnZXIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBkZkZpbGUgPSBhcnJheUJ1ZmZlcnNUb0J5dGVzKGNhY2hlZENodW5rcyk7CiAgICAgICAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChsZW5ndGggJiYgcGRmRmlsZS5sZW5ndGggIT09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICB3YXJuKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZkZpbGU7CiAgICAgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IExvY2FsUGRmTWFuYWdlcihwZGZNYW5hZ2VyQXJncyk7CiAgICAgICAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CiAgICAgICAgICAgIGlmICghZnVsbFJlcXVlc3QuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIiwgewogICAgICAgICAgICAgICAgbG9hZGVkLAogICAgICAgICAgICAgICAgdG90YWw6IE1hdGgubWF4KGxvYWRlZCwgZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCB8fCAwKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdQZGZNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjYWNoZWRDaHVua3MucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVsbFJlcXVlc3QucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGUpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KTsKICAgICAgY2FuY2VsWEhScyA9IHJlYXNvbiA9PiB7CiAgICAgICAgcGRmU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbik7CiAgICAgIH07CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgfQogICAgZnVuY3Rpb24gc2V0dXBEb2MoZGF0YSkgewogICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoZG9jKSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGhhbmRsZXIuc2VuZCgiR2V0RG9jIiwgewogICAgICAgICAgcGRmSW5mbzogZG9jCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25GYWlsdXJlKGV4KSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhc3N3b3JkRXhjZXB0aW9uKSB7CiAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFBhc3N3b3JkRXhjZXB0aW9uOiByZXNwb25zZSAke2V4LmNvZGV9YCk7CiAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUGFzc3dvcmRSZXF1ZXN0IiwgZXgpLnRoZW4oZnVuY3Rpb24gKHsKICAgICAgICAgICAgcGFzc3dvcmQKICAgICAgICAgIH0pIHsKICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcGRmTWFuYWdlci51cGRhdGVQYXNzd29yZChwYXNzd29yZCk7CiAgICAgICAgICAgIHBkZk1hbmFnZXJSZWFkeSgpOwogICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIGV4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIHdyYXBSZWFzb24oZXgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGRmTWFuYWdlclJlYWR5KCkgewogICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICBsb2FkRG9jdW1lbnQoZmFsc2UpLnRoZW4ob25TdWNjZXNzLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBYUmVmUGFyc2VFeGNlcHRpb24pKSB7CiAgICAgICAgICAgIG9uRmFpbHVyZShyZWFzb24pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgICAgICBsb2FkRG9jdW1lbnQodHJ1ZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIGdldFBkZk1hbmFnZXIoZGF0YSkudGhlbihmdW5jdGlvbiAobmV3UGRmTWFuYWdlcikgewogICAgICAgIGlmICh0ZXJtaW5hdGVkKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpOwogICAgICAgIH0KICAgICAgICBwZGZNYW5hZ2VyID0gbmV3UGRmTWFuYWdlcjsKICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0odHJ1ZSkudGhlbihzdHJlYW0gPT4gewogICAgICAgICAgaGFuZGxlci5zZW5kKCJEYXRhTG9hZGVkIiwgewogICAgICAgICAgICBsZW5ndGg6IHN0cmVhbS5ieXRlcy5ieXRlTGVuZ3RoCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSkudGhlbihwZGZNYW5hZ2VyUmVhZHksIG9uRmFpbHVyZSk7CiAgICB9CiAgICBoYW5kbGVyLm9uKCJHZXRQYWdlIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShkYXRhLnBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInJvdGF0ZSIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAicmVmIiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJ1c2VyVW5pdCIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAidmlldyIpXSkudGhlbihmdW5jdGlvbiAoW3JvdGF0ZSwgcmVmLCB1c2VyVW5pdCwgdmlld10pIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdGF0ZSwKICAgICAgICAgICAgcmVmLAogICAgICAgICAgICByZWZTdHI6IHJlZj8udG9TdHJpbmcoKSA/PyBudWxsLAogICAgICAgICAgICB1c2VyVW5pdCwKICAgICAgICAgICAgdmlldwogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VJbmRleCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIGNvbnN0IHBhZ2VSZWYgPSBSZWYuZ2V0KGRhdGEubnVtLCBkYXRhLmdlbik7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImRlc3RpbmF0aW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXREZXN0aW5hdGlvbiIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIiwgW2RhdGEuaWRdKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxhYmVscyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYWJlbHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxheW91dCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZU1vZGUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwYWdlTW9kZSIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRWaWV3ZXJQcmVmZXJlbmNlcyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInZpZXdlclByZWZlcmVuY2VzIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wZW5BY3Rpb24iLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldEF0dGFjaG1lbnRzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYXR0YWNobWVudHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RG9jSlNBY3Rpb25zIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VKU0FjdGlvbnMiLCBmdW5jdGlvbiAoewogICAgICBwYWdlSW5kZXgKICAgIH0pIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4ocGFnZSA9PiBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAianNBY3Rpb25zIikpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPdXRsaW5lIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wdGlvbmFsQ29udGVudENvbmZpZyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRQZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE1ldGFkYXRhIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygiZG9jdW1lbnRJbmZvIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibWV0YWRhdGEiKV0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRNYXJrSW5mbyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm1hcmtJbmZvIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERhdGEiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCkudGhlbihzdHJlYW0gPT4gc3RyZWFtLmJ5dGVzKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0QW5ub3RhdGlvbnMiLCBmdW5jdGlvbiAoewogICAgICBwYWdlSW5kZXgsCiAgICAgIGludGVudAogICAgfSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0QW5ub3RhdGlvbnM6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CiAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spOwogICAgICAgIHJldHVybiBwYWdlLmdldEFubm90YXRpb25zRGF0YShoYW5kbGVyLCB0YXNrLCBpbnRlbnQpLnRoZW4oZGF0YSA9PiB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfSwgcmVhc29uID0+IHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRGaWVsZE9iamVjdHMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpLnRoZW4oZmllbGRPYmplY3RzID0+IGZpZWxkT2JqZWN0cz8uYWxsRmllbGRzIHx8IG51bGwpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJIYXNKU0FjdGlvbnMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoImhhc0pTQWN0aW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjYWxjdWxhdGlvbk9yZGVySWRzIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlNhdmVEb2N1bWVudCIsIGFzeW5jIGZ1bmN0aW9uICh7CiAgICAgIGlzUHVyZVhmYSwKICAgICAgbnVtUGFnZXMsCiAgICAgIGFubm90YXRpb25TdG9yYWdlLAogICAgICBmaWxlbmFtZQogICAgfSkgewogICAgICBjb25zdCBnbG9iYWxQcm9taXNlcyA9IFtwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtUmVmIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJzdGFydFhSZWYiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoInhyZWYiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImxpbmVhcml6YXRpb24iKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJzdHJ1Y3RUcmVlUm9vdCIpXTsKICAgICAgY29uc3QgY2hhbmdlcyA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgICBjb25zdCBuZXdBbm5vdGF0aW9uc0J5UGFnZSA9ICFpc1B1cmVYZmEgPyBnZXROZXdBbm5vdGF0aW9uc01hcChhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogICAgICBjb25zdCBbc3RyZWFtLCBhY3JvRm9ybSwgYWNyb0Zvcm1SZWYsIHN0YXJ0WFJlZiwgeHJlZiwgbGluZWFyaXphdGlvbiwgX3N0cnVjdFRyZWVSb290XSA9IGF3YWl0IFByb21pc2UuYWxsKGdsb2JhbFByb21pc2VzKTsKICAgICAgY29uc3QgY2F0YWxvZ1JlZiA9IHhyZWYudHJhaWxlci5nZXRSYXcoIlJvb3QiKSB8fCBudWxsOwogICAgICBsZXQgc3RydWN0VHJlZVJvb3Q7CiAgICAgIGlmIChuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgIGlmICghX3N0cnVjdFRyZWVSb290KSB7CiAgICAgICAgICBpZiAoYXdhaXQgU3RydWN0VHJlZVJvb3QuY2FuQ3JlYXRlU3RydWN0dXJlVHJlZSh7CiAgICAgICAgICAgIGNhdGFsb2dSZWYsCiAgICAgICAgICAgIHBkZk1hbmFnZXIsCiAgICAgICAgICAgIG5ld0Fubm90YXRpb25zQnlQYWdlCiAgICAgICAgICB9KSkgewogICAgICAgICAgICBzdHJ1Y3RUcmVlUm9vdCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhd2FpdCBfc3RydWN0VHJlZVJvb3QuY2FuVXBkYXRlU3RydWN0VHJlZSh7CiAgICAgICAgICBwZGZNYW5hZ2VyLAogICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UKICAgICAgICB9KSkgewogICAgICAgICAgc3RydWN0VHJlZVJvb3QgPSBfc3RydWN0VHJlZVJvb3Q7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9uU3RvcmFnZS52YWx1ZXMoKSwgeHJlZiwgcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCBuZXdBbm5vdGF0aW9uUHJvbWlzZXMgPSBzdHJ1Y3RUcmVlUm9vdCA9PT0gdW5kZWZpbmVkID8gcHJvbWlzZXMgOiBbXTsKICAgICAgICBmb3IgKGNvbnN0IFtwYWdlSW5kZXgsIGFubm90YXRpb25zXSBvZiBuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgICAgbmV3QW5ub3RhdGlvblByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihwYWdlID0+IHsKICAgICAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBTYXZlIChlZGl0b3IpOiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICAgIHJldHVybiBwYWdlLnNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ1Y3RUcmVlUm9vdCA9PT0gbnVsbCkgewogICAgICAgICAgcHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChuZXdBbm5vdGF0aW9uUHJvbWlzZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBTdHJ1Y3RUcmVlUm9vdC5jcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgICAgICAgICAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgICAgICAgICAgICB4cmVmLAogICAgICAgICAgICAgIGNhdGFsb2dSZWYsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgIH0gZWxzZSBpZiAoc3RydWN0VHJlZVJvb3QpIHsKICAgICAgICAgIHByb21pc2VzLnB1c2goUHJvbWlzZS5hbGwobmV3QW5ub3RhdGlvblByb21pc2VzKS50aGVuKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgYXdhaXQgc3RydWN0VHJlZVJvb3QudXBkYXRlU3RydWN0dXJlVHJlZSh7CiAgICAgICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNQdXJlWGZhKSB7CiAgICAgICAgcHJvbWlzZXMucHVzaChwZGZNYW5hZ2VyLnNlcmlhbGl6ZVhmYURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGxldCBwYWdlSW5kZXggPSAwOyBwYWdlSW5kZXggPCBudW1QYWdlczsgcGFnZUluZGV4KyspIHsKICAgICAgICAgIHByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFNhdmU6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CiAgICAgICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcmV0dXJuIHBhZ2Uuc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlZnMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICAgIGxldCB4ZmFEYXRhID0gbnVsbDsKICAgICAgaWYgKGlzUHVyZVhmYSkgewogICAgICAgIHhmYURhdGEgPSByZWZzWzBdOwogICAgICAgIGlmICgheGZhRGF0YSkgewogICAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5zaXplID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgfQogICAgICBjb25zdCBuZWVkQXBwZWFyYW5jZXMgPSBhY3JvRm9ybVJlZiAmJiBhY3JvRm9ybSBpbnN0YW5jZW9mIERpY3QgJiYgY2hhbmdlcy52YWx1ZXMoKS5zb21lKHJlZiA9PiByZWYubmVlZEFwcGVhcmFuY2VzKTsKICAgICAgY29uc3QgeGZhID0gYWNyb0Zvcm0gaW5zdGFuY2VvZiBEaWN0ICYmIGFjcm9Gb3JtLmdldCgiWEZBIikgfHwgbnVsbDsKICAgICAgbGV0IHhmYURhdGFzZXRzUmVmID0gbnVsbDsKICAgICAgbGV0IGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeGZhKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhmYS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICBpZiAoeGZhW2ldID09PSAiZGF0YXNldHMiKSB7CiAgICAgICAgICAgIHhmYURhdGFzZXRzUmVmID0geGZhW2kgKyAxXTsKICAgICAgICAgICAgaGFzWGZhRGF0YXNldHNFbnRyeSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh4ZmFEYXRhc2V0c1JlZiA9PT0gbnVsbCkgewogICAgICAgICAgeGZhRGF0YXNldHNSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh4ZmEpIHsKICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBYRkEgdHlwZS4iKTsKICAgICAgfQogICAgICBsZXQgbmV3WHJlZkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBpZiAoeHJlZi50cmFpbGVyKSB7CiAgICAgICAgY29uc3QgaW5mb09iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgY29uc3QgeHJlZkluZm8gPSB4cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIikgfHwgbnVsbDsKICAgICAgICBpZiAoeHJlZkluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB4cmVmSW5mbykgewogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgIGluZm9PYmpba2V5XSA9IHN0cmluZ1RvUERGU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXdYcmVmSW5mbyA9IHsKICAgICAgICAgIHJvb3RSZWY6IGNhdGFsb2dSZWYsCiAgICAgICAgICBlbmNyeXB0UmVmOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KCJFbmNyeXB0IikgfHwgbnVsbCwKICAgICAgICAgIG5ld1JlZjogeHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKSwKICAgICAgICAgIGluZm9SZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkluZm8iKSB8fCBudWxsLAogICAgICAgICAgaW5mbzogaW5mb09iaiwKICAgICAgICAgIGZpbGVJZHM6IHhyZWYudHJhaWxlci5nZXQoIklEIikgfHwgbnVsbCwKICAgICAgICAgIHN0YXJ0WFJlZjogbGluZWFyaXphdGlvbiA/IHN0YXJ0WFJlZiA6IHhyZWYubGFzdFhSZWZTdHJlYW1Qb3MgPz8gc3RhcnRYUmVmLAogICAgICAgICAgZmlsZW5hbWUKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgICAgICAgb3JpZ2luYWxEYXRhOiBzdHJlYW0uYnl0ZXMsCiAgICAgICAgeHJlZkluZm86IG5ld1hyZWZJbmZvLAogICAgICAgIGNoYW5nZXMsCiAgICAgICAgeHJlZiwKICAgICAgICBoYXNYZmE6ICEheGZhLAogICAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICAgIGhhc1hmYURhdGFzZXRzRW50cnksCiAgICAgICAgbmVlZEFwcGVhcmFuY2VzLAogICAgICAgIGFjcm9Gb3JtUmVmLAogICAgICAgIGFjcm9Gb3JtLAogICAgICAgIHhmYURhdGEsCiAgICAgICAgdXNlWHJlZlN0cmVhbTogaXNEaWN0KHhyZWYudG9wRGljdCwgIlhSZWYiKQogICAgICB9KS5maW5hbGx5KCgpID0+IHsKICAgICAgICB4cmVmLnJlc2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPcGVyYXRvckxpc3QiLCBmdW5jdGlvbiAoZGF0YSwgc2luaykgewogICAgICBjb25zdCBwYWdlSW5kZXggPSBkYXRhLnBhZ2VJbmRleDsKICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0T3BlcmF0b3JMaXN0OiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICBzaW5rLAogICAgICAgICAgdGFzaywKICAgICAgICAgIGludGVudDogZGF0YS5pbnRlbnQsCiAgICAgICAgICBjYWNoZUtleTogZGF0YS5jYWNoZUtleSwKICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBkYXRhLmFubm90YXRpb25TdG9yYWdlLAogICAgICAgICAgbW9kaWZpZWRJZHM6IGRhdGEubW9kaWZpZWRJZHMKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChvcGVyYXRvckxpc3RJbmZvKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHN0YXJ0KSB7CiAgICAgICAgICAgIGluZm8oYHBhZ2U9JHtwYWdlSW5kZXggKyAxfSAtIGdldE9wZXJhdG9yTGlzdDogdGltZT1gICsgYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zLCBsZW49JHtvcGVyYXRvckxpc3RJbmZvLmxlbmd0aH1gKTsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuY2xvc2UoKTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHRhc2sudGVybWluYXRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRUZXh0Q29udGVudCIsIGZ1bmN0aW9uIChkYXRhLCBzaW5rKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgfSA9IGRhdGE7CiAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIgKyBwYWdlSW5kZXgpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZXh0cmFjdFRleHRDb250ZW50KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICB0YXNrLAogICAgICAgICAgc2luaywKICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgaW5mbyhgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9YCArIGAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApOwogICAgICAgICAgfQogICAgICAgICAgc2luay5jbG9zZSgpOwogICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFN0cnVjdFRyZWUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKGRhdGEucGFnZUluZGV4KS50aGVuKHBhZ2UgPT4gcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgImdldFN0cnVjdFRyZWUiKSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkZvbnRGYWxsYmFjayIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmZvbnRGYWxsYmFjayhkYXRhLmlkLCBoYW5kbGVyKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiQ2xlYW51cCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmNsZWFudXAodHJ1ZSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlRlcm1pbmF0ZSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlOwogICAgICBjb25zdCB3YWl0T24gPSBbXTsKICAgICAgaWYgKHBkZk1hbmFnZXIpIHsKICAgICAgICBwZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgY29uc3QgY2xlYW51cFByb21pc2UgPSBwZGZNYW5hZ2VyLmNsZWFudXAoKTsKICAgICAgICB3YWl0T24ucHVzaChjbGVhbnVwUHJvbWlzZSk7CiAgICAgICAgcGRmTWFuYWdlciA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xlYXJHbG9iYWxDYWNoZXMoKTsKICAgICAgfQogICAgICBjYW5jZWxYSFJzPy4obmV3IEFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOwogICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgV29ya2VyVGFza3MpIHsKICAgICAgICB3YWl0T24ucHVzaCh0YXNrLmZpbmlzaGVkKTsKICAgICAgICB0YXNrLnRlcm1pbmF0ZSgpOwogICAgICB9CiAgICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGhhbmRsZXIuZGVzdHJveSgpOwogICAgICAgIGhhbmRsZXIgPSBudWxsOwogICAgICB9KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiUmVhZHkiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICBzZXR1cERvYyhkb2NQYXJhbXMpOwogICAgICBkb2NQYXJhbXMgPSBudWxsOwogICAgfSk7CiAgICByZXR1cm4gd29ya2VySGFuZGxlck5hbWU7CiAgfQogIHN0YXRpYyBpbml0aWFsaXplRnJvbVBvcnQocG9ydCkgewogICAgY29uc3QgaGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcigid29ya2VyIiwgIm1haW4iLCBwb3J0KTsKICAgIHRoaXMuc2V0dXAoaGFuZGxlciwgcG9ydCk7CiAgICBoYW5kbGVyLnNlbmQoInJlYWR5IiwgbnVsbCk7CiAgfQp9Cgo7Ly8gLi9zcmMvcGRmLndvcmtlci5qcwoKY29uc3QgcGRmanNWZXJzaW9uID0gIjUuMS45MSI7CmNvbnN0IHBkZmpzQnVpbGQgPSAiNDVjYmU4YmIwIjsKCnZhciBfX3dlYnBhY2tfZXhwb3J0c19fV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLldvcmtlck1lc3NhZ2VIYW5kbGVyOwpleHBvcnQgeyBfX3dlYnBhY2tfZXhwb3J0c19fV29ya2VyTWVzc2FnZUhhbmRsZXIgYXMgV29ya2VyTWVzc2FnZUhhbmRsZXIgfTsKCi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZi53b3JrZXIubWpzLm1hcA==", import.meta.url).toString();
- const I = t, g = wi(1), C = wi([]), i = wi(""), e = wi(1);
- let A = null;
- const s = () => {
- let d = 0;
- window.screen.width > 1440 ? d = 1.4 : d = 1.2, !(g.value >= d) && (g.value = g.value + 0.1, n());
- }, l = () => {
- g.value <= 1 || (g.value = g.value - 0.1, n());
- }, n = async () => {
- A = await fdg(I.data).promise, C.value = A.numPages, a();
- }, a = async (d = 1) => {
- e.value = d;
- const o = await A.getPage(d), c = document.getElementById("the_canvas" + d), r = c.getContext("2d"), h = window.devicePixelRatio || 1, b = r.webkitBackingStorePixelRatio || r.mozBackingStorePixelRatio || r.msBackingStorePixelRatio || r.oBackingStorePixelRatio || r.backingStorePixelRatio || 1, u = h / b, m = o.getViewport({ scale: g.value });
- c.width = m.width * u, c.height = m.height * u, c.style.width = m.width + "px", i.value = m.width + "px", c.style.height = m.height + "px", r.setTransform(u, 0, 0, u, 0, 0);
- const Z = {
- canvasContext: r,
- viewport: m
- };
- o.render(Z), C.value > d && setTimeout(() => a(d + 1));
- };
- return tG(() => {
- n();
- }), (d, o) => (Ug(), Pg("div", Hdg, [
- tC("div", { class: "pdf_down" }, [
- tC("div", {
- class: "pdf_set_left",
- onClick: s
- }, "➕"),
- tC("div", {
- class: "pdf_set_middle",
- onClick: l
- }, "➖")
- ]),
- tC("div", {
- style: Ae({ width: i.value, margin: "0 auto" })
- }, [
- (Ug(!0), Pg(ct, null, vi(C.value, (c) => (Ug(), Pg("canvas", {
- id: "the_canvas" + c,
- key: c
- }, null, 8, Xdg))), 128))
- ], 4)
- ]));
- }
- }, Ddg = /* @__PURE__ */ V0(Sdg, [["__scopeId", "data-v-58fcf604"]]);
- async function Kdg(t, I) {
- const g = iG(Ddg, { data: t });
- return g.mount(I), {
- $el: I,
- $destroy() {
- g.unmount();
- }
- };
- }
- const Fdg = ["src"], kdg = ["src"], zdg = {
- __name: "ImageViewer",
- props: {
- image: String,
- srcList: Array
- },
- setup(t) {
- const I = t, g = wi(!1), C = wi(0), i = DA(() => {
- const d = Array.isArray(I.srcList) ? I.srcList : [];
- if (d.length) return d.map((c) => String(c || "")).filter(Boolean);
- const o = String(I.image || "");
- return o ? [o] : [];
- }), e = DA(() => ({
- visible: g.value,
- open: A,
- close: s,
- next: l,
- prev: n
- }));
- function A(d = 0) {
- i.value.length && (C.value = Math.max(0, Math.min(i.value.length - 1, Number(d) || 0)), g.value = !0);
- }
- function s() {
- g.value = !1;
- }
- function l() {
- i.value.length <= 1 || (C.value = (C.value + 1) % i.value.length);
- }
- function n() {
- i.value.length <= 1 || (C.value = (C.value - 1 + i.value.length) % i.value.length);
- }
- function a(d) {
- g.value && (d.key === "Escape" && s(), d.key === "ArrowRight" && l(), d.key === "ArrowLeft" && n());
- }
- return tG(() => {
- window.addEventListener("keydown", a);
- }), s9(() => {
- window.removeEventListener("keydown", a);
- }), (d, o) => (Ug(), Pg("div", null, [
- d$(d.$slots, "image", {
- src: i.value[0],
- srcList: i.value,
- index: C.value,
- preview: e.value
- }, () => [
- i.value[0] ? (Ug(), Pg("img", {
- key: 0,
- class: "image",
- src: i.value[0],
- alt: "",
- onClick: o[0] || (o[0] = (c) => A(0))
- }, null, 8, Fdg)) : Yt("", !0)
- ], !0),
- g.value ? (Ug(), Pg("div", {
- key: 0,
- class: "viewfile-image-preview",
- onClick: ah(s, ["self"])
- }, [
- tC("button", {
- class: "viewfile-image-preview-close",
- type: "button",
- onClick: s
- }, "×"),
- i.value.length > 1 ? (Ug(), Pg("button", {
- key: 0,
- class: "viewfile-image-preview-prev",
- type: "button",
- onClick: ah(n, ["stop"])
- }, "‹")) : Yt("", !0),
- tC("img", {
- class: "viewfile-image-preview-img",
- src: i.value[C.value],
- alt: ""
- }, null, 8, kdg),
- i.value.length > 1 ? (Ug(), Pg("button", {
- key: 1,
- class: "viewfile-image-preview-next",
- type: "button",
- onClick: ah(l, ["stop"])
- }, "›")) : Yt("", !0)
- ])) : Yt("", !0)
- ]));
- }
- }, Jdg = /* @__PURE__ */ V0(zdg, [["__scopeId", "data-v-00723940"]]);
- async function Ldg(t, I) {
- const g = await Nig(t), C = iG(Jdg, { image: g });
- return C.mount(I), {
- $el: I,
- $destroy() {
- C.unmount();
- }
- };
- }
- const vdg = { class: "code-area" }, Tdg = {
- __name: "CodeViewer",
- props: {
- value: {
- type: String,
- description: "值"
- }
- },
- setup(t) {
- return (I, g) => (Ug(), Pg("pre", vdg, " " + um(t.value) + `
- `, 1));
- }
- }, xdg = /* @__PURE__ */ V0(Tdg, [["__scopeId", "data-v-215846b2"]]);
- async function jdg(t, I) {
- const g = await gGg(t), C = iG(xdg, { value: g });
- return C.mount(I), {
- $el: I,
- $destroy() {
- C.unmount();
- }
- };
- }
- function gI(t) {
- const I = Number(t);
- return Number.isFinite(I) ? I : 0;
- }
- function G8(t) {
- const I = Number.parseFloat(String(t ?? ""));
- return Number.isFinite(I) ? I : 0;
- }
- function cG(t, I) {
- return `${t}-${I}`;
- }
- function dh(t) {
- if (!t) return "";
- try {
- const g = new DOMParser().parseFromString(t, "text/html");
- return ["script", "style", "iframe", "object", "embed", "link", "meta"].forEach((i) => {
- g.querySelectorAll(i).forEach((e) => e.remove());
- }), g.querySelectorAll("*").forEach((i) => {
- Array.from(i.attributes).forEach((A) => {
- const s = A.name.toLowerCase(), l = String(A.value || "").trim().toLowerCase();
- s.startsWith("on") && i.removeAttribute(A.name), (s === "href" || s === "src") && l.startsWith("javascript:") && i.removeAttribute(A.name);
- });
- const e = i.getAttribute("style");
- if (e) {
- let A = e.replace(/font-size\s*:\s*([\d.]+)pt/gi, (s, l) => {
- const n = Number(l);
- return Number.isFinite(n) ? `font-size: ${(n * 96 / 72).toFixed(3).replace(/\.0+$/, "").replace(/(\.\d*?)0+$/, "$1")}px` : s;
- });
- /text-align\s*:\s*justify/i.test(A) && (/text-align-last/i.test(A) || (A += ";text-align-last:justify"), /text-justify/i.test(A) || (A += ";text-justify:inter-character")), A !== e && i.setAttribute("style", A);
- }
- }), g.body.innerHTML;
- } catch {
- return t;
- }
- }
- function Qdg(t, I) {
- const g = gI(t.order) || I;
- return `${t.type || "el"}-${g}`;
- }
- function KI(t, I, g) {
- const C = gI(t.order) || I, e = `${String(t.type || "el")}-${C}`;
- return g ? `${g}/${e}` : e;
- }
- function DIg(t) {
- const g = [t.radius, t.cornerRadius, t.rx].map(gI).find((C) => C > 0) || 0;
- return g ? `${g}px` : void 0;
- }
- function CM(t) {
- const I = String(t.borderColor ?? t.stroke ?? t.lineColor ?? ""), g = gI(t.borderWidth ?? t.strokeWidth ?? t.lineWidth), C = String(t.borderStrokeDasharray ?? t.strokeDasharray ?? t.dasharray ?? ""), i = t.border && typeof t.border == "object" ? t.border : null, e = t.line && typeof t.line == "object" ? t.line : null, A = String((i == null ? void 0 : i.color) ?? (e == null ? void 0 : e.color) ?? ""), s = gI((i == null ? void 0 : i.width) ?? (e == null ? void 0 : e.width)), l = String((i == null ? void 0 : i.dasharray) ?? (e == null ? void 0 : e.dasharray) ?? ""), n = I || A, a = g || s, d = (C && C !== "0" ? C : "") || (l && l !== "0" ? l : "");
- return {
- color: n || "transparent",
- width: Math.max(0, a),
- dasharray: d || void 0
- };
- }
- function Odg(t) {
- const I = (t == null ? void 0 : t.ph) ?? (t == null ? void 0 : t.placeholder) ?? (t == null ? void 0 : t.placeHolder) ?? null, g = String((I == null ? void 0 : I.type) ?? (I == null ? void 0 : I.phType) ?? (t == null ? void 0 : t.phType) ?? (t == null ? void 0 : t.placeholderType) ?? "").trim().toLowerCase(), C = gI((I == null ? void 0 : I.idx) ?? (I == null ? void 0 : I.phIdx) ?? (t == null ? void 0 : t.phIdx) ?? (t == null ? void 0 : t.idx) ?? (t == null ? void 0 : t.placeholderIdx) ?? (t == null ? void 0 : t.phIndex)), i = String((I == null ? void 0 : I.id) ?? (t == null ? void 0 : t.phId) ?? (t == null ? void 0 : t.placeholderId) ?? "").trim();
- return !g && !C && !i ? null : { type: g, idx: C, id: i };
- }
- function w8(t) {
- const I = Odg(t);
- if (!I) return "";
- const g = I.id || (I.idx ? String(I.idx) : "");
- return g ? `${I.type || "ph"}:${g}` : `${I.type || "ph"}`;
- }
- function Udg(t) {
- const I = String(t || "").trim();
- return I ? /click to add/i.test(I) || /单击.*添加/.test(I) || /点击.*添加/.test(I) || /添加(标题|文本|内容)/.test(I) : !1;
- }
- function xY(t) {
- const I = gI(t);
- return I ? I > 1 ? Math.max(0, Math.min(1, I / 100)) : Math.max(0, Math.min(1, I)) : 0;
- }
- function KIg(t) {
- const I = t == null ? void 0 : t.rect, g = t == null ? void 0 : t.crop, C = I && typeof I == "object" ? I : g && typeof g == "object" ? g : null;
- if (!C) return null;
- const i = xY(C.t), e = xY(C.b), A = xY(C.l), s = xY(C.r);
- if (!i && !e && !A && !s) return null;
- const l = Math.max(0, Math.min(0.9, A)), n = Math.max(0, Math.min(0.9, s)), a = Math.max(0, Math.min(0.9, i)), d = Math.max(0, Math.min(0.9, e));
- return l + n >= 0.98 || a + d >= 0.98 ? null : { t: a, b: d, l, r: n };
- }
- function Edg(t) {
- return String((t == null ? void 0 : t.geom) || (t == null ? void 0 : t.shapeType) || "").toLowerCase();
- }
- function FIg(t) {
- const I = Edg(t);
- return {
- width: "100%",
- height: "100%",
- position: "relative",
- overflow: "hidden",
- borderRadius: I === "ellipse" || I === "circle" ? "50%" : DIg(t)
- };
- }
- function EH(t, I = 1) {
- if (t == null) return I;
- const g = gI(t);
- if (!g) return I;
- const C = g > 10 ? g / 100 : g;
- return Math.max(0, Math.min(3, C));
- }
- function Pdg(t) {
- const I = t == null ? void 0 : t.filters;
- if (!I || typeof I != "object") return;
- const g = EH(I.brightness, 1), C = EH(I.contrast, 1), i = EH(I.saturation, 1), e = gI(I.colorTemperature), A = [];
- if (g !== 1 && A.push(`brightness(${g})`), C !== 1 && A.push(`contrast(${C})`), i !== 1 && A.push(`saturate(${i})`), e) {
- const s = Math.max(-100, Math.min(100, e)), l = s * 0.6, n = Math.min(1, Math.abs(s) / 200);
- A.push(`hue-rotate(${l}deg)`), s > 0 && n && A.push(`sepia(${n})`);
- }
- return A.length ? A.join(" ") : void 0;
- }
- function kIg(t) {
- const I = KIg(t), g = Pdg(t);
- if (!I)
- return {
- width: "100%",
- height: "100%",
- objectFit: "fill",
- filter: g,
- display: "block"
- };
- const C = 1 / (1 - I.l - I.r), i = 1 / (1 - I.t - I.b), e = -I.l * 100, A = -I.t * 100;
- return {
- width: "100%",
- height: "100%",
- objectFit: "fill",
- display: "block",
- transformOrigin: "top left",
- transform: `translate(${e}%, ${A}%) scale(${C}, ${i})`,
- filter: g
- };
- }
- function tA(t) {
- var i, e, A, s;
- const I = typeof t.fill == "object" && t.fill ? t.fill : null, C = [
- t.src,
- t.url,
- t.picBase64,
- t.mediaBase64,
- t.base64,
- t.blob,
- t.blobUrl,
- (i = t.value) == null ? void 0 : i.picBase64,
- (e = t.value) == null ? void 0 : e.src,
- (A = I == null ? void 0 : I.value) == null ? void 0 : A.picBase64,
- (s = I == null ? void 0 : I.value) == null ? void 0 : s.src
- ].find((l) => typeof l == "string" && l.trim());
- return C ? String(C) : "";
- }
- function tM(t) {
- const I = String(t.type || "").toLowerCase();
- return I === "shape" || I === "rect" || I === "line";
- }
- function y9(t) {
- var g, C;
- if (typeof t.fill == "object" && ((g = t.fill) == null ? void 0 : g.type) === "image") return !0;
- if (typeof t.fill == "object" && t.fill) {
- const i = (C = t.fill) == null ? void 0 : C.value;
- if (i && (typeof i.picBase64 == "string" || typeof i.src == "string") || typeof t.fill.picBase64 == "string" || typeof t.fill.src == "string") return !0;
- }
- const I = String(t.type || "").toLowerCase();
- return I === "pic" || I === "picture";
- }
- function Y9(t) {
- const I = String(t.type || "").toLowerCase();
- if (y9(t)) return !1;
- if (I === "image" || I === "pic" || I === "picture") return !0;
- const g = tA(t);
- return !!g && /^data:image\//i.test(g);
- }
- function N9(t) {
- if (String(t.type || "").toLowerCase() === "video") return !0;
- const g = tA(t);
- return !!g && /^data:video\//i.test(g);
- }
- function V9(t) {
- if (String(t.type || "").toLowerCase() === "audio") return !0;
- const g = tA(t);
- return !!g && /^data:audio\//i.test(g);
- }
- function zIg(t) {
- return String(t.type || "").toLowerCase() === "table";
- }
- function JIg(t) {
- const I = String(t.type || "").toLowerCase();
- return I === "chart" || I === "charts";
- }
- function LIg(t) {
- const I = String(t.type || "").toLowerCase();
- return I === "group" || I === "groupshape" || I === "grpsp" || I === "grp" || [t == null ? void 0 : t.elements, t == null ? void 0 : t.children, t == null ? void 0 : t.childrens, t == null ? void 0 : t.items, t == null ? void 0 : t.spTree].some((i) => Array.isArray(i) && i.length) ? !0 : I.includes("group");
- }
- function vIg(t) {
- const I = String(t.type || "").toLowerCase();
- return I === "math" || I === "equation";
- }
- function TIg(t) {
- const I = String(t.type || "").toLowerCase();
- return I === "diagram" || I === "smartart" || I === "smart_art";
- }
- function _dg(t) {
- var I, g, C, i, e;
- if (!t || !t.type) return "#fff";
- if (t.type === "color") return String(t.value || "#fff");
- if (t.type === "gradient") {
- const A = Array.isArray((I = t.value) == null ? void 0 : I.colors) ? t.value.colors : [], s = gI((g = t.value) == null ? void 0 : g.rot), l = String(((C = t.value) == null ? void 0 : C.path) || "rect"), n = A.map((a) => {
- const d = String((a == null ? void 0 : a.pos) ?? ""), o = String((a == null ? void 0 : a.color) ?? "");
- return o ? d ? `${o} ${d}` : o : "";
- }).filter(Boolean).join(", ");
- return n ? l === "rect" ? `linear-gradient(${(90 - s + 360) % 360}deg, ${n})` : `radial-gradient(circle, ${n})` : "#fff";
- }
- if (t.type === "image") {
- const A = String(((i = t.value) == null ? void 0 : i.picBase64) || ((e = t.value) == null ? void 0 : e.src) || "");
- return A ? `center / cover no-repeat url(${A})` : "#fff";
- }
- return "#fff";
- }
- function qdg(t, I) {
- const g = gI(t.order) || I, i = (t == null ? void 0 : t.__source) === "slide" ? 1e5 : 0;
- return g + i;
- }
- function xIg(t) {
- const I = t == null ? void 0 : t.shadow;
- if (!I || typeof I != "object") return;
- const g = gI(I.h), C = gI(I.v), i = Math.max(0, gI(I.blur)), e = String(I.color || "").trim();
- if (!(!e || !g && !C && !i))
- return `drop-shadow(${g}px ${C}px ${i}px ${e})`;
- }
- function jIg(t) {
- if (tM(t)) return;
- const I = CM(t);
- if (I.width)
- return `${I.width}px solid ${I.color}`;
- }
- function QIg(t) {
- var g, C, i;
- if (tM(t) || y9(t) || Y9(t) || N9(t) || V9(t)) return;
- if (typeof t.fill == "string") {
- const e = t.fill.trim();
- return e || void 0;
- }
- const I = typeof t.fill == "object" && t.fill ? t.fill : null;
- if (!(!I || !I.type)) {
- if (I.type === "color") return String(I.value || "") || void 0;
- if (I.type === "gradient") {
- const e = Array.isArray((g = I.value) == null ? void 0 : g.colors) ? I.value.colors : [], A = gI((C = I.value) == null ? void 0 : C.rot), s = String(((i = I.value) == null ? void 0 : i.path) || "rect"), l = e.map((n) => {
- const a = String((n == null ? void 0 : n.pos) ?? ""), d = String((n == null ? void 0 : n.color) ?? "");
- return d ? a ? `${d} ${a}` : d : "";
- }).filter(Boolean).join(", ");
- return l ? s === "rect" ? `linear-gradient(${(90 - A + 360) % 360}deg, ${l})` : `radial-gradient(circle, ${l})` : void 0;
- }
- }
- }
- function $dg(t, I) {
- const g = gI(t.left), C = gI(t.top), i = Math.max(0, gI(t.width)), e = Math.max(0, gI(t.height)), A = gI(t.rotate), s = !!t.isFlipH, l = !!t.isFlipV, n = qdg(t, I), a = t.opacity == null ? 1 : Math.max(0, Math.min(1, gI(t.opacity))), d = [];
- A && d.push(`rotate(${A}deg)`), s && d.push("scaleX(-1)"), l && d.push("scaleY(-1)");
- const o = QIg(t), c = jIg(t), r = DIg(t), h = xIg(t);
- return {
- position: "absolute",
- left: `${g}px`,
- top: `${C}px`,
- width: `${i}px`,
- height: `${e}px`,
- zIndex: n,
- opacity: a,
- background: o,
- border: c,
- borderRadius: r,
- filter: h,
- transformOrigin: "center center",
- transform: d.length ? d.join(" ") : void 0
- };
- }
- function aV(t) {
- return {
- position: "absolute",
- left: 0,
- top: 0,
- width: "100%",
- height: "100%",
- display: "table"
- };
- }
- function oV(t) {
- const I = t == null ? void 0 : t.autoFit, g = I && typeof I == "object" ? gI(I.fontScale) : 1, C = g && g !== 1 ? Math.max(0.1, Math.min(5, g)) : 1, i = !!(t != null && t.isVertical), e = i ? "vertical-rl" : void 0, A = i ? "mixed" : void 0, s = String(t.vAlign || "up"), l = s === "down" ? "bottom" : s === "mid" ? "middle" : "top";
- return C === 1 ? {
- display: "table-cell",
- width: "100%",
- height: "100%",
- verticalAlign: l,
- writingMode: e,
- textOrientation: A
- } : {
- display: "table-cell",
- // width: `${inv}%`,
- // height: `${inv}%`,
- width: "100%",
- height: "100%",
- position: "absolute",
- left: 0,
- top: 0,
- verticalAlign: l,
- // transformOrigin: "top left",
- // transform: `scale(${fontScale})`,
- writingMode: e,
- textOrientation: A
- };
- }
- const Ku = /* @__PURE__ */ new Map();
- function Ti(t, I, g) {
- var w;
- const C = `c-${cG(I, g)}`, i = Ku.get(C);
- if (i) return i;
- const e = Math.max(1, gI(t.width)), A = Math.max(1, gI(t.height)), s = String((t == null ? void 0 : t.chartType) || "").toLowerCase(), l = Array.isArray(t == null ? void 0 : t.colors) ? t.colors : [], n = l.length ? l.map((W) => String(W || "").trim()).filter(Boolean) : [], a = (W) => n[W % Math.max(1, n.length)] || "#4e79a7", d = t.opacity == null ? 1 : Math.max(0, Math.min(1, gI(t.opacity))), o = Math.max(4, Math.min(24, Math.round(Math.min(e, A) * 0.08))), c = s.includes("pie") || s.includes("doughnut"), r = s.includes("bar") || s.includes("col");
- if (s.includes("scatter") || s.includes("bubble")) {
- const W = t == null ? void 0 : t.data, y = Array.isArray(W == null ? void 0 : W[0]) ? W[0] : [], f = Array.isArray(W == null ? void 0 : W[1]) ? W[1] : [], D = Math.min(y.length, f.length), F = D ? Math.min(...y.slice(0, D)) : 0, T = D ? Math.max(...y.slice(0, D)) : 1, Q = D ? Math.min(...f.slice(0, D)) : 0, P = D ? Math.max(...f.slice(0, D)) : 1, L = T - F || 1, E = P - Q || 1, J = Math.max(1, e - o * 2), k = Math.max(1, A - o * 2), j = [];
- for (let Cg = 0; Cg < D; Cg++) {
- const Ig = o + (y[Cg] - F) / L * J, x = o + (1 - (f[Cg] - Q) / E) * k;
- j.push({ cx: Ig, cy: x, r: 3, fill: a(0), opacity: d });
- }
- const q = { kind: "scatter", bars: [], paths: [], points: j, slices: [], cx: 0, cy: 0, holeR: 0 };
- return Ku.set(C, q), q;
- }
- const b = t == null ? void 0 : t.data;
- if (c) {
- const W = Array.isArray(b) ? b : [], f = (Array.isArray((w = W == null ? void 0 : W[0]) == null ? void 0 : w.values) ? W[0].values : []).map((k) => ({ y: gI(k == null ? void 0 : k.y), x: String((k == null ? void 0 : k.x) ?? "") })).filter((k) => Number.isFinite(k.y) && k.y > 0), D = f.reduce((k, j) => k + j.y, 0) || 1, F = e / 2, T = A / 2, Q = Math.max(2, Math.min(e, A) / 2 - o), P = s.includes("doughnut") ? Q * 0.55 : 0;
- let L = -Math.PI / 2;
- const E = [];
- f.forEach((k, j) => {
- const q = k.y / D * Math.PI * 2, Cg = L + q, Ig = F + Q * Math.cos(L), x = T + Q * Math.sin(L), Ag = F + Q * Math.cos(Cg), eg = T + Q * Math.sin(Cg), O = q > Math.PI ? 1 : 0, _ = `M ${F} ${T} L ${Ig} ${x} A ${Q} ${Q} 0 ${O} 1 ${Ag} ${eg} Z`;
- E.push({ d: _, fill: a(j), opacity: d }), L = Cg;
- });
- const J = { kind: "pie", bars: [], paths: [], points: [], slices: E, cx: F, cy: T, holeR: P };
- return Ku.set(C, J), J;
- }
- const m = (Array.isArray(b) ? b : []).map((W) => {
- const f = (Array.isArray(W == null ? void 0 : W.values) ? W.values : []).map((D) => ({ y: gI(D == null ? void 0 : D.y), x: String((D == null ? void 0 : D.x) ?? "") })).filter((D) => Number.isFinite(D.y));
- return {
- name: String((W == null ? void 0 : W.name) ?? ""),
- values: f
- };
- }).filter((W) => W.values.length), Z = Array.from(new Set(m.flatMap((W) => W.values.map((y) => y.x)).filter((W) => W != null).map((W) => String(W)))), p = Math.max(1, Z.length), Y = Math.max(1, m.length), R = Math.max(1, ...m.flatMap((W) => W.values.map((y) => y.y)).filter((W) => Number.isFinite(W))), X = Math.max(1, e - o * 2), H = Math.max(1, A - o * 2), S = String((t == null ? void 0 : t.barDir) || "col").toLowerCase();
- if (r) {
- const W = [];
- if (S === "bar") {
- const f = H / p, D = f * 0.8, F = (f - D) / 2, T = D / Y;
- for (let Q = 0; Q < p; Q++)
- for (let P = 0; P < m.length; P++) {
- const L = m[P].values.find((q) => q.x === Z[Q]), J = (L ? L.y : 0) / R * X, k = o, j = o + Q * f + F + P * T;
- W.push({ x: k, y: j, w: Math.max(0, J), h: Math.max(0, T * 0.9), fill: a(P), opacity: d });
- }
- } else {
- const f = X / p, D = f * 0.8, F = (f - D) / 2, T = D / Y;
- for (let Q = 0; Q < p; Q++)
- for (let P = 0; P < m.length; P++) {
- const L = m[P].values.find((q) => q.x === Z[Q]), J = (L ? L.y : 0) / R * H, k = o + Q * f + F + P * T, j = o + (H - J);
- W.push({ x: k, y: j, w: Math.max(0, T * 0.9), h: Math.max(0, J), fill: a(P), opacity: d });
- }
- }
- const y = { kind: "bar", bars: W, paths: [], points: [], slices: [], cx: 0, cy: 0, holeR: 0 };
- return Ku.set(C, y), y;
- }
- const z = [], v = [], K = Math.max(1, Math.round(Math.min(e, A) * 0.01)), V = !!(t != null && t.marker), N = (W) => o + (p === 1 ? X / 2 : W / (p - 1) * X), B = (W) => o + (1 - W / R) * H;
- m.forEach((W, y) => {
- let f = "";
- Z.forEach((D, F) => {
- const T = W.values.find((E) => E.x === D), Q = T ? T.y : 0, P = N(F), L = B(Q);
- f += F === 0 ? `M ${P} ${L}` : ` L ${P} ${L}`, V && v.push({ cx: P, cy: L, r: K * 0.9 + 1, fill: a(y), opacity: d });
- }), z.push({ d: f, stroke: a(y), strokeWidth: K });
- });
- const G = { kind: "line", bars: [], paths: z, points: v, slices: [], cx: 0, cy: 0, holeR: 0 };
- return Ku.set(C, G), G;
- }
- const p8 = /* @__PURE__ */ new Map();
- function Zm(t, I, g) {
- const C = `t-${cG(I, g)}`, i = p8.get(C);
- if (i) return i;
- const e = t == null ? void 0 : t.data, A = Array.isArray(e) ? e : [], s = t == null ? void 0 : t.colWidths, l = t == null ? void 0 : t.rowHeights, n = Array.isArray(s) ? s.map(gI) : [], a = Array.isArray(l) ? l.map(gI) : [], d = A.map((c) => (Array.isArray(c) ? c : []).map((h) => Irg(t, h))), o = {
- colWidths: n,
- rowHeights: a,
- rows: d
- };
- return p8.set(C, o), o;
- }
- function OIg(t, I, g, C) {
- const e = Zm(t, I, g).rowHeights[C];
- if (e)
- return {
- height: `${e}px`
- };
- }
- function grg(t) {
- const I = t.match(/text-align\s*:\s*(left|right|center|justify)/i);
- return I ? I[1].toLowerCase() : "left";
- }
- function jY(t) {
- if (!t) return "";
- const I = String(t.borderColor || ""), g = Math.max(0, gI(t.borderWidth)), C = String(t.borderType || "solid");
- return !I || !g ? "" : `${g}px ${C === "dashed" || C === "dash" ? "dashed" : "solid"} ${I}`;
- }
- function Irg(t, I) {
- const g = I && typeof I == "object" ? I : {}, C = String(g.text ?? g.content ?? g.html ?? ""), i = Math.max(1, gI(g.colSpan ?? g.colspan ?? g.gridSpan) || 1), e = Math.max(1, gI(g.rowSpan ?? g.rowspan) || 1), A = gI(g.hMerge) === 1 || gI(g.vMerge) === 1, s = String(g.fillColor || "") || void 0, l = String(g.fontColor || "") || void 0, n = g.fontBold ? 700 : void 0, a = g.fontItalic ? "italic" : void 0, d = C ? grg(C) : void 0, o = g.borders || (t == null ? void 0 : t.borders) || void 0, c = jY(o == null ? void 0 : o.top), r = jY(o == null ? void 0 : o.right), h = jY(o == null ? void 0 : o.bottom), b = jY(o == null ? void 0 : o.left);
- return {
- html: C,
- colspan: i,
- rowspan: e,
- skip: A,
- style: {
- padding: "2px 4px",
- verticalAlign: "middle",
- background: s,
- color: l,
- fontWeight: n,
- fontStyle: a,
- textAlign: d,
- borderTop: c || void 0,
- borderRight: r || void 0,
- borderBottom: h || void 0,
- borderLeft: b || void 0,
- overflow: "hidden"
- }
- };
- }
- function M9(t) {
- return t.replace(/[^a-zA-Z0-9_-]/g, "_");
- }
- function hs(t, I, g) {
- var l, n, a;
- const C = typeof t.fill == "object" ? t.fill : null;
- if (!C || C.type !== "pattern" || !C.value) return null;
- const i = String(((l = C.value) == null ? void 0 : l.type) || ""), e = String(((n = C.value) == null ? void 0 : n.foregroundColor) || "#000"), A = String(((a = C.value) == null ? void 0 : a.backgroundColor) || "#fff"), s = `pptx-pattern-${I}-${M9(g)}`;
- return i === "pct5" ? {
- id: s,
- width: 10,
- height: 10,
- background: A,
- shapes: [{ kind: "circle", cx: 5, cy: 5, r: 1.2, fill: e }]
- } : i === "solidDmnd" ? {
- id: s,
- width: 12,
- height: 12,
- background: A,
- shapes: [{ kind: "polygon", points: "6,0 12,6 6,12 0,6", fill: e }]
- } : {
- id: s,
- width: 10,
- height: 10,
- background: A,
- shapes: [{ kind: "circle", cx: 5, cy: 5, r: 1, fill: e }]
- };
- }
- function Gm(t, I, g) {
- const C = typeof t.fill == "object" ? t.fill : null;
- if (!C) return null;
- const i = C == null ? void 0 : C.value;
- if (!(C.type === "image" || !!i && (typeof i.picBase64 == "string" || typeof i.src == "string") || typeof C.picBase64 == "string" || typeof C.src == "string")) return null;
- const A = tA(t);
- return A ? {
- id: `pptx-shape-img-${I}-${M9(g)}`,
- href: A
- } : null;
- }
- const gA = {
- pattern: /* @__PURE__ */ new Map(),
- image: /* @__PURE__ */ new Map(),
- gradient: /* @__PURE__ */ new Map()
- };
- function UIg(t, I, g) {
- const C = `p-${cG(I, g)}`;
- if (gA.pattern.has(C)) return gA.pattern.get(C);
- const i = hs(t, I, g);
- return gA.pattern.set(C, i), i;
- }
- function LN(t, I, g) {
- const C = `i-${cG(I, g)}`;
- if (gA.image.has(C)) return gA.image.get(C);
- const i = Gm(t, I, g);
- return gA.image.set(C, i), i;
- }
- function Crg(t) {
- const I = String(t ?? "").trim();
- if (!I) return "";
- if (I.endsWith("%")) return I;
- const g = Number(I);
- return Number.isFinite(g) ? `${g}%` : I;
- }
- function ae(t, I, g) {
- var m, Z, p;
- const C = `g-${cG(I, g)}`;
- if (gA.gradient.has(C)) return gA.gradient.get(C);
- const i = typeof t.fill == "object" ? t.fill : null;
- if (!i || i.type !== "gradient" || !i.value)
- return gA.gradient.set(C, null), null;
- const e = Array.isArray((m = i.value) == null ? void 0 : m.colors) ? i.value.colors : [], A = gI((Z = i.value) == null ? void 0 : Z.rot), s = String(((p = i.value) == null ? void 0 : p.path) || "rect"), l = e.map((Y) => {
- const R = Crg(Y == null ? void 0 : Y.pos), X = String((Y == null ? void 0 : Y.color) ?? "").trim(), H = (Y == null ? void 0 : Y.alpha) ?? (Y == null ? void 0 : Y.opacity), S = H == null ? void 0 : Math.max(0, Math.min(1, gI(H)));
- return X ? {
- offset: R || void 0,
- color: X,
- opacity: S
- } : null;
- }).filter(Boolean), n = `pptx-grad-${I}-${M9(g)}`;
- if (!l.length)
- return gA.gradient.set(C, null), null;
- if (s !== "rect") {
- const Y = {
- id: n,
- kind: "radial",
- stops: l.map((R) => ({ ...R, offset: R.offset || "0%" }))
- };
- return gA.gradient.set(C, Y), Y;
- }
- const a = (90 - A + 360) % 360 * (Math.PI / 180), d = Math.cos(a), o = Math.sin(a), c = 0.5 - d / 2, r = 0.5 + o / 2, h = 0.5 + d / 2, b = 0.5 - o / 2, u = {
- id: n,
- kind: "linear",
- x1: `${Math.max(0, Math.min(1, c)) * 100}%`,
- y1: `${Math.max(0, Math.min(1, r)) * 100}%`,
- x2: `${Math.max(0, Math.min(1, h)) * 100}%`,
- y2: `${Math.max(0, Math.min(1, b)) * 100}%`,
- stops: l.map((Y) => ({ ...Y, offset: Y.offset || "0%" }))
- };
- return gA.gradient.set(C, u), u;
- }
- function EIg(t, I, g) {
- return !!(ae(t, I, g) || UIg(t, I, g) || LN(t, I, g));
- }
- function PIg(t, I, g) {
- var e;
- const C = typeof t.fill == "object" ? t.fill : null, i = String(t.type || "").toLowerCase().includes("pic");
- if ((!C || !C.type) && i) {
- const A = LN(t, I, g);
- return A ? `url(#${A.id})` : "transparent";
- }
- if (!C || !C.type) return "transparent";
- if (C.type === "color") return String(C.value || "transparent");
- if (C.type === "gradient") {
- const A = ae(t, I, g);
- return A ? `url(#${A.id})` : "transparent";
- }
- if (C.type === "pattern") {
- const A = UIg(t, I, g);
- return A ? `url(#${A.id})` : String(((e = C.value) == null ? void 0 : e.foregroundColor) || "transparent");
- }
- if (C.type === "image" || i || C.type == null && LN(t, I, g)) {
- const A = LN(t, I, g);
- return A ? `url(#${A.id})` : "transparent";
- }
- return "transparent";
- }
- function _Ig(t) {
- return CM(t).color || "transparent";
- }
- function qIg(t) {
- const I = CM(t);
- return Math.max(0, I.width);
- }
- function $Ig(t) {
- return CM(t).dasharray;
- }
- function gCg(t) {
- const I = typeof t.path == "string" ? String(t.path).trim() : "";
- if (I) return I;
- const g = Math.max(0, gI(t.width)), C = Math.max(0, gI(t.height)), i = String(t.shapType || t.shapeType || t.geom || "").toLowerCase(), e = !!t.isFlipH, A = !!t.isFlipV;
- if (i === "line" || i === "connector" || i === "straightconnector1")
- return A && e ? `M ${g} ${C} L 0 0` : A ? `M 0 ${C} L ${g} 0` : e ? `M ${g} 0 L 0 ${C}` : `M 0 0 L ${g} ${C}`;
- if (g <= 0 || C <= 0)
- return g > 0 ? `M 0 0 L ${g} 0` : C > 0 ? `M 0 0 L 0 ${C}` : "";
- if (i === "ellipse" || i === "circle") {
- const l = g / 2, n = C / 2, a = g / 2, d = C / 2;
- return `M ${l - a} ${n} A ${a} ${d} 0 1 0 ${l + a} ${n} A ${a} ${d} 0 1 0 ${l - a} ${n} Z`;
- }
- if (i === "triangle" || i === "tri")
- return `M ${g / 2} 0 L ${g} ${C} L 0 ${C} Z`;
- if (i === "diamond" || i === "rhombus")
- return `M ${g / 2} 0 L ${g} ${C / 2} L ${g / 2} ${C} L 0 ${C / 2} Z`;
- const s = Math.max(0, Math.min(Math.min(g, C) / 2, gI(t.radius || t.cornerRadius || t.rx)));
- if (s) {
- const l = Math.min(s, g / 2, C / 2);
- return `M ${l} 0 H ${g - l} A ${l} ${l} 0 0 1 ${g} ${l} V ${C - l} A ${l} ${l} 0 0 1 ${g - l} ${C} H ${l} A ${l} ${l} 0 0 1 0 ${C - l} V ${l} A ${l} ${l} 0 0 1 ${l} 0 Z`;
- }
- return `M 0 0 H ${g} V ${C} H 0 Z`;
- }
- function trg(t) {
- var C;
- const I = [
- t == null ? void 0 : t.elements,
- t == null ? void 0 : t.children,
- t == null ? void 0 : t.childrens,
- t == null ? void 0 : t.items,
- t == null ? void 0 : t.spTree,
- (C = t == null ? void 0 : t.spTree) == null ? void 0 : C.elements
- ], g = [];
- return I.forEach((i) => {
- Array.isArray(i) && i.forEach((e) => {
- e && typeof e == "object" && g.push(e);
- });
- }), g;
- }
- function irg(t) {
- const I = String(t || "").match(/-?\d*\.?\d+(?:e[-+]?\d+)?/gi);
- if (!I || I.length < 2) return null;
- let g = 0, C = 0;
- for (let i = 0; i + 1 < I.length; i += 2) {
- const e = Number(I[i]), A = Number(I[i + 1]);
- Number.isFinite(e) && (g = Math.max(g, Math.abs(e))), Number.isFinite(A) && (C = Math.max(C, Math.abs(A)));
- }
- return !g || !C ? null : { vbW: g, vbH: C };
- }
- function ICg(t) {
- const I = (t == null ? void 0 : t.chOff) ?? (t == null ? void 0 : t.childOff) ?? (t == null ? void 0 : t.childOffset) ?? null, g = (t == null ? void 0 : t.chExt) ?? (t == null ? void 0 : t.childExt) ?? (t == null ? void 0 : t.childExtent) ?? null, C = gI((I == null ? void 0 : I.x) ?? (I == null ? void 0 : I.left) ?? (I == null ? void 0 : I.l) ?? (t == null ? void 0 : t.chOffX) ?? (t == null ? void 0 : t.childOffX)), i = gI((I == null ? void 0 : I.y) ?? (I == null ? void 0 : I.top) ?? (I == null ? void 0 : I.t) ?? (t == null ? void 0 : t.chOffY) ?? (t == null ? void 0 : t.childOffY)), e = gI((g == null ? void 0 : g.cx) ?? (g == null ? void 0 : g.w) ?? (g == null ? void 0 : g.width) ?? (t == null ? void 0 : t.chExtW) ?? (t == null ? void 0 : t.childExtW)), A = gI((g == null ? void 0 : g.cy) ?? (g == null ? void 0 : g.h) ?? (g == null ? void 0 : g.height) ?? (t == null ? void 0 : t.chExtH) ?? (t == null ? void 0 : t.childExtH));
- return !e || !A ? null : { offX: C, offY: i, extW: e, extH: A };
- }
- function erg(t, I, g, C, i) {
- const e = Math.max(0, gI(t.width)), A = Math.max(0, gI(t.height)), s = gI(I.left), l = gI(I.top), n = Math.max(0, gI(I.width)), a = Math.max(0, gI(I.height)), d = s >= -0.5 && l >= -0.5 && s + n <= e + 0.5 && l + a <= A + 0.5, o = ICg(t), c = o && e ? e / o.extW : 1, r = o && A ? A / o.extH : 1, h = d ? s : o ? (s - o.offX) * c : s - C, b = d ? l : o ? (l - o.offY) * r : l - i, u = o && !d ? n * c : n, m = o && !d ? a * r : a, Z = gI(I.rotate), p = !!I.isFlipH, Y = !!I.isFlipV, R = gI(I.order) || g, X = I.opacity == null ? 1 : Math.max(0, Math.min(1, gI(I.opacity))), H = [];
- Z && H.push(`rotate(${Z}deg)`), p && H.push("scaleX(-1)"), Y && H.push("scaleY(-1)");
- const S = QIg(I), z = jIg(I), v = xIg(I);
- return {
- position: "absolute",
- left: `${h}px`,
- top: `${b}px`,
- width: `${u}px`,
- height: `${m}px`,
- zIndex: R,
- opacity: X,
- background: S,
- border: z,
- filter: v,
- transformOrigin: "center center",
- transform: H.length ? H.join(" ") : void 0
- };
- }
- const CCg = r$({
- name: "PptxGroup",
- props: {
- el: { type: Object, required: !0 },
- slideIndex: { type: Number, required: !0 },
- cacheId: { type: String, required: !0 },
- absLeft: { type: Number, required: !0 },
- absTop: { type: Number, required: !0 }
- },
- setup(t) {
- const I = (C, i, e, A, s) => {
- if (!EIg(C, i, e)) return null;
- const l = ae(C, i, e), n = hs(C, i, e), a = Gm(C, i, e), d = [];
- if ((l == null ? void 0 : l.kind) === "linear" ? d.push(
- yI(
- "linearGradient",
- { id: l.id, x1: l.x1, y1: l.y1, x2: l.x2, y2: l.y2 },
- l.stops.map((o, c) => yI("stop", { key: c, offset: o.offset, "stop-color": o.color, "stop-opacity": o.opacity }))
- )
- ) : (l == null ? void 0 : l.kind) === "radial" && d.push(
- yI(
- "radialGradient",
- { id: l.id, cx: "50%", cy: "50%", r: "50%" },
- l.stops.map((o, c) => yI("stop", { key: c, offset: o.offset, "stop-color": o.color, "stop-opacity": o.opacity }))
- )
- ), n && d.push(
- yI(
- "pattern",
- { id: n.id, patternUnits: "userSpaceOnUse", width: n.width, height: n.height },
- [
- yI("rect", { x: 0, y: 0, width: n.width, height: n.height, fill: n.background }),
- ...n.shapes.map((o, c) => o.kind === "circle" ? yI("circle", { key: c, cx: o.cx, cy: o.cy, r: o.r, fill: o.fill }) : o.kind === "polygon" ? yI("polygon", { key: c, points: o.points, fill: o.fill }) : yI("rect", {
- key: c,
- x: o.x,
- y: o.y,
- width: o.width,
- height: o.height,
- fill: o.fill,
- transform: o.transform
- }))
- ]
- )
- ), a) {
- const o = KIg(C), c = o ? 1 / (1 - o.l - o.r) : 1, r = o ? 1 / (1 - o.t - o.b) : 1, h = o ? -o.l * c : 0, b = o ? -o.t * r : 0;
- d.push(
- yI(
- "pattern",
- {
- id: a.id,
- patternUnits: "userSpaceOnUse",
- patternContentUnits: "userSpaceOnUse",
- x: 0,
- y: 0,
- width: A,
- height: s
- },
- [
- yI("image", {
- x: h * A,
- y: b * s,
- width: c * A,
- height: r * s,
- href: a.href,
- "xlink:href": a.href,
- preserveAspectRatio: "none"
- })
- ]
- )
- );
- }
- return d.length ? yI("defs", null, d) : null;
- }, g = (C, i, e, A, s, l) => {
- const n = erg(e, C, i, A, s), a = KI(C, i, l), d = G8(n == null ? void 0 : n.left), o = G8(n == null ? void 0 : n.top), c = A + d, r = s + o, h = ICg(e), b = Math.max(0, gI(e.width)), u = Math.max(0, gI(e.height)), m = h && b ? b / h.extW : 1, Z = h && u ? u / h.extH : 1;
- if (Y9(C))
- return yI("div", { key: a, class: "pptx-element", style: n }, [
- yI("div", { class: "pptx-img-wrap", style: FIg(C) }, [
- yI("img", { class: "pptx-img", src: tA(C), style: kIg(C), alt: "", draggable: !1 })
- ])
- ]);
- if (N9(C))
- return yI("div", { key: a, class: "pptx-element", style: n }, [yI("video", { class: "pptx-media", src: tA(C), controls: !0, preload: "metadata" })]);
- if (V9(C))
- return yI("div", { key: a, class: "pptx-element", style: n }, [yI("audio", { class: "pptx-media", src: tA(C), controls: !0, preload: "metadata" })]);
- if (vIg(C))
- return yI("div", { key: a, class: "pptx-element", style: n }, [yI("img", { class: "pptx-img", src: tA(C), alt: "", draggable: !1 })]);
- if (JIg(C)) {
- const Y = Ti(C, t.slideIndex, a), R = [];
- return Y.kind === "bar" ? R.push(...Y.bars.map((X, H) => yI("rect", { key: H, x: X.x, y: X.y, width: X.w, height: X.h, fill: X.fill, "fill-opacity": X.opacity }))) : Y.kind === "line" ? (R.push(
- ...Y.paths.map(
- (X, H) => yI("path", { key: H, d: X.d, fill: "none", stroke: X.stroke, "stroke-width": X.strokeWidth, "stroke-linejoin": "round", "stroke-linecap": "round" })
- )
- ), R.push(...Y.points.map((X, H) => yI("circle", { key: H, cx: X.cx, cy: X.cy, r: X.r, fill: X.fill, "fill-opacity": X.opacity })))) : Y.kind === "pie" ? (R.push(...Y.slices.map((X, H) => yI("path", { key: H, d: X.d, fill: X.fill, "fill-opacity": X.opacity }))), Y.holeR && R.push(yI("circle", { cx: Y.cx, cy: Y.cy, r: Y.holeR, fill: "#fff" }))) : Y.kind === "scatter" && R.push(...Y.points.map((X, H) => yI("circle", { key: H, cx: X.cx, cy: X.cy, r: X.r, fill: X.fill, "fill-opacity": X.opacity }))), yI("div", { key: a, class: "pptx-element", style: n }, [yI("svg", { class: "pptx-chart", viewBox: `0 0 ${gI(C.width)} ${gI(C.height)}`, preserveAspectRatio: "none" }, R)]);
- }
- if (zIg(C)) {
- const Y = Zm(C, t.slideIndex, a);
- return yI("div", { key: a, class: "pptx-element", style: n }, [
- yI("div", { class: "pptx-table-wrap" }, [
- yI("table", { class: "pptx-table" }, [
- Y.colWidths.length ? yI("colgroup", null, Y.colWidths.map((R, X) => yI("col", { key: X, style: { width: R ? `${R}px` : void 0 } }))) : null,
- yI(
- "tbody",
- null,
- Y.rows.map(
- (R, X) => yI(
- "tr",
- { key: X, style: OIg(C, t.slideIndex, a, X) },
- R.map((H, S) => H.skip ? null : yI(
- "td",
- { key: `${X}-${S}`, colspan: H.colspan, rowspan: H.rowspan, style: H.style },
- [yI("div", { class: "pptx-table-html", innerHTML: dh(H.html) })]
- )).filter(Boolean)
- )
- )
- )
- ].filter(Boolean))
- ])
- ]);
- }
- if (tM(C) || y9(C)) {
- const Y = Math.max(0, gI(C.width)), R = Math.max(0, gI(C.height)), X = gCg(C), H = (!Y || !R) && X ? irg(X) : null, S = Y || (H == null ? void 0 : H.vbW) || 1, z = R || (H == null ? void 0 : H.vbH) || 1, v = I(C, t.slideIndex, a, S, z), K = yI(
- "svg",
- {
- class: "pptx-shape-svg",
- viewBox: `0 0 ${S} ${z}`,
- preserveAspectRatio: "none",
- style: {
- overflow: "visible",
- width: "100%",
- height: "100%",
- display: "block"
- }
- },
- [
- v,
- yI("path", {
- d: X,
- fill: PIg(C, t.slideIndex, a),
- stroke: _Ig(C),
- "stroke-width": qIg(C),
- "stroke-dasharray": $Ig(C),
- style: { vectorEffect: "non-scaling-stroke" }
- })
- ].filter(Boolean)
- ), N = typeof C.content == "string" && C.content.trim() ? yI(
- "div",
- {
- class: "pptx-html",
- style: {
- ...aV(),
- overflow: "visible",
- width: `${Y}px`,
- height: `${R}px`,
- transform: m !== 1 || Z !== 1 ? `scale(${m}, ${Z})` : void 0,
- transformOrigin: "top left",
- position: "absolute",
- left: 0,
- top: 0
- }
- },
- [yI("div", { class: "pptx-html-inner", style: oV(C), innerHTML: dh(C.content) })]
- ) : null;
- return yI("div", { key: a, class: "pptx-element", style: { ...n, overflow: "visible" } }, [K, N].filter(Boolean));
- }
- if (LIg(C) || TIg(C))
- return yI("div", { key: a, class: "pptx-element", style: n }, [
- yI(CCg, { el: C, slideIndex: t.slideIndex, cacheId: a, absLeft: c, absTop: r })
- ]);
- const p = typeof C.content == "string" && C.content.trim();
- return yI(
- "div",
- { key: a, class: "pptx-element", style: n },
- p ? [
- yI("div", { class: "pptx-html", style: aV() }, [
- yI("div", { class: "pptx-html-inner", style: oV(C), innerHTML: dh(C.content) })
- ])
- ] : []
- );
- };
- return () => {
- const C = trg(t.el);
- return yI(
- "div",
- { class: "pptx-group-inner" },
- C.map((i, e) => g(i, e, t.el, t.absLeft, t.absTop, t.cacheId))
- );
- };
- }
- }), Arg = {
- key: 0,
- class: "pptx-empty"
- }, srg = {
- key: 1,
- class: "pptx-slides"
- }, lrg = ["src"], nrg = ["src"], arg = ["src"], org = ["src"], crg = ["viewBox"], drg = ["x", "y", "width", "height", "fill", "fill-opacity"], rrg = ["d", "stroke", "stroke-width"], hrg = ["cx", "cy", "r", "fill", "fill-opacity"], brg = ["d", "fill", "fill-opacity"], urg = ["cx", "cy", "r"], mrg = ["cx", "cy", "r", "fill", "fill-opacity"], Zrg = {
- key: 6,
- class: "pptx-table-wrap"
- }, Grg = { class: "pptx-table" }, wrg = { key: 0 }, prg = ["colspan", "rowspan"], Brg = ["innerHTML"], Wrg = ["viewBox"], yrg = { key: 0 }, Yrg = ["id", "x1", "y1", "x2", "y2"], Nrg = ["offset", "stop-color", "stop-opacity"], Vrg = ["id"], Mrg = ["offset", "stop-color", "stop-opacity"], Rrg = ["id", "width", "height"], frg = ["width", "height", "fill"], Hrg = ["cx", "cy", "r", "fill"], Xrg = ["points", "fill"], Srg = ["x", "y", "width", "height", "fill", "transform"], Drg = ["id"], Krg = ["href"], Frg = ["d", "fill", "stroke", "stroke-width", "stroke-dasharray"], krg = ["innerHTML"], zrg = ["innerHTML"], Jrg = /* @__PURE__ */ r$({
- __name: "PPT",
- props: {
- pptxJson: {}
- },
- setup(t) {
- const I = t, g = wi(null), C = wi(0);
- let i = null;
- const e = DA(() => {
- var o, c, r, h;
- const a = ((c = (o = I.pptxJson) == null ? void 0 : o.size) == null ? void 0 : c.width) ?? 960, d = ((h = (r = I.pptxJson) == null ? void 0 : r.size) == null ? void 0 : h.height) ?? 540;
- return {
- width: Number.isFinite(a) ? a : 960,
- height: Number.isFinite(d) ? d : 540
- };
- }), A = DA(() => {
- const a = C.value;
- if (!a) return 1;
- const d = a / e.value.width;
- return Math.min(1, Math.max(0.1, d));
- }), s = DA(() => {
- var d;
- return (Array.isArray((d = I.pptxJson) == null ? void 0 : d.slides) ? I.pptxJson.slides : []).map((o) => {
- const c = (Array.isArray(o.elements) ? o.elements : []).map((m) => ({
- ...m,
- __source: "slide"
- })), r = new Set(c.map(w8).filter(Boolean)), u = [...(Array.isArray(o.layoutElements) ? o.layoutElements : []).map((m) => {
- const Z = { ...m, __source: "layout" }, p = w8(Z);
- return p && r.has(p) ? null : p && typeof Z.content == "string" && Udg(Z.content) ? { ...Z, content: "" } : Z;
- }).filter(Boolean), ...c].filter((m) => m && typeof m == "object").map((m, Z) => ({ el: m, idx: Z })).sort((m, Z) => {
- const p = gI(m.el.order), Y = gI(Z.el.order);
- return p !== Y ? p - Y : m.idx - Z.idx;
- }).map((m) => m.el);
- return {
- ...o,
- elements: u
- };
- });
- });
- tG(() => {
- if (!g.value) return;
- console.log(I.pptxJson);
- const a = () => {
- g.value && (C.value = g.value.clientWidth);
- };
- a(), i = new ResizeObserver(() => a()), i.observe(g.value);
- }), s9(() => {
- i == null || i.disconnect(), i = null;
- });
- function l() {
- return {
- width: `${Math.round(e.value.width * A.value)}px`,
- height: `${Math.round(e.value.height * A.value)}px`
- };
- }
- function n(a) {
- var o;
- const d = _dg(
- (a == null ? void 0 : a.fill) ?? (a == null ? void 0 : a.backgroundFill) ?? (a == null ? void 0 : a.layoutFill) ?? ((o = a == null ? void 0 : a.layout) == null ? void 0 : o.fill) ?? (a == null ? void 0 : a.masterFill)
- );
- return {
- width: `${e.value.width}px`,
- height: `${e.value.height}px`,
- transform: `scale(${A.value})`,
- background: d
- };
- }
- return (a, d) => (Ug(), Pg("div", {
- ref_key: "rootRef",
- ref: g,
- class: "pptx-preview"
- }, [
- s.value.length ? (Ug(), Pg("div", srg, [
- (Ug(!0), Pg(ct, null, vi(s.value, (o, c) => (Ug(), Pg("div", {
- key: c,
- class: "pptx-slide-shell",
- style: Ae(l())
- }, [
- tC("div", {
- class: "pptx-slide",
- style: Ae(n(o))
- }, [
- (Ug(!0), Pg(ct, null, vi(o.elements, (r, h) => {
- var b, u;
- return Ug(), Pg("div", {
- key: Dg(Qdg)(r, h),
- class: "pptx-element",
- style: Ae(Dg($dg)(r, h))
- }, [
- Dg(Y9)(r) ? (Ug(), Pg("div", {
- key: 0,
- class: "pptx-img-wrap",
- style: Ae(Dg(FIg)(r))
- }, [
- tC("img", {
- class: "pptx-img",
- src: Dg(tA)(r),
- style: Ae(Dg(kIg)(r)),
- alt: "",
- draggable: "false"
- }, null, 12, lrg)
- ], 4)) : Dg(N9)(r) ? (Ug(), Pg("video", {
- key: 1,
- class: "pptx-media",
- src: Dg(tA)(r),
- controls: "",
- preload: "metadata"
- }, null, 8, nrg)) : Dg(V9)(r) ? (Ug(), Pg("audio", {
- key: 2,
- class: "pptx-media",
- src: Dg(tA)(r),
- controls: "",
- preload: "metadata"
- }, null, 8, arg)) : Dg(vIg)(r) ? (Ug(), Pg("img", {
- key: 3,
- class: "pptx-img",
- src: Dg(tA)(r),
- alt: "",
- draggable: "false"
- }, null, 8, org)) : Dg(JIg)(r) ? (Ug(), Pg("svg", {
- key: 4,
- class: "pptx-chart",
- viewBox: `0 0 ${Dg(gI)(r.width)} ${Dg(gI)(r.height)}`,
- preserveAspectRatio: "none"
- }, [
- Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "bar" ? (Ug(!0), Pg(ct, { key: 0 }, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).bars, (m, Z) => (Ug(), Pg("rect", {
- key: Z,
- x: m.x,
- y: m.y,
- width: m.w,
- height: m.h,
- fill: m.fill,
- "fill-opacity": m.opacity
- }, null, 8, drg))), 128)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "line" ? (Ug(), Pg(ct, { key: 1 }, [
- (Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).paths, (m, Z) => (Ug(), Pg("path", {
- key: Z,
- d: m.d,
- fill: "none",
- stroke: m.stroke,
- "stroke-width": m.strokeWidth,
- "stroke-linejoin": "round",
- "stroke-linecap": "round"
- }, null, 8, rrg))), 128)),
- (Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).points, (m, Z) => (Ug(), Pg("circle", {
- key: Z,
- cx: m.cx,
- cy: m.cy,
- r: m.r,
- fill: m.fill,
- "fill-opacity": m.opacity
- }, null, 8, hrg))), 128))
- ], 64)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "pie" ? (Ug(), Pg(ct, { key: 2 }, [
- (Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).slices, (m, Z) => (Ug(), Pg("path", {
- key: Z,
- d: m.d,
- fill: m.fill,
- "fill-opacity": m.opacity
- }, null, 8, brg))), 128)),
- Dg(Ti)(r, c, Dg(KI)(r, h)).holeR ? (Ug(), Pg("circle", {
- key: 0,
- cx: Dg(Ti)(r, c, Dg(KI)(r, h)).cx,
- cy: Dg(Ti)(r, c, Dg(KI)(r, h)).cy,
- r: Dg(Ti)(r, c, Dg(KI)(r, h)).holeR,
- fill: "#fff"
- }, null, 8, urg)) : Yt("", !0)
- ], 64)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "scatter" ? (Ug(!0), Pg(ct, { key: 3 }, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).points, (m, Z) => (Ug(), Pg("circle", {
- key: Z,
- cx: m.cx,
- cy: m.cy,
- r: m.r,
- fill: m.fill,
- "fill-opacity": m.opacity
- }, null, 8, mrg))), 128)) : Yt("", !0)
- ], 8, crg)) : Dg(LIg)(r) || Dg(TIg)(r) ? (Ug(), h$(Dg(CCg), {
- key: 5,
- el: r,
- "slide-index": c,
- "cache-id": Dg(KI)(r, h),
- "abs-left": Dg(gI)(r.left),
- "abs-top": Dg(gI)(r.top)
- }, null, 8, ["el", "slide-index", "cache-id", "abs-left", "abs-top"])) : Dg(zIg)(r) ? (Ug(), Pg("div", Zrg, [
- tC("table", Grg, [
- Dg(Zm)(r, c, Dg(KI)(r, h)).colWidths.length ? (Ug(), Pg("colgroup", wrg, [
- (Ug(!0), Pg(ct, null, vi(Dg(Zm)(r, c, Dg(KI)(r, h)).colWidths, (m, Z) => (Ug(), Pg("col", {
- key: Z,
- style: Ae({ width: m ? `${m}px` : void 0 })
- }, null, 4))), 128))
- ])) : Yt("", !0),
- tC("tbody", null, [
- (Ug(!0), Pg(ct, null, vi(Dg(Zm)(r, c, Dg(KI)(r, h)).rows, (m, Z) => (Ug(), Pg("tr", {
- key: Z,
- style: Ae(Dg(OIg)(r, c, Dg(KI)(r, h), Z))
- }, [
- (Ug(!0), Pg(ct, null, vi(m, (p, Y) => (Ug(), Pg(ct, {
- key: `${Z}-${Y}`
- }, [
- p.skip ? Yt("", !0) : (Ug(), Pg("td", {
- key: 0,
- colspan: p.colspan,
- rowspan: p.rowspan,
- style: Ae(p.style)
- }, [
- tC("div", {
- class: "pptx-table-html",
- innerHTML: Dg(dh)(p.html)
- }, null, 8, Brg)
- ], 12, prg))
- ], 64))), 128))
- ], 4))), 128))
- ])
- ])
- ])) : Dg(tM)(r) ? (Ug(), Pg(ct, { key: 7 }, [
- (Ug(), Pg("svg", {
- class: "pptx-shape-svg",
- viewBox: `0 0 ${Dg(gI)(r.width)} ${Dg(gI)(r.height)}`,
- preserveAspectRatio: "none"
- }, [
- Dg(EIg)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("defs", yrg, [
- ((b = Dg(ae)(r, c, Dg(KI)(r, h))) == null ? void 0 : b.kind) === "linear" ? (Ug(), Pg("linearGradient", {
- key: 0,
- id: Dg(ae)(r, c, Dg(KI)(r, h)).id,
- x1: Dg(ae)(r, c, Dg(KI)(r, h)).x1,
- y1: Dg(ae)(r, c, Dg(KI)(r, h)).y1,
- x2: Dg(ae)(r, c, Dg(KI)(r, h)).x2,
- y2: Dg(ae)(r, c, Dg(KI)(r, h)).y2
- }, [
- (Ug(!0), Pg(ct, null, vi(Dg(ae)(r, c, Dg(KI)(r, h)).stops, (m, Z) => (Ug(), Pg("stop", {
- key: Z,
- offset: m.offset,
- "stop-color": m.color,
- "stop-opacity": m.opacity
- }, null, 8, Nrg))), 128))
- ], 8, Yrg)) : ((u = Dg(ae)(r, c, Dg(KI)(r, h))) == null ? void 0 : u.kind) === "radial" ? (Ug(), Pg("radialGradient", {
- key: 1,
- id: Dg(ae)(r, c, Dg(KI)(r, h)).id,
- cx: "50%",
- cy: "50%",
- r: "50%"
- }, [
- (Ug(!0), Pg(ct, null, vi(Dg(ae)(r, c, Dg(KI)(r, h)).stops, (m, Z) => (Ug(), Pg("stop", {
- key: Z,
- offset: m.offset,
- "stop-color": m.color,
- "stop-opacity": m.opacity
- }, null, 8, Mrg))), 128))
- ], 8, Vrg)) : Yt("", !0),
- Dg(hs)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("pattern", {
- key: 2,
- id: Dg(hs)(r, c, Dg(KI)(r, h)).id,
- patternUnits: "userSpaceOnUse",
- width: Dg(hs)(r, c, Dg(KI)(r, h)).width,
- height: Dg(hs)(r, c, Dg(KI)(r, h)).height
- }, [
- tC("rect", {
- x: "0",
- y: "0",
- width: Dg(hs)(r, c, Dg(KI)(r, h)).width,
- height: Dg(hs)(r, c, Dg(KI)(r, h)).height,
- fill: Dg(hs)(r, c, Dg(KI)(r, h)).background
- }, null, 8, frg),
- (Ug(!0), Pg(ct, null, vi(Dg(hs)(r, c, Dg(KI)(r, h)).shapes, (m, Z) => (Ug(), Pg(ct, { key: Z }, [
- m.kind === "circle" ? (Ug(), Pg("circle", {
- key: 0,
- cx: m.cx,
- cy: m.cy,
- r: m.r,
- fill: m.fill
- }, null, 8, Hrg)) : m.kind === "polygon" ? (Ug(), Pg("polygon", {
- key: 1,
- points: m.points,
- fill: m.fill
- }, null, 8, Xrg)) : m.kind === "rect" ? (Ug(), Pg("rect", {
- key: 2,
- x: m.x,
- y: m.y,
- width: m.width,
- height: m.height,
- fill: m.fill,
- transform: m.transform
- }, null, 8, Srg)) : Yt("", !0)
- ], 64))), 128))
- ], 8, Rrg)) : Yt("", !0),
- Dg(Gm)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("pattern", {
- key: 3,
- id: Dg(Gm)(r, c, Dg(KI)(r, h)).id,
- patternUnits: "objectBoundingBox",
- width: "1",
- height: "1"
- }, [
- tC("image", {
- x: "0",
- y: "0",
- width: "100%",
- height: "100%",
- preserveAspectRatio: "none",
- href: Dg(Gm)(r, c, Dg(KI)(r, h)).href
- }, null, 8, Krg)
- ], 8, Drg)) : Yt("", !0)
- ])) : Yt("", !0),
- tC("path", {
- d: Dg(gCg)(r),
- fill: Dg(PIg)(r, c, Dg(KI)(r, h)),
- stroke: Dg(_Ig)(r),
- "stroke-width": Dg(qIg)(r),
- "stroke-dasharray": Dg($Ig)(r)
- }, null, 8, Frg)
- ], 8, Wrg)),
- typeof r.content == "string" && r.content.trim() ? (Ug(), Pg("div", {
- key: 0,
- class: "pptx-html",
- style: Ae(Dg(aV)(r))
- }, [
- tC("div", {
- class: "pptx-html-inner",
- style: Ae(Dg(oV)(r)),
- innerHTML: Dg(dh)(r.content)
- }, null, 12, krg)
- ], 4)) : Yt("", !0)
- ], 64)) : (Ug(), Pg(ct, { key: 8 }, [
- typeof r.content == "string" && r.content.trim() ? (Ug(), Pg("div", {
- key: 0,
- class: "pptx-html",
- style: Ae(Dg(aV)(r))
- }, [
- tC("div", {
- class: "pptx-html-inner",
- style: Ae(Dg(oV)(r)),
- innerHTML: Dg(dh)(r.content)
- }, null, 12, zrg)
- ], 4)) : Yt("", !0)
- ], 64))
- ], 4);
- }), 128))
- ], 4)
- ], 4))), 128))
- ])) : (Ug(), Pg("div", Arg, "暂无可渲染的幻灯片"))
- ], 512));
- }
- }), Lrg = /* @__PURE__ */ V0(Jrg, [["__scopeId", "data-v-5765ec3e"]]);
- function nD(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function tCg(t, I) {
- if (t) {
- if (typeof t == "string") return nD(t, I);
- var g = Object.prototype.toString.call(t).slice(8, -1);
- return g === "Object" && t.constructor && (g = t.constructor.name), g === "Map" || g === "Set" ? Array.from(t) : g === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(g) ? nD(t, I) : void 0;
- }
- }
- function R9(t) {
- return function(I) {
- if (Array.isArray(I)) return nD(I);
- }(t) || function(I) {
- if (typeof Symbol < "u" && I[Symbol.iterator] != null || I["@@iterator"] != null) return Array.from(I);
- }(t) || tCg(t) || function() {
- throw new TypeError(`Invalid attempt to spread non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }();
- }
- function B8(t, I, g, C, i, e, A) {
- try {
- var s = t[e](A), l = s.value;
- } catch (n) {
- return void g(n);
- }
- s.done ? I(l) : Promise.resolve(l).then(C, i);
- }
- function SC(t) {
- return function() {
- var I = this, g = arguments;
- return new Promise(function(C, i) {
- var e = t.apply(I, g);
- function A(l) {
- B8(e, C, i, A, s, "next", l);
- }
- function s(l) {
- B8(e, C, i, A, s, "throw", l);
- }
- A(void 0);
- });
- };
- }
- function _a(t) {
- return _a = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
- return typeof I;
- } : function(I) {
- return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
- }, _a(t);
- }
- function f9(t, I, g) {
- return I in t ? Object.defineProperty(t, I, { value: g, enumerable: !0, configurable: !0, writable: !0 }) : t[I] = g, t;
- }
- var oe = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
- function iM(t) {
- var I = t.default;
- if (typeof I == "function") {
- var g = function() {
- return I.apply(this, arguments);
- };
- g.prototype = I.prototype;
- } else g = {};
- return Object.defineProperty(g, "__esModule", { value: !0 }), Object.keys(t).forEach(function(C) {
- var i = Object.getOwnPropertyDescriptor(t, C);
- Object.defineProperty(g, C, i.get ? i : { enumerable: !0, get: function() {
- return t[C];
- } });
- }), g;
- }
- var iCg = { exports: {} }, W8 = { exports: {} };
- (function(t) {
- function I(g) {
- return t.exports = I = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(C) {
- return typeof C;
- } : function(C) {
- return C && typeof Symbol == "function" && C.constructor === Symbol && C !== Symbol.prototype ? "symbol" : typeof C;
- }, t.exports.__esModule = !0, t.exports.default = t.exports, I(g);
- }
- t.exports = I, t.exports.__esModule = !0, t.exports.default = t.exports;
- })(W8), function(t) {
- var I = W8.exports.default;
- function g() {
- t.exports = g = function() {
- return C;
- }, t.exports.__esModule = !0, t.exports.default = t.exports;
- var C = {}, i = Object.prototype, e = i.hasOwnProperty, A = Object.defineProperty || function(B, G, w) {
- B[G] = w.value;
- }, s = typeof Symbol == "function" ? Symbol : {}, l = s.iterator || "@@iterator", n = s.asyncIterator || "@@asyncIterator", a = s.toStringTag || "@@toStringTag";
- function d(B, G, w) {
- return Object.defineProperty(B, G, { value: w, enumerable: !0, configurable: !0, writable: !0 }), B[G];
- }
- try {
- d({}, "");
- } catch {
- d = function(G, w, W) {
- return G[w] = W;
- };
- }
- function o(B, G, w, W) {
- var y = G && G.prototype instanceof h ? G : h, f = Object.create(y.prototype), D = new K(W || []);
- return A(f, "_invoke", { value: H(B, w, D) }), f;
- }
- function c(B, G, w) {
- try {
- return { type: "normal", arg: B.call(G, w) };
- } catch (W) {
- return { type: "throw", arg: W };
- }
- }
- C.wrap = o;
- var r = {};
- function h() {
- }
- function b() {
- }
- function u() {
- }
- var m = {};
- d(m, l, function() {
- return this;
- });
- var Z = Object.getPrototypeOf, p = Z && Z(Z(V([])));
- p && p !== i && e.call(p, l) && (m = p);
- var Y = u.prototype = h.prototype = Object.create(m);
- function R(B) {
- ["next", "throw", "return"].forEach(function(G) {
- d(B, G, function(w) {
- return this._invoke(G, w);
- });
- });
- }
- function X(B, G) {
- function w(y, f, D, F) {
- var T = c(B[y], B, f);
- if (T.type !== "throw") {
- var Q = T.arg, P = Q.value;
- return P && I(P) == "object" && e.call(P, "__await") ? G.resolve(P.__await).then(function(L) {
- w("next", L, D, F);
- }, function(L) {
- w("throw", L, D, F);
- }) : G.resolve(P).then(function(L) {
- Q.value = L, D(Q);
- }, function(L) {
- return w("throw", L, D, F);
- });
- }
- F(T.arg);
- }
- var W;
- A(this, "_invoke", { value: function(y, f) {
- function D() {
- return new G(function(F, T) {
- w(y, f, F, T);
- });
- }
- return W = W ? W.then(D, D) : D();
- } });
- }
- function H(B, G, w) {
- var W = "suspendedStart";
- return function(y, f) {
- if (W === "executing") throw new Error("Generator is already running");
- if (W === "completed") {
- if (y === "throw") throw f;
- return N();
- }
- for (w.method = y, w.arg = f; ; ) {
- var D = w.delegate;
- if (D) {
- var F = S(D, w);
- if (F) {
- if (F === r) continue;
- return F;
- }
- }
- if (w.method === "next") w.sent = w._sent = w.arg;
- else if (w.method === "throw") {
- if (W === "suspendedStart") throw W = "completed", w.arg;
- w.dispatchException(w.arg);
- } else w.method === "return" && w.abrupt("return", w.arg);
- W = "executing";
- var T = c(B, G, w);
- if (T.type === "normal") {
- if (W = w.done ? "completed" : "suspendedYield", T.arg === r) continue;
- return { value: T.arg, done: w.done };
- }
- T.type === "throw" && (W = "completed", w.method = "throw", w.arg = T.arg);
- }
- };
- }
- function S(B, G) {
- var w = B.iterator[G.method];
- if (w === void 0) {
- if (G.delegate = null, G.method === "throw") {
- if (B.iterator.return && (G.method = "return", G.arg = void 0, S(B, G), G.method === "throw")) return r;
- G.method = "throw", G.arg = new TypeError("The iterator does not provide a 'throw' method");
- }
- return r;
- }
- var W = c(w, B.iterator, G.arg);
- if (W.type === "throw") return G.method = "throw", G.arg = W.arg, G.delegate = null, r;
- var y = W.arg;
- return y ? y.done ? (G[B.resultName] = y.value, G.next = B.nextLoc, G.method !== "return" && (G.method = "next", G.arg = void 0), G.delegate = null, r) : y : (G.method = "throw", G.arg = new TypeError("iterator result is not an object"), G.delegate = null, r);
- }
- function z(B) {
- var G = { tryLoc: B[0] };
- 1 in B && (G.catchLoc = B[1]), 2 in B && (G.finallyLoc = B[2], G.afterLoc = B[3]), this.tryEntries.push(G);
- }
- function v(B) {
- var G = B.completion || {};
- G.type = "normal", delete G.arg, B.completion = G;
- }
- function K(B) {
- this.tryEntries = [{ tryLoc: "root" }], B.forEach(z, this), this.reset(!0);
- }
- function V(B) {
- if (B) {
- var G = B[l];
- if (G) return G.call(B);
- if (typeof B.next == "function") return B;
- if (!isNaN(B.length)) {
- var w = -1, W = function y() {
- for (; ++w < B.length; ) if (e.call(B, w)) return y.value = B[w], y.done = !1, y;
- return y.value = void 0, y.done = !0, y;
- };
- return W.next = W;
- }
- }
- return { next: N };
- }
- function N() {
- return { value: void 0, done: !0 };
- }
- return b.prototype = u, A(Y, "constructor", { value: u, configurable: !0 }), A(u, "constructor", { value: b, configurable: !0 }), b.displayName = d(u, a, "GeneratorFunction"), C.isGeneratorFunction = function(B) {
- var G = typeof B == "function" && B.constructor;
- return !!G && (G === b || (G.displayName || G.name) === "GeneratorFunction");
- }, C.mark = function(B) {
- return Object.setPrototypeOf ? Object.setPrototypeOf(B, u) : (B.__proto__ = u, d(B, a, "GeneratorFunction")), B.prototype = Object.create(Y), B;
- }, C.awrap = function(B) {
- return { __await: B };
- }, R(X.prototype), d(X.prototype, n, function() {
- return this;
- }), C.AsyncIterator = X, C.async = function(B, G, w, W, y) {
- y === void 0 && (y = Promise);
- var f = new X(o(B, G, w, W), y);
- return C.isGeneratorFunction(G) ? f : f.next().then(function(D) {
- return D.done ? D.value : f.next();
- });
- }, R(Y), d(Y, a, "Generator"), d(Y, l, function() {
- return this;
- }), d(Y, "toString", function() {
- return "[object Generator]";
- }), C.keys = function(B) {
- var G = Object(B), w = [];
- for (var W in G) w.push(W);
- return w.reverse(), function y() {
- for (; w.length; ) {
- var f = w.pop();
- if (f in G) return y.value = f, y.done = !1, y;
- }
- return y.done = !0, y;
- };
- }, C.values = V, K.prototype = { constructor: K, reset: function(B) {
- if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = !1, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(v), !B) for (var G in this) G.charAt(0) === "t" && e.call(this, G) && !isNaN(+G.slice(1)) && (this[G] = void 0);
- }, stop: function() {
- this.done = !0;
- var B = this.tryEntries[0].completion;
- if (B.type === "throw") throw B.arg;
- return this.rval;
- }, dispatchException: function(B) {
- if (this.done) throw B;
- var G = this;
- function w(T, Q) {
- return f.type = "throw", f.arg = B, G.next = T, Q && (G.method = "next", G.arg = void 0), !!Q;
- }
- for (var W = this.tryEntries.length - 1; W >= 0; --W) {
- var y = this.tryEntries[W], f = y.completion;
- if (y.tryLoc === "root") return w("end");
- if (y.tryLoc <= this.prev) {
- var D = e.call(y, "catchLoc"), F = e.call(y, "finallyLoc");
- if (D && F) {
- if (this.prev < y.catchLoc) return w(y.catchLoc, !0);
- if (this.prev < y.finallyLoc) return w(y.finallyLoc);
- } else if (D) {
- if (this.prev < y.catchLoc) return w(y.catchLoc, !0);
- } else {
- if (!F) throw new Error("try statement without catch or finally");
- if (this.prev < y.finallyLoc) return w(y.finallyLoc);
- }
- }
- }
- }, abrupt: function(B, G) {
- for (var w = this.tryEntries.length - 1; w >= 0; --w) {
- var W = this.tryEntries[w];
- if (W.tryLoc <= this.prev && e.call(W, "finallyLoc") && this.prev < W.finallyLoc) {
- var y = W;
- break;
- }
- }
- y && (B === "break" || B === "continue") && y.tryLoc <= G && G <= y.finallyLoc && (y = null);
- var f = y ? y.completion : {};
- return f.type = B, f.arg = G, y ? (this.method = "next", this.next = y.finallyLoc, r) : this.complete(f);
- }, complete: function(B, G) {
- if (B.type === "throw") throw B.arg;
- return B.type === "break" || B.type === "continue" ? this.next = B.arg : B.type === "return" ? (this.rval = this.arg = B.arg, this.method = "return", this.next = "end") : B.type === "normal" && G && (this.next = G), r;
- }, finish: function(B) {
- for (var G = this.tryEntries.length - 1; G >= 0; --G) {
- var w = this.tryEntries[G];
- if (w.finallyLoc === B) return this.complete(w.completion, w.afterLoc), v(w), r;
- }
- }, catch: function(B) {
- for (var G = this.tryEntries.length - 1; G >= 0; --G) {
- var w = this.tryEntries[G];
- if (w.tryLoc === B) {
- var W = w.completion;
- if (W.type === "throw") {
- var y = W.arg;
- v(w);
- }
- return y;
- }
- }
- throw new Error("illegal catch attempt");
- }, delegateYield: function(B, G, w) {
- return this.delegate = { iterator: V(B), resultName: G, nextLoc: w }, this.method === "next" && (this.arg = void 0), r;
- } }, C;
- }
- t.exports = g, t.exports.__esModule = !0, t.exports.default = t.exports;
- }(iCg);
- var vN = iCg.exports(), bI = vN;
- try {
- regeneratorRuntime = vN;
- } catch {
- typeof globalThis == "object" ? globalThis.regeneratorRuntime = vN : Function("r", "regeneratorRuntime = r")(vN);
- }
- var M0 = {}, y8 = {}, W0 = typeof global < "u" ? global : typeof self < "u" ? self : typeof window < "u" ? window : {}, Xs = [], xe = [], vrg = typeof Uint8Array < "u" ? Uint8Array : Array, H9 = !1;
- function eCg() {
- H9 = !0;
- for (var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", I = 0, g = t.length; I < g; ++I) Xs[I] = t[I], xe[t.charCodeAt(I)] = I;
- xe[45] = 62, xe[95] = 63;
- }
- function Trg(t, I, g) {
- for (var C, i, e = [], A = I; A < g; A += 3) C = (t[A] << 16) + (t[A + 1] << 8) + t[A + 2], e.push(Xs[(i = C) >> 18 & 63] + Xs[i >> 12 & 63] + Xs[i >> 6 & 63] + Xs[63 & i]);
- return e.join("");
- }
- function Y8(t) {
- var I;
- H9 || eCg();
- for (var g = t.length, C = g % 3, i = "", e = [], A = 16383, s = 0, l = g - C; s < l; s += A) e.push(Trg(t, s, s + A > l ? l : s + A));
- return C === 1 ? (I = t[g - 1], i += Xs[I >> 2], i += Xs[I << 4 & 63], i += "==") : C === 2 && (I = (t[g - 2] << 8) + t[g - 1], i += Xs[I >> 10], i += Xs[I >> 4 & 63], i += Xs[I << 2 & 63], i += "="), e.push(i), e.join("");
- }
- function QY(t, I, g, C, i) {
- var e, A, s = 8 * i - C - 1, l = (1 << s) - 1, n = l >> 1, a = -7, d = g ? i - 1 : 0, o = g ? -1 : 1, c = t[I + d];
- for (d += o, e = c & (1 << -a) - 1, c >>= -a, a += s; a > 0; e = 256 * e + t[I + d], d += o, a -= 8) ;
- for (A = e & (1 << -a) - 1, e >>= -a, a += C; a > 0; A = 256 * A + t[I + d], d += o, a -= 8) ;
- if (e === 0) e = 1 - n;
- else {
- if (e === l) return A ? NaN : 1 / 0 * (c ? -1 : 1);
- A += Math.pow(2, C), e -= n;
- }
- return (c ? -1 : 1) * A * Math.pow(2, e - C);
- }
- function ACg(t, I, g, C, i, e) {
- var A, s, l, n = 8 * e - i - 1, a = (1 << n) - 1, d = a >> 1, o = i === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0, c = C ? 0 : e - 1, r = C ? 1 : -1, h = I < 0 || I === 0 && 1 / I < 0 ? 1 : 0;
- for (I = Math.abs(I), isNaN(I) || I === 1 / 0 ? (s = isNaN(I) ? 1 : 0, A = a) : (A = Math.floor(Math.log(I) / Math.LN2), I * (l = Math.pow(2, -A)) < 1 && (A--, l *= 2), (I += A + d >= 1 ? o / l : o * Math.pow(2, 1 - d)) * l >= 2 && (A++, l /= 2), A + d >= a ? (s = 0, A = a) : A + d >= 1 ? (s = (I * l - 1) * Math.pow(2, i), A += d) : (s = I * Math.pow(2, d - 1) * Math.pow(2, i), A = 0)); i >= 8; t[g + c] = 255 & s, c += r, s /= 256, i -= 8) ;
- for (A = A << i | s, n += i; n > 0; t[g + c] = 255 & A, c += r, A /= 256, n -= 8) ;
- t[g + c - r] |= 128 * h;
- }
- var xrg = {}.toString, sCg = Array.isArray || function(t) {
- return xrg.call(t) == "[object Array]";
- };
- Hg.TYPED_ARRAY_SUPPORT = W0.TYPED_ARRAY_SUPPORT === void 0 || W0.TYPED_ARRAY_SUPPORT;
- var jrg = cV();
- function cV() {
- return Hg.TYPED_ARRAY_SUPPORT ? 2147483647 : 1073741823;
- }
- function Pl(t, I) {
- if (cV() < I) throw new RangeError("Invalid typed array length");
- return Hg.TYPED_ARRAY_SUPPORT ? (t = new Uint8Array(I)).__proto__ = Hg.prototype : (t === null && (t = new Hg(I)), t.length = I), t;
- }
- function Hg(t, I, g) {
- if (!(Hg.TYPED_ARRAY_SUPPORT || this instanceof Hg)) return new Hg(t, I, g);
- if (typeof t == "number") {
- if (typeof I == "string") throw new Error("If encoding is specified then the first argument must be a string");
- return aD(this, t);
- }
- return lCg(this, t, I, g);
- }
- function lCg(t, I, g, C) {
- if (typeof I == "number") throw new TypeError('"value" argument must not be a number');
- return typeof ArrayBuffer < "u" && I instanceof ArrayBuffer ? function(i, e, A, s) {
- if (e.byteLength, A < 0 || e.byteLength < A) throw new RangeError("'offset' is out of bounds");
- if (e.byteLength < A + (s || 0)) throw new RangeError("'length' is out of bounds");
- return e = A === void 0 && s === void 0 ? new Uint8Array(e) : s === void 0 ? new Uint8Array(e, A) : new Uint8Array(e, A, s), Hg.TYPED_ARRAY_SUPPORT ? (i = e).__proto__ = Hg.prototype : i = PH(i, e), i;
- }(t, I, g, C) : typeof I == "string" ? function(i, e, A) {
- if (typeof A == "string" && A !== "" || (A = "utf8"), !Hg.isEncoding(A)) throw new TypeError('"encoding" must be a valid string encoding');
- var s = 0 | aCg(e, A), l = (i = Pl(i, s)).write(e, A);
- return l !== s && (i = i.slice(0, l)), i;
- }(t, I, g) : function(i, e) {
- if (Ss(e)) {
- var A = 0 | X9(e.length);
- return (i = Pl(i, A)).length === 0 || e.copy(i, 0, 0, A), i;
- }
- if (e) {
- if (typeof ArrayBuffer < "u" && e.buffer instanceof ArrayBuffer || "length" in e) return typeof e.length != "number" || (s = e.length) != s ? Pl(i, 0) : PH(i, e);
- if (e.type === "Buffer" && sCg(e.data)) return PH(i, e.data);
- }
- var s;
- throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.");
- }(t, I);
- }
- function nCg(t) {
- if (typeof t != "number") throw new TypeError('"size" argument must be a number');
- if (t < 0) throw new RangeError('"size" argument must not be negative');
- }
- function aD(t, I) {
- if (nCg(I), t = Pl(t, I < 0 ? 0 : 0 | X9(I)), !Hg.TYPED_ARRAY_SUPPORT) for (var g = 0; g < I; ++g) t[g] = 0;
- return t;
- }
- function PH(t, I) {
- var g = I.length < 0 ? 0 : 0 | X9(I.length);
- t = Pl(t, g);
- for (var C = 0; C < g; C += 1) t[C] = 255 & I[C];
- return t;
- }
- function X9(t) {
- if (t >= cV()) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + cV().toString(16) + " bytes");
- return 0 | t;
- }
- function Ss(t) {
- return !(t == null || !t._isBuffer);
- }
- function aCg(t, I) {
- if (Ss(t)) return t.length;
- if (typeof ArrayBuffer < "u" && typeof ArrayBuffer.isView == "function" && (ArrayBuffer.isView(t) || t instanceof ArrayBuffer)) return t.byteLength;
- typeof t != "string" && (t = "" + t);
- var g = t.length;
- if (g === 0) return 0;
- for (var C = !1; ; ) switch (I) {
- case "ascii":
- case "latin1":
- case "binary":
- return g;
- case "utf8":
- case "utf-8":
- case void 0:
- return dV(t).length;
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return 2 * g;
- case "hex":
- return g >>> 1;
- case "base64":
- return rCg(t).length;
- default:
- if (C) return dV(t).length;
- I = ("" + I).toLowerCase(), C = !0;
- }
- }
- function Qrg(t, I, g) {
- var C = !1;
- if ((I === void 0 || I < 0) && (I = 0), I > this.length || ((g === void 0 || g > this.length) && (g = this.length), g <= 0) || (g >>>= 0) <= (I >>>= 0)) return "";
- for (t || (t = "utf8"); ; ) switch (t) {
- case "hex":
- return Ihg(this, I, g);
- case "utf8":
- case "utf-8":
- return cCg(this, I, g);
- case "ascii":
- return $rg(this, I, g);
- case "latin1":
- case "binary":
- return ghg(this, I, g);
- case "base64":
- return qrg(this, I, g);
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return Chg(this, I, g);
- default:
- if (C) throw new TypeError("Unknown encoding: " + t);
- t = (t + "").toLowerCase(), C = !0;
- }
- }
- function Lo(t, I, g) {
- var C = t[I];
- t[I] = t[g], t[g] = C;
- }
- function N8(t, I, g, C, i) {
- if (t.length === 0) return -1;
- if (typeof g == "string" ? (C = g, g = 0) : g > 2147483647 ? g = 2147483647 : g < -2147483648 && (g = -2147483648), g = +g, isNaN(g) && (g = i ? 0 : t.length - 1), g < 0 && (g = t.length + g), g >= t.length) {
- if (i) return -1;
- g = t.length - 1;
- } else if (g < 0) {
- if (!i) return -1;
- g = 0;
- }
- if (typeof I == "string" && (I = Hg.from(I, C)), Ss(I)) return I.length === 0 ? -1 : V8(t, I, g, C, i);
- if (typeof I == "number") return I &= 255, Hg.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf == "function" ? i ? Uint8Array.prototype.indexOf.call(t, I, g) : Uint8Array.prototype.lastIndexOf.call(t, I, g) : V8(t, [I], g, C, i);
- throw new TypeError("val must be string, number or Buffer");
- }
- function V8(t, I, g, C, i) {
- var e, A = 1, s = t.length, l = I.length;
- if (C !== void 0 && ((C = String(C).toLowerCase()) === "ucs2" || C === "ucs-2" || C === "utf16le" || C === "utf-16le")) {
- if (t.length < 2 || I.length < 2) return -1;
- A = 2, s /= 2, l /= 2, g /= 2;
- }
- function n(c, r) {
- return A === 1 ? c[r] : c.readUInt16BE(r * A);
- }
- if (i) {
- var a = -1;
- for (e = g; e < s; e++) if (n(t, e) === n(I, a === -1 ? 0 : e - a)) {
- if (a === -1 && (a = e), e - a + 1 === l) return a * A;
- } else a !== -1 && (e -= e - a), a = -1;
- } else for (g + l > s && (g = s - l), e = g; e >= 0; e--) {
- for (var d = !0, o = 0; o < l; o++) if (n(t, e + o) !== n(I, o)) {
- d = !1;
- break;
- }
- if (d) return e;
- }
- return -1;
- }
- function Org(t, I, g, C) {
- g = Number(g) || 0;
- var i = t.length - g;
- C ? (C = Number(C)) > i && (C = i) : C = i;
- var e = I.length;
- if (e % 2 != 0) throw new TypeError("Invalid hex string");
- C > e / 2 && (C = e / 2);
- for (var A = 0; A < C; ++A) {
- var s = parseInt(I.substr(2 * A, 2), 16);
- if (isNaN(s)) return A;
- t[g + A] = s;
- }
- return A;
- }
- function Urg(t, I, g, C) {
- return eM(dV(I, t.length - g), t, g, C);
- }
- function oCg(t, I, g, C) {
- return eM(function(i) {
- for (var e = [], A = 0; A < i.length; ++A) e.push(255 & i.charCodeAt(A));
- return e;
- }(I), t, g, C);
- }
- function Erg(t, I, g, C) {
- return oCg(t, I, g, C);
- }
- function Prg(t, I, g, C) {
- return eM(rCg(I), t, g, C);
- }
- function _rg(t, I, g, C) {
- return eM(function(i, e) {
- for (var A, s, l, n = [], a = 0; a < i.length && !((e -= 2) < 0); ++a) s = (A = i.charCodeAt(a)) >> 8, l = A % 256, n.push(l), n.push(s);
- return n;
- }(I, t.length - g), t, g, C);
- }
- function qrg(t, I, g) {
- return I === 0 && g === t.length ? Y8(t) : Y8(t.slice(I, g));
- }
- function cCg(t, I, g) {
- g = Math.min(t.length, g);
- for (var C = [], i = I; i < g; ) {
- var e, A, s, l, n = t[i], a = null, d = n > 239 ? 4 : n > 223 ? 3 : n > 191 ? 2 : 1;
- if (i + d <= g) switch (d) {
- case 1:
- n < 128 && (a = n);
- break;
- case 2:
- (192 & (e = t[i + 1])) == 128 && (l = (31 & n) << 6 | 63 & e) > 127 && (a = l);
- break;
- case 3:
- e = t[i + 1], A = t[i + 2], (192 & e) == 128 && (192 & A) == 128 && (l = (15 & n) << 12 | (63 & e) << 6 | 63 & A) > 2047 && (l < 55296 || l > 57343) && (a = l);
- break;
- case 4:
- e = t[i + 1], A = t[i + 2], s = t[i + 3], (192 & e) == 128 && (192 & A) == 128 && (192 & s) == 128 && (l = (15 & n) << 18 | (63 & e) << 12 | (63 & A) << 6 | 63 & s) > 65535 && l < 1114112 && (a = l);
- }
- a === null ? (a = 65533, d = 1) : a > 65535 && (a -= 65536, C.push(a >>> 10 & 1023 | 55296), a = 56320 | 1023 & a), C.push(a), i += d;
- }
- return function(o) {
- var c = o.length;
- if (c <= 4096) return String.fromCharCode.apply(String, o);
- for (var r = "", h = 0; h < c; ) r += String.fromCharCode.apply(String, o.slice(h, h += 4096));
- return r;
- }(C);
- }
- Hg.poolSize = 8192, Hg._augment = function(t) {
- return t.__proto__ = Hg.prototype, t;
- }, Hg.from = function(t, I, g) {
- return lCg(null, t, I, g);
- }, Hg.TYPED_ARRAY_SUPPORT && (Hg.prototype.__proto__ = Uint8Array.prototype, Hg.__proto__ = Uint8Array, typeof Symbol < "u" && Symbol.species && Hg[Symbol.species]), Hg.alloc = function(t, I, g) {
- return function(C, i, e, A) {
- return nCg(i), i <= 0 ? Pl(C, i) : e !== void 0 ? typeof A == "string" ? Pl(C, i).fill(e, A) : Pl(C, i).fill(e) : Pl(C, i);
- }(null, t, I, g);
- }, Hg.allocUnsafe = function(t) {
- return aD(null, t);
- }, Hg.allocUnsafeSlow = function(t) {
- return aD(null, t);
- }, Hg.isBuffer = dG, Hg.compare = function(t, I) {
- if (!Ss(t) || !Ss(I)) throw new TypeError("Arguments must be Buffers");
- if (t === I) return 0;
- for (var g = t.length, C = I.length, i = 0, e = Math.min(g, C); i < e; ++i) if (t[i] !== I[i]) {
- g = t[i], C = I[i];
- break;
- }
- return g < C ? -1 : C < g ? 1 : 0;
- }, Hg.isEncoding = function(t) {
- switch (String(t).toLowerCase()) {
- case "hex":
- case "utf8":
- case "utf-8":
- case "ascii":
- case "latin1":
- case "binary":
- case "base64":
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return !0;
- default:
- return !1;
- }
- }, Hg.concat = function(t, I) {
- if (!sCg(t)) throw new TypeError('"list" argument must be an Array of Buffers');
- if (t.length === 0) return Hg.alloc(0);
- var g;
- if (I === void 0) for (I = 0, g = 0; g < t.length; ++g) I += t[g].length;
- var C = Hg.allocUnsafe(I), i = 0;
- for (g = 0; g < t.length; ++g) {
- var e = t[g];
- if (!Ss(e)) throw new TypeError('"list" argument must be an Array of Buffers');
- e.copy(C, i), i += e.length;
- }
- return C;
- }, Hg.byteLength = aCg, Hg.prototype._isBuffer = !0, Hg.prototype.swap16 = function() {
- var t = this.length;
- if (t % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
- for (var I = 0; I < t; I += 2) Lo(this, I, I + 1);
- return this;
- }, Hg.prototype.swap32 = function() {
- var t = this.length;
- if (t % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
- for (var I = 0; I < t; I += 4) Lo(this, I, I + 3), Lo(this, I + 1, I + 2);
- return this;
- }, Hg.prototype.swap64 = function() {
- var t = this.length;
- if (t % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
- for (var I = 0; I < t; I += 8) Lo(this, I, I + 7), Lo(this, I + 1, I + 6), Lo(this, I + 2, I + 5), Lo(this, I + 3, I + 4);
- return this;
- }, Hg.prototype.toString = function() {
- var t = 0 | this.length;
- return t === 0 ? "" : arguments.length === 0 ? cCg(this, 0, t) : Qrg.apply(this, arguments);
- }, Hg.prototype.equals = function(t) {
- if (!Ss(t)) throw new TypeError("Argument must be a Buffer");
- return this === t || Hg.compare(this, t) === 0;
- }, Hg.prototype.inspect = function() {
- var t = "";
- return this.length > 0 && (t = this.toString("hex", 0, 50).match(/.{2}/g).join(" "), this.length > 50 && (t += " ... ")), "<Buffer " + t + ">";
- }, Hg.prototype.compare = function(t, I, g, C, i) {
- if (!Ss(t)) throw new TypeError("Argument must be a Buffer");
- if (I === void 0 && (I = 0), g === void 0 && (g = t ? t.length : 0), C === void 0 && (C = 0), i === void 0 && (i = this.length), I < 0 || g > t.length || C < 0 || i > this.length) throw new RangeError("out of range index");
- if (C >= i && I >= g) return 0;
- if (C >= i) return -1;
- if (I >= g) return 1;
- if (this === t) return 0;
- for (var e = (i >>>= 0) - (C >>>= 0), A = (g >>>= 0) - (I >>>= 0), s = Math.min(e, A), l = this.slice(C, i), n = t.slice(I, g), a = 0; a < s; ++a) if (l[a] !== n[a]) {
- e = l[a], A = n[a];
- break;
- }
- return e < A ? -1 : A < e ? 1 : 0;
- }, Hg.prototype.includes = function(t, I, g) {
- return this.indexOf(t, I, g) !== -1;
- }, Hg.prototype.indexOf = function(t, I, g) {
- return N8(this, t, I, g, !0);
- }, Hg.prototype.lastIndexOf = function(t, I, g) {
- return N8(this, t, I, g, !1);
- }, Hg.prototype.write = function(t, I, g, C) {
- if (I === void 0) C = "utf8", g = this.length, I = 0;
- else if (g === void 0 && typeof I == "string") C = I, g = this.length, I = 0;
- else {
- if (!isFinite(I)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
- I |= 0, isFinite(g) ? (g |= 0, C === void 0 && (C = "utf8")) : (C = g, g = void 0);
- }
- var i = this.length - I;
- if ((g === void 0 || g > i) && (g = i), t.length > 0 && (g < 0 || I < 0) || I > this.length) throw new RangeError("Attempt to write outside buffer bounds");
- C || (C = "utf8");
- for (var e = !1; ; ) switch (C) {
- case "hex":
- return Org(this, t, I, g);
- case "utf8":
- case "utf-8":
- return Urg(this, t, I, g);
- case "ascii":
- return oCg(this, t, I, g);
- case "latin1":
- case "binary":
- return Erg(this, t, I, g);
- case "base64":
- return Prg(this, t, I, g);
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return _rg(this, t, I, g);
- default:
- if (e) throw new TypeError("Unknown encoding: " + C);
- C = ("" + C).toLowerCase(), e = !0;
- }
- }, Hg.prototype.toJSON = function() {
- return { type: "Buffer", data: Array.prototype.slice.call(this._arr || this, 0) };
- };
- function $rg(t, I, g) {
- var C = "";
- g = Math.min(t.length, g);
- for (var i = I; i < g; ++i) C += String.fromCharCode(127 & t[i]);
- return C;
- }
- function ghg(t, I, g) {
- var C = "";
- g = Math.min(t.length, g);
- for (var i = I; i < g; ++i) C += String.fromCharCode(t[i]);
- return C;
- }
- function Ihg(t, I, g) {
- var C = t.length;
- (!I || I < 0) && (I = 0), (!g || g < 0 || g > C) && (g = C);
- for (var i = "", e = I; e < g; ++e) i += ihg(t[e]);
- return i;
- }
- function Chg(t, I, g) {
- for (var C = t.slice(I, g), i = "", e = 0; e < C.length; e += 2) i += String.fromCharCode(C[e] + 256 * C[e + 1]);
- return i;
- }
- function Xt(t, I, g) {
- if (t % 1 != 0 || t < 0) throw new RangeError("offset is not uint");
- if (t + I > g) throw new RangeError("Trying to access beyond buffer length");
- }
- function Ji(t, I, g, C, i, e) {
- if (!Ss(t)) throw new TypeError('"buffer" argument must be a Buffer instance');
- if (I > i || I < e) throw new RangeError('"value" argument is out of bounds');
- if (g + C > t.length) throw new RangeError("Index out of range");
- }
- function OY(t, I, g, C) {
- I < 0 && (I = 65535 + I + 1);
- for (var i = 0, e = Math.min(t.length - g, 2); i < e; ++i) t[g + i] = (I & 255 << 8 * (C ? i : 1 - i)) >>> 8 * (C ? i : 1 - i);
- }
- function UY(t, I, g, C) {
- I < 0 && (I = 4294967295 + I + 1);
- for (var i = 0, e = Math.min(t.length - g, 4); i < e; ++i) t[g + i] = I >>> 8 * (C ? i : 3 - i) & 255;
- }
- function dCg(t, I, g, C, i, e) {
- if (g + C > t.length) throw new RangeError("Index out of range");
- if (g < 0) throw new RangeError("Index out of range");
- }
- function M8(t, I, g, C, i) {
- return i || dCg(t, 0, g, 4), ACg(t, I, g, C, 23, 4), g + 4;
- }
- function R8(t, I, g, C, i) {
- return i || dCg(t, 0, g, 8), ACg(t, I, g, C, 52, 8), g + 8;
- }
- Hg.prototype.slice = function(t, I) {
- var g, C = this.length;
- if ((t = ~~t) < 0 ? (t += C) < 0 && (t = 0) : t > C && (t = C), (I = I === void 0 ? C : ~~I) < 0 ? (I += C) < 0 && (I = 0) : I > C && (I = C), I < t && (I = t), Hg.TYPED_ARRAY_SUPPORT) (g = this.subarray(t, I)).__proto__ = Hg.prototype;
- else {
- var i = I - t;
- g = new Hg(i, void 0);
- for (var e = 0; e < i; ++e) g[e] = this[e + t];
- }
- return g;
- }, Hg.prototype.readUIntLE = function(t, I, g) {
- t |= 0, I |= 0, g || Xt(t, I, this.length);
- for (var C = this[t], i = 1, e = 0; ++e < I && (i *= 256); ) C += this[t + e] * i;
- return C;
- }, Hg.prototype.readUIntBE = function(t, I, g) {
- t |= 0, I |= 0, g || Xt(t, I, this.length);
- for (var C = this[t + --I], i = 1; I > 0 && (i *= 256); ) C += this[t + --I] * i;
- return C;
- }, Hg.prototype.readUInt8 = function(t, I) {
- return I || Xt(t, 1, this.length), this[t];
- }, Hg.prototype.readUInt16LE = function(t, I) {
- return I || Xt(t, 2, this.length), this[t] | this[t + 1] << 8;
- }, Hg.prototype.readUInt16BE = function(t, I) {
- return I || Xt(t, 2, this.length), this[t] << 8 | this[t + 1];
- }, Hg.prototype.readUInt32LE = function(t, I) {
- return I || Xt(t, 4, this.length), (this[t] | this[t + 1] << 8 | this[t + 2] << 16) + 16777216 * this[t + 3];
- }, Hg.prototype.readUInt32BE = function(t, I) {
- return I || Xt(t, 4, this.length), 16777216 * this[t] + (this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3]);
- }, Hg.prototype.readIntLE = function(t, I, g) {
- t |= 0, I |= 0, g || Xt(t, I, this.length);
- for (var C = this[t], i = 1, e = 0; ++e < I && (i *= 256); ) C += this[t + e] * i;
- return C >= (i *= 128) && (C -= Math.pow(2, 8 * I)), C;
- }, Hg.prototype.readIntBE = function(t, I, g) {
- t |= 0, I |= 0, g || Xt(t, I, this.length);
- for (var C = I, i = 1, e = this[t + --C]; C > 0 && (i *= 256); ) e += this[t + --C] * i;
- return e >= (i *= 128) && (e -= Math.pow(2, 8 * I)), e;
- }, Hg.prototype.readInt8 = function(t, I) {
- return I || Xt(t, 1, this.length), 128 & this[t] ? -1 * (255 - this[t] + 1) : this[t];
- }, Hg.prototype.readInt16LE = function(t, I) {
- I || Xt(t, 2, this.length);
- var g = this[t] | this[t + 1] << 8;
- return 32768 & g ? 4294901760 | g : g;
- }, Hg.prototype.readInt16BE = function(t, I) {
- I || Xt(t, 2, this.length);
- var g = this[t + 1] | this[t] << 8;
- return 32768 & g ? 4294901760 | g : g;
- }, Hg.prototype.readInt32LE = function(t, I) {
- return I || Xt(t, 4, this.length), this[t] | this[t + 1] << 8 | this[t + 2] << 16 | this[t + 3] << 24;
- }, Hg.prototype.readInt32BE = function(t, I) {
- return I || Xt(t, 4, this.length), this[t] << 24 | this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3];
- }, Hg.prototype.readFloatLE = function(t, I) {
- return I || Xt(t, 4, this.length), QY(this, t, !0, 23, 4);
- }, Hg.prototype.readFloatBE = function(t, I) {
- return I || Xt(t, 4, this.length), QY(this, t, !1, 23, 4);
- }, Hg.prototype.readDoubleLE = function(t, I) {
- return I || Xt(t, 8, this.length), QY(this, t, !0, 52, 8);
- }, Hg.prototype.readDoubleBE = function(t, I) {
- return I || Xt(t, 8, this.length), QY(this, t, !1, 52, 8);
- }, Hg.prototype.writeUIntLE = function(t, I, g, C) {
- t = +t, I |= 0, g |= 0, C || Ji(this, t, I, g, Math.pow(2, 8 * g) - 1, 0);
- var i = 1, e = 0;
- for (this[I] = 255 & t; ++e < g && (i *= 256); ) this[I + e] = t / i & 255;
- return I + g;
- }, Hg.prototype.writeUIntBE = function(t, I, g, C) {
- t = +t, I |= 0, g |= 0, C || Ji(this, t, I, g, Math.pow(2, 8 * g) - 1, 0);
- var i = g - 1, e = 1;
- for (this[I + i] = 255 & t; --i >= 0 && (e *= 256); ) this[I + i] = t / e & 255;
- return I + g;
- }, Hg.prototype.writeUInt8 = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 1, 255, 0), Hg.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), this[I] = 255 & t, I + 1;
- }, Hg.prototype.writeUInt16LE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 2, 65535, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8) : OY(this, t, I, !0), I + 2;
- }, Hg.prototype.writeUInt16BE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 2, 65535, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 8, this[I + 1] = 255 & t) : OY(this, t, I, !1), I + 2;
- }, Hg.prototype.writeUInt32LE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 4, 4294967295, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I + 3] = t >>> 24, this[I + 2] = t >>> 16, this[I + 1] = t >>> 8, this[I] = 255 & t) : UY(this, t, I, !0), I + 4;
- }, Hg.prototype.writeUInt32BE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 4, 4294967295, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 24, this[I + 1] = t >>> 16, this[I + 2] = t >>> 8, this[I + 3] = 255 & t) : UY(this, t, I, !1), I + 4;
- }, Hg.prototype.writeIntLE = function(t, I, g, C) {
- if (t = +t, I |= 0, !C) {
- var i = Math.pow(2, 8 * g - 1);
- Ji(this, t, I, g, i - 1, -i);
- }
- var e = 0, A = 1, s = 0;
- for (this[I] = 255 & t; ++e < g && (A *= 256); ) t < 0 && s === 0 && this[I + e - 1] !== 0 && (s = 1), this[I + e] = (t / A >> 0) - s & 255;
- return I + g;
- }, Hg.prototype.writeIntBE = function(t, I, g, C) {
- if (t = +t, I |= 0, !C) {
- var i = Math.pow(2, 8 * g - 1);
- Ji(this, t, I, g, i - 1, -i);
- }
- var e = g - 1, A = 1, s = 0;
- for (this[I + e] = 255 & t; --e >= 0 && (A *= 256); ) t < 0 && s === 0 && this[I + e + 1] !== 0 && (s = 1), this[I + e] = (t / A >> 0) - s & 255;
- return I + g;
- }, Hg.prototype.writeInt8 = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 1, 127, -128), Hg.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), t < 0 && (t = 255 + t + 1), this[I] = 255 & t, I + 1;
- }, Hg.prototype.writeInt16LE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 2, 32767, -32768), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8) : OY(this, t, I, !0), I + 2;
- }, Hg.prototype.writeInt16BE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 2, 32767, -32768), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 8, this[I + 1] = 255 & t) : OY(this, t, I, !1), I + 2;
- }, Hg.prototype.writeInt32LE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 4, 2147483647, -2147483648), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8, this[I + 2] = t >>> 16, this[I + 3] = t >>> 24) : UY(this, t, I, !0), I + 4;
- }, Hg.prototype.writeInt32BE = function(t, I, g) {
- return t = +t, I |= 0, g || Ji(this, t, I, 4, 2147483647, -2147483648), t < 0 && (t = 4294967295 + t + 1), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 24, this[I + 1] = t >>> 16, this[I + 2] = t >>> 8, this[I + 3] = 255 & t) : UY(this, t, I, !1), I + 4;
- }, Hg.prototype.writeFloatLE = function(t, I, g) {
- return M8(this, t, I, !0, g);
- }, Hg.prototype.writeFloatBE = function(t, I, g) {
- return M8(this, t, I, !1, g);
- }, Hg.prototype.writeDoubleLE = function(t, I, g) {
- return R8(this, t, I, !0, g);
- }, Hg.prototype.writeDoubleBE = function(t, I, g) {
- return R8(this, t, I, !1, g);
- }, Hg.prototype.copy = function(t, I, g, C) {
- if (g || (g = 0), C || C === 0 || (C = this.length), I >= t.length && (I = t.length), I || (I = 0), C > 0 && C < g && (C = g), C === g || t.length === 0 || this.length === 0) return 0;
- if (I < 0) throw new RangeError("targetStart out of bounds");
- if (g < 0 || g >= this.length) throw new RangeError("sourceStart out of bounds");
- if (C < 0) throw new RangeError("sourceEnd out of bounds");
- C > this.length && (C = this.length), t.length - I < C - g && (C = t.length - I + g);
- var i, e = C - g;
- if (this === t && g < I && I < C) for (i = e - 1; i >= 0; --i) t[i + I] = this[i + g];
- else if (e < 1e3 || !Hg.TYPED_ARRAY_SUPPORT) for (i = 0; i < e; ++i) t[i + I] = this[i + g];
- else Uint8Array.prototype.set.call(t, this.subarray(g, g + e), I);
- return e;
- }, Hg.prototype.fill = function(t, I, g, C) {
- if (typeof t == "string") {
- if (typeof I == "string" ? (C = I, I = 0, g = this.length) : typeof g == "string" && (C = g, g = this.length), t.length === 1) {
- var i = t.charCodeAt(0);
- i < 256 && (t = i);
- }
- if (C !== void 0 && typeof C != "string") throw new TypeError("encoding must be a string");
- if (typeof C == "string" && !Hg.isEncoding(C)) throw new TypeError("Unknown encoding: " + C);
- } else typeof t == "number" && (t &= 255);
- if (I < 0 || this.length < I || this.length < g) throw new RangeError("Out of range index");
- if (g <= I) return this;
- var e;
- if (I >>>= 0, g = g === void 0 ? this.length : g >>> 0, t || (t = 0), typeof t == "number") for (e = I; e < g; ++e) this[e] = t;
- else {
- var A = Ss(t) ? t : dV(new Hg(t, C).toString()), s = A.length;
- for (e = 0; e < g - I; ++e) this[e + I] = A[e % s];
- }
- return this;
- };
- var thg = /[^+\/0-9A-Za-z-_]/g;
- function ihg(t) {
- return t < 16 ? "0" + t.toString(16) : t.toString(16);
- }
- function dV(t, I) {
- var g;
- I = I || 1 / 0;
- for (var C = t.length, i = null, e = [], A = 0; A < C; ++A) {
- if ((g = t.charCodeAt(A)) > 55295 && g < 57344) {
- if (!i) {
- if (g > 56319) {
- (I -= 3) > -1 && e.push(239, 191, 189);
- continue;
- }
- if (A + 1 === C) {
- (I -= 3) > -1 && e.push(239, 191, 189);
- continue;
- }
- i = g;
- continue;
- }
- if (g < 56320) {
- (I -= 3) > -1 && e.push(239, 191, 189), i = g;
- continue;
- }
- g = 65536 + (i - 55296 << 10 | g - 56320);
- } else i && (I -= 3) > -1 && e.push(239, 191, 189);
- if (i = null, g < 128) {
- if ((I -= 1) < 0) break;
- e.push(g);
- } else if (g < 2048) {
- if ((I -= 2) < 0) break;
- e.push(g >> 6 | 192, 63 & g | 128);
- } else if (g < 65536) {
- if ((I -= 3) < 0) break;
- e.push(g >> 12 | 224, g >> 6 & 63 | 128, 63 & g | 128);
- } else {
- if (!(g < 1114112)) throw new Error("Invalid code point");
- if ((I -= 4) < 0) break;
- e.push(g >> 18 | 240, g >> 12 & 63 | 128, g >> 6 & 63 | 128, 63 & g | 128);
- }
- }
- return e;
- }
- function rCg(t) {
- return function(I) {
- var g, C, i, e, A, s;
- H9 || eCg();
- var l = I.length;
- if (l % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
- A = I[l - 2] === "=" ? 2 : I[l - 1] === "=" ? 1 : 0, s = new vrg(3 * l / 4 - A), i = A > 0 ? l - 4 : l;
- var n = 0;
- for (g = 0, C = 0; g < i; g += 4, C += 3) e = xe[I.charCodeAt(g)] << 18 | xe[I.charCodeAt(g + 1)] << 12 | xe[I.charCodeAt(g + 2)] << 6 | xe[I.charCodeAt(g + 3)], s[n++] = e >> 16 & 255, s[n++] = e >> 8 & 255, s[n++] = 255 & e;
- return A === 2 ? (e = xe[I.charCodeAt(g)] << 2 | xe[I.charCodeAt(g + 1)] >> 4, s[n++] = 255 & e) : A === 1 && (e = xe[I.charCodeAt(g)] << 10 | xe[I.charCodeAt(g + 1)] << 4 | xe[I.charCodeAt(g + 2)] >> 2, s[n++] = e >> 8 & 255, s[n++] = 255 & e), s;
- }(function(I) {
- if ((I = function(g) {
- return g.trim ? g.trim() : g.replace(/^\s+|\s+$/g, "");
- }(I).replace(thg, "")).length < 2) return "";
- for (; I.length % 4 != 0; ) I += "=";
- return I;
- }(t));
- }
- function eM(t, I, g, C) {
- for (var i = 0; i < C && !(i + g >= I.length || i >= t.length); ++i) I[i + g] = t[i];
- return i;
- }
- function dG(t) {
- return t != null && (!!t._isBuffer || f8(t) || function(I) {
- return typeof I.readFloatLE == "function" && typeof I.slice == "function" && f8(I.slice(0, 0));
- }(t));
- }
- function f8(t) {
- return !!t.constructor && typeof t.constructor.isBuffer == "function" && t.constructor.isBuffer(t);
- }
- var ehg = Object.freeze({ __proto__: null, INSPECT_MAX_BYTES: 50, kMaxLength: jrg, Buffer: Hg, SlowBuffer: function(t) {
- return +t != t && (t = 0), Hg.alloc(+t);
- }, isBuffer: dG }), rt = {};
- function hCg() {
- throw new Error("setTimeout has not been defined");
- }
- function bCg() {
- throw new Error("clearTimeout has not been defined");
- }
- var ga = hCg, Ia = bCg;
- function uCg(t) {
- if (ga === setTimeout) return setTimeout(t, 0);
- if ((ga === hCg || !ga) && setTimeout) return ga = setTimeout, setTimeout(t, 0);
- try {
- return ga(t, 0);
- } catch {
- try {
- return ga.call(null, t, 0);
- } catch {
- return ga.call(this, t, 0);
- }
- }
- }
- typeof W0.setTimeout == "function" && (ga = setTimeout), typeof W0.clearTimeout == "function" && (Ia = clearTimeout);
- var $o, _l = [], rh = !1, TN = -1;
- function Ahg() {
- rh && $o && (rh = !1, $o.length ? _l = $o.concat(_l) : TN = -1, _l.length && mCg());
- }
- function mCg() {
- if (!rh) {
- var t = uCg(Ahg);
- rh = !0;
- for (var I = _l.length; I; ) {
- for ($o = _l, _l = []; ++TN < I; ) $o && $o[TN].run();
- TN = -1, I = _l.length;
- }
- $o = null, rh = !1, function(g) {
- if (Ia === clearTimeout) return clearTimeout(g);
- if ((Ia === bCg || !Ia) && clearTimeout) return Ia = clearTimeout, clearTimeout(g);
- try {
- Ia(g);
- } catch {
- try {
- return Ia.call(null, g);
- } catch {
- return Ia.call(this, g);
- }
- }
- }(t);
- }
- }
- function vt(t) {
- var I = new Array(arguments.length - 1);
- if (arguments.length > 1) for (var g = 1; g < arguments.length; g++) I[g - 1] = arguments[g];
- _l.push(new ZCg(t, I)), _l.length !== 1 || rh || uCg(mCg);
- }
- function ZCg(t, I) {
- this.fun = t, this.array = I;
- }
- ZCg.prototype.run = function() {
- this.fun.apply(null, this.array);
- };
- var Fu = W0.performance || {};
- Fu.now || Fu.mozNow || Fu.msNow || Fu.oNow || Fu.webkitNow;
- var ld = { env: {} }, _H = { exports: {} };
- function Ca() {
- }
- function qI() {
- qI.init.call(this);
- }
- function GCg(t) {
- return t._maxListeners === void 0 ? qI.defaultMaxListeners : t._maxListeners;
- }
- function shg(t, I, g) {
- if (I) t.call(g);
- else for (var C = t.length, i = rG(t, C), e = 0; e < C; ++e) i[e].call(g);
- }
- function lhg(t, I, g, C) {
- if (I) t.call(g, C);
- else for (var i = t.length, e = rG(t, i), A = 0; A < i; ++A) e[A].call(g, C);
- }
- function nhg(t, I, g, C, i) {
- if (I) t.call(g, C, i);
- else for (var e = t.length, A = rG(t, e), s = 0; s < e; ++s) A[s].call(g, C, i);
- }
- function ahg(t, I, g, C, i, e) {
- if (I) t.call(g, C, i, e);
- else for (var A = t.length, s = rG(t, A), l = 0; l < A; ++l) s[l].call(g, C, i, e);
- }
- function ohg(t, I, g, C) {
- if (I) t.apply(g, C);
- else for (var i = t.length, e = rG(t, i), A = 0; A < i; ++A) e[A].apply(g, C);
- }
- function H8(t, I, g, C) {
- var i, e, A, s;
- if (typeof g != "function") throw new TypeError('"listener" argument must be a function');
- if ((e = t._events) ? (e.newListener && (t.emit("newListener", I, g.listener ? g.listener : g), e = t._events), A = e[I]) : (e = t._events = new Ca(), t._eventsCount = 0), A) {
- if (typeof A == "function" ? A = e[I] = C ? [g, A] : [A, g] : C ? A.unshift(g) : A.push(g), !A.warned && (i = GCg(t)) && i > 0 && A.length > i) {
- A.warned = !0;
- var l = new Error("Possible EventEmitter memory leak detected. " + A.length + " " + I + " listeners added. Use emitter.setMaxListeners() to increase limit");
- l.name = "MaxListenersExceededWarning", l.emitter = t, l.type = I, l.count = A.length, s = l, typeof console.warn == "function" ? console.warn(s) : console.log(s);
- }
- } else A = e[I] = g, ++t._eventsCount;
- return t;
- }
- function X8(t, I, g) {
- var C = !1;
- function i() {
- t.removeListener(I, i), C || (C = !0, g.apply(t, arguments));
- }
- return i.listener = g, i;
- }
- function S8(t) {
- var I = this._events;
- if (I) {
- var g = I[t];
- if (typeof g == "function") return 1;
- if (g) return g.length;
- }
- return 0;
- }
- function rG(t, I) {
- for (var g = new Array(I); I--; ) g[I] = t[I];
- return g;
- }
- Ca.prototype = /* @__PURE__ */ Object.create(null), qI.EventEmitter = qI, qI.usingDomains = !1, qI.prototype.domain = void 0, qI.prototype._events = void 0, qI.prototype._maxListeners = void 0, qI.defaultMaxListeners = 10, qI.init = function() {
- this.domain = null, qI.usingDomains && (void 0).active, this._events && this._events !== Object.getPrototypeOf(this)._events || (this._events = new Ca(), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;
- }, qI.prototype.setMaxListeners = function(t) {
- if (typeof t != "number" || t < 0 || isNaN(t)) throw new TypeError('"n" argument must be a positive number');
- return this._maxListeners = t, this;
- }, qI.prototype.getMaxListeners = function() {
- return GCg(this);
- }, qI.prototype.emit = function(t) {
- var I, g, C, i, e, A, s, l = t === "error";
- if (A = this._events) l = l && A.error == null;
- else if (!l) return !1;
- if (s = this.domain, l) {
- if (I = arguments[1], !s) {
- if (I instanceof Error) throw I;
- var n = new Error('Uncaught, unspecified "error" event. (' + I + ")");
- throw n.context = I, n;
- }
- return I || (I = new Error('Uncaught, unspecified "error" event')), I.domainEmitter = this, I.domain = s, I.domainThrown = !1, s.emit("error", I), !1;
- }
- if (!(g = A[t])) return !1;
- var a = typeof g == "function";
- switch (C = arguments.length) {
- case 1:
- shg(g, a, this);
- break;
- case 2:
- lhg(g, a, this, arguments[1]);
- break;
- case 3:
- nhg(g, a, this, arguments[1], arguments[2]);
- break;
- case 4:
- ahg(g, a, this, arguments[1], arguments[2], arguments[3]);
- break;
- default:
- for (i = new Array(C - 1), e = 1; e < C; e++) i[e - 1] = arguments[e];
- ohg(g, a, this, i);
- }
- return !0;
- }, qI.prototype.addListener = function(t, I) {
- return H8(this, t, I, !1);
- }, qI.prototype.on = qI.prototype.addListener, qI.prototype.prependListener = function(t, I) {
- return H8(this, t, I, !0);
- }, qI.prototype.once = function(t, I) {
- if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
- return this.on(t, X8(this, t, I)), this;
- }, qI.prototype.prependOnceListener = function(t, I) {
- if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
- return this.prependListener(t, X8(this, t, I)), this;
- }, qI.prototype.removeListener = function(t, I) {
- var g, C, i, e, A;
- if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
- if (!(C = this._events)) return this;
- if (!(g = C[t])) return this;
- if (g === I || g.listener && g.listener === I) --this._eventsCount == 0 ? this._events = new Ca() : (delete C[t], C.removeListener && this.emit("removeListener", t, g.listener || I));
- else if (typeof g != "function") {
- for (i = -1, e = g.length; e-- > 0; ) if (g[e] === I || g[e].listener && g[e].listener === I) {
- A = g[e].listener, i = e;
- break;
- }
- if (i < 0) return this;
- if (g.length === 1) {
- if (g[0] = void 0, --this._eventsCount == 0) return this._events = new Ca(), this;
- delete C[t];
- } else (function(s, l) {
- for (var n = l, a = n + 1, d = s.length; a < d; n += 1, a += 1) s[n] = s[a];
- s.pop();
- })(g, i);
- C.removeListener && this.emit("removeListener", t, A || I);
- }
- return this;
- }, qI.prototype.removeAllListeners = function(t) {
- var I, g;
- if (!(g = this._events)) return this;
- if (!g.removeListener) return arguments.length === 0 ? (this._events = new Ca(), this._eventsCount = 0) : g[t] && (--this._eventsCount == 0 ? this._events = new Ca() : delete g[t]), this;
- if (arguments.length === 0) {
- for (var C, i = Object.keys(g), e = 0; e < i.length; ++e) (C = i[e]) !== "removeListener" && this.removeAllListeners(C);
- return this.removeAllListeners("removeListener"), this._events = new Ca(), this._eventsCount = 0, this;
- }
- if (typeof (I = g[t]) == "function") this.removeListener(t, I);
- else if (I) do
- this.removeListener(t, I[I.length - 1]);
- while (I[0]);
- return this;
- }, qI.prototype.listeners = function(t) {
- var I, g, C = this._events;
- return g = C && (I = C[t]) ? typeof I == "function" ? [I.listener || I] : function(i) {
- for (var e = new Array(i.length), A = 0; A < e.length; ++A) e[A] = i[A].listener || i[A];
- return e;
- }(I) : [], g;
- }, qI.listenerCount = function(t, I) {
- return typeof t.listenerCount == "function" ? t.listenerCount(I) : S8.call(t, I);
- }, qI.prototype.listenerCount = S8, qI.prototype.eventNames = function() {
- return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
- };
- var chg = Object.freeze({ __proto__: null, default: qI, EventEmitter: qI }), Oa = typeof Object.create == "function" ? function(t, I) {
- t.super_ = I, t.prototype = Object.create(I.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } });
- } : function(t, I) {
- t.super_ = I;
- var g = function() {
- };
- g.prototype = I.prototype, t.prototype = new g(), t.prototype.constructor = t;
- }, dhg = /%[sdj%]/g;
- function AM(t) {
- if (!fm(t)) {
- for (var I = [], g = 0; g < arguments.length; g++) I.push(ks(arguments[g]));
- return I.join(" ");
- }
- g = 1;
- for (var C = arguments, i = C.length, e = String(t).replace(dhg, function(s) {
- if (s === "%%") return "%";
- if (g >= i) return s;
- switch (s) {
- case "%s":
- return String(C[g++]);
- case "%d":
- return Number(C[g++]);
- case "%j":
- try {
- return JSON.stringify(C[g++]);
- } catch {
- return "[Circular]";
- }
- default:
- return s;
- }
- }), A = C[g]; g < i; A = C[++g]) hG(A) || !Zd(A) ? e += " " + A : e += " " + ks(A);
- return e;
- }
- function sM(t, I) {
- if (Ks(W0.process)) return function() {
- return sM(t, I).apply(this, arguments);
- };
- if (ld.noDeprecation === !0) return t;
- var g = !1;
- return function() {
- if (!g) {
- if (ld.throwDeprecation) throw new Error(I);
- ld.traceDeprecation ? console.trace(I) : console.error(I), g = !0;
- }
- return t.apply(this, arguments);
- };
- }
- var qH, EY = {};
- function S9(t) {
- return Ks(qH) && (qH = ld.env.NODE_DEBUG || ""), t = t.toUpperCase(), !EY[t] && (new RegExp("\\b" + t + "\\b", "i").test(qH) ? EY[t] = function() {
- var I = AM.apply(null, arguments);
- console.error("%s %d: %s", t, 0, I);
- } : EY[t] = function() {
- }), EY[t];
- }
- function ks(t, I) {
- var g = { seen: [], stylize: hhg };
- return arguments.length >= 3 && (g.depth = arguments[2]), arguments.length >= 4 && (g.colors = arguments[3]), lM(I) ? g.showHidden = I : I && k9(g, I), Ks(g.showHidden) && (g.showHidden = !1), Ks(g.depth) && (g.depth = 2), Ks(g.colors) && (g.colors = !1), Ks(g.customInspect) && (g.customInspect = !0), g.colors && (g.stylize = rhg), rV(g, t, g.depth);
- }
- function rhg(t, I) {
- var g = ks.styles[I];
- return g ? "\x1B[" + ks.colors[g][0] + "m" + t + "\x1B[" + ks.colors[g][1] + "m" : t;
- }
- function hhg(t, I) {
- return t;
- }
- function rV(t, I, g) {
- if (t.customInspect && I && Bm(I.inspect) && I.inspect !== ks && (!I.constructor || I.constructor.prototype !== I)) {
- var C = I.inspect(g, t);
- return fm(C) || (C = rV(t, C, g)), C;
- }
- var i = function(o, c) {
- if (Ks(c)) return o.stylize("undefined", "undefined");
- if (fm(c)) {
- var r = "'" + JSON.stringify(c).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'";
- return o.stylize(r, "string");
- }
- if (K9(c)) return o.stylize("" + c, "number");
- if (lM(c)) return o.stylize("" + c, "boolean");
- if (hG(c)) return o.stylize("null", "null");
- }(t, I);
- if (i) return i;
- var e = Object.keys(I), A = function(o) {
- var c = {};
- return o.forEach(function(r, h) {
- c[r] = !0;
- }), c;
- }(e);
- if (t.showHidden && (e = Object.getOwnPropertyNames(I)), pm(I) && (e.indexOf("message") >= 0 || e.indexOf("description") >= 0)) return $H(I);
- if (e.length === 0) {
- if (Bm(I)) {
- var s = I.name ? ": " + I.name : "";
- return t.stylize("[Function" + s + "]", "special");
- }
- if (wm(I)) return t.stylize(RegExp.prototype.toString.call(I), "regexp");
- if (hV(I)) return t.stylize(Date.prototype.toString.call(I), "date");
- if (pm(I)) return $H(I);
- }
- var l, n = "", a = !1, d = ["{", "}"];
- return D9(I) && (a = !0, d = ["[", "]"]), Bm(I) && (n = " [Function" + (I.name ? ": " + I.name : "") + "]"), wm(I) && (n = " " + RegExp.prototype.toString.call(I)), hV(I) && (n = " " + Date.prototype.toUTCString.call(I)), pm(I) && (n = " " + $H(I)), e.length !== 0 || a && I.length != 0 ? g < 0 ? wm(I) ? t.stylize(RegExp.prototype.toString.call(I), "regexp") : t.stylize("[Object]", "special") : (t.seen.push(I), l = a ? function(o, c, r, h, b) {
- for (var u = [], m = 0, Z = c.length; m < Z; ++m) YCg(c, String(m)) ? u.push(gX(o, c, r, h, String(m), !0)) : u.push("");
- return b.forEach(function(p) {
- p.match(/^\d+$/) || u.push(gX(o, c, r, h, p, !0));
- }), u;
- }(t, I, g, A, e) : e.map(function(o) {
- return gX(t, I, g, A, o, a);
- }), t.seen.pop(), function(o, c, r) {
- return o.reduce(function(h, b) {
- return b.indexOf(`
- `), h + b.replace(/\u001b\[\d\d?m/g, "").length + 1;
- }, 0) > 60 ? r[0] + (c === "" ? "" : c + `
- `) + " " + o.join(`,
- `) + " " + r[1] : r[0] + c + " " + o.join(", ") + " " + r[1];
- }(l, n, d)) : d[0] + n + d[1];
- }
- function $H(t) {
- return "[" + Error.prototype.toString.call(t) + "]";
- }
- function gX(t, I, g, C, i, e) {
- var A, s, l;
- if ((l = Object.getOwnPropertyDescriptor(I, i) || { value: I[i] }).get ? s = l.set ? t.stylize("[Getter/Setter]", "special") : t.stylize("[Getter]", "special") : l.set && (s = t.stylize("[Setter]", "special")), YCg(C, i) || (A = "[" + i + "]"), s || (t.seen.indexOf(l.value) < 0 ? (s = hG(g) ? rV(t, l.value, null) : rV(t, l.value, g - 1)).indexOf(`
- `) > -1 && (s = e ? s.split(`
- `).map(function(n) {
- return " " + n;
- }).join(`
- `).substr(2) : `
- ` + s.split(`
- `).map(function(n) {
- return " " + n;
- }).join(`
- `)) : s = t.stylize("[Circular]", "special")), Ks(A)) {
- if (e && i.match(/^\d+$/)) return s;
- (A = JSON.stringify("" + i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? (A = A.substr(1, A.length - 2), A = t.stylize(A, "name")) : (A = A.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"), A = t.stylize(A, "string"));
- }
- return A + ": " + s;
- }
- function D9(t) {
- return Array.isArray(t);
- }
- function lM(t) {
- return typeof t == "boolean";
- }
- function hG(t) {
- return t === null;
- }
- function wCg(t) {
- return t == null;
- }
- function K9(t) {
- return typeof t == "number";
- }
- function fm(t) {
- return typeof t == "string";
- }
- function pCg(t) {
- return typeof t == "symbol";
- }
- function Ks(t) {
- return t === void 0;
- }
- function wm(t) {
- return Zd(t) && F9(t) === "[object RegExp]";
- }
- function Zd(t) {
- return typeof t == "object" && t !== null;
- }
- function hV(t) {
- return Zd(t) && F9(t) === "[object Date]";
- }
- function pm(t) {
- return Zd(t) && (F9(t) === "[object Error]" || t instanceof Error);
- }
- function Bm(t) {
- return typeof t == "function";
- }
- function BCg(t) {
- return t === null || typeof t == "boolean" || typeof t == "number" || typeof t == "string" || typeof t == "symbol" || t === void 0;
- }
- function WCg(t) {
- return dG(t);
- }
- function F9(t) {
- return Object.prototype.toString.call(t);
- }
- function IX(t) {
- return t < 10 ? "0" + t.toString(10) : t.toString(10);
- }
- ks.colors = { bold: [1, 22], italic: [3, 23], underline: [4, 24], inverse: [7, 27], white: [37, 39], grey: [90, 39], black: [30, 39], blue: [34, 39], cyan: [36, 39], green: [32, 39], magenta: [35, 39], red: [31, 39], yellow: [33, 39] }, ks.styles = { special: "cyan", number: "yellow", boolean: "yellow", undefined: "grey", null: "bold", string: "green", date: "magenta", regexp: "red" };
- var bhg = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
- function uhg() {
- var t = /* @__PURE__ */ new Date(), I = [IX(t.getHours()), IX(t.getMinutes()), IX(t.getSeconds())].join(":");
- return [t.getDate(), bhg[t.getMonth()], I].join(" ");
- }
- function yCg() {
- console.log("%s - %s", uhg(), AM.apply(null, arguments));
- }
- function k9(t, I) {
- if (!I || !Zd(I)) return t;
- for (var g = Object.keys(I), C = g.length; C--; ) t[g[C]] = I[g[C]];
- return t;
- }
- function YCg(t, I) {
- return Object.prototype.hasOwnProperty.call(t, I);
- }
- var mhg = { inherits: Oa, _extend: k9, log: yCg, isBuffer: WCg, isPrimitive: BCg, isFunction: Bm, isError: pm, isDate: hV, isObject: Zd, isRegExp: wm, isUndefined: Ks, isSymbol: pCg, isString: fm, isNumber: K9, isNullOrUndefined: wCg, isNull: hG, isBoolean: lM, isArray: D9, inspect: ks, deprecate: sM, format: AM, debuglog: S9 }, Zhg = Object.freeze({ __proto__: null, format: AM, deprecate: sM, debuglog: S9, inspect: ks, isArray: D9, isBoolean: lM, isNull: hG, isNullOrUndefined: wCg, isNumber: K9, isString: fm, isSymbol: pCg, isUndefined: Ks, isRegExp: wm, isObject: Zd, isDate: hV, isError: pm, isFunction: Bm, isPrimitive: BCg, isBuffer: WCg, log: yCg, inherits: Oa, _extend: k9, default: mhg });
- function Qo() {
- this.head = null, this.tail = null, this.length = 0;
- }
- Qo.prototype.push = function(t) {
- var I = { data: t, next: null };
- this.length > 0 ? this.tail.next = I : this.head = I, this.tail = I, ++this.length;
- }, Qo.prototype.unshift = function(t) {
- var I = { data: t, next: this.head };
- this.length === 0 && (this.tail = I), this.head = I, ++this.length;
- }, Qo.prototype.shift = function() {
- if (this.length !== 0) {
- var t = this.head.data;
- return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, t;
- }
- }, Qo.prototype.clear = function() {
- this.head = this.tail = null, this.length = 0;
- }, Qo.prototype.join = function(t) {
- if (this.length === 0) return "";
- for (var I = this.head, g = "" + I.data; I = I.next; ) g += t + I.data;
- return g;
- }, Qo.prototype.concat = function(t) {
- if (this.length === 0) return Hg.alloc(0);
- if (this.length === 1) return this.head.data;
- for (var I = Hg.allocUnsafe(t >>> 0), g = this.head, C = 0; g; ) g.data.copy(I, C), C += g.data.length, g = g.next;
- return I;
- };
- var Ghg = Hg.isEncoding || function(t) {
- switch (t && t.toLowerCase()) {
- case "hex":
- case "utf8":
- case "utf-8":
- case "ascii":
- case "binary":
- case "base64":
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- case "raw":
- return !0;
- default:
- return !1;
- }
- };
- function Wm(t) {
- switch (this.encoding = (t || "utf8").toLowerCase().replace(/[-_]/, ""), function(I) {
- if (I && !Ghg(I)) throw new Error("Unknown encoding: " + I);
- }(t), this.encoding) {
- case "utf8":
- this.surrogateSize = 3;
- break;
- case "ucs2":
- case "utf16le":
- this.surrogateSize = 2, this.detectIncompleteChar = phg;
- break;
- case "base64":
- this.surrogateSize = 3, this.detectIncompleteChar = Bhg;
- break;
- default:
- return void (this.write = whg);
- }
- this.charBuffer = new Hg(6), this.charReceived = 0, this.charLength = 0;
- }
- function whg(t) {
- return t.toString(this.encoding);
- }
- function phg(t) {
- this.charReceived = t.length % 2, this.charLength = this.charReceived ? 2 : 0;
- }
- function Bhg(t) {
- this.charReceived = t.length % 3, this.charLength = this.charReceived ? 3 : 0;
- }
- Wm.prototype.write = function(t) {
- for (var I = ""; this.charLength; ) {
- var g = t.length >= this.charLength - this.charReceived ? this.charLength - this.charReceived : t.length;
- if (t.copy(this.charBuffer, this.charReceived, 0, g), this.charReceived += g, this.charReceived < this.charLength) return "";
- if (t = t.slice(g, t.length), !((i = (I = this.charBuffer.slice(0, this.charLength).toString(this.encoding)).charCodeAt(I.length - 1)) >= 55296 && i <= 56319)) {
- if (this.charReceived = this.charLength = 0, t.length === 0) return I;
- break;
- }
- this.charLength += this.surrogateSize, I = "";
- }
- this.detectIncompleteChar(t);
- var C = t.length;
- this.charLength && (t.copy(this.charBuffer, 0, t.length - this.charReceived, C), C -= this.charReceived);
- var i;
- if (C = (I += t.toString(this.encoding, 0, C)).length - 1, (i = I.charCodeAt(C)) >= 55296 && i <= 56319) {
- var e = this.surrogateSize;
- return this.charLength += e, this.charReceived += e, this.charBuffer.copy(this.charBuffer, e, 0, e), t.copy(this.charBuffer, 0, 0, e), I.substring(0, C);
- }
- return I;
- }, Wm.prototype.detectIncompleteChar = function(t) {
- for (var I = t.length >= 3 ? 3 : t.length; I > 0; I--) {
- var g = t[t.length - I];
- if (I == 1 && g >> 5 == 6) {
- this.charLength = 2;
- break;
- }
- if (I <= 2 && g >> 4 == 14) {
- this.charLength = 3;
- break;
- }
- if (I <= 3 && g >> 3 == 30) {
- this.charLength = 4;
- break;
- }
- }
- this.charReceived = I;
- }, Wm.prototype.end = function(t) {
- var I = "";
- if (t && t.length && (I = this.write(t)), this.charReceived) {
- var g = this.charReceived, C = this.charBuffer, i = this.encoding;
- I += C.slice(0, g).toString(i);
- }
- return I;
- }, PC.ReadableState = NCg;
- var uC = S9("stream");
- function NCg(t, I) {
- t = t || {}, this.objectMode = !!t.objectMode, I instanceof Ve && (this.objectMode = this.objectMode || !!t.readableObjectMode);
- var g = t.highWaterMark, C = this.objectMode ? 16 : 16384;
- this.highWaterMark = g || g === 0 ? g : C, this.highWaterMark = ~~this.highWaterMark, this.buffer = new Qo(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.defaultEncoding = t.defaultEncoding || "utf8", this.ranOut = !1, this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, t.encoding && (this.decoder = new Wm(t.encoding), this.encoding = t.encoding);
- }
- function PC(t) {
- if (!(this instanceof PC)) return new PC(t);
- this._readableState = new NCg(t, this), this.readable = !0, t && typeof t.read == "function" && (this._read = t.read), qI.call(this);
- }
- function D8(t, I, g, C, i) {
- var e = function(n, a) {
- var d = null;
- return dG(a) || typeof a == "string" || a == null || n.objectMode || (d = new TypeError("Invalid non-string/buffer chunk")), d;
- }(I, g);
- if (e) t.emit("error", e);
- else if (g === null) I.reading = !1, function(n, a) {
- if (!a.ended) {
- if (a.decoder) {
- var d = a.decoder.end();
- d && d.length && (a.buffer.push(d), a.length += a.objectMode ? 1 : d.length);
- }
- a.ended = !0, bV(n);
- }
- }(t, I);
- else if (I.objectMode || g && g.length > 0) if (I.ended && !i) {
- var A = new Error("stream.push() after EOF");
- t.emit("error", A);
- } else if (I.endEmitted && i) {
- var s = new Error("stream.unshift() after end event");
- t.emit("error", s);
- } else {
- var l;
- !I.decoder || i || C || (g = I.decoder.write(g), l = !I.objectMode && g.length === 0), i || (I.reading = !1), l || (I.flowing && I.length === 0 && !I.sync ? (t.emit("data", g), t.read(0)) : (I.length += I.objectMode ? 1 : g.length, i ? I.buffer.unshift(g) : I.buffer.push(g), I.needReadable && bV(t))), function(n, a) {
- a.readingMore || (a.readingMore = !0, vt(Whg, n, a));
- }(t, I);
- }
- else i || (I.reading = !1);
- return function(n) {
- return !n.ended && (n.needReadable || n.length < n.highWaterMark || n.length === 0);
- }(I);
- }
- Oa(PC, qI), PC.prototype.push = function(t, I) {
- var g = this._readableState;
- return g.objectMode || typeof t != "string" || (I = I || g.defaultEncoding) !== g.encoding && (t = Hg.from(t, I), I = ""), D8(this, g, t, I, !1);
- }, PC.prototype.unshift = function(t) {
- return D8(this, this._readableState, t, "", !0);
- }, PC.prototype.isPaused = function() {
- return this._readableState.flowing === !1;
- }, PC.prototype.setEncoding = function(t) {
- return this._readableState.decoder = new Wm(t), this._readableState.encoding = t, this;
- };
- function K8(t, I) {
- return t <= 0 || I.length === 0 && I.ended ? 0 : I.objectMode ? 1 : t != t ? I.flowing && I.length ? I.buffer.head.data.length : I.length : (t > I.highWaterMark && (I.highWaterMark = function(g) {
- return g >= 8388608 ? g = 8388608 : (g--, g |= g >>> 1, g |= g >>> 2, g |= g >>> 4, g |= g >>> 8, g |= g >>> 16, g++), g;
- }(t)), t <= I.length ? t : I.ended ? I.length : (I.needReadable = !0, 0));
- }
- function bV(t) {
- var I = t._readableState;
- I.needReadable = !1, I.emittedReadable || (uC("emitReadable", I.flowing), I.emittedReadable = !0, I.sync ? vt(F8, t) : F8(t));
- }
- function F8(t) {
- uC("emit readable"), t.emit("readable"), z9(t);
- }
- function Whg(t, I) {
- for (var g = I.length; !I.reading && !I.flowing && !I.ended && I.length < I.highWaterMark && (uC("maybeReadMore read 0"), t.read(0), g !== I.length); ) g = I.length;
- I.readingMore = !1;
- }
- function yhg(t) {
- uC("readable nexttick read 0"), t.read(0);
- }
- function Yhg(t, I) {
- I.reading || (uC("resume read 0"), t.read(0)), I.resumeScheduled = !1, I.awaitDrain = 0, t.emit("resume"), z9(t), I.flowing && !I.reading && t.read(0);
- }
- function z9(t) {
- var I = t._readableState;
- for (uC("flow", I.flowing); I.flowing && t.read() !== null; ) ;
- }
- function k8(t, I) {
- return I.length === 0 ? null : (I.objectMode ? g = I.buffer.shift() : !t || t >= I.length ? (g = I.decoder ? I.buffer.join("") : I.buffer.length === 1 ? I.buffer.head.data : I.buffer.concat(I.length), I.buffer.clear()) : g = function(C, i, e) {
- var A;
- return C < i.head.data.length ? (A = i.head.data.slice(0, C), i.head.data = i.head.data.slice(C)) : A = C === i.head.data.length ? i.shift() : e ? function(s, l) {
- var n = l.head, a = 1, d = n.data;
- for (s -= d.length; n = n.next; ) {
- var o = n.data, c = s > o.length ? o.length : s;
- if (c === o.length ? d += o : d += o.slice(0, s), (s -= c) === 0) {
- c === o.length ? (++a, n.next ? l.head = n.next : l.head = l.tail = null) : (l.head = n, n.data = o.slice(c));
- break;
- }
- ++a;
- }
- return l.length -= a, d;
- }(C, i) : function(s, l) {
- var n = Hg.allocUnsafe(s), a = l.head, d = 1;
- for (a.data.copy(n), s -= a.data.length; a = a.next; ) {
- var o = a.data, c = s > o.length ? o.length : s;
- if (o.copy(n, n.length - s, 0, c), (s -= c) === 0) {
- c === o.length ? (++d, a.next ? l.head = a.next : l.head = l.tail = null) : (l.head = a, a.data = o.slice(c));
- break;
- }
- ++d;
- }
- return l.length -= d, n;
- }(C, i), A;
- }(t, I.buffer, I.decoder), g);
- var g;
- }
- function CX(t) {
- var I = t._readableState;
- if (I.length > 0) throw new Error('"endReadable()" called on non-empty stream');
- I.endEmitted || (I.ended = !0, vt(Nhg, I, t));
- }
- function Nhg(t, I) {
- t.endEmitted || t.length !== 0 || (t.endEmitted = !0, I.readable = !1, I.emit("end"));
- }
- function z8(t, I) {
- for (var g = 0, C = t.length; g < C; g++) if (t[g] === I) return g;
- return -1;
- }
- function Vhg() {
- }
- function Mhg(t, I, g) {
- this.chunk = t, this.encoding = I, this.callback = g, this.next = null;
- }
- function oD(t, I) {
- Object.defineProperty(this, "buffer", { get: sM(function() {
- return this.getBuffer();
- }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.") }), t = t || {}, this.objectMode = !!t.objectMode, I instanceof Ve && (this.objectMode = this.objectMode || !!t.writableObjectMode);
- var g = t.highWaterMark, C = this.objectMode ? 16 : 16384;
- this.highWaterMark = g || g === 0 ? g : C, this.highWaterMark = ~~this.highWaterMark, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1;
- var i = t.decodeStrings === !1;
- this.decodeStrings = !i, this.defaultEncoding = t.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(e) {
- (function(A, s) {
- var l = A._writableState, n = l.sync, a = l.writecb;
- if (function(o) {
- o.writing = !1, o.writecb = null, o.length -= o.writelen, o.writelen = 0;
- }(l), s) (function(o, c, r, h, b) {
- --c.pendingcb, r ? vt(b, h) : b(h), o._writableState.errorEmitted = !0, o.emit("error", h);
- })(A, l, n, s, a);
- else {
- var d = MCg(l);
- d || l.corked || l.bufferProcessing || !l.bufferedRequest || VCg(A, l), n ? vt(J8, A, l, d, a) : J8(A, l, d, a);
- }
- })(I, e);
- }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new fCg(this);
- }
- function gi(t) {
- if (!(this instanceof gi || this instanceof Ve)) return new gi(t);
- this._writableState = new oD(t, this), this.writable = !0, t && (typeof t.write == "function" && (this._write = t.write), typeof t.writev == "function" && (this._writev = t.writev)), qI.call(this);
- }
- function cD(t, I, g, C, i, e, A) {
- I.writelen = C, I.writecb = A, I.writing = !0, I.sync = !0, g ? t._writev(i, I.onwrite) : t._write(i, e, I.onwrite), I.sync = !1;
- }
- function J8(t, I, g, C) {
- g || function(i, e) {
- e.length === 0 && e.needDrain && (e.needDrain = !1, i.emit("drain"));
- }(t, I), I.pendingcb--, C(), RCg(t, I);
- }
- function VCg(t, I) {
- I.bufferProcessing = !0;
- var g = I.bufferedRequest;
- if (t._writev && g && g.next) {
- var C = I.bufferedRequestCount, i = new Array(C), e = I.corkedRequestsFree;
- e.entry = g;
- for (var A = 0; g; ) i[A] = g, g = g.next, A += 1;
- cD(t, I, !0, I.length, i, "", e.finish), I.pendingcb++, I.lastBufferedRequest = null, e.next ? (I.corkedRequestsFree = e.next, e.next = null) : I.corkedRequestsFree = new fCg(I);
- } else {
- for (; g; ) {
- var s = g.chunk, l = g.encoding, n = g.callback;
- if (cD(t, I, !1, I.objectMode ? 1 : s.length, s, l, n), g = g.next, I.writing) break;
- }
- g === null && (I.lastBufferedRequest = null);
- }
- I.bufferedRequestCount = 0, I.bufferedRequest = g, I.bufferProcessing = !1;
- }
- function MCg(t) {
- return t.ending && t.length === 0 && t.bufferedRequest === null && !t.finished && !t.writing;
- }
- function L8(t, I) {
- I.prefinished || (I.prefinished = !0, t.emit("prefinish"));
- }
- function RCg(t, I) {
- var g = MCg(I);
- return g && (I.pendingcb === 0 ? (L8(t, I), I.finished = !0, t.emit("finish")) : L8(t, I)), g;
- }
- function fCg(t) {
- var I = this;
- this.next = null, this.entry = null, this.finish = function(g) {
- var C = I.entry;
- for (I.entry = null; C; ) {
- var i = C.callback;
- t.pendingcb--, i(g), C = C.next;
- }
- t.corkedRequestsFree ? t.corkedRequestsFree.next = I : t.corkedRequestsFree = I;
- };
- }
- PC.prototype.read = function(t) {
- uC("read", t), t = parseInt(t, 10);
- var I = this._readableState, g = t;
- if (t !== 0 && (I.emittedReadable = !1), t === 0 && I.needReadable && (I.length >= I.highWaterMark || I.ended)) return uC("read: emitReadable", I.length, I.ended), I.length === 0 && I.ended ? CX(this) : bV(this), null;
- if ((t = K8(t, I)) === 0 && I.ended) return I.length === 0 && CX(this), null;
- var C, i = I.needReadable;
- return uC("need readable", i), (I.length === 0 || I.length - t < I.highWaterMark) && uC("length less than watermark", i = !0), I.ended || I.reading ? uC("reading or ended", i = !1) : i && (uC("do read"), I.reading = !0, I.sync = !0, I.length === 0 && (I.needReadable = !0), this._read(I.highWaterMark), I.sync = !1, I.reading || (t = K8(g, I))), (C = t > 0 ? k8(t, I) : null) === null ? (I.needReadable = !0, t = 0) : I.length -= t, I.length === 0 && (I.ended || (I.needReadable = !0), g !== t && I.ended && CX(this)), C !== null && this.emit("data", C), C;
- }, PC.prototype._read = function(t) {
- this.emit("error", new Error("not implemented"));
- }, PC.prototype.pipe = function(t, I) {
- var g = this, C = this._readableState;
- switch (C.pipesCount) {
- case 0:
- C.pipes = t;
- break;
- case 1:
- C.pipes = [C.pipes, t];
- break;
- default:
- C.pipes.push(t);
- }
- C.pipesCount += 1, uC("pipe count=%d opts=%j", C.pipesCount, I);
- var i = !I || I.end !== !1 ? A : n;
- function e(b) {
- uC("onunpipe"), b === g && n();
- }
- function A() {
- uC("onend"), t.end();
- }
- C.endEmitted ? vt(i) : g.once("end", i), t.on("unpipe", e);
- var s = /* @__PURE__ */ function(b) {
- return function() {
- var u = b._readableState;
- uC("pipeOnDrain", u.awaitDrain), u.awaitDrain && u.awaitDrain--, u.awaitDrain === 0 && b.listeners("data").length && (u.flowing = !0, z9(b));
- };
- }(g);
- t.on("drain", s);
- var l = !1;
- function n() {
- uC("cleanup"), t.removeListener("close", c), t.removeListener("finish", r), t.removeListener("drain", s), t.removeListener("error", o), t.removeListener("unpipe", e), g.removeListener("end", A), g.removeListener("end", n), g.removeListener("data", d), l = !0, !C.awaitDrain || t._writableState && !t._writableState.needDrain || s();
- }
- var a = !1;
- function d(b) {
- uC("ondata"), a = !1, t.write(b) !== !1 || a || ((C.pipesCount === 1 && C.pipes === t || C.pipesCount > 1 && z8(C.pipes, t) !== -1) && !l && (uC("false write response, pause", g._readableState.awaitDrain), g._readableState.awaitDrain++, a = !0), g.pause());
- }
- function o(b) {
- var u;
- uC("onerror", b), h(), t.removeListener("error", o), u = "error", t.listeners(u).length === 0 && t.emit("error", b);
- }
- function c() {
- t.removeListener("finish", r), h();
- }
- function r() {
- uC("onfinish"), t.removeListener("close", c), h();
- }
- function h() {
- uC("unpipe"), g.unpipe(t);
- }
- return g.on("data", d), function(b, u, m) {
- if (typeof b.prependListener == "function") return b.prependListener(u, m);
- b._events && b._events[u] ? Array.isArray(b._events[u]) ? b._events[u].unshift(m) : b._events[u] = [m, b._events[u]] : b.on(u, m);
- }(t, "error", o), t.once("close", c), t.once("finish", r), t.emit("pipe", g), C.flowing || (uC("pipe resume"), g.resume()), t;
- }, PC.prototype.unpipe = function(t) {
- var I = this._readableState;
- if (I.pipesCount === 0) return this;
- if (I.pipesCount === 1) return t && t !== I.pipes || (t || (t = I.pipes), I.pipes = null, I.pipesCount = 0, I.flowing = !1, t && t.emit("unpipe", this)), this;
- if (!t) {
- var g = I.pipes, C = I.pipesCount;
- I.pipes = null, I.pipesCount = 0, I.flowing = !1;
- for (var i = 0; i < C; i++) g[i].emit("unpipe", this);
- return this;
- }
- var e = z8(I.pipes, t);
- return e === -1 || (I.pipes.splice(e, 1), I.pipesCount -= 1, I.pipesCount === 1 && (I.pipes = I.pipes[0]), t.emit("unpipe", this)), this;
- }, PC.prototype.on = function(t, I) {
- var g = qI.prototype.on.call(this, t, I);
- if (t === "data") this._readableState.flowing !== !1 && this.resume();
- else if (t === "readable") {
- var C = this._readableState;
- C.endEmitted || C.readableListening || (C.readableListening = C.needReadable = !0, C.emittedReadable = !1, C.reading ? C.length && bV(this) : vt(yhg, this));
- }
- return g;
- }, PC.prototype.addListener = PC.prototype.on, PC.prototype.resume = function() {
- var t = this._readableState;
- return t.flowing || (uC("resume"), t.flowing = !0, function(I, g) {
- g.resumeScheduled || (g.resumeScheduled = !0, vt(Yhg, I, g));
- }(this, t)), this;
- }, PC.prototype.pause = function() {
- return uC("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (uC("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
- }, PC.prototype.wrap = function(t) {
- var I = this._readableState, g = !1, C = this;
- for (var i in t.on("end", function() {
- if (uC("wrapped end"), I.decoder && !I.ended) {
- var e = I.decoder.end();
- e && e.length && C.push(e);
- }
- C.push(null);
- }), t.on("data", function(e) {
- uC("wrapped data"), I.decoder && (e = I.decoder.write(e)), I.objectMode && e == null || (I.objectMode || e && e.length) && (C.push(e) || (g = !0, t.pause()));
- }), t) this[i] === void 0 && typeof t[i] == "function" && (this[i] = /* @__PURE__ */ function(e) {
- return function() {
- return t[e].apply(t, arguments);
- };
- }(i));
- return function(e, A) {
- for (var s = 0, l = e.length; s < l; s++) A(e[s], s);
- }(["error", "close", "destroy", "pause", "resume"], function(e) {
- t.on(e, C.emit.bind(C, e));
- }), C._read = function(e) {
- uC("wrapped _read", e), g && (g = !1, t.resume());
- }, C;
- }, PC._fromList = k8, gi.WritableState = oD, Oa(gi, qI), oD.prototype.getBuffer = function() {
- for (var t = this.bufferedRequest, I = []; t; ) I.push(t), t = t.next;
- return I;
- }, gi.prototype.pipe = function() {
- this.emit("error", new Error("Cannot pipe, not readable"));
- }, gi.prototype.write = function(t, I, g) {
- var C = this._writableState, i = !1;
- return typeof I == "function" && (g = I, I = null), Hg.isBuffer(t) ? I = "buffer" : I || (I = C.defaultEncoding), typeof g != "function" && (g = Vhg), C.ended ? function(e, A) {
- var s = new Error("write after end");
- e.emit("error", s), vt(A, s);
- }(this, g) : function(e, A, s, l) {
- var n = !0, a = !1;
- return s === null ? a = new TypeError("May not write null values to stream") : Hg.isBuffer(s) || typeof s == "string" || s === void 0 || A.objectMode || (a = new TypeError("Invalid non-string/buffer chunk")), a && (e.emit("error", a), vt(l, a), n = !1), n;
- }(this, C, t, g) && (C.pendingcb++, i = function(e, A, s, l, n) {
- s = function(c, r, h) {
- return c.objectMode || c.decodeStrings === !1 || typeof r != "string" || (r = Hg.from(r, h)), r;
- }(A, s, l), Hg.isBuffer(s) && (l = "buffer");
- var a = A.objectMode ? 1 : s.length;
- A.length += a;
- var d = A.length < A.highWaterMark;
- if (d || (A.needDrain = !0), A.writing || A.corked) {
- var o = A.lastBufferedRequest;
- A.lastBufferedRequest = new Mhg(s, l, n), o ? o.next = A.lastBufferedRequest : A.bufferedRequest = A.lastBufferedRequest, A.bufferedRequestCount += 1;
- } else cD(e, A, !1, a, s, l, n);
- return d;
- }(this, C, t, I, g)), i;
- }, gi.prototype.cork = function() {
- this._writableState.corked++;
- }, gi.prototype.uncork = function() {
- var t = this._writableState;
- t.corked && (t.corked--, t.writing || t.corked || t.finished || t.bufferProcessing || !t.bufferedRequest || VCg(this, t));
- }, gi.prototype.setDefaultEncoding = function(t) {
- if (typeof t == "string" && (t = t.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((t + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + t);
- return this._writableState.defaultEncoding = t, this;
- }, gi.prototype._write = function(t, I, g) {
- g(new Error("not implemented"));
- }, gi.prototype._writev = null, gi.prototype.end = function(t, I, g) {
- var C = this._writableState;
- typeof t == "function" ? (g = t, t = null, I = null) : typeof I == "function" && (g = I, I = null), t != null && this.write(t, I), C.corked && (C.corked = 1, this.uncork()), C.ending || C.finished || function(i, e, A) {
- e.ending = !0, RCg(i, e), A && (e.finished ? vt(A) : i.once("finish", A)), e.ended = !0, i.writable = !1;
- }(this, C, g);
- }, Oa(Ve, PC);
- for (var v8 = Object.keys(gi.prototype), tX = 0; tX < v8.length; tX++) {
- var iX = v8[tX];
- Ve.prototype[iX] || (Ve.prototype[iX] = gi.prototype[iX]);
- }
- function Ve(t) {
- if (!(this instanceof Ve)) return new Ve(t);
- PC.call(this, t), gi.call(this, t), t && t.readable === !1 && (this.readable = !1), t && t.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, t && t.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", Rhg);
- }
- function Rhg() {
- this.allowHalfOpen || this._writableState.ended || vt(fhg, this);
- }
- function fhg(t) {
- t.end();
- }
- function Hhg(t) {
- this.afterTransform = function(I, g) {
- return function(C, i, e) {
- var A = C._transformState;
- A.transforming = !1;
- var s = A.writecb;
- if (!s) return C.emit("error", new Error("no writecb in Transform class"));
- A.writechunk = null, A.writecb = null, e != null && C.push(e), s(i);
- var l = C._readableState;
- l.reading = !1, (l.needReadable || l.length < l.highWaterMark) && C._read(l.highWaterMark);
- }(t, I, g);
- }, this.needTransform = !1, this.transforming = !1, this.writecb = null, this.writechunk = null, this.writeencoding = null;
- }
- function SA(t) {
- if (!(this instanceof SA)) return new SA(t);
- Ve.call(this, t), this._transformState = new Hhg(this);
- var I = this;
- this._readableState.needReadable = !0, this._readableState.sync = !1, t && (typeof t.transform == "function" && (this._transform = t.transform), typeof t.flush == "function" && (this._flush = t.flush)), this.once("prefinish", function() {
- typeof this._flush == "function" ? this._flush(function(g) {
- T8(I, g);
- }) : T8(I);
- });
- }
- function T8(t, I) {
- if (I) return t.emit("error", I);
- var g = t._writableState, C = t._transformState;
- if (g.length) throw new Error("Calling transform done when ws.length != 0");
- if (C.transforming) throw new Error("Calling transform done when still transforming");
- return t.push(null);
- }
- function hh(t) {
- if (!(this instanceof hh)) return new hh(t);
- SA.call(this, t);
- }
- function GA() {
- qI.call(this);
- }
- Oa(SA, Ve), SA.prototype.push = function(t, I) {
- return this._transformState.needTransform = !1, Ve.prototype.push.call(this, t, I);
- }, SA.prototype._transform = function(t, I, g) {
- throw new Error("Not implemented");
- }, SA.prototype._write = function(t, I, g) {
- var C = this._transformState;
- if (C.writecb = g, C.writechunk = t, C.writeencoding = I, !C.transforming) {
- var i = this._readableState;
- (C.needTransform || i.needReadable || i.length < i.highWaterMark) && this._read(i.highWaterMark);
- }
- }, SA.prototype._read = function(t) {
- var I = this._transformState;
- I.writechunk !== null && I.writecb && !I.transforming ? (I.transforming = !0, this._transform(I.writechunk, I.writeencoding, I.afterTransform)) : I.needTransform = !0;
- }, Oa(hh, SA), hh.prototype._transform = function(t, I, g) {
- g(null, t);
- }, Oa(GA, qI), GA.Readable = PC, GA.Writable = gi, GA.Duplex = Ve, GA.Transform = SA, GA.PassThrough = hh, GA.Stream = GA, GA.prototype.pipe = function(t, I) {
- var g = this;
- function C(a) {
- t.writable && t.write(a) === !1 && g.pause && g.pause();
- }
- function i() {
- g.readable && g.resume && g.resume();
- }
- g.on("data", C), t.on("drain", i), t._isStdio || I && I.end === !1 || (g.on("end", A), g.on("close", s));
- var e = !1;
- function A() {
- e || (e = !0, t.end());
- }
- function s() {
- e || (e = !0, typeof t.destroy == "function" && t.destroy());
- }
- function l(a) {
- if (n(), qI.listenerCount(this, "error") === 0) throw a;
- }
- function n() {
- g.removeListener("data", C), t.removeListener("drain", i), g.removeListener("end", A), g.removeListener("close", s), g.removeListener("error", l), t.removeListener("error", l), g.removeListener("end", n), g.removeListener("close", n), t.removeListener("close", n);
- }
- return g.on("error", l), t.on("error", l), g.on("end", n), g.on("close", n), t.on("close", n), t.emit("pipe", g), t;
- };
- var x8, j8, Q8, HCg = iM(Object.freeze({ __proto__: null, default: GA, Readable: PC, Writable: gi, Duplex: Ve, Transform: SA, PassThrough: hh, Stream: GA })), eX = { exports: {} };
- function nM() {
- return x8 || (x8 = 1, eX.exports = { nextTick: function(t, I, g, C) {
- if (typeof t != "function") throw new TypeError('"callback" argument must be a function');
- var i, e, A = arguments.length;
- switch (A) {
- case 0:
- case 1:
- return vt(t);
- case 2:
- return vt(function() {
- t.call(null, I);
- });
- case 3:
- return vt(function() {
- t.call(null, I, g);
- });
- case 4:
- return vt(function() {
- t.call(null, I, g, C);
- });
- default:
- for (i = new Array(A - 1), e = 0; e < i.length; ) i[e++] = arguments[e];
- return vt(function() {
- t.apply(null, i);
- });
- }
- } }), eX.exports;
- }
- var O8, Xhg = iM(chg), U8 = { exports: {} };
- function XCg() {
- return O8 ? U8.exports : (O8 = 1, U8.exports = HCg);
- }
- var E8, AX = { exports: {} }, SCg = iM(ehg);
- function aM() {
- return E8 || (E8 = 1, function(t, I) {
- var g = SCg, C = g.Buffer;
- function i(A, s) {
- for (var l in A) s[l] = A[l];
- }
- function e(A, s, l) {
- return C(A, s, l);
- }
- C.from && C.alloc && C.allocUnsafe && C.allocUnsafeSlow ? t.exports = g : (i(g, I), I.Buffer = e), i(C, e), e.from = function(A, s, l) {
- if (typeof A == "number") throw new TypeError("Argument must not be a number");
- return C(A, s, l);
- }, e.alloc = function(A, s, l) {
- if (typeof A != "number") throw new TypeError("Argument must be a number");
- var n = C(A);
- return s !== void 0 ? typeof l == "string" ? n.fill(s, l) : n.fill(s) : n.fill(0), n;
- }, e.allocUnsafe = function(A) {
- if (typeof A != "number") throw new TypeError("Argument must be a number");
- return C(A);
- }, e.allocUnsafeSlow = function(A) {
- if (typeof A != "number") throw new TypeError("Argument must be a number");
- return g.SlowBuffer(A);
- };
- }(AX, AX.exports)), AX.exports;
- }
- var P8, Ut = {};
- function bG() {
- if (P8) return Ut;
- function t(I) {
- return Object.prototype.toString.call(I);
- }
- return P8 = 1, Ut.isArray = function(I) {
- return Array.isArray ? Array.isArray(I) : t(I) === "[object Array]";
- }, Ut.isBoolean = function(I) {
- return typeof I == "boolean";
- }, Ut.isNull = function(I) {
- return I === null;
- }, Ut.isNullOrUndefined = function(I) {
- return I == null;
- }, Ut.isNumber = function(I) {
- return typeof I == "number";
- }, Ut.isString = function(I) {
- return typeof I == "string";
- }, Ut.isSymbol = function(I) {
- return typeof I == "symbol";
- }, Ut.isUndefined = function(I) {
- return I === void 0;
- }, Ut.isRegExp = function(I) {
- return t(I) === "[object RegExp]";
- }, Ut.isObject = function(I) {
- return typeof I == "object" && I !== null;
- }, Ut.isDate = function(I) {
- return t(I) === "[object Date]";
- }, Ut.isError = function(I) {
- return t(I) === "[object Error]" || I instanceof Error;
- }, Ut.isFunction = function(I) {
- return typeof I == "function";
- }, Ut.isPrimitive = function(I) {
- return I === null || typeof I == "boolean" || typeof I == "number" || typeof I == "string" || typeof I == "symbol" || I === void 0;
- }, Ut.isBuffer = SCg.Buffer.isBuffer, Ut;
- }
- var _8, q8, $8 = { exports: {} }, oM = iM(Zhg), sX = { exports: {} };
- function uG() {
- return q8 || (q8 = 1, function(t) {
- try {
- var I = oM;
- if (typeof I.inherits != "function") throw "";
- t.exports = I.inherits;
- } catch {
- t.exports = (_8 || (_8 = 1, typeof Object.create == "function" ? sX.exports = function(C, i) {
- i && (C.super_ = i, C.prototype = Object.create(i.prototype, { constructor: { value: C, enumerable: !1, writable: !0, configurable: !0 } }));
- } : sX.exports = function(C, i) {
- if (i) {
- C.super_ = i;
- var e = function() {
- };
- e.prototype = i.prototype, C.prototype = new e(), C.prototype.constructor = C;
- }
- }), sX.exports);
- }
- }($8)), $8.exports;
- }
- var g_, lX, I_, C_, t_, nX, i_, aX, e_, A_ = { exports: {} };
- function Shg() {
- return g_ || (g_ = 1, function(t) {
- var I = aM().Buffer, g = oM;
- t.exports = function() {
- function C() {
- (function(i, e) {
- if (!(i instanceof e)) throw new TypeError("Cannot call a class as a function");
- })(this, C), this.head = null, this.tail = null, this.length = 0;
- }
- return C.prototype.push = function(i) {
- var e = { data: i, next: null };
- this.length > 0 ? this.tail.next = e : this.head = e, this.tail = e, ++this.length;
- }, C.prototype.unshift = function(i) {
- var e = { data: i, next: this.head };
- this.length === 0 && (this.tail = e), this.head = e, ++this.length;
- }, C.prototype.shift = function() {
- if (this.length !== 0) {
- var i = this.head.data;
- return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, i;
- }
- }, C.prototype.clear = function() {
- this.head = this.tail = null, this.length = 0;
- }, C.prototype.join = function(i) {
- if (this.length === 0) return "";
- for (var e = this.head, A = "" + e.data; e = e.next; ) A += i + e.data;
- return A;
- }, C.prototype.concat = function(i) {
- if (this.length === 0) return I.alloc(0);
- if (this.length === 1) return this.head.data;
- for (var e, A, s, l = I.allocUnsafe(i >>> 0), n = this.head, a = 0; n; ) e = n.data, A = l, s = a, e.copy(A, s), a += n.data.length, n = n.next;
- return l;
- }, C;
- }(), g && g.inspect && g.inspect.custom && (t.exports.prototype[g.inspect.custom] = function() {
- var C = g.inspect({ length: this.length });
- return this.constructor.name + " " + C;
- });
- }(A_)), A_.exports;
- }
- function DCg() {
- if (I_) return lX;
- I_ = 1;
- var t = nM();
- function I(g, C) {
- g.emit("error", C);
- }
- return lX = { destroy: function(g, C) {
- var i = this, e = this._readableState && this._readableState.destroyed, A = this._writableState && this._writableState.destroyed;
- return e || A ? (C ? C(g) : !g || this._writableState && this._writableState.errorEmitted || t.nextTick(I, this, g), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(g || null, function(s) {
- !C && s ? (t.nextTick(I, i, s), i._writableState && (i._writableState.errorEmitted = !0)) : C && C(s);
- }), this);
- }, undestroy: function() {
- this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);
- } }, lX;
- }
- function KCg() {
- if (i_) return nX;
- i_ = 1;
- var t = nM();
- function I(p) {
- var Y = this;
- this.next = null, this.entry = null, this.finish = function() {
- (function(R, X, H) {
- var S = R.entry;
- for (R.entry = null; S; ) {
- var z = S.callback;
- X.pendingcb--, z(H), S = S.next;
- }
- X.corkedRequestsFree ? X.corkedRequestsFree.next = R : X.corkedRequestsFree = R;
- })(Y, p);
- };
- }
- nX = c;
- var g, C = t.nextTick;
- c.WritableState = o;
- var i = Object.create(bG());
- i.inherits = uG();
- var e = { deprecate: t_ ? C_ : (t_ = 1, C_ = oM.deprecate) }, A = XCg(), s = aM().Buffer, l = oe.Uint8Array || function() {
- }, n, a = DCg();
- function d() {
- }
- function o(p, Y) {
- g = g || y0(), p = p || {};
- var R = Y instanceof g;
- this.objectMode = !!p.objectMode, R && (this.objectMode = this.objectMode || !!p.writableObjectMode);
- var X = p.highWaterMark, H = p.writableHighWaterMark, S = this.objectMode ? 16 : 16384;
- this.highWaterMark = X || X === 0 ? X : R && (H || H === 0) ? H : S, this.highWaterMark = Math.floor(this.highWaterMark), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;
- var z = p.decodeStrings === !1;
- this.decodeStrings = !z, this.defaultEncoding = p.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(v) {
- (function(K, V) {
- var N = K._writableState, B = N.sync, G = N.writecb;
- if (function(W) {
- W.writing = !1, W.writecb = null, W.length -= W.writelen, W.writelen = 0;
- }(N), V) (function(W, y, f, D, F) {
- --y.pendingcb, f ? (t.nextTick(F, D), t.nextTick(Z, W, y), W._writableState.errorEmitted = !0, W.emit("error", D)) : (F(D), W._writableState.errorEmitted = !0, W.emit("error", D), Z(W, y));
- })(K, N, B, V, G);
- else {
- var w = u(N);
- w || N.corked || N.bufferProcessing || !N.bufferedRequest || b(K, N), B ? C(h, K, N, w, G) : h(K, N, w, G);
- }
- })(Y, v);
- }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new I(this);
- }
- function c(p) {
- if (g = g || y0(), !(n.call(c, this) || this instanceof g)) return new c(p);
- this._writableState = new o(p, this), this.writable = !0, p && (typeof p.write == "function" && (this._write = p.write), typeof p.writev == "function" && (this._writev = p.writev), typeof p.destroy == "function" && (this._destroy = p.destroy), typeof p.final == "function" && (this._final = p.final)), A.call(this);
- }
- function r(p, Y, R, X, H, S, z) {
- Y.writelen = X, Y.writecb = z, Y.writing = !0, Y.sync = !0, R ? p._writev(H, Y.onwrite) : p._write(H, S, Y.onwrite), Y.sync = !1;
- }
- function h(p, Y, R, X) {
- R || function(H, S) {
- S.length === 0 && S.needDrain && (S.needDrain = !1, H.emit("drain"));
- }(p, Y), Y.pendingcb--, X(), Z(p, Y);
- }
- function b(p, Y) {
- Y.bufferProcessing = !0;
- var R = Y.bufferedRequest;
- if (p._writev && R && R.next) {
- var X = Y.bufferedRequestCount, H = new Array(X), S = Y.corkedRequestsFree;
- S.entry = R;
- for (var z = 0, v = !0; R; ) H[z] = R, R.isBuf || (v = !1), R = R.next, z += 1;
- H.allBuffers = v, r(p, Y, !0, Y.length, H, "", S.finish), Y.pendingcb++, Y.lastBufferedRequest = null, S.next ? (Y.corkedRequestsFree = S.next, S.next = null) : Y.corkedRequestsFree = new I(Y), Y.bufferedRequestCount = 0;
- } else {
- for (; R; ) {
- var K = R.chunk, V = R.encoding, N = R.callback;
- if (r(p, Y, !1, Y.objectMode ? 1 : K.length, K, V, N), R = R.next, Y.bufferedRequestCount--, Y.writing) break;
- }
- R === null && (Y.lastBufferedRequest = null);
- }
- Y.bufferedRequest = R, Y.bufferProcessing = !1;
- }
- function u(p) {
- return p.ending && p.length === 0 && p.bufferedRequest === null && !p.finished && !p.writing;
- }
- function m(p, Y) {
- p._final(function(R) {
- Y.pendingcb--, R && p.emit("error", R), Y.prefinished = !0, p.emit("prefinish"), Z(p, Y);
- });
- }
- function Z(p, Y) {
- var R = u(Y);
- return R && (function(X, H) {
- H.prefinished || H.finalCalled || (typeof X._final == "function" ? (H.pendingcb++, H.finalCalled = !0, t.nextTick(m, X, H)) : (H.prefinished = !0, X.emit("prefinish")));
- }(p, Y), Y.pendingcb === 0 && (Y.finished = !0, p.emit("finish"))), R;
- }
- return i.inherits(c, A), o.prototype.getBuffer = function() {
- for (var p = this.bufferedRequest, Y = []; p; ) Y.push(p), p = p.next;
- return Y;
- }, function() {
- try {
- Object.defineProperty(o.prototype, "buffer", { get: e.deprecate(function() {
- return this.getBuffer();
- }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });
- } catch {
- }
- }(), typeof Symbol == "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] == "function" ? (n = Function.prototype[Symbol.hasInstance], Object.defineProperty(c, Symbol.hasInstance, { value: function(p) {
- return !!n.call(this, p) || this === c && p && p._writableState instanceof o;
- } })) : n = function(p) {
- return p instanceof this;
- }, c.prototype.pipe = function() {
- this.emit("error", new Error("Cannot pipe, not readable"));
- }, c.prototype.write = function(p, Y, R) {
- var X, H = this._writableState, S = !1, z = !H.objectMode && (X = p, s.isBuffer(X) || X instanceof l);
- return z && !s.isBuffer(p) && (p = function(v) {
- return s.from(v);
- }(p)), typeof Y == "function" && (R = Y, Y = null), z ? Y = "buffer" : Y || (Y = H.defaultEncoding), typeof R != "function" && (R = d), H.ended ? function(v, K) {
- var V = new Error("write after end");
- v.emit("error", V), t.nextTick(K, V);
- }(this, R) : (z || function(v, K, V, N) {
- var B = !0, G = !1;
- return V === null ? G = new TypeError("May not write null values to stream") : typeof V == "string" || V === void 0 || K.objectMode || (G = new TypeError("Invalid non-string/buffer chunk")), G && (v.emit("error", G), t.nextTick(N, G), B = !1), B;
- }(this, H, p, R)) && (H.pendingcb++, S = function(v, K, V, N, B, G) {
- if (!V) {
- var w = function(D, F, T) {
- return D.objectMode || D.decodeStrings === !1 || typeof F != "string" || (F = s.from(F, T)), F;
- }(K, N, B);
- N !== w && (V = !0, B = "buffer", N = w);
- }
- var W = K.objectMode ? 1 : N.length;
- K.length += W;
- var y = K.length < K.highWaterMark;
- if (y || (K.needDrain = !0), K.writing || K.corked) {
- var f = K.lastBufferedRequest;
- K.lastBufferedRequest = { chunk: N, encoding: B, isBuf: V, callback: G, next: null }, f ? f.next = K.lastBufferedRequest : K.bufferedRequest = K.lastBufferedRequest, K.bufferedRequestCount += 1;
- } else r(v, K, !1, W, N, B, G);
- return y;
- }(this, H, z, p, Y, R)), S;
- }, c.prototype.cork = function() {
- this._writableState.corked++;
- }, c.prototype.uncork = function() {
- var p = this._writableState;
- p.corked && (p.corked--, p.writing || p.corked || p.finished || p.bufferProcessing || !p.bufferedRequest || b(this, p));
- }, c.prototype.setDefaultEncoding = function(p) {
- if (typeof p == "string" && (p = p.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((p + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + p);
- return this._writableState.defaultEncoding = p, this;
- }, Object.defineProperty(c.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
- return this._writableState.highWaterMark;
- } }), c.prototype._write = function(p, Y, R) {
- R(new Error("_write() is not implemented"));
- }, c.prototype._writev = null, c.prototype.end = function(p, Y, R) {
- var X = this._writableState;
- typeof p == "function" ? (R = p, p = null, Y = null) : typeof Y == "function" && (R = Y, Y = null), p != null && this.write(p, Y), X.corked && (X.corked = 1, this.uncork()), X.ending || X.finished || function(H, S, z) {
- S.ending = !0, Z(H, S), z && (S.finished ? t.nextTick(z) : H.once("finish", z)), S.ended = !0, H.writable = !1;
- }(this, X, R);
- }, Object.defineProperty(c.prototype, "destroyed", { get: function() {
- return this._writableState !== void 0 && this._writableState.destroyed;
- }, set: function(p) {
- this._writableState && (this._writableState.destroyed = p);
- } }), c.prototype.destroy = a.destroy, c.prototype._undestroy = a.undestroy, c.prototype._destroy = function(p, Y) {
- this.end(), Y(p);
- }, nX;
- }
- function y0() {
- if (e_) return aX;
- e_ = 1;
- var t = nM(), I = Object.keys || function(d) {
- var o = [];
- for (var c in d) o.push(c);
- return o;
- };
- aX = l;
- var g = Object.create(bG());
- g.inherits = uG();
- var C = FCg(), i = KCg();
- g.inherits(l, C);
- for (var e = I(i.prototype), A = 0; A < e.length; A++) {
- var s = e[A];
- l.prototype[s] || (l.prototype[s] = i.prototype[s]);
- }
- function l(d) {
- if (!(this instanceof l)) return new l(d);
- C.call(this, d), i.call(this, d), d && d.readable === !1 && (this.readable = !1), d && d.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, d && d.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", n);
- }
- function n() {
- this.allowHalfOpen || this._writableState.ended || t.nextTick(a, this);
- }
- function a(d) {
- d.end();
- }
- return Object.defineProperty(l.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
- return this._writableState.highWaterMark;
- } }), Object.defineProperty(l.prototype, "destroyed", { get: function() {
- return this._readableState !== void 0 && this._writableState !== void 0 && this._readableState.destroyed && this._writableState.destroyed;
- }, set: function(d) {
- this._readableState !== void 0 && this._writableState !== void 0 && (this._readableState.destroyed = d, this._writableState.destroyed = d);
- } }), l.prototype._destroy = function(d, o) {
- this.push(null), this.end(), t.nextTick(o, d);
- }, aX;
- }
- var s_, oX, l_, cX, n_, dX, a_, o_, rX = {};
- function c_() {
- if (s_) return rX;
- s_ = 1;
- var t = aM().Buffer, I = t.isEncoding || function(d) {
- switch ((d = "" + d) && d.toLowerCase()) {
- case "hex":
- case "utf8":
- case "utf-8":
- case "ascii":
- case "binary":
- case "base64":
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- case "raw":
- return !0;
- default:
- return !1;
- }
- };
- function g(d) {
- var o;
- switch (this.encoding = function(c) {
- var r = function(h) {
- if (!h) return "utf8";
- for (var b; ; ) switch (h) {
- case "utf8":
- case "utf-8":
- return "utf8";
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return "utf16le";
- case "latin1":
- case "binary":
- return "latin1";
- case "base64":
- case "ascii":
- case "hex":
- return h;
- default:
- if (b) return;
- h = ("" + h).toLowerCase(), b = !0;
- }
- }(c);
- if (typeof r != "string" && (t.isEncoding === I || !I(c))) throw new Error("Unknown encoding: " + c);
- return r || c;
- }(d), this.encoding) {
- case "utf16le":
- this.text = e, this.end = A, o = 4;
- break;
- case "utf8":
- this.fillLast = i, o = 4;
- break;
- case "base64":
- this.text = s, this.end = l, o = 3;
- break;
- default:
- return this.write = n, void (this.end = a);
- }
- this.lastNeed = 0, this.lastTotal = 0, this.lastChar = t.allocUnsafe(o);
- }
- function C(d) {
- return d <= 127 ? 0 : d >> 5 == 6 ? 2 : d >> 4 == 14 ? 3 : d >> 3 == 30 ? 4 : d >> 6 == 2 ? -1 : -2;
- }
- function i(d) {
- var o = this.lastTotal - this.lastNeed, c = function(r, h, b) {
- if ((192 & h[0]) != 128) return r.lastNeed = 0, "�";
- if (r.lastNeed > 1 && h.length > 1) {
- if ((192 & h[1]) != 128) return r.lastNeed = 1, "�";
- if (r.lastNeed > 2 && h.length > 2 && (192 & h[2]) != 128) return r.lastNeed = 2, "�";
- }
- }(this, d);
- return c !== void 0 ? c : this.lastNeed <= d.length ? (d.copy(this.lastChar, o, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (d.copy(this.lastChar, o, 0, d.length), void (this.lastNeed -= d.length));
- }
- function e(d, o) {
- if ((d.length - o) % 2 == 0) {
- var c = d.toString("utf16le", o);
- if (c) {
- var r = c.charCodeAt(c.length - 1);
- if (r >= 55296 && r <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = d[d.length - 2], this.lastChar[1] = d[d.length - 1], c.slice(0, -1);
- }
- return c;
- }
- return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = d[d.length - 1], d.toString("utf16le", o, d.length - 1);
- }
- function A(d) {
- var o = d && d.length ? this.write(d) : "";
- if (this.lastNeed) {
- var c = this.lastTotal - this.lastNeed;
- return o + this.lastChar.toString("utf16le", 0, c);
- }
- return o;
- }
- function s(d, o) {
- var c = (d.length - o) % 3;
- return c === 0 ? d.toString("base64", o) : (this.lastNeed = 3 - c, this.lastTotal = 3, c === 1 ? this.lastChar[0] = d[d.length - 1] : (this.lastChar[0] = d[d.length - 2], this.lastChar[1] = d[d.length - 1]), d.toString("base64", o, d.length - c));
- }
- function l(d) {
- var o = d && d.length ? this.write(d) : "";
- return this.lastNeed ? o + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : o;
- }
- function n(d) {
- return d.toString(this.encoding);
- }
- function a(d) {
- return d && d.length ? this.write(d) : "";
- }
- return rX.StringDecoder = g, g.prototype.write = function(d) {
- if (d.length === 0) return "";
- var o, c;
- if (this.lastNeed) {
- if ((o = this.fillLast(d)) === void 0) return "";
- c = this.lastNeed, this.lastNeed = 0;
- } else c = 0;
- return c < d.length ? o ? o + this.text(d, c) : this.text(d, c) : o || "";
- }, g.prototype.end = function(d) {
- var o = d && d.length ? this.write(d) : "";
- return this.lastNeed ? o + "�" : o;
- }, g.prototype.text = function(d, o) {
- var c = function(h, b, u) {
- var m = b.length - 1;
- if (m < u) return 0;
- var Z = C(b[m]);
- return Z >= 0 ? (Z > 0 && (h.lastNeed = Z - 1), Z) : --m < u || Z === -2 ? 0 : (Z = C(b[m])) >= 0 ? (Z > 0 && (h.lastNeed = Z - 2), Z) : --m < u || Z === -2 ? 0 : (Z = C(b[m])) >= 0 ? (Z > 0 && (Z === 2 ? Z = 0 : h.lastNeed = Z - 3), Z) : 0;
- }(this, d, o);
- if (!this.lastNeed) return d.toString("utf8", o);
- this.lastTotal = c;
- var r = d.length - (c - this.lastNeed);
- return d.copy(this.lastChar, 0, r), d.toString("utf8", o, r);
- }, g.prototype.fillLast = function(d) {
- if (this.lastNeed <= d.length) return d.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);
- d.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, d.length), this.lastNeed -= d.length;
- }, rX;
- }
- function FCg() {
- if (l_) return oX;
- l_ = 1;
- var t = nM();
- oX = h;
- var I, g = function() {
- if (Q8) return j8;
- Q8 = 1;
- var B = {}.toString;
- return j8 = Array.isArray || function(G) {
- return B.call(G) == "[object Array]";
- };
- }();
- h.ReadableState = r, Xhg.EventEmitter;
- var C = function(B, G) {
- return B.listeners(G).length;
- }, i = XCg(), e = aM().Buffer, A = oe.Uint8Array || function() {
- }, s = Object.create(bG());
- s.inherits = uG();
- var l = oM, n = void 0;
- n = l && l.debuglog ? l.debuglog("stream") : function() {
- };
- var a, d = Shg(), o = DCg();
- s.inherits(h, i);
- var c = ["error", "close", "destroy", "pause", "resume"];
- function r(B, G) {
- B = B || {};
- var w = G instanceof (I = I || y0());
- this.objectMode = !!B.objectMode, w && (this.objectMode = this.objectMode || !!B.readableObjectMode);
- var W = B.highWaterMark, y = B.readableHighWaterMark, f = this.objectMode ? 16 : 16384;
- this.highWaterMark = W || W === 0 ? W : w && (y || y === 0) ? y : f, this.highWaterMark = Math.floor(this.highWaterMark), this.buffer = new d(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.destroyed = !1, this.defaultEncoding = B.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, B.encoding && (a || (a = c_().StringDecoder), this.decoder = new a(B.encoding), this.encoding = B.encoding);
- }
- function h(B) {
- if (I = I || y0(), !(this instanceof h)) return new h(B);
- this._readableState = new r(B, this), this.readable = !0, B && (typeof B.read == "function" && (this._read = B.read), typeof B.destroy == "function" && (this._destroy = B.destroy)), i.call(this);
- }
- function b(B, G, w, W, y) {
- var f, D = B._readableState;
- return G === null ? (D.reading = !1, function(F, T) {
- if (!T.ended) {
- if (T.decoder) {
- var Q = T.decoder.end();
- Q && Q.length && (T.buffer.push(Q), T.length += T.objectMode ? 1 : Q.length);
- }
- T.ended = !0, p(F);
- }
- }(B, D)) : (y || (f = function(F, T) {
- var Q;
- P = T, e.isBuffer(P) || P instanceof A || typeof T == "string" || T === void 0 || F.objectMode || (Q = new TypeError("Invalid non-string/buffer chunk"));
- var P;
- return Q;
- }(D, G)), f ? B.emit("error", f) : D.objectMode || G && G.length > 0 ? (typeof G == "string" || D.objectMode || Object.getPrototypeOf(G) === e.prototype || (G = function(F) {
- return e.from(F);
- }(G)), W ? D.endEmitted ? B.emit("error", new Error("stream.unshift() after end event")) : u(B, D, G, !0) : D.ended ? B.emit("error", new Error("stream.push() after EOF")) : (D.reading = !1, D.decoder && !w ? (G = D.decoder.write(G), D.objectMode || G.length !== 0 ? u(B, D, G, !1) : R(B, D)) : u(B, D, G, !1))) : W || (D.reading = !1)), function(F) {
- return !F.ended && (F.needReadable || F.length < F.highWaterMark || F.length === 0);
- }(D);
- }
- function u(B, G, w, W) {
- G.flowing && G.length === 0 && !G.sync ? (B.emit("data", w), B.read(0)) : (G.length += G.objectMode ? 1 : w.length, W ? G.buffer.unshift(w) : G.buffer.push(w), G.needReadable && p(B)), R(B, G);
- }
- Object.defineProperty(h.prototype, "destroyed", { get: function() {
- return this._readableState !== void 0 && this._readableState.destroyed;
- }, set: function(B) {
- this._readableState && (this._readableState.destroyed = B);
- } }), h.prototype.destroy = o.destroy, h.prototype._undestroy = o.undestroy, h.prototype._destroy = function(B, G) {
- this.push(null), G(B);
- }, h.prototype.push = function(B, G) {
- var w, W = this._readableState;
- return W.objectMode ? w = !0 : typeof B == "string" && ((G = G || W.defaultEncoding) !== W.encoding && (B = e.from(B, G), G = ""), w = !0), b(this, B, G, !1, w);
- }, h.prototype.unshift = function(B) {
- return b(this, B, null, !0, !1);
- }, h.prototype.isPaused = function() {
- return this._readableState.flowing === !1;
- }, h.prototype.setEncoding = function(B) {
- return a || (a = c_().StringDecoder), this._readableState.decoder = new a(B), this._readableState.encoding = B, this;
- };
- var m = 8388608;
- function Z(B, G) {
- return B <= 0 || G.length === 0 && G.ended ? 0 : G.objectMode ? 1 : B != B ? G.flowing && G.length ? G.buffer.head.data.length : G.length : (B > G.highWaterMark && (G.highWaterMark = function(w) {
- return w >= m ? w = m : (w--, w |= w >>> 1, w |= w >>> 2, w |= w >>> 4, w |= w >>> 8, w |= w >>> 16, w++), w;
- }(B)), B <= G.length ? B : G.ended ? G.length : (G.needReadable = !0, 0));
- }
- function p(B) {
- var G = B._readableState;
- G.needReadable = !1, G.emittedReadable || (n("emitReadable", G.flowing), G.emittedReadable = !0, G.sync ? t.nextTick(Y, B) : Y(B));
- }
- function Y(B) {
- n("emit readable"), B.emit("readable"), z(B);
- }
- function R(B, G) {
- G.readingMore || (G.readingMore = !0, t.nextTick(X, B, G));
- }
- function X(B, G) {
- for (var w = G.length; !G.reading && !G.flowing && !G.ended && G.length < G.highWaterMark && (n("maybeReadMore read 0"), B.read(0), w !== G.length); ) w = G.length;
- G.readingMore = !1;
- }
- function H(B) {
- n("readable nexttick read 0"), B.read(0);
- }
- function S(B, G) {
- G.reading || (n("resume read 0"), B.read(0)), G.resumeScheduled = !1, G.awaitDrain = 0, B.emit("resume"), z(B), G.flowing && !G.reading && B.read(0);
- }
- function z(B) {
- var G = B._readableState;
- for (n("flow", G.flowing); G.flowing && B.read() !== null; ) ;
- }
- function v(B, G) {
- return G.length === 0 ? null : (G.objectMode ? w = G.buffer.shift() : !B || B >= G.length ? (w = G.decoder ? G.buffer.join("") : G.buffer.length === 1 ? G.buffer.head.data : G.buffer.concat(G.length), G.buffer.clear()) : w = function(W, y, f) {
- var D;
- return W < y.head.data.length ? (D = y.head.data.slice(0, W), y.head.data = y.head.data.slice(W)) : D = W === y.head.data.length ? y.shift() : f ? function(F, T) {
- var Q = T.head, P = 1, L = Q.data;
- for (F -= L.length; Q = Q.next; ) {
- var E = Q.data, J = F > E.length ? E.length : F;
- if (J === E.length ? L += E : L += E.slice(0, F), (F -= J) === 0) {
- J === E.length ? (++P, Q.next ? T.head = Q.next : T.head = T.tail = null) : (T.head = Q, Q.data = E.slice(J));
- break;
- }
- ++P;
- }
- return T.length -= P, L;
- }(W, y) : function(F, T) {
- var Q = e.allocUnsafe(F), P = T.head, L = 1;
- for (P.data.copy(Q), F -= P.data.length; P = P.next; ) {
- var E = P.data, J = F > E.length ? E.length : F;
- if (E.copy(Q, Q.length - F, 0, J), (F -= J) === 0) {
- J === E.length ? (++L, P.next ? T.head = P.next : T.head = T.tail = null) : (T.head = P, P.data = E.slice(J));
- break;
- }
- ++L;
- }
- return T.length -= L, Q;
- }(W, y), D;
- }(B, G.buffer, G.decoder), w);
- var w;
- }
- function K(B) {
- var G = B._readableState;
- if (G.length > 0) throw new Error('"endReadable()" called on non-empty stream');
- G.endEmitted || (G.ended = !0, t.nextTick(V, G, B));
- }
- function V(B, G) {
- B.endEmitted || B.length !== 0 || (B.endEmitted = !0, G.readable = !1, G.emit("end"));
- }
- function N(B, G) {
- for (var w = 0, W = B.length; w < W; w++) if (B[w] === G) return w;
- return -1;
- }
- return h.prototype.read = function(B) {
- n("read", B), B = parseInt(B, 10);
- var G = this._readableState, w = B;
- if (B !== 0 && (G.emittedReadable = !1), B === 0 && G.needReadable && (G.length >= G.highWaterMark || G.ended)) return n("read: emitReadable", G.length, G.ended), G.length === 0 && G.ended ? K(this) : p(this), null;
- if ((B = Z(B, G)) === 0 && G.ended) return G.length === 0 && K(this), null;
- var W, y = G.needReadable;
- return n("need readable", y), (G.length === 0 || G.length - B < G.highWaterMark) && n("length less than watermark", y = !0), G.ended || G.reading ? n("reading or ended", y = !1) : y && (n("do read"), G.reading = !0, G.sync = !0, G.length === 0 && (G.needReadable = !0), this._read(G.highWaterMark), G.sync = !1, G.reading || (B = Z(w, G))), (W = B > 0 ? v(B, G) : null) === null ? (G.needReadable = !0, B = 0) : G.length -= B, G.length === 0 && (G.ended || (G.needReadable = !0), w !== B && G.ended && K(this)), W !== null && this.emit("data", W), W;
- }, h.prototype._read = function(B) {
- this.emit("error", new Error("_read() is not implemented"));
- }, h.prototype.pipe = function(B, G) {
- var w = this, W = this._readableState;
- switch (W.pipesCount) {
- case 0:
- W.pipes = B;
- break;
- case 1:
- W.pipes = [W.pipes, B];
- break;
- default:
- W.pipes.push(B);
- }
- W.pipesCount += 1, n("pipe count=%d opts=%j", W.pipesCount, G);
- var y = (!G || G.end !== !1) && B !== ld.stdout && B !== ld.stderr ? D : k;
- function f(j, q) {
- n("onunpipe"), j === w && q && q.hasUnpiped === !1 && (q.hasUnpiped = !0, n("cleanup"), B.removeListener("close", E), B.removeListener("finish", J), B.removeListener("drain", F), B.removeListener("error", L), B.removeListener("unpipe", f), w.removeListener("end", D), w.removeListener("end", k), w.removeListener("data", P), T = !0, !W.awaitDrain || B._writableState && !B._writableState.needDrain || F());
- }
- function D() {
- n("onend"), B.end();
- }
- W.endEmitted ? t.nextTick(y) : w.once("end", y), B.on("unpipe", f);
- var F = /* @__PURE__ */ function(j) {
- return function() {
- var q = j._readableState;
- n("pipeOnDrain", q.awaitDrain), q.awaitDrain && q.awaitDrain--, q.awaitDrain === 0 && C(j, "data") && (q.flowing = !0, z(j));
- };
- }(w);
- B.on("drain", F);
- var T = !1, Q = !1;
- function P(j) {
- n("ondata"), Q = !1, B.write(j) !== !1 || Q || ((W.pipesCount === 1 && W.pipes === B || W.pipesCount > 1 && N(W.pipes, B) !== -1) && !T && (n("false write response, pause", w._readableState.awaitDrain), w._readableState.awaitDrain++, Q = !0), w.pause());
- }
- function L(j) {
- n("onerror", j), k(), B.removeListener("error", L), C(B, "error") === 0 && B.emit("error", j);
- }
- function E() {
- B.removeListener("finish", J), k();
- }
- function J() {
- n("onfinish"), B.removeListener("close", E), k();
- }
- function k() {
- n("unpipe"), w.unpipe(B);
- }
- return w.on("data", P), function(j, q, Cg) {
- if (typeof j.prependListener == "function") return j.prependListener(q, Cg);
- j._events && j._events[q] ? g(j._events[q]) ? j._events[q].unshift(Cg) : j._events[q] = [Cg, j._events[q]] : j.on(q, Cg);
- }(B, "error", L), B.once("close", E), B.once("finish", J), B.emit("pipe", w), W.flowing || (n("pipe resume"), w.resume()), B;
- }, h.prototype.unpipe = function(B) {
- var G = this._readableState, w = { hasUnpiped: !1 };
- if (G.pipesCount === 0) return this;
- if (G.pipesCount === 1) return B && B !== G.pipes || (B || (B = G.pipes), G.pipes = null, G.pipesCount = 0, G.flowing = !1, B && B.emit("unpipe", this, w)), this;
- if (!B) {
- var W = G.pipes, y = G.pipesCount;
- G.pipes = null, G.pipesCount = 0, G.flowing = !1;
- for (var f = 0; f < y; f++) W[f].emit("unpipe", this, w);
- return this;
- }
- var D = N(G.pipes, B);
- return D === -1 || (G.pipes.splice(D, 1), G.pipesCount -= 1, G.pipesCount === 1 && (G.pipes = G.pipes[0]), B.emit("unpipe", this, w)), this;
- }, h.prototype.on = function(B, G) {
- var w = i.prototype.on.call(this, B, G);
- if (B === "data") this._readableState.flowing !== !1 && this.resume();
- else if (B === "readable") {
- var W = this._readableState;
- W.endEmitted || W.readableListening || (W.readableListening = W.needReadable = !0, W.emittedReadable = !1, W.reading ? W.length && p(this) : t.nextTick(H, this));
- }
- return w;
- }, h.prototype.addListener = h.prototype.on, h.prototype.resume = function() {
- var B = this._readableState;
- return B.flowing || (n("resume"), B.flowing = !0, function(G, w) {
- w.resumeScheduled || (w.resumeScheduled = !0, t.nextTick(S, G, w));
- }(this, B)), this;
- }, h.prototype.pause = function() {
- return n("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (n("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
- }, h.prototype.wrap = function(B) {
- var G = this, w = this._readableState, W = !1;
- for (var y in B.on("end", function() {
- if (n("wrapped end"), w.decoder && !w.ended) {
- var D = w.decoder.end();
- D && D.length && G.push(D);
- }
- G.push(null);
- }), B.on("data", function(D) {
- n("wrapped data"), w.decoder && (D = w.decoder.write(D)), w.objectMode && D == null || (w.objectMode || D && D.length) && (G.push(D) || (W = !0, B.pause()));
- }), B) this[y] === void 0 && typeof B[y] == "function" && (this[y] = /* @__PURE__ */ function(D) {
- return function() {
- return B[D].apply(B, arguments);
- };
- }(y));
- for (var f = 0; f < c.length; f++) B.on(c[f], this.emit.bind(this, c[f]));
- return this._read = function(D) {
- n("wrapped _read", D), W && (W = !1, B.resume());
- }, this;
- }, Object.defineProperty(h.prototype, "readableHighWaterMark", { enumerable: !1, get: function() {
- return this._readableState.highWaterMark;
- } }), h._fromList = v, oX;
- }
- function d_() {
- if (n_) return cX;
- n_ = 1, cX = C;
- var t = y0(), I = Object.create(bG());
- function g(A, s) {
- var l = this._transformState;
- l.transforming = !1;
- var n = l.writecb;
- if (!n) return this.emit("error", new Error("write callback called multiple times"));
- l.writechunk = null, l.writecb = null, s != null && this.push(s), n(A);
- var a = this._readableState;
- a.reading = !1, (a.needReadable || a.length < a.highWaterMark) && this._read(a.highWaterMark);
- }
- function C(A) {
- if (!(this instanceof C)) return new C(A);
- t.call(this, A), this._transformState = { afterTransform: g.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, A && (typeof A.transform == "function" && (this._transform = A.transform), typeof A.flush == "function" && (this._flush = A.flush)), this.on("prefinish", i);
- }
- function i() {
- var A = this;
- typeof this._flush == "function" ? this._flush(function(s, l) {
- e(A, s, l);
- }) : e(this, null, null);
- }
- function e(A, s, l) {
- if (s) return A.emit("error", s);
- if (l != null && A.push(l), A._writableState.length) throw new Error("Calling transform done when ws.length != 0");
- if (A._transformState.transforming) throw new Error("Calling transform done when still transforming");
- return A.push(null);
- }
- return I.inherits = uG(), I.inherits(C, t), C.prototype.push = function(A, s) {
- return this._transformState.needTransform = !1, t.prototype.push.call(this, A, s);
- }, C.prototype._transform = function(A, s, l) {
- throw new Error("_transform() is not implemented");
- }, C.prototype._write = function(A, s, l) {
- var n = this._transformState;
- if (n.writecb = l, n.writechunk = A, n.writeencoding = s, !n.transforming) {
- var a = this._readableState;
- (n.needTransform || a.needReadable || a.length < a.highWaterMark) && this._read(a.highWaterMark);
- }
- }, C.prototype._read = function(A) {
- var s = this._transformState;
- s.writechunk !== null && s.writecb && !s.transforming ? (s.transforming = !0, this._transform(s.writechunk, s.writeencoding, s.afterTransform)) : s.needTransform = !0;
- }, C.prototype._destroy = function(A, s) {
- var l = this;
- t.prototype._destroy.call(this, A, function(n) {
- s(n), l.emit("close");
- });
- }, cX;
- }
- function kCg() {
- return o_ || (o_ = 1, function(t, I) {
- var g = HCg;
- ld.env.READABLE_STREAM === "disable" && g ? (t.exports = g, (I = t.exports = g.Readable).Readable = g.Readable, I.Writable = g.Writable, I.Duplex = g.Duplex, I.Transform = g.Transform, I.PassThrough = g.PassThrough, I.Stream = g) : ((I = t.exports = FCg()).Stream = g || I, I.Readable = I, I.Writable = KCg(), I.Duplex = y0(), I.Transform = d_(), I.PassThrough = function() {
- if (a_) return dX;
- a_ = 1, dX = e;
- var C = d_(), i = Object.create(bG());
- function e(A) {
- if (!(this instanceof e)) return new e(A);
- C.call(this, A);
- }
- return i.inherits = uG(), i.inherits(e, C), e.prototype._transform = function(A, s, l) {
- l(null, A);
- }, dX;
- }());
- }(_H, _H.exports)), _H.exports;
- }
- if (rt.base64 = !0, rt.array = !0, rt.string = !0, rt.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", rt.nodebuffer = !0, rt.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") rt.blob = !1;
- else {
- var r_ = new ArrayBuffer(0);
- try {
- rt.blob = new Blob([r_], { type: "application/zip" }).size === 0;
- } catch {
- try {
- var h_ = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
- h_.append(r_), rt.blob = h_.getBlob("application/zip").size === 0;
- } catch {
- rt.blob = !1;
- }
- }
- }
- try {
- rt.nodestream = !!kCg().Readable;
- } catch {
- rt.nodestream = !1;
- }
- var b_, PY = {};
- function zCg() {
- if (b_) return PY;
- b_ = 1;
- var t = gt(), I = rt, g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- return PY.encode = function(C) {
- for (var i, e, A, s, l, n, a, d = [], o = 0, c = C.length, r = c, h = t.getTypeOf(C) !== "string"; o < C.length; ) r = c - o, h ? (i = C[o++], e = o < c ? C[o++] : 0, A = o < c ? C[o++] : 0) : (i = C.charCodeAt(o++), e = o < c ? C.charCodeAt(o++) : 0, A = o < c ? C.charCodeAt(o++) : 0), s = i >> 2, l = (3 & i) << 4 | e >> 4, n = r > 1 ? (15 & e) << 2 | A >> 6 : 64, a = r > 2 ? 63 & A : 64, d.push(g.charAt(s) + g.charAt(l) + g.charAt(n) + g.charAt(a));
- return d.join("");
- }, PY.decode = function(C) {
- var i, e, A, s, l, n, a = 0, d = 0, o = "data:";
- if (C.substr(0, o.length) === o) throw new Error("Invalid base64 input, it looks like a data url.");
- var c, r = 3 * (C = C.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
- if (C.charAt(C.length - 1) === g.charAt(64) && r--, C.charAt(C.length - 2) === g.charAt(64) && r--, r % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
- for (c = I.uint8array ? new Uint8Array(0 | r) : new Array(0 | r); a < C.length; ) i = g.indexOf(C.charAt(a++)) << 2 | (s = g.indexOf(C.charAt(a++))) >> 4, e = (15 & s) << 4 | (l = g.indexOf(C.charAt(a++))) >> 2, A = (3 & l) << 6 | (n = g.indexOf(C.charAt(a++))), c[d++] = i, l !== 64 && (c[d++] = e), n !== 64 && (c[d++] = A);
- return c;
- }, PY;
- }
- var u_, m_, hX, Z_, cM = { isNode: !0, newBufferFrom: function(t, I) {
- if (Hg.from && Hg.from !== Uint8Array.from) return Hg.from(t, I);
- if (typeof t == "number") throw new Error('The "data" argument must not be a number');
- return new Hg(t, I);
- }, allocBuffer: function(t) {
- if (Hg.alloc) return Hg.alloc(t);
- var I = new Hg(t);
- return I.fill(0), I;
- }, isBuffer: function(t) {
- return dG(t);
- }, isStream: function(t) {
- return t && typeof t.on == "function" && typeof t.pause == "function" && typeof t.resume == "function";
- } }, JCg = null;
- JCg = typeof Promise < "u" ? Promise : function() {
- if (Z_) return hX;
- Z_ = 1;
- var t = function() {
- if (m_) return u_;
- m_ = 1;
- var o, c, r = oe.MutationObserver || oe.WebKitMutationObserver;
- if (r) {
- var h = 0, b = new r(p), u = oe.document.createTextNode("");
- b.observe(u, { characterData: !0 }), o = function() {
- u.data = h = ++h % 2;
- };
- } else if (oe.setImmediate || oe.MessageChannel === void 0) o = "document" in oe && "onreadystatechange" in oe.document.createElement("script") ? function() {
- var Y = oe.document.createElement("script");
- Y.onreadystatechange = function() {
- p(), Y.onreadystatechange = null, Y.parentNode.removeChild(Y), Y = null;
- }, oe.document.documentElement.appendChild(Y);
- } : function() {
- setTimeout(p, 0);
- };
- else {
- var m = new oe.MessageChannel();
- m.port1.onmessage = p, o = function() {
- m.port2.postMessage(0);
- };
- }
- var Z = [];
- function p() {
- var Y, R;
- c = !0;
- for (var X = Z.length; X; ) {
- for (R = Z, Z = [], Y = -1; ++Y < X; ) R[Y]();
- X = Z.length;
- }
- c = !1;
- }
- return u_ = function(Y) {
- Z.push(Y) !== 1 || c || o();
- };
- }();
- function I() {
- }
- var g = {}, C = ["REJECTED"], i = ["FULFILLED"], e = ["PENDING"];
- function A(o) {
- if (typeof o != "function") throw new TypeError("resolver must be a function");
- this.state = e, this.queue = [], this.outcome = void 0, o !== I && a(this, o);
- }
- function s(o, c, r) {
- this.promise = o, typeof c == "function" && (this.onFulfilled = c, this.callFulfilled = this.otherCallFulfilled), typeof r == "function" && (this.onRejected = r, this.callRejected = this.otherCallRejected);
- }
- function l(o, c, r) {
- t(function() {
- var h;
- try {
- h = c(r);
- } catch (b) {
- return g.reject(o, b);
- }
- h === o ? g.reject(o, new TypeError("Cannot resolve promise with itself")) : g.resolve(o, h);
- });
- }
- function n(o) {
- var c = o && o.then;
- if (o && (typeof o == "object" || typeof o == "function") && typeof c == "function") return function() {
- c.apply(o, arguments);
- };
- }
- function a(o, c) {
- var r = !1;
- function h(m) {
- r || (r = !0, g.reject(o, m));
- }
- function b(m) {
- r || (r = !0, g.resolve(o, m));
- }
- var u = d(function() {
- c(b, h);
- });
- u.status === "error" && h(u.value);
- }
- function d(o, c) {
- var r = {};
- try {
- r.value = o(c), r.status = "success";
- } catch (h) {
- r.status = "error", r.value = h;
- }
- return r;
- }
- return hX = A, A.prototype.finally = function(o) {
- if (typeof o != "function") return this;
- var c = this.constructor;
- return this.then(function(r) {
- return c.resolve(o()).then(function() {
- return r;
- });
- }, function(r) {
- return c.resolve(o()).then(function() {
- throw r;
- });
- });
- }, A.prototype.catch = function(o) {
- return this.then(null, o);
- }, A.prototype.then = function(o, c) {
- if (typeof o != "function" && this.state === i || typeof c != "function" && this.state === C) return this;
- var r = new this.constructor(I);
- return this.state !== e ? l(r, this.state === i ? o : c, this.outcome) : this.queue.push(new s(r, o, c)), r;
- }, s.prototype.callFulfilled = function(o) {
- g.resolve(this.promise, o);
- }, s.prototype.otherCallFulfilled = function(o) {
- l(this.promise, this.onFulfilled, o);
- }, s.prototype.callRejected = function(o) {
- g.reject(this.promise, o);
- }, s.prototype.otherCallRejected = function(o) {
- l(this.promise, this.onRejected, o);
- }, g.resolve = function(o, c) {
- var r = d(n, c);
- if (r.status === "error") return g.reject(o, r.value);
- var h = r.value;
- if (h) a(o, h);
- else {
- o.state = i, o.outcome = c;
- for (var b = -1, u = o.queue.length; ++b < u; ) o.queue[b].callFulfilled(c);
- }
- return o;
- }, g.reject = function(o, c) {
- o.state = C, o.outcome = c;
- for (var r = -1, h = o.queue.length; ++r < h; ) o.queue[r].callRejected(c);
- return o;
- }, A.resolve = function(o) {
- return o instanceof this ? o : g.resolve(new this(I), o);
- }, A.reject = function(o) {
- var c = new this(I);
- return g.reject(c, o);
- }, A.all = function(o) {
- var c = this;
- if (Object.prototype.toString.call(o) !== "[object Array]") return this.reject(new TypeError("must be an array"));
- var r = o.length, h = !1;
- if (!r) return this.resolve([]);
- for (var b = new Array(r), u = 0, m = -1, Z = new this(I); ++m < r; ) p(o[m], m);
- return Z;
- function p(Y, R) {
- c.resolve(Y).then(function(X) {
- b[R] = X, ++u !== r || h || (h = !0, g.resolve(Z, b));
- }, function(X) {
- h || (h = !0, g.reject(Z, X));
- });
- }
- }, A.race = function(o) {
- var c = this;
- if (Object.prototype.toString.call(o) !== "[object Array]") return this.reject(new TypeError("must be an array"));
- var r = o.length, h = !1;
- if (!r) return this.resolve([]);
- for (var b, u = -1, m = new this(I); ++u < r; ) b = o[u], c.resolve(b).then(function(Z) {
- h || (h = !0, g.resolve(m, Z));
- }, function(Z) {
- h || (h = !0, g.reject(m, Z));
- });
- return m;
- }, hX;
- }();
- var G_, mG = { Promise: JCg };
- function gt() {
- return G_ || (G_ = 1, function(t) {
- var I = rt, g = zCg(), C = cM, i = mG;
- function e(d) {
- return d;
- }
- function A(d, o) {
- for (var c = 0; c < d.length; ++c) o[c] = 255 & d.charCodeAt(c);
- return o;
- }
- t.newBlob = function(d, o) {
- t.checkSupport("blob");
- try {
- return new Blob([d], { type: o });
- } catch {
- try {
- var c = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
- return c.append(d), c.getBlob(o);
- } catch {
- throw new Error("Bug : can't construct the Blob.");
- }
- }
- };
- var s = { stringifyByChunk: function(d, o, c) {
- var r = [], h = 0, b = d.length;
- if (b <= c) return String.fromCharCode.apply(null, d);
- for (; h < b; ) o === "array" || o === "nodebuffer" ? r.push(String.fromCharCode.apply(null, d.slice(h, Math.min(h + c, b)))) : r.push(String.fromCharCode.apply(null, d.subarray(h, Math.min(h + c, b)))), h += c;
- return r.join("");
- }, stringifyByChar: function(d) {
- for (var o = "", c = 0; c < d.length; c++) o += String.fromCharCode(d[c]);
- return o;
- }, applyCanBeUsed: { uint8array: function() {
- try {
- return I.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
- } catch {
- return !1;
- }
- }(), nodebuffer: function() {
- try {
- return I.nodebuffer && String.fromCharCode.apply(null, C.allocBuffer(1)).length === 1;
- } catch {
- return !1;
- }
- }() } };
- function l(d) {
- var o = 65536, c = t.getTypeOf(d), r = !0;
- if (c === "uint8array" ? r = s.applyCanBeUsed.uint8array : c === "nodebuffer" && (r = s.applyCanBeUsed.nodebuffer), r) for (; o > 1; ) try {
- return s.stringifyByChunk(d, c, o);
- } catch {
- o = Math.floor(o / 2);
- }
- return s.stringifyByChar(d);
- }
- function n(d, o) {
- for (var c = 0; c < d.length; c++) o[c] = d[c];
- return o;
- }
- t.applyFromCharCode = l;
- var a = {};
- a.string = { string: e, array: function(d) {
- return A(d, new Array(d.length));
- }, arraybuffer: function(d) {
- return a.string.uint8array(d).buffer;
- }, uint8array: function(d) {
- return A(d, new Uint8Array(d.length));
- }, nodebuffer: function(d) {
- return A(d, C.allocBuffer(d.length));
- } }, a.array = { string: l, array: e, arraybuffer: function(d) {
- return new Uint8Array(d).buffer;
- }, uint8array: function(d) {
- return new Uint8Array(d);
- }, nodebuffer: function(d) {
- return C.newBufferFrom(d);
- } }, a.arraybuffer = { string: function(d) {
- return l(new Uint8Array(d));
- }, array: function(d) {
- return n(new Uint8Array(d), new Array(d.byteLength));
- }, arraybuffer: e, uint8array: function(d) {
- return new Uint8Array(d);
- }, nodebuffer: function(d) {
- return C.newBufferFrom(new Uint8Array(d));
- } }, a.uint8array = { string: l, array: function(d) {
- return n(d, new Array(d.length));
- }, arraybuffer: function(d) {
- return d.buffer;
- }, uint8array: e, nodebuffer: function(d) {
- return C.newBufferFrom(d);
- } }, a.nodebuffer = { string: l, array: function(d) {
- return n(d, new Array(d.length));
- }, arraybuffer: function(d) {
- return a.nodebuffer.uint8array(d).buffer;
- }, uint8array: function(d) {
- return n(d, new Uint8Array(d.length));
- }, nodebuffer: e }, t.transformTo = function(d, o) {
- if (o || (o = ""), !d) return o;
- t.checkSupport(d);
- var c = t.getTypeOf(o);
- return a[c][d](o);
- }, t.resolve = function(d) {
- for (var o = d.split("/"), c = [], r = 0; r < o.length; r++) {
- var h = o[r];
- h === "." || h === "" && r !== 0 && r !== o.length - 1 || (h === ".." ? c.pop() : c.push(h));
- }
- return c.join("/");
- }, t.getTypeOf = function(d) {
- return typeof d == "string" ? "string" : Object.prototype.toString.call(d) === "[object Array]" ? "array" : I.nodebuffer && C.isBuffer(d) ? "nodebuffer" : I.uint8array && d instanceof Uint8Array ? "uint8array" : I.arraybuffer && d instanceof ArrayBuffer ? "arraybuffer" : void 0;
- }, t.checkSupport = function(d) {
- if (!I[d.toLowerCase()]) throw new Error(d + " is not supported by this platform");
- }, t.MAX_VALUE_16BITS = 65535, t.MAX_VALUE_32BITS = -1, t.pretty = function(d) {
- var o, c, r = "";
- for (c = 0; c < (d || "").length; c++) r += "\\x" + ((o = d.charCodeAt(c)) < 16 ? "0" : "") + o.toString(16).toUpperCase();
- return r;
- }, t.delay = function(d, o, c) {
- setImmediate(function() {
- d.apply(c || null, o || []);
- });
- }, t.inherits = function(d, o) {
- var c = function() {
- };
- c.prototype = o.prototype, d.prototype = new c();
- }, t.extend = function() {
- var d, o, c = {};
- for (d = 0; d < arguments.length; d++) for (o in arguments[d]) Object.prototype.hasOwnProperty.call(arguments[d], o) && c[o] === void 0 && (c[o] = arguments[d][o]);
- return c;
- }, t.prepareContent = function(d, o, c, r, h) {
- return i.Promise.resolve(o).then(function(b) {
- return I.blob && (b instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(b)) !== -1) && typeof FileReader < "u" ? new i.Promise(function(u, m) {
- var Z = new FileReader();
- Z.onload = function(p) {
- u(p.target.result);
- }, Z.onerror = function(p) {
- m(p.target.error);
- }, Z.readAsArrayBuffer(b);
- }) : b;
- }).then(function(b) {
- var u, m = t.getTypeOf(b);
- return m ? (m === "arraybuffer" ? b = t.transformTo("uint8array", b) : m === "string" && (h ? b = g.decode(b) : c && r !== !0 && (b = A(u = b, I.uint8array ? new Uint8Array(u.length) : new Array(u.length)))), b) : i.Promise.reject(new Error("Can't read the data of '" + d + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
- });
- };
- }(y8)), y8;
- }
- function LCg(t) {
- this.name = t || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
- }
- (function(t, I) {
- if (!t.setImmediate) {
- var g, C, i, e, A, s = 1, l = {}, n = !1, a = t.document, d = Object.getPrototypeOf && Object.getPrototypeOf(t);
- d = d && d.setTimeout ? d : t, {}.toString.call(t.process) === "[object process]" ? g = function(r) {
- vt(function() {
- c(r);
- });
- } : function() {
- if (t.postMessage && !t.importScripts) {
- var r = !0, h = t.onmessage;
- return t.onmessage = function() {
- r = !1;
- }, t.postMessage("", "*"), t.onmessage = h, r;
- }
- }() ? (e = "setImmediate$" + Math.random() + "$", A = function(r) {
- r.source === t && typeof r.data == "string" && r.data.indexOf(e) === 0 && c(+r.data.slice(e.length));
- }, t.addEventListener ? t.addEventListener("message", A, !1) : t.attachEvent("onmessage", A), g = function(r) {
- t.postMessage(e + r, "*");
- }) : t.MessageChannel ? ((i = new MessageChannel()).port1.onmessage = function(r) {
- c(r.data);
- }, g = function(r) {
- i.port2.postMessage(r);
- }) : a && "onreadystatechange" in a.createElement("script") ? (C = a.documentElement, g = function(r) {
- var h = a.createElement("script");
- h.onreadystatechange = function() {
- c(r), h.onreadystatechange = null, C.removeChild(h), h = null;
- }, C.appendChild(h);
- }) : g = function(r) {
- setTimeout(c, 0, r);
- }, d.setImmediate = function(r) {
- typeof r != "function" && (r = new Function("" + r));
- for (var h = new Array(arguments.length - 1), b = 0; b < h.length; b++) h[b] = arguments[b + 1];
- var u = { callback: r, args: h };
- return l[s] = u, g(s), s++;
- }, d.clearImmediate = o;
- }
- function o(r) {
- delete l[r];
- }
- function c(r) {
- if (n) setTimeout(c, 0, r);
- else {
- var h = l[r];
- if (h) {
- n = !0;
- try {
- (function(b) {
- var u = b.callback, m = b.args;
- switch (m.length) {
- case 0:
- u();
- break;
- case 1:
- u(m[0]);
- break;
- case 2:
- u(m[0], m[1]);
- break;
- case 3:
- u(m[0], m[1], m[2]);
- break;
- default:
- u.apply(void 0, m);
- }
- })(h);
- } finally {
- o(r), n = !1;
- }
- }
- }
- }
- })(typeof self > "u" ? oe : self), LCg.prototype = { push: function(t) {
- this.emit("data", t);
- }, end: function() {
- if (this.isFinished) return !1;
- this.flush();
- try {
- this.emit("end"), this.cleanUp(), this.isFinished = !0;
- } catch (t) {
- this.emit("error", t);
- }
- return !0;
- }, error: function(t) {
- return !this.isFinished && (this.isPaused ? this.generatedError = t : (this.isFinished = !0, this.emit("error", t), this.previous && this.previous.error(t), this.cleanUp()), !0);
- }, on: function(t, I) {
- return this._listeners[t].push(I), this;
- }, cleanUp: function() {
- this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
- }, emit: function(t, I) {
- if (this._listeners[t]) for (var g = 0; g < this._listeners[t].length; g++) this._listeners[t][g].call(this, I);
- }, pipe: function(t) {
- return t.registerPrevious(this);
- }, registerPrevious: function(t) {
- if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
- this.streamInfo = t.streamInfo, this.mergeStreamInfo(), this.previous = t;
- var I = this;
- return t.on("data", function(g) {
- I.processChunk(g);
- }), t.on("end", function() {
- I.end();
- }), t.on("error", function(g) {
- I.error(g);
- }), this;
- }, pause: function() {
- return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
- }, resume: function() {
- if (!this.isPaused || this.isFinished) return !1;
- this.isPaused = !1;
- var t = !1;
- return this.generatedError && (this.error(this.generatedError), t = !0), this.previous && this.previous.resume(), !t;
- }, flush: function() {
- }, processChunk: function(t) {
- this.push(t);
- }, withStreamInfo: function(t, I) {
- return this.extraStreamInfo[t] = I, this.mergeStreamInfo(), this;
- }, mergeStreamInfo: function() {
- for (var t in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, t) && (this.streamInfo[t] = this.extraStreamInfo[t]);
- }, lock: function() {
- if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
- this.isLocked = !0, this.previous && this.previous.lock();
- }, toString: function() {
- var t = "Worker " + this.name;
- return this.previous ? this.previous + " -> " + t : t;
- } };
- var eA = LCg;
- (function(t) {
- for (var I = gt(), g = rt, C = cM, i = eA, e = new Array(256), A = 0; A < 256; A++) e[A] = A >= 252 ? 6 : A >= 248 ? 5 : A >= 240 ? 4 : A >= 224 ? 3 : A >= 192 ? 2 : 1;
- e[254] = e[254] = 1;
- function s() {
- i.call(this, "utf-8 decode"), this.leftOver = null;
- }
- function l() {
- i.call(this, "utf-8 encode");
- }
- t.utf8encode = function(n) {
- return g.nodebuffer ? C.newBufferFrom(n, "utf-8") : function(a) {
- var d, o, c, r, h, b = a.length, u = 0;
- for (r = 0; r < b; r++) (64512 & (o = a.charCodeAt(r))) == 55296 && r + 1 < b && (64512 & (c = a.charCodeAt(r + 1))) == 56320 && (o = 65536 + (o - 55296 << 10) + (c - 56320), r++), u += o < 128 ? 1 : o < 2048 ? 2 : o < 65536 ? 3 : 4;
- for (d = g.uint8array ? new Uint8Array(u) : new Array(u), h = 0, r = 0; h < u; r++) (64512 & (o = a.charCodeAt(r))) == 55296 && r + 1 < b && (64512 & (c = a.charCodeAt(r + 1))) == 56320 && (o = 65536 + (o - 55296 << 10) + (c - 56320), r++), o < 128 ? d[h++] = o : o < 2048 ? (d[h++] = 192 | o >>> 6, d[h++] = 128 | 63 & o) : o < 65536 ? (d[h++] = 224 | o >>> 12, d[h++] = 128 | o >>> 6 & 63, d[h++] = 128 | 63 & o) : (d[h++] = 240 | o >>> 18, d[h++] = 128 | o >>> 12 & 63, d[h++] = 128 | o >>> 6 & 63, d[h++] = 128 | 63 & o);
- return d;
- }(n);
- }, t.utf8decode = function(n) {
- return g.nodebuffer ? I.transformTo("nodebuffer", n).toString("utf-8") : function(a) {
- var d, o, c, r, h = a.length, b = new Array(2 * h);
- for (o = 0, d = 0; d < h; ) if ((c = a[d++]) < 128) b[o++] = c;
- else if ((r = e[c]) > 4) b[o++] = 65533, d += r - 1;
- else {
- for (c &= r === 2 ? 31 : r === 3 ? 15 : 7; r > 1 && d < h; ) c = c << 6 | 63 & a[d++], r--;
- r > 1 ? b[o++] = 65533 : c < 65536 ? b[o++] = c : (c -= 65536, b[o++] = 55296 | c >> 10 & 1023, b[o++] = 56320 | 1023 & c);
- }
- return b.length !== o && (b.subarray ? b = b.subarray(0, o) : b.length = o), I.applyFromCharCode(b);
- }(n = I.transformTo(g.uint8array ? "uint8array" : "array", n));
- }, I.inherits(s, i), s.prototype.processChunk = function(n) {
- var a = I.transformTo(g.uint8array ? "uint8array" : "array", n.data);
- if (this.leftOver && this.leftOver.length) {
- if (g.uint8array) {
- var d = a;
- (a = new Uint8Array(d.length + this.leftOver.length)).set(this.leftOver, 0), a.set(d, this.leftOver.length);
- } else a = this.leftOver.concat(a);
- this.leftOver = null;
- }
- var o = function(r, h) {
- var b;
- for ((h = h || r.length) > r.length && (h = r.length), b = h - 1; b >= 0 && (192 & r[b]) == 128; ) b--;
- return b < 0 || b === 0 ? h : b + e[r[b]] > h ? b : h;
- }(a), c = a;
- o !== a.length && (g.uint8array ? (c = a.subarray(0, o), this.leftOver = a.subarray(o, a.length)) : (c = a.slice(0, o), this.leftOver = a.slice(o, a.length))), this.push({ data: t.utf8decode(c), meta: n.meta });
- }, s.prototype.flush = function() {
- this.leftOver && this.leftOver.length && (this.push({ data: t.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
- }, t.Utf8DecodeWorker = s, I.inherits(l, i), l.prototype.processChunk = function(n) {
- this.push({ data: t.utf8encode(n.data), meta: n.meta });
- }, t.Utf8EncodeWorker = l;
- })(M0);
- var vCg = eA, w_ = gt();
- function dD(t) {
- vCg.call(this, "ConvertWorker to " + t), this.destType = t;
- }
- w_.inherits(dD, vCg), dD.prototype.processChunk = function(t) {
- this.push({ data: w_.transformTo(this.destType, t.data), meta: t.meta });
- };
- var p_, B_, Dhg = dD, nd = gt(), Khg = Dhg, Fhg = eA, khg = zCg(), zhg = mG, TCg = null;
- if (rt.nodestream) try {
- TCg = function() {
- if (B_) return p_;
- B_ = 1;
- var t = kCg().Readable;
- function I(g, C, i) {
- t.call(this, C), this._helper = g;
- var e = this;
- g.on("data", function(A, s) {
- e.push(A) || e._helper.pause(), i && i(s);
- }).on("error", function(A) {
- e.emit("error", A);
- }).on("end", function() {
- e.push(null);
- });
- }
- return gt().inherits(I, t), I.prototype._read = function() {
- this._helper.resume();
- }, p_ = I;
- }();
- } catch {
- }
- function Jhg(t, I) {
- return new zhg.Promise(function(g, C) {
- var i = [], e = t._internalType, A = t._outputType, s = t._mimeType;
- t.on("data", function(l, n) {
- i.push(l), I && I(n);
- }).on("error", function(l) {
- i = [], C(l);
- }).on("end", function() {
- try {
- var l = function(n, a, d) {
- switch (n) {
- case "blob":
- return nd.newBlob(nd.transformTo("arraybuffer", a), d);
- case "base64":
- return khg.encode(a);
- default:
- return nd.transformTo(n, a);
- }
- }(A, function(n, a) {
- var d, o = 0, c = null, r = 0;
- for (d = 0; d < a.length; d++) r += a[d].length;
- switch (n) {
- case "string":
- return a.join("");
- case "array":
- return Array.prototype.concat.apply([], a);
- case "uint8array":
- for (c = new Uint8Array(r), d = 0; d < a.length; d++) c.set(a[d], o), o += a[d].length;
- return c;
- case "nodebuffer":
- return Hg.concat(a);
- default:
- throw new Error("concat : unsupported type '" + n + "'");
- }
- }(e, i), s);
- g(l);
- } catch (n) {
- C(n);
- }
- i = [];
- }).resume();
- });
- }
- function xCg(t, I, g) {
- var C = I;
- switch (I) {
- case "blob":
- case "arraybuffer":
- C = "uint8array";
- break;
- case "base64":
- C = "string";
- }
- try {
- this._internalType = C, this._outputType = I, this._mimeType = g, nd.checkSupport(C), this._worker = t.pipe(new Khg(C)), t.lock();
- } catch (i) {
- this._worker = new Fhg("error"), this._worker.error(i);
- }
- }
- xCg.prototype = { accumulate: function(t) {
- return Jhg(this, t);
- }, on: function(t, I) {
- var g = this;
- return t === "data" ? this._worker.on(t, function(C) {
- I.call(g, C.data, C.meta);
- }) : this._worker.on(t, function() {
- nd.delay(I, arguments, g);
- }), this;
- }, resume: function() {
- return nd.delay(this._worker.resume, [], this._worker), this;
- }, pause: function() {
- return this._worker.pause(), this;
- }, toNodejsStream: function(t) {
- if (nd.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
- return new TCg(this, { objectMode: this._outputType !== "nodebuffer" }, t);
- } };
- var jCg = xCg, QCg = { base64: !1, binary: !1, dir: !1, createFolders: !0, date: null, compression: null, compressionOptions: null, comment: null, unixPermissions: null, dosPermissions: null }, xN = gt(), jN = eA;
- function gh(t) {
- jN.call(this, "DataWorker");
- var I = this;
- this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, t.then(function(g) {
- I.dataIsReady = !0, I.data = g, I.max = g && g.length || 0, I.type = xN.getTypeOf(g), I.isPaused || I._tickAndRepeat();
- }, function(g) {
- I.error(g);
- });
- }
- xN.inherits(gh, jN), gh.prototype.cleanUp = function() {
- jN.prototype.cleanUp.call(this), this.data = null;
- }, gh.prototype.resume = function() {
- return !!jN.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, xN.delay(this._tickAndRepeat, [], this)), !0);
- }, gh.prototype._tickAndRepeat = function() {
- this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (xN.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
- }, gh.prototype._tick = function() {
- if (this.isPaused || this.isFinished) return !1;
- var t = null, I = Math.min(this.max, this.index + 16384);
- if (this.index >= this.max) return this.end();
- switch (this.type) {
- case "string":
- t = this.data.substring(this.index, I);
- break;
- case "uint8array":
- t = this.data.subarray(this.index, I);
- break;
- case "array":
- case "nodebuffer":
- t = this.data.slice(this.index, I);
- }
- return this.index = I, this.push({ data: t, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
- };
- var OCg = gh, Lhg = gt(), W_ = function() {
- for (var t, I = [], g = 0; g < 256; g++) {
- t = g;
- for (var C = 0; C < 8; C++) t = 1 & t ? 3988292384 ^ t >>> 1 : t >>> 1;
- I[g] = t;
- }
- return I;
- }(), J9 = function(t, I) {
- return t !== void 0 && t.length ? Lhg.getTypeOf(t) !== "string" ? function(g, C, i, e) {
- var A = W_, s = e + i;
- g ^= -1;
- for (var l = e; l < s; l++) g = g >>> 8 ^ A[255 & (g ^ C[l])];
- return -1 ^ g;
- }(0 | I, t, t.length, 0) : function(g, C, i, e) {
- var A = W_, s = e + i;
- g ^= -1;
- for (var l = e; l < s; l++) g = g >>> 8 ^ A[255 & (g ^ C.charCodeAt(l))];
- return -1 ^ g;
- }(0 | I, t, t.length, 0) : 0;
- }, UCg = eA, vhg = J9;
- function rD() {
- UCg.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
- }
- gt().inherits(rD, UCg), rD.prototype.processChunk = function(t) {
- this.streamInfo.crc32 = vhg(t.data, this.streamInfo.crc32 || 0), this.push(t);
- };
- var ECg = rD, Thg = gt(), hD = eA;
- function bD(t) {
- hD.call(this, "DataLengthProbe for " + t), this.propName = t, this.withStreamInfo(t, 0);
- }
- Thg.inherits(bD, hD), bD.prototype.processChunk = function(t) {
- if (t) {
- var I = this.streamInfo[this.propName] || 0;
- this.streamInfo[this.propName] = I + t.data.length;
- }
- hD.prototype.processChunk.call(this, t);
- };
- var y_ = mG, Y_ = OCg, xhg = ECg, bX = bD;
- function uD(t, I, g, C, i) {
- this.compressedSize = t, this.uncompressedSize = I, this.crc32 = g, this.compression = C, this.compressedContent = i;
- }
- uD.prototype = { getContentWorker: function() {
- var t = new Y_(y_.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new bX("data_length")), I = this;
- return t.on("end", function() {
- if (this.streamInfo.data_length !== I.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
- }), t;
- }, getCompressedWorker: function() {
- return new Y_(y_.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
- } }, uD.createWorkerFrom = function(t, I, g) {
- return t.pipe(new xhg()).pipe(new bX("uncompressedSize")).pipe(I.compressWorker(g)).pipe(new bX("compressedSize")).withStreamInfo("compression", I);
- };
- var L9 = uD, jhg = jCg, Qhg = OCg, uX = M0, mX = L9, N_ = eA, v9 = function(t, I, g) {
- this.name = t, this.dir = g.dir, this.date = g.date, this.comment = g.comment, this.unixPermissions = g.unixPermissions, this.dosPermissions = g.dosPermissions, this._data = I, this._dataBinary = g.binary, this.options = { compression: g.compression, compressionOptions: g.compressionOptions };
- };
- v9.prototype = { internalStream: function(t) {
- var I = null, g = "string";
- try {
- if (!t) throw new Error("No output type specified.");
- var C = (g = t.toLowerCase()) === "string" || g === "text";
- g !== "binarystring" && g !== "text" || (g = "string"), I = this._decompressWorker();
- var i = !this._dataBinary;
- i && !C && (I = I.pipe(new uX.Utf8EncodeWorker())), !i && C && (I = I.pipe(new uX.Utf8DecodeWorker()));
- } catch (e) {
- (I = new N_("error")).error(e);
- }
- return new jhg(I, g, "");
- }, async: function(t, I) {
- return this.internalStream(t).accumulate(I);
- }, nodeStream: function(t, I) {
- return this.internalStream(t || "nodebuffer").toNodejsStream(I);
- }, _compressWorker: function(t, I) {
- if (this._data instanceof mX && this._data.compression.magic === t.magic) return this._data.getCompressedWorker();
- var g = this._decompressWorker();
- return this._dataBinary || (g = g.pipe(new uX.Utf8EncodeWorker())), mX.createWorkerFrom(g, t, I);
- }, _decompressWorker: function() {
- return this._data instanceof mX ? this._data.getContentWorker() : this._data instanceof N_ ? this._data : new Qhg(this._data);
- } };
- for (var V_ = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], Ohg = function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, ZX = 0; ZX < V_.length; ZX++) v9.prototype[V_[ZX]] = Ohg;
- var Uhg = v9, PCg = {}, uV = {}, QN = {}, tn = {};
- (function(t) {
- var I = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
- function g(e, A) {
- return Object.prototype.hasOwnProperty.call(e, A);
- }
- t.assign = function(e) {
- for (var A = Array.prototype.slice.call(arguments, 1); A.length; ) {
- var s = A.shift();
- if (s) {
- if (typeof s != "object") throw new TypeError(s + "must be non-object");
- for (var l in s) g(s, l) && (e[l] = s[l]);
- }
- }
- return e;
- }, t.shrinkBuf = function(e, A) {
- return e.length === A ? e : e.subarray ? e.subarray(0, A) : (e.length = A, e);
- };
- var C = { arraySet: function(e, A, s, l, n) {
- if (A.subarray && e.subarray) e.set(A.subarray(s, s + l), n);
- else for (var a = 0; a < l; a++) e[n + a] = A[s + a];
- }, flattenChunks: function(e) {
- var A, s, l, n, a, d;
- for (l = 0, A = 0, s = e.length; A < s; A++) l += e[A].length;
- for (d = new Uint8Array(l), n = 0, A = 0, s = e.length; A < s; A++) a = e[A], d.set(a, n), n += a.length;
- return d;
- } }, i = { arraySet: function(e, A, s, l, n) {
- for (var a = 0; a < l; a++) e[n + a] = A[s + a];
- }, flattenChunks: function(e) {
- return [].concat.apply([], e);
- } };
- t.setTyped = function(e) {
- e ? (t.Buf8 = Uint8Array, t.Buf16 = Uint16Array, t.Buf32 = Int32Array, t.assign(t, C)) : (t.Buf8 = Array, t.Buf16 = Array, t.Buf32 = Array, t.assign(t, i));
- }, t.setTyped(I);
- })(tn);
- var em = {}, rs = {}, Ih = {}, Ehg = tn;
- function R0(t) {
- for (var I = t.length; --I >= 0; ) t[I] = 0;
- }
- var mD = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], ON = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], Phg = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], M_ = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], bl = new Array(576);
- R0(bl);
- var Am = new Array(60);
- R0(Am);
- var Hm = new Array(512);
- R0(Hm);
- var ym = new Array(256);
- R0(ym);
- var T9 = new Array(29);
- R0(T9);
- var R_, f_, H_, mV = new Array(30);
- function GX(t, I, g, C, i) {
- this.static_tree = t, this.extra_bits = I, this.extra_base = g, this.elems = C, this.max_length = i, this.has_stree = t && t.length;
- }
- function wX(t, I) {
- this.dyn_tree = t, this.max_code = 0, this.stat_desc = I;
- }
- function _Cg(t) {
- return t < 256 ? Hm[t] : Hm[256 + (t >>> 7)];
- }
- function Xm(t, I) {
- t.pending_buf[t.pending++] = 255 & I, t.pending_buf[t.pending++] = I >>> 8 & 255;
- }
- function Pi(t, I, g) {
- t.bi_valid > 16 - g ? (t.bi_buf |= I << t.bi_valid & 65535, Xm(t, t.bi_buf), t.bi_buf = I >> 16 - t.bi_valid, t.bi_valid += g - 16) : (t.bi_buf |= I << t.bi_valid & 65535, t.bi_valid += g);
- }
- function Ds(t, I, g) {
- Pi(t, g[2 * I], g[2 * I + 1]);
- }
- function qCg(t, I) {
- var g = 0;
- do
- g |= 1 & t, t >>>= 1, g <<= 1;
- while (--I > 0);
- return g >>> 1;
- }
- function $Cg(t, I, g) {
- var C, i, e = new Array(16), A = 0;
- for (C = 1; C <= 15; C++) e[C] = A = A + g[C - 1] << 1;
- for (i = 0; i <= I; i++) {
- var s = t[2 * i + 1];
- s !== 0 && (t[2 * i] = qCg(e[s]++, s));
- }
- }
- function X_(t) {
- var I;
- for (I = 0; I < 286; I++) t.dyn_ltree[2 * I] = 0;
- for (I = 0; I < 30; I++) t.dyn_dtree[2 * I] = 0;
- for (I = 0; I < 19; I++) t.bl_tree[2 * I] = 0;
- t.dyn_ltree[512] = 1, t.opt_len = t.static_len = 0, t.last_lit = t.matches = 0;
- }
- function gtg(t) {
- t.bi_valid > 8 ? Xm(t, t.bi_buf) : t.bi_valid > 0 && (t.pending_buf[t.pending++] = t.bi_buf), t.bi_buf = 0, t.bi_valid = 0;
- }
- function S_(t, I, g, C) {
- var i = 2 * I, e = 2 * g;
- return t[i] < t[e] || t[i] === t[e] && C[I] <= C[g];
- }
- function pX(t, I, g) {
- for (var C = t.heap[g], i = g << 1; i <= t.heap_len && (i < t.heap_len && S_(I, t.heap[i + 1], t.heap[i], t.depth) && i++, !S_(I, C, t.heap[i], t.depth)); ) t.heap[g] = t.heap[i], g = i, i <<= 1;
- t.heap[g] = C;
- }
- function D_(t, I, g) {
- var C, i, e, A, s = 0;
- if (t.last_lit !== 0) do
- C = t.pending_buf[t.d_buf + 2 * s] << 8 | t.pending_buf[t.d_buf + 2 * s + 1], i = t.pending_buf[t.l_buf + s], s++, C === 0 ? Ds(t, i, I) : (Ds(t, (e = ym[i]) + 256 + 1, I), (A = mD[e]) !== 0 && Pi(t, i -= T9[e], A), Ds(t, e = _Cg(--C), g), (A = ON[e]) !== 0 && Pi(t, C -= mV[e], A));
- while (s < t.last_lit);
- Ds(t, 256, I);
- }
- function BX(t, I) {
- var g, C, i, e = I.dyn_tree, A = I.stat_desc.static_tree, s = I.stat_desc.has_stree, l = I.stat_desc.elems, n = -1;
- for (t.heap_len = 0, t.heap_max = 573, g = 0; g < l; g++) e[2 * g] !== 0 ? (t.heap[++t.heap_len] = n = g, t.depth[g] = 0) : e[2 * g + 1] = 0;
- for (; t.heap_len < 2; ) e[2 * (i = t.heap[++t.heap_len] = n < 2 ? ++n : 0)] = 1, t.depth[i] = 0, t.opt_len--, s && (t.static_len -= A[2 * i + 1]);
- for (I.max_code = n, g = t.heap_len >> 1; g >= 1; g--) pX(t, e, g);
- i = l;
- do
- g = t.heap[1], t.heap[1] = t.heap[t.heap_len--], pX(t, e, 1), C = t.heap[1], t.heap[--t.heap_max] = g, t.heap[--t.heap_max] = C, e[2 * i] = e[2 * g] + e[2 * C], t.depth[i] = (t.depth[g] >= t.depth[C] ? t.depth[g] : t.depth[C]) + 1, e[2 * g + 1] = e[2 * C + 1] = i, t.heap[1] = i++, pX(t, e, 1);
- while (t.heap_len >= 2);
- t.heap[--t.heap_max] = t.heap[1], function(a, d) {
- var o, c, r, h, b, u, m = d.dyn_tree, Z = d.max_code, p = d.stat_desc.static_tree, Y = d.stat_desc.has_stree, R = d.stat_desc.extra_bits, X = d.stat_desc.extra_base, H = d.stat_desc.max_length, S = 0;
- for (h = 0; h <= 15; h++) a.bl_count[h] = 0;
- for (m[2 * a.heap[a.heap_max] + 1] = 0, o = a.heap_max + 1; o < 573; o++) (h = m[2 * m[2 * (c = a.heap[o]) + 1] + 1] + 1) > H && (h = H, S++), m[2 * c + 1] = h, c > Z || (a.bl_count[h]++, b = 0, c >= X && (b = R[c - X]), u = m[2 * c], a.opt_len += u * (h + b), Y && (a.static_len += u * (p[2 * c + 1] + b)));
- if (S !== 0) {
- do {
- for (h = H - 1; a.bl_count[h] === 0; ) h--;
- a.bl_count[h]--, a.bl_count[h + 1] += 2, a.bl_count[H]--, S -= 2;
- } while (S > 0);
- for (h = H; h !== 0; h--) for (c = a.bl_count[h]; c !== 0; ) (r = a.heap[--o]) > Z || (m[2 * r + 1] !== h && (a.opt_len += (h - m[2 * r + 1]) * m[2 * r], m[2 * r + 1] = h), c--);
- }
- }(t, I), $Cg(e, n, t.bl_count);
- }
- function K_(t, I, g) {
- var C, i, e = -1, A = I[1], s = 0, l = 7, n = 4;
- for (A === 0 && (l = 138, n = 3), I[2 * (g + 1) + 1] = 65535, C = 0; C <= g; C++) i = A, A = I[2 * (C + 1) + 1], ++s < l && i === A || (s < n ? t.bl_tree[2 * i] += s : i !== 0 ? (i !== e && t.bl_tree[2 * i]++, t.bl_tree[32]++) : s <= 10 ? t.bl_tree[34]++ : t.bl_tree[36]++, s = 0, e = i, A === 0 ? (l = 138, n = 3) : i === A ? (l = 6, n = 3) : (l = 7, n = 4));
- }
- function F_(t, I, g) {
- var C, i, e = -1, A = I[1], s = 0, l = 7, n = 4;
- for (A === 0 && (l = 138, n = 3), C = 0; C <= g; C++) if (i = A, A = I[2 * (C + 1) + 1], !(++s < l && i === A)) {
- if (s < n) do
- Ds(t, i, t.bl_tree);
- while (--s != 0);
- else i !== 0 ? (i !== e && (Ds(t, i, t.bl_tree), s--), Ds(t, 16, t.bl_tree), Pi(t, s - 3, 2)) : s <= 10 ? (Ds(t, 17, t.bl_tree), Pi(t, s - 3, 3)) : (Ds(t, 18, t.bl_tree), Pi(t, s - 11, 7));
- s = 0, e = i, A === 0 ? (l = 138, n = 3) : i === A ? (l = 6, n = 3) : (l = 7, n = 4);
- }
- }
- R0(mV);
- var k_ = !1;
- function z_(t, I, g, C) {
- Pi(t, 0 + (C ? 1 : 0), 3), function(i, e, A, s) {
- gtg(i), Xm(i, A), Xm(i, ~A), Ehg.arraySet(i.pending_buf, i.window, e, A, i.pending), i.pending += A;
- }(t, I, g);
- }
- Ih._tr_init = function(t) {
- k_ || (function() {
- var I, g, C, i, e, A = new Array(16);
- for (C = 0, i = 0; i < 28; i++) for (T9[i] = C, I = 0; I < 1 << mD[i]; I++) ym[C++] = i;
- for (ym[C - 1] = i, e = 0, i = 0; i < 16; i++) for (mV[i] = e, I = 0; I < 1 << ON[i]; I++) Hm[e++] = i;
- for (e >>= 7; i < 30; i++) for (mV[i] = e << 7, I = 0; I < 1 << ON[i] - 7; I++) Hm[256 + e++] = i;
- for (g = 0; g <= 15; g++) A[g] = 0;
- for (I = 0; I <= 143; ) bl[2 * I + 1] = 8, I++, A[8]++;
- for (; I <= 255; ) bl[2 * I + 1] = 9, I++, A[9]++;
- for (; I <= 279; ) bl[2 * I + 1] = 7, I++, A[7]++;
- for (; I <= 287; ) bl[2 * I + 1] = 8, I++, A[8]++;
- for ($Cg(bl, 287, A), I = 0; I < 30; I++) Am[2 * I + 1] = 5, Am[2 * I] = qCg(I, 5);
- R_ = new GX(bl, mD, 257, 286, 15), f_ = new GX(Am, ON, 0, 30, 15), H_ = new GX(new Array(0), Phg, 0, 19, 7);
- }(), k_ = !0), t.l_desc = new wX(t.dyn_ltree, R_), t.d_desc = new wX(t.dyn_dtree, f_), t.bl_desc = new wX(t.bl_tree, H_), t.bi_buf = 0, t.bi_valid = 0, X_(t);
- }, Ih._tr_stored_block = z_, Ih._tr_flush_block = function(t, I, g, C) {
- var i, e, A = 0;
- t.level > 0 ? (t.strm.data_type === 2 && (t.strm.data_type = function(s) {
- var l, n = 4093624447;
- for (l = 0; l <= 31; l++, n >>>= 1) if (1 & n && s.dyn_ltree[2 * l] !== 0) return 0;
- if (s.dyn_ltree[18] !== 0 || s.dyn_ltree[20] !== 0 || s.dyn_ltree[26] !== 0) return 1;
- for (l = 32; l < 256; l++) if (s.dyn_ltree[2 * l] !== 0) return 1;
- return 0;
- }(t)), BX(t, t.l_desc), BX(t, t.d_desc), A = function(s) {
- var l;
- for (K_(s, s.dyn_ltree, s.l_desc.max_code), K_(s, s.dyn_dtree, s.d_desc.max_code), BX(s, s.bl_desc), l = 18; l >= 3 && s.bl_tree[2 * M_[l] + 1] === 0; l--) ;
- return s.opt_len += 3 * (l + 1) + 5 + 5 + 4, l;
- }(t), i = t.opt_len + 3 + 7 >>> 3, (e = t.static_len + 3 + 7 >>> 3) <= i && (i = e)) : i = e = g + 5, g + 4 <= i && I !== -1 ? z_(t, I, g, C) : t.strategy === 4 || e === i ? (Pi(t, 2 + (C ? 1 : 0), 3), D_(t, bl, Am)) : (Pi(t, 4 + (C ? 1 : 0), 3), function(s, l, n, a) {
- var d;
- for (Pi(s, l - 257, 5), Pi(s, n - 1, 5), Pi(s, a - 4, 4), d = 0; d < a; d++) Pi(s, s.bl_tree[2 * M_[d] + 1], 3);
- F_(s, s.dyn_ltree, l - 1), F_(s, s.dyn_dtree, n - 1);
- }(t, t.l_desc.max_code + 1, t.d_desc.max_code + 1, A + 1), D_(t, t.dyn_ltree, t.dyn_dtree)), X_(t), C && gtg(t);
- }, Ih._tr_tally = function(t, I, g) {
- return t.pending_buf[t.d_buf + 2 * t.last_lit] = I >>> 8 & 255, t.pending_buf[t.d_buf + 2 * t.last_lit + 1] = 255 & I, t.pending_buf[t.l_buf + t.last_lit] = 255 & g, t.last_lit++, I === 0 ? t.dyn_ltree[2 * g]++ : (t.matches++, I--, t.dyn_ltree[2 * (ym[g] + 256 + 1)]++, t.dyn_dtree[2 * _Cg(I)]++), t.last_lit === t.lit_bufsize - 1;
- }, Ih._tr_align = function(t) {
- Pi(t, 2, 3), Ds(t, 256, bl), function(I) {
- I.bi_valid === 16 ? (Xm(I, I.bi_buf), I.bi_buf = 0, I.bi_valid = 0) : I.bi_valid >= 8 && (I.pending_buf[I.pending++] = 255 & I.bi_buf, I.bi_buf >>= 8, I.bi_valid -= 8);
- }(t);
- };
- var Itg = function(t, I, g, C) {
- for (var i = 65535 & t | 0, e = t >>> 16 & 65535 | 0, A = 0; g !== 0; ) {
- g -= A = g > 2e3 ? 2e3 : g;
- do
- e = e + (i = i + I[C++] | 0) | 0;
- while (--A);
- i %= 65521, e %= 65521;
- }
- return i | e << 16 | 0;
- }, _hg = function() {
- for (var t, I = [], g = 0; g < 256; g++) {
- t = g;
- for (var C = 0; C < 8; C++) t = 1 & t ? 3988292384 ^ t >>> 1 : t >>> 1;
- I[g] = t;
- }
- return I;
- }(), Ah, Ctg = function(t, I, g, C) {
- var i = _hg, e = C + g;
- t ^= -1;
- for (var A = C; A < e; A++) t = t >>> 8 ^ i[255 & (t ^ I[A])];
- return -1 ^ t;
- }, x9 = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" }, Hi = tn, IA = Ih, ttg = Itg, ta = Ctg, qhg = x9;
- function Aa(t, I) {
- return t.msg = qhg[I], I;
- }
- function J_(t) {
- return (t << 1) - (t > 4 ? 9 : 0);
- }
- function na(t) {
- for (var I = t.length; --I >= 0; ) t[I] = 0;
- }
- function ia(t) {
- var I = t.state, g = I.pending;
- g > t.avail_out && (g = t.avail_out), g !== 0 && (Hi.arraySet(t.output, I.pending_buf, I.pending_out, g, t.next_out), t.next_out += g, I.pending_out += g, t.total_out += g, t.avail_out -= g, I.pending -= g, I.pending === 0 && (I.pending_out = 0));
- }
- function Ii(t, I) {
- IA._tr_flush_block(t, t.block_start >= 0 ? t.block_start : -1, t.strstart - t.block_start, I), t.block_start = t.strstart, ia(t.strm);
- }
- function oC(t, I) {
- t.pending_buf[t.pending++] = I;
- }
- function ku(t, I) {
- t.pending_buf[t.pending++] = I >>> 8 & 255, t.pending_buf[t.pending++] = 255 & I;
- }
- function itg(t, I) {
- var g, C, i = t.max_chain_length, e = t.strstart, A = t.prev_length, s = t.nice_match, l = t.strstart > t.w_size - 262 ? t.strstart - (t.w_size - 262) : 0, n = t.window, a = t.w_mask, d = t.prev, o = t.strstart + 258, c = n[e + A - 1], r = n[e + A];
- t.prev_length >= t.good_match && (i >>= 2), s > t.lookahead && (s = t.lookahead);
- do
- if (n[(g = I) + A] === r && n[g + A - 1] === c && n[g] === n[e] && n[++g] === n[e + 1]) {
- e += 2, g++;
- do
- ;
- while (n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && e < o);
- if (C = 258 - (o - e), e = o - 258, C > A) {
- if (t.match_start = I, A = C, C >= s) break;
- c = n[e + A - 1], r = n[e + A];
- }
- }
- while ((I = d[I & a]) > l && --i != 0);
- return A <= t.lookahead ? A : t.lookahead;
- }
- function Oo(t) {
- var I, g, C, i, e, A, s, l, n, a, d = t.w_size;
- do {
- if (i = t.window_size - t.lookahead - t.strstart, t.strstart >= d + (d - 262)) {
- Hi.arraySet(t.window, t.window, d, d, 0), t.match_start -= d, t.strstart -= d, t.block_start -= d, I = g = t.hash_size;
- do
- C = t.head[--I], t.head[I] = C >= d ? C - d : 0;
- while (--g);
- I = g = d;
- do
- C = t.prev[--I], t.prev[I] = C >= d ? C - d : 0;
- while (--g);
- i += d;
- }
- if (t.strm.avail_in === 0) break;
- if (A = t.strm, s = t.window, l = t.strstart + t.lookahead, n = i, a = void 0, (a = A.avail_in) > n && (a = n), g = a === 0 ? 0 : (A.avail_in -= a, Hi.arraySet(s, A.input, A.next_in, a, l), A.state.wrap === 1 ? A.adler = ttg(A.adler, s, a, l) : A.state.wrap === 2 && (A.adler = ta(A.adler, s, a, l)), A.next_in += a, A.total_in += a, a), t.lookahead += g, t.lookahead + t.insert >= 3) for (e = t.strstart - t.insert, t.ins_h = t.window[e], t.ins_h = (t.ins_h << t.hash_shift ^ t.window[e + 1]) & t.hash_mask; t.insert && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[e + 3 - 1]) & t.hash_mask, t.prev[e & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = e, e++, t.insert--, !(t.lookahead + t.insert < 3)); ) ;
- } while (t.lookahead < 262 && t.strm.avail_in !== 0);
- }
- function WX(t, I) {
- for (var g, C; ; ) {
- if (t.lookahead < 262) {
- if (Oo(t), t.lookahead < 262 && I === 0) return 1;
- if (t.lookahead === 0) break;
- }
- if (g = 0, t.lookahead >= 3 && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), g !== 0 && t.strstart - g <= t.w_size - 262 && (t.match_length = itg(t, g)), t.match_length >= 3) if (C = IA._tr_tally(t, t.strstart - t.match_start, t.match_length - 3), t.lookahead -= t.match_length, t.match_length <= t.max_lazy_match && t.lookahead >= 3) {
- t.match_length--;
- do
- t.strstart++, t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart;
- while (--t.match_length != 0);
- t.strstart++;
- } else t.strstart += t.match_length, t.match_length = 0, t.ins_h = t.window[t.strstart], t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 1]) & t.hash_mask;
- else C = IA._tr_tally(t, 0, t.window[t.strstart]), t.lookahead--, t.strstart++;
- if (C && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
- }
- return t.insert = t.strstart < 2 ? t.strstart : 2, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : t.last_lit && (Ii(t, !1), t.strm.avail_out === 0) ? 1 : 2;
- }
- function kr(t, I) {
- for (var g, C, i; ; ) {
- if (t.lookahead < 262) {
- if (Oo(t), t.lookahead < 262 && I === 0) return 1;
- if (t.lookahead === 0) break;
- }
- if (g = 0, t.lookahead >= 3 && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), t.prev_length = t.match_length, t.prev_match = t.match_start, t.match_length = 2, g !== 0 && t.prev_length < t.max_lazy_match && t.strstart - g <= t.w_size - 262 && (t.match_length = itg(t, g), t.match_length <= 5 && (t.strategy === 1 || t.match_length === 3 && t.strstart - t.match_start > 4096) && (t.match_length = 2)), t.prev_length >= 3 && t.match_length <= t.prev_length) {
- i = t.strstart + t.lookahead - 3, C = IA._tr_tally(t, t.strstart - 1 - t.prev_match, t.prev_length - 3), t.lookahead -= t.prev_length - 1, t.prev_length -= 2;
- do
- ++t.strstart <= i && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart);
- while (--t.prev_length != 0);
- if (t.match_available = 0, t.match_length = 2, t.strstart++, C && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
- } else if (t.match_available) {
- if ((C = IA._tr_tally(t, 0, t.window[t.strstart - 1])) && Ii(t, !1), t.strstart++, t.lookahead--, t.strm.avail_out === 0) return 1;
- } else t.match_available = 1, t.strstart++, t.lookahead--;
- }
- return t.match_available && (C = IA._tr_tally(t, 0, t.window[t.strstart - 1]), t.match_available = 0), t.insert = t.strstart < 2 ? t.strstart : 2, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : t.last_lit && (Ii(t, !1), t.strm.avail_out === 0) ? 1 : 2;
- }
- function ns(t, I, g, C, i) {
- this.good_length = t, this.max_lazy = I, this.nice_length = g, this.max_chain = C, this.func = i;
- }
- function $hg() {
- this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new Hi.Buf16(1146), this.dyn_dtree = new Hi.Buf16(122), this.bl_tree = new Hi.Buf16(78), na(this.dyn_ltree), na(this.dyn_dtree), na(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new Hi.Buf16(16), this.heap = new Hi.Buf16(573), na(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new Hi.Buf16(573), na(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
- }
- function etg(t) {
- var I;
- return t && t.state ? (t.total_in = t.total_out = 0, t.data_type = 2, (I = t.state).pending = 0, I.pending_out = 0, I.wrap < 0 && (I.wrap = -I.wrap), I.status = I.wrap ? 42 : 113, t.adler = I.wrap === 2 ? 0 : 1, I.last_flush = 0, IA._tr_init(I), 0) : Aa(t, -2);
- }
- function Atg(t) {
- var I, g = etg(t);
- return g === 0 && ((I = t.state).window_size = 2 * I.w_size, na(I.head), I.max_lazy_match = Ah[I.level].max_lazy, I.good_match = Ah[I.level].good_length, I.nice_match = Ah[I.level].nice_length, I.max_chain_length = Ah[I.level].max_chain, I.strstart = 0, I.block_start = 0, I.lookahead = 0, I.insert = 0, I.match_length = I.prev_length = 2, I.match_available = 0, I.ins_h = 0), g;
- }
- function L_(t, I, g, C, i, e) {
- if (!t) return -2;
- var A = 1;
- if (I === -1 && (I = 6), C < 0 ? (A = 0, C = -C) : C > 15 && (A = 2, C -= 16), i < 1 || i > 9 || g !== 8 || C < 8 || C > 15 || I < 0 || I > 9 || e < 0 || e > 4) return Aa(t, -2);
- C === 8 && (C = 9);
- var s = new $hg();
- return t.state = s, s.strm = t, s.wrap = A, s.gzhead = null, s.w_bits = C, s.w_size = 1 << s.w_bits, s.w_mask = s.w_size - 1, s.hash_bits = i + 7, s.hash_size = 1 << s.hash_bits, s.hash_mask = s.hash_size - 1, s.hash_shift = ~~((s.hash_bits + 3 - 1) / 3), s.window = new Hi.Buf8(2 * s.w_size), s.head = new Hi.Buf16(s.hash_size), s.prev = new Hi.Buf16(s.w_size), s.lit_bufsize = 1 << i + 6, s.pending_buf_size = 4 * s.lit_bufsize, s.pending_buf = new Hi.Buf8(s.pending_buf_size), s.d_buf = 1 * s.lit_bufsize, s.l_buf = 3 * s.lit_bufsize, s.level = I, s.strategy = e, s.method = g, Atg(t);
- }
- Ah = [new ns(0, 0, 0, 0, function(t, I) {
- var g = 65535;
- for (g > t.pending_buf_size - 5 && (g = t.pending_buf_size - 5); ; ) {
- if (t.lookahead <= 1) {
- if (Oo(t), t.lookahead === 0 && I === 0) return 1;
- if (t.lookahead === 0) break;
- }
- t.strstart += t.lookahead, t.lookahead = 0;
- var C = t.block_start + g;
- if ((t.strstart === 0 || t.strstart >= C) && (t.lookahead = t.strstart - C, t.strstart = C, Ii(t, !1), t.strm.avail_out === 0) || t.strstart - t.block_start >= t.w_size - 262 && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
- }
- return t.insert = 0, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : (t.strstart > t.block_start && (Ii(t, !1), t.strm.avail_out), 1);
- }), new ns(4, 4, 8, 4, WX), new ns(4, 5, 16, 8, WX), new ns(4, 6, 32, 32, WX), new ns(4, 4, 16, 16, kr), new ns(8, 16, 32, 32, kr), new ns(8, 16, 128, 128, kr), new ns(8, 32, 128, 256, kr), new ns(32, 128, 258, 1024, kr), new ns(32, 258, 258, 4096, kr)], rs.deflateInit = function(t, I) {
- return L_(t, I, 8, 15, 8, 0);
- }, rs.deflateInit2 = L_, rs.deflateReset = Atg, rs.deflateResetKeep = etg, rs.deflateSetHeader = function(t, I) {
- return t && t.state ? t.state.wrap !== 2 ? -2 : (t.state.gzhead = I, 0) : -2;
- }, rs.deflate = function(t, I) {
- var g, C, i, e;
- if (!t || !t.state || I > 5 || I < 0) return t ? Aa(t, -2) : -2;
- if (C = t.state, !t.output || !t.input && t.avail_in !== 0 || C.status === 666 && I !== 4) return Aa(t, t.avail_out === 0 ? -5 : -2);
- if (C.strm = t, g = C.last_flush, C.last_flush = I, C.status === 42) if (C.wrap === 2) t.adler = 0, oC(C, 31), oC(C, 139), oC(C, 8), C.gzhead ? (oC(C, (C.gzhead.text ? 1 : 0) + (C.gzhead.hcrc ? 2 : 0) + (C.gzhead.extra ? 4 : 0) + (C.gzhead.name ? 8 : 0) + (C.gzhead.comment ? 16 : 0)), oC(C, 255 & C.gzhead.time), oC(C, C.gzhead.time >> 8 & 255), oC(C, C.gzhead.time >> 16 & 255), oC(C, C.gzhead.time >> 24 & 255), oC(C, C.level === 9 ? 2 : C.strategy >= 2 || C.level < 2 ? 4 : 0), oC(C, 255 & C.gzhead.os), C.gzhead.extra && C.gzhead.extra.length && (oC(C, 255 & C.gzhead.extra.length), oC(C, C.gzhead.extra.length >> 8 & 255)), C.gzhead.hcrc && (t.adler = ta(t.adler, C.pending_buf, C.pending, 0)), C.gzindex = 0, C.status = 69) : (oC(C, 0), oC(C, 0), oC(C, 0), oC(C, 0), oC(C, 0), oC(C, C.level === 9 ? 2 : C.strategy >= 2 || C.level < 2 ? 4 : 0), oC(C, 3), C.status = 113);
- else {
- var A = 8 + (C.w_bits - 8 << 4) << 8;
- A |= (C.strategy >= 2 || C.level < 2 ? 0 : C.level < 6 ? 1 : C.level === 6 ? 2 : 3) << 6, C.strstart !== 0 && (A |= 32), A += 31 - A % 31, C.status = 113, ku(C, A), C.strstart !== 0 && (ku(C, t.adler >>> 16), ku(C, 65535 & t.adler)), t.adler = 1;
- }
- if (C.status === 69) if (C.gzhead.extra) {
- for (i = C.pending; C.gzindex < (65535 & C.gzhead.extra.length) && (C.pending !== C.pending_buf_size || (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending !== C.pending_buf_size)); ) oC(C, 255 & C.gzhead.extra[C.gzindex]), C.gzindex++;
- C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), C.gzindex === C.gzhead.extra.length && (C.gzindex = 0, C.status = 73);
- } else C.status = 73;
- if (C.status === 73) if (C.gzhead.name) {
- i = C.pending;
- do {
- if (C.pending === C.pending_buf_size && (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending === C.pending_buf_size)) {
- e = 1;
- break;
- }
- e = C.gzindex < C.gzhead.name.length ? 255 & C.gzhead.name.charCodeAt(C.gzindex++) : 0, oC(C, e);
- } while (e !== 0);
- C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), e === 0 && (C.gzindex = 0, C.status = 91);
- } else C.status = 91;
- if (C.status === 91) if (C.gzhead.comment) {
- i = C.pending;
- do {
- if (C.pending === C.pending_buf_size && (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending === C.pending_buf_size)) {
- e = 1;
- break;
- }
- e = C.gzindex < C.gzhead.comment.length ? 255 & C.gzhead.comment.charCodeAt(C.gzindex++) : 0, oC(C, e);
- } while (e !== 0);
- C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), e === 0 && (C.status = 103);
- } else C.status = 103;
- if (C.status === 103 && (C.gzhead.hcrc ? (C.pending + 2 > C.pending_buf_size && ia(t), C.pending + 2 <= C.pending_buf_size && (oC(C, 255 & t.adler), oC(C, t.adler >> 8 & 255), t.adler = 0, C.status = 113)) : C.status = 113), C.pending !== 0) {
- if (ia(t), t.avail_out === 0) return C.last_flush = -1, 0;
- } else if (t.avail_in === 0 && J_(I) <= J_(g) && I !== 4) return Aa(t, -5);
- if (C.status === 666 && t.avail_in !== 0) return Aa(t, -5);
- if (t.avail_in !== 0 || C.lookahead !== 0 || I !== 0 && C.status !== 666) {
- var s = C.strategy === 2 ? function(l, n) {
- for (var a; ; ) {
- if (l.lookahead === 0 && (Oo(l), l.lookahead === 0)) {
- if (n === 0) return 1;
- break;
- }
- if (l.match_length = 0, a = IA._tr_tally(l, 0, l.window[l.strstart]), l.lookahead--, l.strstart++, a && (Ii(l, !1), l.strm.avail_out === 0)) return 1;
- }
- return l.insert = 0, n === 4 ? (Ii(l, !0), l.strm.avail_out === 0 ? 3 : 4) : l.last_lit && (Ii(l, !1), l.strm.avail_out === 0) ? 1 : 2;
- }(C, I) : C.strategy === 3 ? function(l, n) {
- for (var a, d, o, c, r = l.window; ; ) {
- if (l.lookahead <= 258) {
- if (Oo(l), l.lookahead <= 258 && n === 0) return 1;
- if (l.lookahead === 0) break;
- }
- if (l.match_length = 0, l.lookahead >= 3 && l.strstart > 0 && (d = r[o = l.strstart - 1]) === r[++o] && d === r[++o] && d === r[++o]) {
- c = l.strstart + 258;
- do
- ;
- while (d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && o < c);
- l.match_length = 258 - (c - o), l.match_length > l.lookahead && (l.match_length = l.lookahead);
- }
- if (l.match_length >= 3 ? (a = IA._tr_tally(l, 1, l.match_length - 3), l.lookahead -= l.match_length, l.strstart += l.match_length, l.match_length = 0) : (a = IA._tr_tally(l, 0, l.window[l.strstart]), l.lookahead--, l.strstart++), a && (Ii(l, !1), l.strm.avail_out === 0)) return 1;
- }
- return l.insert = 0, n === 4 ? (Ii(l, !0), l.strm.avail_out === 0 ? 3 : 4) : l.last_lit && (Ii(l, !1), l.strm.avail_out === 0) ? 1 : 2;
- }(C, I) : Ah[C.level].func(C, I);
- if (s !== 3 && s !== 4 || (C.status = 666), s === 1 || s === 3) return t.avail_out === 0 && (C.last_flush = -1), 0;
- if (s === 2 && (I === 1 ? IA._tr_align(C) : I !== 5 && (IA._tr_stored_block(C, 0, 0, !1), I === 3 && (na(C.head), C.lookahead === 0 && (C.strstart = 0, C.block_start = 0, C.insert = 0))), ia(t), t.avail_out === 0)) return C.last_flush = -1, 0;
- }
- return I !== 4 ? 0 : C.wrap <= 0 ? 1 : (C.wrap === 2 ? (oC(C, 255 & t.adler), oC(C, t.adler >> 8 & 255), oC(C, t.adler >> 16 & 255), oC(C, t.adler >> 24 & 255), oC(C, 255 & t.total_in), oC(C, t.total_in >> 8 & 255), oC(C, t.total_in >> 16 & 255), oC(C, t.total_in >> 24 & 255)) : (ku(C, t.adler >>> 16), ku(C, 65535 & t.adler)), ia(t), C.wrap > 0 && (C.wrap = -C.wrap), C.pending !== 0 ? 0 : 1);
- }, rs.deflateEnd = function(t) {
- var I;
- return t && t.state ? (I = t.state.status) !== 42 && I !== 69 && I !== 73 && I !== 91 && I !== 103 && I !== 113 && I !== 666 ? Aa(t, -2) : (t.state = null, I === 113 ? Aa(t, -3) : 0) : -2;
- }, rs.deflateSetDictionary = function(t, I) {
- var g, C, i, e, A, s, l, n, a = I.length;
- if (!t || !t.state || (e = (g = t.state).wrap) === 2 || e === 1 && g.status !== 42 || g.lookahead) return -2;
- for (e === 1 && (t.adler = ttg(t.adler, I, a, 0)), g.wrap = 0, a >= g.w_size && (e === 0 && (na(g.head), g.strstart = 0, g.block_start = 0, g.insert = 0), n = new Hi.Buf8(g.w_size), Hi.arraySet(n, I, a - g.w_size, g.w_size, 0), I = n, a = g.w_size), A = t.avail_in, s = t.next_in, l = t.input, t.avail_in = a, t.next_in = 0, t.input = I, Oo(g); g.lookahead >= 3; ) {
- C = g.strstart, i = g.lookahead - 2;
- do
- g.ins_h = (g.ins_h << g.hash_shift ^ g.window[C + 3 - 1]) & g.hash_mask, g.prev[C & g.w_mask] = g.head[g.ins_h], g.head[g.ins_h] = C, C++;
- while (--i);
- g.strstart = C, g.lookahead = 2, Oo(g);
- }
- return g.strstart += g.lookahead, g.block_start = g.strstart, g.insert = g.lookahead, g.lookahead = 0, g.match_length = g.prev_length = 2, g.match_available = 0, t.next_in = s, t.input = l, t.avail_in = A, g.wrap = e, 0;
- }, rs.deflateInfo = "pako deflate (from Nodeca project)";
- var Uo = {}, ZV = tn, stg = !0, ltg = !0;
- try {
- String.fromCharCode.apply(null, [0]);
- } catch {
- stg = !1;
- }
- try {
- String.fromCharCode.apply(null, new Uint8Array(1));
- } catch {
- ltg = !1;
- }
- for (var sm = new ZV.Buf8(256), En = 0; En < 256; En++) sm[En] = En >= 252 ? 6 : En >= 248 ? 5 : En >= 240 ? 4 : En >= 224 ? 3 : En >= 192 ? 2 : 1;
- function v_(t, I) {
- if (I < 65534 && (t.subarray && ltg || !t.subarray && stg)) return String.fromCharCode.apply(null, ZV.shrinkBuf(t, I));
- for (var g = "", C = 0; C < I; C++) g += String.fromCharCode(t[C]);
- return g;
- }
- sm[254] = sm[254] = 1, Uo.string2buf = function(t) {
- var I, g, C, i, e, A = t.length, s = 0;
- for (i = 0; i < A; i++) (64512 & (g = t.charCodeAt(i))) == 55296 && i + 1 < A && (64512 & (C = t.charCodeAt(i + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (C - 56320), i++), s += g < 128 ? 1 : g < 2048 ? 2 : g < 65536 ? 3 : 4;
- for (I = new ZV.Buf8(s), e = 0, i = 0; e < s; i++) (64512 & (g = t.charCodeAt(i))) == 55296 && i + 1 < A && (64512 & (C = t.charCodeAt(i + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (C - 56320), i++), g < 128 ? I[e++] = g : g < 2048 ? (I[e++] = 192 | g >>> 6, I[e++] = 128 | 63 & g) : g < 65536 ? (I[e++] = 224 | g >>> 12, I[e++] = 128 | g >>> 6 & 63, I[e++] = 128 | 63 & g) : (I[e++] = 240 | g >>> 18, I[e++] = 128 | g >>> 12 & 63, I[e++] = 128 | g >>> 6 & 63, I[e++] = 128 | 63 & g);
- return I;
- }, Uo.buf2binstring = function(t) {
- return v_(t, t.length);
- }, Uo.binstring2buf = function(t) {
- for (var I = new ZV.Buf8(t.length), g = 0, C = I.length; g < C; g++) I[g] = t.charCodeAt(g);
- return I;
- }, Uo.buf2string = function(t, I) {
- var g, C, i, e, A = I || t.length, s = new Array(2 * A);
- for (C = 0, g = 0; g < A; ) if ((i = t[g++]) < 128) s[C++] = i;
- else if ((e = sm[i]) > 4) s[C++] = 65533, g += e - 1;
- else {
- for (i &= e === 2 ? 31 : e === 3 ? 15 : 7; e > 1 && g < A; ) i = i << 6 | 63 & t[g++], e--;
- e > 1 ? s[C++] = 65533 : i < 65536 ? s[C++] = i : (i -= 65536, s[C++] = 55296 | i >> 10 & 1023, s[C++] = 56320 | 1023 & i);
- }
- return v_(s, C);
- }, Uo.utf8border = function(t, I) {
- var g;
- for ((I = I || t.length) > t.length && (I = t.length), g = I - 1; g >= 0 && (192 & t[g]) == 128; ) g--;
- return g < 0 || g === 0 ? I : g + sm[t[g]] > I ? g : I;
- };
- var ntg = function() {
- this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
- }, Ym = rs, lm = tn, ZD = Uo, GD = x9, g0g = ntg, atg = Object.prototype.toString;
- function gc(t) {
- if (!(this instanceof gc)) return new gc(t);
- this.options = lm.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, t || {});
- var I = this.options;
- I.raw && I.windowBits > 0 ? I.windowBits = -I.windowBits : I.gzip && I.windowBits > 0 && I.windowBits < 16 && (I.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new g0g(), this.strm.avail_out = 0;
- var g = Ym.deflateInit2(this.strm, I.level, I.method, I.windowBits, I.memLevel, I.strategy);
- if (g !== 0) throw new Error(GD[g]);
- if (I.header && Ym.deflateSetHeader(this.strm, I.header), I.dictionary) {
- var C;
- if (C = typeof I.dictionary == "string" ? ZD.string2buf(I.dictionary) : atg.call(I.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(I.dictionary) : I.dictionary, (g = Ym.deflateSetDictionary(this.strm, C)) !== 0) throw new Error(GD[g]);
- this._dict_set = !0;
- }
- }
- function yX(t, I) {
- var g = new gc(I);
- if (g.push(t, !0), g.err) throw g.msg || GD[g.err];
- return g.result;
- }
- gc.prototype.push = function(t, I) {
- var g, C, i = this.strm, e = this.options.chunkSize;
- if (this.ended) return !1;
- C = I === ~~I ? I : I === !0 ? 4 : 0, typeof t == "string" ? i.input = ZD.string2buf(t) : atg.call(t) === "[object ArrayBuffer]" ? i.input = new Uint8Array(t) : i.input = t, i.next_in = 0, i.avail_in = i.input.length;
- do {
- if (i.avail_out === 0 && (i.output = new lm.Buf8(e), i.next_out = 0, i.avail_out = e), (g = Ym.deflate(i, C)) !== 1 && g !== 0) return this.onEnd(g), this.ended = !0, !1;
- i.avail_out !== 0 && (i.avail_in !== 0 || C !== 4 && C !== 2) || (this.options.to === "string" ? this.onData(ZD.buf2binstring(lm.shrinkBuf(i.output, i.next_out))) : this.onData(lm.shrinkBuf(i.output, i.next_out)));
- } while ((i.avail_in > 0 || i.avail_out === 0) && g !== 1);
- return C === 4 ? (g = Ym.deflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === 0) : C !== 2 || (this.onEnd(0), i.avail_out = 0, !0);
- }, gc.prototype.onData = function(t) {
- this.chunks.push(t);
- }, gc.prototype.onEnd = function(t) {
- t === 0 && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = lm.flattenChunks(this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg;
- }, em.Deflate = gc, em.deflate = yX, em.deflateRaw = function(t, I) {
- return (I = I || {}).raw = !0, yX(t, I);
- }, em.gzip = function(t, I) {
- return (I = I || {}).gzip = !0, yX(t, I);
- };
- var nm = {}, bA = {}, T_ = tn, I0g = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], C0g = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], t0g = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], i0g = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64], Ne = tn, YX = Itg, as = Ctg, e0g = function(t, I) {
- var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z;
- g = t.state, C = t.next_in, S = t.input, i = C + (t.avail_in - 5), e = t.next_out, z = t.output, A = e - (I - t.avail_out), s = e + (t.avail_out - 257), l = g.dmax, n = g.wsize, a = g.whave, d = g.wnext, o = g.window, c = g.hold, r = g.bits, h = g.lencode, b = g.distcode, u = (1 << g.lenbits) - 1, m = (1 << g.distbits) - 1;
- g: do {
- r < 15 && (c += S[C++] << r, r += 8, c += S[C++] << r, r += 8), Z = h[c & u];
- I: for (; ; ) {
- if (c >>>= p = Z >>> 24, r -= p, (p = Z >>> 16 & 255) === 0) z[e++] = 65535 & Z;
- else {
- if (!(16 & p)) {
- if ((64 & p) == 0) {
- Z = h[(65535 & Z) + (c & (1 << p) - 1)];
- continue I;
- }
- if (32 & p) {
- g.mode = 12;
- break g;
- }
- t.msg = "invalid literal/length code", g.mode = 30;
- break g;
- }
- Y = 65535 & Z, (p &= 15) && (r < p && (c += S[C++] << r, r += 8), Y += c & (1 << p) - 1, c >>>= p, r -= p), r < 15 && (c += S[C++] << r, r += 8, c += S[C++] << r, r += 8), Z = b[c & m];
- C: for (; ; ) {
- if (c >>>= p = Z >>> 24, r -= p, !(16 & (p = Z >>> 16 & 255))) {
- if ((64 & p) == 0) {
- Z = b[(65535 & Z) + (c & (1 << p) - 1)];
- continue C;
- }
- t.msg = "invalid distance code", g.mode = 30;
- break g;
- }
- if (R = 65535 & Z, r < (p &= 15) && (c += S[C++] << r, (r += 8) < p && (c += S[C++] << r, r += 8)), (R += c & (1 << p) - 1) > l) {
- t.msg = "invalid distance too far back", g.mode = 30;
- break g;
- }
- if (c >>>= p, r -= p, R > (p = e - A)) {
- if ((p = R - p) > a && g.sane) {
- t.msg = "invalid distance too far back", g.mode = 30;
- break g;
- }
- if (X = 0, H = o, d === 0) {
- if (X += n - p, p < Y) {
- Y -= p;
- do
- z[e++] = o[X++];
- while (--p);
- X = e - R, H = z;
- }
- } else if (d < p) {
- if (X += n + d - p, (p -= d) < Y) {
- Y -= p;
- do
- z[e++] = o[X++];
- while (--p);
- if (X = 0, d < Y) {
- Y -= p = d;
- do
- z[e++] = o[X++];
- while (--p);
- X = e - R, H = z;
- }
- }
- } else if (X += d - p, p < Y) {
- Y -= p;
- do
- z[e++] = o[X++];
- while (--p);
- X = e - R, H = z;
- }
- for (; Y > 2; ) z[e++] = H[X++], z[e++] = H[X++], z[e++] = H[X++], Y -= 3;
- Y && (z[e++] = H[X++], Y > 1 && (z[e++] = H[X++]));
- } else {
- X = e - R;
- do
- z[e++] = z[X++], z[e++] = z[X++], z[e++] = z[X++], Y -= 3;
- while (Y > 2);
- Y && (z[e++] = z[X++], Y > 1 && (z[e++] = z[X++]));
- }
- break;
- }
- }
- break;
- }
- } while (C < i && e < s);
- C -= Y = r >> 3, c &= (1 << (r -= Y << 3)) - 1, t.next_in = C, t.next_out = e, t.avail_in = C < i ? i - C + 5 : 5 - (C - i), t.avail_out = e < s ? s - e + 257 : 257 - (e - s), g.hold = c, g.bits = r;
- }, Nm = function(t, I, g, C, i, e, A, s) {
- var l, n, a, d, o, c, r, h, b, u = s.bits, m = 0, Z = 0, p = 0, Y = 0, R = 0, X = 0, H = 0, S = 0, z = 0, v = 0, K = null, V = 0, N = new T_.Buf16(16), B = new T_.Buf16(16), G = null, w = 0;
- for (m = 0; m <= 15; m++) N[m] = 0;
- for (Z = 0; Z < C; Z++) N[I[g + Z]]++;
- for (R = u, Y = 15; Y >= 1 && N[Y] === 0; Y--) ;
- if (R > Y && (R = Y), Y === 0) return i[e++] = 20971520, i[e++] = 20971520, s.bits = 1, 0;
- for (p = 1; p < Y && N[p] === 0; p++) ;
- for (R < p && (R = p), S = 1, m = 1; m <= 15; m++) if (S <<= 1, (S -= N[m]) < 0) return -1;
- if (S > 0 && (t === 0 || Y !== 1)) return -1;
- for (B[1] = 0, m = 1; m < 15; m++) B[m + 1] = B[m] + N[m];
- for (Z = 0; Z < C; Z++) I[g + Z] !== 0 && (A[B[I[g + Z]]++] = Z);
- if (t === 0 ? (K = G = A, c = 19) : t === 1 ? (K = I0g, V -= 257, G = C0g, w -= 257, c = 256) : (K = t0g, G = i0g, c = -1), v = 0, Z = 0, m = p, o = e, X = R, H = 0, a = -1, d = (z = 1 << R) - 1, t === 1 && z > 852 || t === 2 && z > 592) return 1;
- for (; ; ) {
- r = m - H, A[Z] < c ? (h = 0, b = A[Z]) : A[Z] > c ? (h = G[w + A[Z]], b = K[V + A[Z]]) : (h = 96, b = 0), l = 1 << m - H, p = n = 1 << X;
- do
- i[o + (v >> H) + (n -= l)] = r << 24 | h << 16 | b | 0;
- while (n !== 0);
- for (l = 1 << m - 1; v & l; ) l >>= 1;
- if (l !== 0 ? (v &= l - 1, v += l) : v = 0, Z++, --N[m] == 0) {
- if (m === Y) break;
- m = I[g + A[Z]];
- }
- if (m > R && (v & d) !== a) {
- for (H === 0 && (H = R), o += p, S = 1 << (X = m - H); X + H < Y && !((S -= N[X + H]) <= 0); ) X++, S <<= 1;
- if (z += 1 << X, t === 1 && z > 852 || t === 2 && z > 592) return 1;
- i[a = v & d] = R << 24 | X << 16 | o - e | 0;
- }
- }
- return v !== 0 && (i[o + v] = m - H << 24 | 64 << 16 | 0), s.bits = R, 0;
- };
- function x_(t) {
- return (t >>> 24 & 255) + (t >>> 8 & 65280) + ((65280 & t) << 8) + ((255 & t) << 24);
- }
- function A0g() {
- this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new Ne.Buf16(320), this.work = new Ne.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
- }
- function otg(t) {
- var I;
- return t && t.state ? (I = t.state, t.total_in = t.total_out = I.total = 0, t.msg = "", I.wrap && (t.adler = 1 & I.wrap), I.mode = 1, I.last = 0, I.havedict = 0, I.dmax = 32768, I.head = null, I.hold = 0, I.bits = 0, I.lencode = I.lendyn = new Ne.Buf32(852), I.distcode = I.distdyn = new Ne.Buf32(592), I.sane = 1, I.back = -1, 0) : -2;
- }
- function ctg(t) {
- var I;
- return t && t.state ? ((I = t.state).wsize = 0, I.whave = 0, I.wnext = 0, otg(t)) : -2;
- }
- function dtg(t, I) {
- var g, C;
- return t && t.state ? (C = t.state, I < 0 ? (g = 0, I = -I) : (g = 1 + (I >> 4), I < 48 && (I &= 15)), I && (I < 8 || I > 15) ? -2 : (C.window !== null && C.wbits !== I && (C.window = null), C.wrap = g, C.wbits = I, ctg(t))) : -2;
- }
- function j_(t, I) {
- var g, C;
- return t ? (C = new A0g(), t.state = C, C.window = null, (g = dtg(t, I)) !== 0 && (t.state = null), g) : -2;
- }
- var NX, VX, Q_ = !0;
- function s0g(t) {
- if (Q_) {
- var I;
- for (NX = new Ne.Buf32(512), VX = new Ne.Buf32(32), I = 0; I < 144; ) t.lens[I++] = 8;
- for (; I < 256; ) t.lens[I++] = 9;
- for (; I < 280; ) t.lens[I++] = 7;
- for (; I < 288; ) t.lens[I++] = 8;
- for (Nm(1, t.lens, 0, 288, NX, 0, t.work, { bits: 9 }), I = 0; I < 32; ) t.lens[I++] = 5;
- Nm(2, t.lens, 0, 32, VX, 0, t.work, { bits: 5 }), Q_ = !1;
- }
- t.lencode = NX, t.lenbits = 9, t.distcode = VX, t.distbits = 5;
- }
- function O_(t, I, g, C) {
- var i, e = t.state;
- return e.window === null && (e.wsize = 1 << e.wbits, e.wnext = 0, e.whave = 0, e.window = new Ne.Buf8(e.wsize)), C >= e.wsize ? (Ne.arraySet(e.window, I, g - e.wsize, e.wsize, 0), e.wnext = 0, e.whave = e.wsize) : ((i = e.wsize - e.wnext) > C && (i = C), Ne.arraySet(e.window, I, g - C, i, e.wnext), (C -= i) ? (Ne.arraySet(e.window, I, g - C, C, 0), e.wnext = C, e.whave = e.wsize) : (e.wnext += i, e.wnext === e.wsize && (e.wnext = 0), e.whave < e.wsize && (e.whave += i))), 0;
- }
- bA.inflateReset = ctg, bA.inflateReset2 = dtg, bA.inflateResetKeep = otg, bA.inflateInit = function(t) {
- return j_(t, 15);
- }, bA.inflateInit2 = j_, bA.inflate = function(t, I) {
- var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z = 0, v = new Ne.Buf8(4), K = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
- if (!t || !t.state || !t.output || !t.input && t.avail_in !== 0) return -2;
- (g = t.state).mode === 12 && (g.mode = 13), A = t.next_out, i = t.output, l = t.avail_out, e = t.next_in, C = t.input, s = t.avail_in, n = g.hold, a = g.bits, d = s, o = l, X = 0;
- g: for (; ; ) switch (g.mode) {
- case 1:
- if (g.wrap === 0) {
- g.mode = 13;
- break;
- }
- for (; a < 16; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (2 & g.wrap && n === 35615) {
- g.check = 0, v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0), n = 0, a = 0, g.mode = 2;
- break;
- }
- if (g.flags = 0, g.head && (g.head.done = !1), !(1 & g.wrap) || (((255 & n) << 8) + (n >> 8)) % 31) {
- t.msg = "incorrect header check", g.mode = 30;
- break;
- }
- if ((15 & n) != 8) {
- t.msg = "unknown compression method", g.mode = 30;
- break;
- }
- if (a -= 4, R = 8 + (15 & (n >>>= 4)), g.wbits === 0) g.wbits = R;
- else if (R > g.wbits) {
- t.msg = "invalid window size", g.mode = 30;
- break;
- }
- g.dmax = 1 << R, t.adler = g.check = 1, g.mode = 512 & n ? 10 : 12, n = 0, a = 0;
- break;
- case 2:
- for (; a < 16; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (g.flags = n, (255 & g.flags) != 8) {
- t.msg = "unknown compression method", g.mode = 30;
- break;
- }
- if (57344 & g.flags) {
- t.msg = "unknown header flags set", g.mode = 30;
- break;
- }
- g.head && (g.head.text = n >> 8 & 1), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0, g.mode = 3;
- case 3:
- for (; a < 32; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- g.head && (g.head.time = n), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, v[2] = n >>> 16 & 255, v[3] = n >>> 24 & 255, g.check = as(g.check, v, 4, 0)), n = 0, a = 0, g.mode = 4;
- case 4:
- for (; a < 16; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- g.head && (g.head.xflags = 255 & n, g.head.os = n >> 8), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0, g.mode = 5;
- case 5:
- if (1024 & g.flags) {
- for (; a < 16; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- g.length = n, g.head && (g.head.extra_len = n), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0;
- } else g.head && (g.head.extra = null);
- g.mode = 6;
- case 6:
- if (1024 & g.flags && ((c = g.length) > s && (c = s), c && (g.head && (R = g.head.extra_len - g.length, g.head.extra || (g.head.extra = new Array(g.head.extra_len)), Ne.arraySet(g.head.extra, C, e, c, R)), 512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, g.length -= c), g.length)) break g;
- g.length = 0, g.mode = 7;
- case 7:
- if (2048 & g.flags) {
- if (s === 0) break g;
- c = 0;
- do
- R = C[e + c++], g.head && R && g.length < 65536 && (g.head.name += String.fromCharCode(R));
- while (R && c < s);
- if (512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, R) break g;
- } else g.head && (g.head.name = null);
- g.length = 0, g.mode = 8;
- case 8:
- if (4096 & g.flags) {
- if (s === 0) break g;
- c = 0;
- do
- R = C[e + c++], g.head && R && g.length < 65536 && (g.head.comment += String.fromCharCode(R));
- while (R && c < s);
- if (512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, R) break g;
- } else g.head && (g.head.comment = null);
- g.mode = 9;
- case 9:
- if (512 & g.flags) {
- for (; a < 16; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (n !== (65535 & g.check)) {
- t.msg = "header crc mismatch", g.mode = 30;
- break;
- }
- n = 0, a = 0;
- }
- g.head && (g.head.hcrc = g.flags >> 9 & 1, g.head.done = !0), t.adler = g.check = 0, g.mode = 12;
- break;
- case 10:
- for (; a < 32; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- t.adler = g.check = x_(n), n = 0, a = 0, g.mode = 11;
- case 11:
- if (g.havedict === 0) return t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, 2;
- t.adler = g.check = 1, g.mode = 12;
- case 12:
- if (I === 5 || I === 6) break g;
- case 13:
- if (g.last) {
- n >>>= 7 & a, a -= 7 & a, g.mode = 27;
- break;
- }
- for (; a < 3; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- switch (g.last = 1 & n, a -= 1, 3 & (n >>>= 1)) {
- case 0:
- g.mode = 14;
- break;
- case 1:
- if (s0g(g), g.mode = 20, I === 6) {
- n >>>= 2, a -= 2;
- break g;
- }
- break;
- case 2:
- g.mode = 17;
- break;
- case 3:
- t.msg = "invalid block type", g.mode = 30;
- }
- n >>>= 2, a -= 2;
- break;
- case 14:
- for (n >>>= 7 & a, a -= 7 & a; a < 32; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if ((65535 & n) != (n >>> 16 ^ 65535)) {
- t.msg = "invalid stored block lengths", g.mode = 30;
- break;
- }
- if (g.length = 65535 & n, n = 0, a = 0, g.mode = 15, I === 6) break g;
- case 15:
- g.mode = 16;
- case 16:
- if (c = g.length) {
- if (c > s && (c = s), c > l && (c = l), c === 0) break g;
- Ne.arraySet(i, C, e, c, A), s -= c, e += c, l -= c, A += c, g.length -= c;
- break;
- }
- g.mode = 12;
- break;
- case 17:
- for (; a < 14; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (g.nlen = 257 + (31 & n), n >>>= 5, a -= 5, g.ndist = 1 + (31 & n), n >>>= 5, a -= 5, g.ncode = 4 + (15 & n), n >>>= 4, a -= 4, g.nlen > 286 || g.ndist > 30) {
- t.msg = "too many length or distance symbols", g.mode = 30;
- break;
- }
- g.have = 0, g.mode = 18;
- case 18:
- for (; g.have < g.ncode; ) {
- for (; a < 3; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- g.lens[K[g.have++]] = 7 & n, n >>>= 3, a -= 3;
- }
- for (; g.have < 19; ) g.lens[K[g.have++]] = 0;
- if (g.lencode = g.lendyn, g.lenbits = 7, H = { bits: g.lenbits }, X = Nm(0, g.lens, 0, 19, g.lencode, 0, g.work, H), g.lenbits = H.bits, X) {
- t.msg = "invalid code lengths set", g.mode = 30;
- break;
- }
- g.have = 0, g.mode = 19;
- case 19:
- for (; g.have < g.nlen + g.ndist; ) {
- for (; u = (z = g.lencode[n & (1 << g.lenbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (m < 16) n >>>= b, a -= b, g.lens[g.have++] = m;
- else {
- if (m === 16) {
- for (S = b + 2; a < S; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (n >>>= b, a -= b, g.have === 0) {
- t.msg = "invalid bit length repeat", g.mode = 30;
- break;
- }
- R = g.lens[g.have - 1], c = 3 + (3 & n), n >>>= 2, a -= 2;
- } else if (m === 17) {
- for (S = b + 3; a < S; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- a -= b, R = 0, c = 3 + (7 & (n >>>= b)), n >>>= 3, a -= 3;
- } else {
- for (S = b + 7; a < S; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- a -= b, R = 0, c = 11 + (127 & (n >>>= b)), n >>>= 7, a -= 7;
- }
- if (g.have + c > g.nlen + g.ndist) {
- t.msg = "invalid bit length repeat", g.mode = 30;
- break;
- }
- for (; c--; ) g.lens[g.have++] = R;
- }
- }
- if (g.mode === 30) break;
- if (g.lens[256] === 0) {
- t.msg = "invalid code -- missing end-of-block", g.mode = 30;
- break;
- }
- if (g.lenbits = 9, H = { bits: g.lenbits }, X = Nm(1, g.lens, 0, g.nlen, g.lencode, 0, g.work, H), g.lenbits = H.bits, X) {
- t.msg = "invalid literal/lengths set", g.mode = 30;
- break;
- }
- if (g.distbits = 6, g.distcode = g.distdyn, H = { bits: g.distbits }, X = Nm(2, g.lens, g.nlen, g.ndist, g.distcode, 0, g.work, H), g.distbits = H.bits, X) {
- t.msg = "invalid distances set", g.mode = 30;
- break;
- }
- if (g.mode = 20, I === 6) break g;
- case 20:
- g.mode = 21;
- case 21:
- if (s >= 6 && l >= 258) {
- t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, e0g(t, o), A = t.next_out, i = t.output, l = t.avail_out, e = t.next_in, C = t.input, s = t.avail_in, n = g.hold, a = g.bits, g.mode === 12 && (g.back = -1);
- break;
- }
- for (g.back = 0; u = (z = g.lencode[n & (1 << g.lenbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (u && (240 & u) == 0) {
- for (Z = b, p = u, Y = m; u = (z = g.lencode[Y + ((n & (1 << Z + p) - 1) >> Z)]) >>> 16 & 255, m = 65535 & z, !(Z + (b = z >>> 24) <= a); ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- n >>>= Z, a -= Z, g.back += Z;
- }
- if (n >>>= b, a -= b, g.back += b, g.length = m, u === 0) {
- g.mode = 26;
- break;
- }
- if (32 & u) {
- g.back = -1, g.mode = 12;
- break;
- }
- if (64 & u) {
- t.msg = "invalid literal/length code", g.mode = 30;
- break;
- }
- g.extra = 15 & u, g.mode = 22;
- case 22:
- if (g.extra) {
- for (S = g.extra; a < S; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- g.length += n & (1 << g.extra) - 1, n >>>= g.extra, a -= g.extra, g.back += g.extra;
- }
- g.was = g.length, g.mode = 23;
- case 23:
- for (; u = (z = g.distcode[n & (1 << g.distbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if ((240 & u) == 0) {
- for (Z = b, p = u, Y = m; u = (z = g.distcode[Y + ((n & (1 << Z + p) - 1) >> Z)]) >>> 16 & 255, m = 65535 & z, !(Z + (b = z >>> 24) <= a); ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- n >>>= Z, a -= Z, g.back += Z;
- }
- if (n >>>= b, a -= b, g.back += b, 64 & u) {
- t.msg = "invalid distance code", g.mode = 30;
- break;
- }
- g.offset = m, g.extra = 15 & u, g.mode = 24;
- case 24:
- if (g.extra) {
- for (S = g.extra; a < S; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- g.offset += n & (1 << g.extra) - 1, n >>>= g.extra, a -= g.extra, g.back += g.extra;
- }
- if (g.offset > g.dmax) {
- t.msg = "invalid distance too far back", g.mode = 30;
- break;
- }
- g.mode = 25;
- case 25:
- if (l === 0) break g;
- if (c = o - l, g.offset > c) {
- if ((c = g.offset - c) > g.whave && g.sane) {
- t.msg = "invalid distance too far back", g.mode = 30;
- break;
- }
- c > g.wnext ? (c -= g.wnext, r = g.wsize - c) : r = g.wnext - c, c > g.length && (c = g.length), h = g.window;
- } else h = i, r = A - g.offset, c = g.length;
- c > l && (c = l), l -= c, g.length -= c;
- do
- i[A++] = h[r++];
- while (--c);
- g.length === 0 && (g.mode = 21);
- break;
- case 26:
- if (l === 0) break g;
- i[A++] = g.length, l--, g.mode = 21;
- break;
- case 27:
- if (g.wrap) {
- for (; a < 32; ) {
- if (s === 0) break g;
- s--, n |= C[e++] << a, a += 8;
- }
- if (o -= l, t.total_out += o, g.total += o, o && (t.adler = g.check = g.flags ? as(g.check, i, o, A - o) : YX(g.check, i, o, A - o)), o = l, (g.flags ? n : x_(n)) !== g.check) {
- t.msg = "incorrect data check", g.mode = 30;
- break;
- }
- n = 0, a = 0;
- }
- g.mode = 28;
- case 28:
- if (g.wrap && g.flags) {
- for (; a < 32; ) {
- if (s === 0) break g;
- s--, n += C[e++] << a, a += 8;
- }
- if (n !== (4294967295 & g.total)) {
- t.msg = "incorrect length check", g.mode = 30;
- break;
- }
- n = 0, a = 0;
- }
- g.mode = 29;
- case 29:
- X = 1;
- break g;
- case 30:
- X = -3;
- break g;
- case 31:
- return -4;
- default:
- return -2;
- }
- return t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, (g.wsize || o !== t.avail_out && g.mode < 30 && (g.mode < 27 || I !== 4)) && O_(t, t.output, t.next_out, o - t.avail_out), d -= t.avail_in, o -= t.avail_out, t.total_in += d, t.total_out += o, g.total += o, g.wrap && o && (t.adler = g.check = g.flags ? as(g.check, i, o, t.next_out - o) : YX(g.check, i, o, t.next_out - o)), t.data_type = g.bits + (g.last ? 64 : 0) + (g.mode === 12 ? 128 : 0) + (g.mode === 20 || g.mode === 15 ? 256 : 0), (d === 0 && o === 0 || I === 4) && X === 0 && (X = -5), X;
- }, bA.inflateEnd = function(t) {
- if (!t || !t.state) return -2;
- var I = t.state;
- return I.window && (I.window = null), t.state = null, 0;
- }, bA.inflateGetHeader = function(t, I) {
- var g;
- return t && t.state ? (2 & (g = t.state).wrap) == 0 ? -2 : (g.head = I, I.done = !1, 0) : -2;
- }, bA.inflateSetDictionary = function(t, I) {
- var g, C = I.length;
- return t && t.state ? (g = t.state).wrap !== 0 && g.mode !== 11 ? -2 : g.mode === 11 && YX(1, I, C, 0) !== g.check ? -3 : O_(t, I, C, C) ? (g.mode = 31, -4) : (g.havedict = 1, 0) : -2;
- }, bA.inflateInfo = "pako inflate (from Nodeca project)";
- var rtg = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 }, bh = bA, am = tn, UN = Uo, tt = rtg, wD = x9, l0g = ntg, n0g = function() {
- this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
- }, htg = Object.prototype.toString;
- function Ic(t) {
- if (!(this instanceof Ic)) return new Ic(t);
- this.options = am.assign({ chunkSize: 16384, windowBits: 0, to: "" }, t || {});
- var I = this.options;
- I.raw && I.windowBits >= 0 && I.windowBits < 16 && (I.windowBits = -I.windowBits, I.windowBits === 0 && (I.windowBits = -15)), !(I.windowBits >= 0 && I.windowBits < 16) || t && t.windowBits || (I.windowBits += 32), I.windowBits > 15 && I.windowBits < 48 && (15 & I.windowBits) == 0 && (I.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new l0g(), this.strm.avail_out = 0;
- var g = bh.inflateInit2(this.strm, I.windowBits);
- if (g !== tt.Z_OK) throw new Error(wD[g]);
- if (this.header = new n0g(), bh.inflateGetHeader(this.strm, this.header), I.dictionary && (typeof I.dictionary == "string" ? I.dictionary = UN.string2buf(I.dictionary) : htg.call(I.dictionary) === "[object ArrayBuffer]" && (I.dictionary = new Uint8Array(I.dictionary)), I.raw && (g = bh.inflateSetDictionary(this.strm, I.dictionary)) !== tt.Z_OK)) throw new Error(wD[g]);
- }
- function MX(t, I) {
- var g = new Ic(I);
- if (g.push(t, !0), g.err) throw g.msg || wD[g.err];
- return g.result;
- }
- Ic.prototype.push = function(t, I) {
- var g, C, i, e, A, s = this.strm, l = this.options.chunkSize, n = this.options.dictionary, a = !1;
- if (this.ended) return !1;
- C = I === ~~I ? I : I === !0 ? tt.Z_FINISH : tt.Z_NO_FLUSH, typeof t == "string" ? s.input = UN.binstring2buf(t) : htg.call(t) === "[object ArrayBuffer]" ? s.input = new Uint8Array(t) : s.input = t, s.next_in = 0, s.avail_in = s.input.length;
- do {
- if (s.avail_out === 0 && (s.output = new am.Buf8(l), s.next_out = 0, s.avail_out = l), (g = bh.inflate(s, tt.Z_NO_FLUSH)) === tt.Z_NEED_DICT && n && (g = bh.inflateSetDictionary(this.strm, n)), g === tt.Z_BUF_ERROR && a === !0 && (g = tt.Z_OK, a = !1), g !== tt.Z_STREAM_END && g !== tt.Z_OK) return this.onEnd(g), this.ended = !0, !1;
- s.next_out && (s.avail_out !== 0 && g !== tt.Z_STREAM_END && (s.avail_in !== 0 || C !== tt.Z_FINISH && C !== tt.Z_SYNC_FLUSH) || (this.options.to === "string" ? (i = UN.utf8border(s.output, s.next_out), e = s.next_out - i, A = UN.buf2string(s.output, i), s.next_out = e, s.avail_out = l - e, e && am.arraySet(s.output, s.output, i, e, 0), this.onData(A)) : this.onData(am.shrinkBuf(s.output, s.next_out)))), s.avail_in === 0 && s.avail_out === 0 && (a = !0);
- } while ((s.avail_in > 0 || s.avail_out === 0) && g !== tt.Z_STREAM_END);
- return g === tt.Z_STREAM_END && (C = tt.Z_FINISH), C === tt.Z_FINISH ? (g = bh.inflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === tt.Z_OK) : C !== tt.Z_SYNC_FLUSH || (this.onEnd(tt.Z_OK), s.avail_out = 0, !0);
- }, Ic.prototype.onData = function(t) {
- this.chunks.push(t);
- }, Ic.prototype.onEnd = function(t) {
- t === tt.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = am.flattenChunks(this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg;
- }, nm.Inflate = Ic, nm.inflate = MX, nm.inflateRaw = function(t, I) {
- return (I = I || {}).raw = !0, MX(t, I);
- }, nm.ungzip = MX;
- var btg = {};
- (0, tn.assign)(btg, em, nm, rtg);
- var a0g = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", o0g = btg, U_ = gt(), EN = eA, c0g = a0g ? "uint8array" : "array";
- function vo(t, I) {
- EN.call(this, "FlateWorker/" + t), this._pako = null, this._pakoAction = t, this._pakoOptions = I, this.meta = {};
- }
- QN.magic = "\b\0", U_.inherits(vo, EN), vo.prototype.processChunk = function(t) {
- this.meta = t.meta, this._pako === null && this._createPako(), this._pako.push(U_.transformTo(c0g, t.data), !1);
- }, vo.prototype.flush = function() {
- EN.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
- }, vo.prototype.cleanUp = function() {
- EN.prototype.cleanUp.call(this), this._pako = null;
- }, vo.prototype._createPako = function() {
- this._pako = new o0g[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
- var t = this;
- this._pako.onData = function(I) {
- t.push({ data: I, meta: t.meta });
- };
- }, QN.compressWorker = function(t) {
- return new vo("Deflate", t);
- }, QN.uncompressWorker = function() {
- return new vo("Inflate", {});
- };
- var E_ = eA;
- uV.STORE = { magic: "\0\0", compressWorker: function() {
- return new E_("STORE compression");
- }, uncompressWorker: function() {
- return new E_("STORE decompression");
- } }, uV.DEFLATE = QN;
- var utg = { LOCAL_FILE_HEADER: "PK", CENTRAL_FILE_HEADER: "PK", CENTRAL_DIRECTORY_END: "PK", ZIP64_CENTRAL_DIRECTORY_LOCATOR: "PK\x07", ZIP64_CENTRAL_DIRECTORY_END: "PK", DATA_DESCRIPTOR: "PK\x07\b" }, sh = gt(), Ch = eA, RX = M0, P_ = J9, GV = utg, VC = function(t, I) {
- var g, C = "";
- for (g = 0; g < I; g++) C += String.fromCharCode(255 & t), t >>>= 8;
- return C;
- }, __ = function(t, I, g, C, i, e) {
- var A, s, l = t.file, n = t.compression, a = e !== RX.utf8encode, d = sh.transformTo("string", e(l.name)), o = sh.transformTo("string", RX.utf8encode(l.name)), c = l.comment, r = sh.transformTo("string", e(c)), h = sh.transformTo("string", RX.utf8encode(c)), b = o.length !== l.name.length, u = h.length !== c.length, m = "", Z = "", p = "", Y = l.dir, R = l.date, X = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
- I && !g || (X.crc32 = t.crc32, X.compressedSize = t.compressedSize, X.uncompressedSize = t.uncompressedSize);
- var H = 0;
- I && (H |= 8), a || !b && !u || (H |= 2048);
- var S, z, v, K = 0, V = 0;
- Y && (K |= 16), i === "UNIX" ? (V = 798, K |= (S = l.unixPermissions, z = Y, v = S, S || (v = z ? 16893 : 33204), (65535 & v) << 16)) : (V = 20, K |= 63 & (l.dosPermissions || 0)), A = R.getUTCHours(), A <<= 6, A |= R.getUTCMinutes(), A <<= 5, A |= R.getUTCSeconds() / 2, s = R.getUTCFullYear() - 1980, s <<= 4, s |= R.getUTCMonth() + 1, s <<= 5, s |= R.getUTCDate(), b && (Z = VC(1, 1) + VC(P_(d), 4) + o, m += "up" + VC(Z.length, 2) + Z), u && (p = VC(1, 1) + VC(P_(r), 4) + h, m += "uc" + VC(p.length, 2) + p);
- var N = "";
- return N += `
- \0`, N += VC(H, 2), N += n.magic, N += VC(A, 2), N += VC(s, 2), N += VC(X.crc32, 4), N += VC(X.compressedSize, 4), N += VC(X.uncompressedSize, 4), N += VC(d.length, 2), N += VC(m.length, 2), { fileRecord: GV.LOCAL_FILE_HEADER + N + d + m, dirRecord: GV.CENTRAL_FILE_HEADER + VC(V, 2) + N + VC(r.length, 2) + "\0\0\0\0" + VC(K, 4) + VC(C, 4) + d + m + r };
- }, d0g = function(t) {
- return GV.DATA_DESCRIPTOR + VC(t.crc32, 4) + VC(t.compressedSize, 4) + VC(t.uncompressedSize, 4);
- };
- function uA(t, I, g, C) {
- Ch.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = I, this.zipPlatform = g, this.encodeFileName = C, this.streamFiles = t, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
- }
- sh.inherits(uA, Ch), uA.prototype.push = function(t) {
- var I = t.meta.percent || 0, g = this.entriesCount, C = this._sources.length;
- this.accumulate ? this.contentBuffer.push(t) : (this.bytesWritten += t.data.length, Ch.prototype.push.call(this, { data: t.data, meta: { currentFile: this.currentFile, percent: g ? (I + 100 * (g - C - 1)) / g : 100 } }));
- }, uA.prototype.openedSource = function(t) {
- this.currentSourceOffset = this.bytesWritten, this.currentFile = t.file.name;
- var I = this.streamFiles && !t.file.dir;
- if (I) {
- var g = __(t, I, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
- this.push({ data: g.fileRecord, meta: { percent: 0 } });
- } else this.accumulate = !0;
- }, uA.prototype.closedSource = function(t) {
- this.accumulate = !1;
- var I = this.streamFiles && !t.file.dir, g = __(t, I, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
- if (this.dirRecords.push(g.dirRecord), I) this.push({ data: d0g(t), meta: { percent: 100 } });
- else for (this.push({ data: g.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
- this.currentFile = null;
- }, uA.prototype.flush = function() {
- for (var t = this.bytesWritten, I = 0; I < this.dirRecords.length; I++) this.push({ data: this.dirRecords[I], meta: { percent: 100 } });
- var g = this.bytesWritten - t, C = function(i, e, A, s, l) {
- var n = sh.transformTo("string", l(s));
- return GV.CENTRAL_DIRECTORY_END + "\0\0\0\0" + VC(i, 2) + VC(i, 2) + VC(e, 4) + VC(A, 4) + VC(n.length, 2) + n;
- }(this.dirRecords.length, g, t, this.zipComment, this.encodeFileName);
- this.push({ data: C, meta: { percent: 100 } });
- }, uA.prototype.prepareNextSource = function() {
- this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
- }, uA.prototype.registerPrevious = function(t) {
- this._sources.push(t);
- var I = this;
- return t.on("data", function(g) {
- I.processChunk(g);
- }), t.on("end", function() {
- I.closedSource(I.previous.streamInfo), I._sources.length ? I.prepareNextSource() : I.end();
- }), t.on("error", function(g) {
- I.error(g);
- }), this;
- }, uA.prototype.resume = function() {
- return !!Ch.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
- }, uA.prototype.error = function(t) {
- var I = this._sources;
- if (!Ch.prototype.error.call(this, t)) return !1;
- for (var g = 0; g < I.length; g++) try {
- I[g].error(t);
- } catch {
- }
- return !0;
- }, uA.prototype.lock = function() {
- Ch.prototype.lock.call(this);
- for (var t = this._sources, I = 0; I < t.length; I++) t[I].lock();
- };
- var r0g = uV, h0g = uA;
- PCg.generateWorker = function(t, I, g) {
- var C = new h0g(I.streamFiles, g, I.platform, I.encodeFileName), i = 0;
- try {
- t.forEach(function(e, A) {
- i++;
- var s = function(d, o) {
- var c = d || o, r = r0g[c];
- if (!r) throw new Error(c + " is not a valid compression method !");
- return r;
- }(A.options.compression, I.compression), l = A.options.compressionOptions || I.compressionOptions || {}, n = A.dir, a = A.date;
- A._compressWorker(s, l).withStreamInfo("file", { name: e, dir: n, date: a, comment: A.comment || "", unixPermissions: A.unixPermissions, dosPermissions: A.dosPermissions }).pipe(C);
- }), C.entriesCount = i;
- } catch (e) {
- C.error(e);
- }
- return C;
- };
- var b0g = gt(), PN = eA;
- function om(t, I) {
- PN.call(this, "Nodejs stream input adapter for " + t), this._upstreamEnded = !1, this._bindStream(I);
- }
- b0g.inherits(om, PN), om.prototype._bindStream = function(t) {
- var I = this;
- this._stream = t, t.pause(), t.on("data", function(g) {
- I.push({ data: g, meta: { percent: 0 } });
- }).on("error", function(g) {
- I.isPaused ? this.generatedError = g : I.error(g);
- }).on("end", function() {
- I.isPaused ? I._upstreamEnded = !0 : I.end();
- });
- }, om.prototype.pause = function() {
- return !!PN.prototype.pause.call(this) && (this._stream.pause(), !0);
- }, om.prototype.resume = function() {
- return !!PN.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
- };
- var u0g = om, m0g = M0, Vm = gt(), mtg = eA, Z0g = jCg, Ztg = QCg, q_ = L9, G0g = Uhg, w0g = PCg, $_ = cM, p0g = u0g, Gtg = function(t, I, g) {
- var C, i = Vm.getTypeOf(I), e = Vm.extend(g || {}, Ztg);
- e.date = e.date || /* @__PURE__ */ new Date(), e.compression !== null && (e.compression = e.compression.toUpperCase()), typeof e.unixPermissions == "string" && (e.unixPermissions = parseInt(e.unixPermissions, 8)), e.unixPermissions && 16384 & e.unixPermissions && (e.dir = !0), e.dosPermissions && 16 & e.dosPermissions && (e.dir = !0), e.dir && (t = wtg(t)), e.createFolders && (C = B0g(t)) && ptg.call(this, C, !0);
- var A = i === "string" && e.binary === !1 && e.base64 === !1;
- g && g.binary !== void 0 || (e.binary = !A), (I instanceof q_ && I.uncompressedSize === 0 || e.dir || !I || I.length === 0) && (e.base64 = !1, e.binary = !0, I = "", e.compression = "STORE", i = "string");
- var s = null;
- s = I instanceof q_ || I instanceof mtg ? I : $_.isNode && $_.isStream(I) ? new p0g(t, I) : Vm.prepareContent(t, I, e.binary, e.optimizedBinaryString, e.base64);
- var l = new G0g(t, s, e);
- this.files[t] = l;
- }, B0g = function(t) {
- t.slice(-1) === "/" && (t = t.substring(0, t.length - 1));
- var I = t.lastIndexOf("/");
- return I > 0 ? t.substring(0, I) : "";
- }, wtg = function(t) {
- return t.slice(-1) !== "/" && (t += "/"), t;
- }, ptg = function(t, I) {
- return I = I !== void 0 ? I : Ztg.createFolders, t = wtg(t), this.files[t] || Gtg.call(this, t, null, { dir: !0, createFolders: I }), this.files[t];
- };
- function gq(t) {
- return Object.prototype.toString.call(t) === "[object RegExp]";
- }
- var W0g = { load: function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, forEach: function(t) {
- var I, g, C;
- for (I in this.files) C = this.files[I], (g = I.slice(this.root.length, I.length)) && I.slice(0, this.root.length) === this.root && t(g, C);
- }, filter: function(t) {
- var I = [];
- return this.forEach(function(g, C) {
- t(g, C) && I.push(C);
- }), I;
- }, file: function(t, I, g) {
- if (arguments.length === 1) {
- if (gq(t)) {
- var C = t;
- return this.filter(function(e, A) {
- return !A.dir && C.test(e);
- });
- }
- var i = this.files[this.root + t];
- return i && !i.dir ? i : null;
- }
- return t = this.root + t, Gtg.call(this, t, I, g), this;
- }, folder: function(t) {
- if (!t) return this;
- if (gq(t)) return this.filter(function(i, e) {
- return e.dir && t.test(i);
- });
- var I = this.root + t, g = ptg.call(this, I), C = this.clone();
- return C.root = g.name, C;
- }, remove: function(t) {
- t = this.root + t;
- var I = this.files[t];
- if (I || (t.slice(-1) !== "/" && (t += "/"), I = this.files[t]), I && !I.dir) delete this.files[t];
- else for (var g = this.filter(function(i, e) {
- return e.name.slice(0, t.length) === t;
- }), C = 0; C < g.length; C++) delete this.files[g[C].name];
- return this;
- }, generate: function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, generateInternalStream: function(t) {
- var I, g = {};
- try {
- if ((g = Vm.extend(t || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: m0g.utf8encode })).type = g.type.toLowerCase(), g.compression = g.compression.toUpperCase(), g.type === "binarystring" && (g.type = "string"), !g.type) throw new Error("No output type specified.");
- Vm.checkSupport(g.type), g.platform !== "darwin" && g.platform !== "freebsd" && g.platform !== "linux" && g.platform !== "sunos" || (g.platform = "UNIX"), g.platform === "win32" && (g.platform = "DOS");
- var C = g.comment || this.comment || "";
- I = w0g.generateWorker(this, g, C);
- } catch (i) {
- (I = new mtg("error")).error(i);
- }
- return new Z0g(I, g.type || "string", g.mimeType);
- }, generateAsync: function(t, I) {
- return this.generateInternalStream(t).accumulate(I);
- }, generateNodeStream: function(t, I) {
- return (t = t || {}).type || (t.type = "nodebuffer"), this.generateInternalStream(t).toNodejsStream(I);
- } }, y0g = W0g, Y0g = gt();
- function Btg(t) {
- this.data = t, this.length = t.length, this.index = 0, this.zero = 0;
- }
- Btg.prototype = { checkOffset: function(t) {
- this.checkIndex(this.index + t);
- }, checkIndex: function(t) {
- if (this.length < this.zero + t || t < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + t + "). Corrupted zip ?");
- }, setIndex: function(t) {
- this.checkIndex(t), this.index = t;
- }, skip: function(t) {
- this.setIndex(this.index + t);
- }, byteAt: function() {
- }, readInt: function(t) {
- var I, g = 0;
- for (this.checkOffset(t), I = this.index + t - 1; I >= this.index; I--) g = (g << 8) + this.byteAt(I);
- return this.index += t, g;
- }, readString: function(t) {
- return Y0g.transformTo("string", this.readData(t));
- }, readData: function() {
- }, lastIndexOfSignature: function() {
- }, readAndCheckSignature: function() {
- }, readDate: function() {
- var t = this.readInt(4);
- return new Date(Date.UTC(1980 + (t >> 25 & 127), (t >> 21 & 15) - 1, t >> 16 & 31, t >> 11 & 31, t >> 5 & 63, (31 & t) << 1));
- } };
- var Wtg = Btg, ytg = Wtg;
- function th(t) {
- ytg.call(this, t);
- for (var I = 0; I < this.data.length; I++) t[I] = 255 & t[I];
- }
- gt().inherits(th, ytg), th.prototype.byteAt = function(t) {
- return this.data[this.zero + t];
- }, th.prototype.lastIndexOfSignature = function(t) {
- for (var I = t.charCodeAt(0), g = t.charCodeAt(1), C = t.charCodeAt(2), i = t.charCodeAt(3), e = this.length - 4; e >= 0; --e) if (this.data[e] === I && this.data[e + 1] === g && this.data[e + 2] === C && this.data[e + 3] === i) return e - this.zero;
- return -1;
- }, th.prototype.readAndCheckSignature = function(t) {
- var I = t.charCodeAt(0), g = t.charCodeAt(1), C = t.charCodeAt(2), i = t.charCodeAt(3), e = this.readData(4);
- return I === e[0] && g === e[1] && C === e[2] && i === e[3];
- }, th.prototype.readData = function(t) {
- if (this.checkOffset(t), t === 0) return [];
- var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
- return this.index += t, I;
- };
- var Ytg = th, Ntg = Wtg;
- function ih(t) {
- Ntg.call(this, t);
- }
- gt().inherits(ih, Ntg), ih.prototype.byteAt = function(t) {
- return this.data.charCodeAt(this.zero + t);
- }, ih.prototype.lastIndexOfSignature = function(t) {
- return this.data.lastIndexOf(t) - this.zero;
- }, ih.prototype.readAndCheckSignature = function(t) {
- return t === this.readData(4);
- }, ih.prototype.readData = function(t) {
- this.checkOffset(t);
- var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
- return this.index += t, I;
- };
- var N0g = ih, Vtg = Ytg;
- function pD(t) {
- Vtg.call(this, t);
- }
- gt().inherits(pD, Vtg), pD.prototype.readData = function(t) {
- if (this.checkOffset(t), t === 0) return new Uint8Array(0);
- var I = this.data.subarray(this.zero + this.index, this.zero + this.index + t);
- return this.index += t, I;
- };
- var Mtg = pD, Rtg = Mtg;
- function BD(t) {
- Rtg.call(this, t);
- }
- gt().inherits(BD, Rtg), BD.prototype.readData = function(t) {
- this.checkOffset(t);
- var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
- return this.index += t, I;
- };
- var V0g = BD, _Y = gt(), Iq = rt, M0g = Ytg, R0g = N0g, f0g = V0g, H0g = Mtg, ftg = function(t) {
- var I = _Y.getTypeOf(t);
- return _Y.checkSupport(I), I !== "string" || Iq.uint8array ? I === "nodebuffer" ? new f0g(t) : Iq.uint8array ? new H0g(_Y.transformTo("uint8array", t)) : new M0g(_Y.transformTo("array", t)) : new R0g(t);
- }, fX = ftg, Pn = gt(), X0g = L9, Cq = J9, qY = M0, $Y = uV, S0g = rt;
- function Htg(t, I) {
- this.options = t, this.loadOptions = I;
- }
- Htg.prototype = { isEncrypted: function() {
- return (1 & this.bitFlag) == 1;
- }, useUTF8: function() {
- return (2048 & this.bitFlag) == 2048;
- }, readLocalPart: function(t) {
- var I, g;
- if (t.skip(22), this.fileNameLength = t.readInt(2), g = t.readInt(2), this.fileName = t.readData(this.fileNameLength), t.skip(g), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
- if (I = function(C) {
- for (var i in $Y) if (Object.prototype.hasOwnProperty.call($Y, i) && $Y[i].magic === C) return $Y[i];
- return null;
- }(this.compressionMethod), I === null) throw new Error("Corrupted zip : compression " + Pn.pretty(this.compressionMethod) + " unknown (inner file : " + Pn.transformTo("string", this.fileName) + ")");
- this.decompressed = new X0g(this.compressedSize, this.uncompressedSize, this.crc32, I, t.readData(this.compressedSize));
- }, readCentralPart: function(t) {
- this.versionMadeBy = t.readInt(2), t.skip(2), this.bitFlag = t.readInt(2), this.compressionMethod = t.readString(2), this.date = t.readDate(), this.crc32 = t.readInt(4), this.compressedSize = t.readInt(4), this.uncompressedSize = t.readInt(4);
- var I = t.readInt(2);
- if (this.extraFieldsLength = t.readInt(2), this.fileCommentLength = t.readInt(2), this.diskNumberStart = t.readInt(2), this.internalFileAttributes = t.readInt(2), this.externalFileAttributes = t.readInt(4), this.localHeaderOffset = t.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
- t.skip(I), this.readExtraFields(t), this.parseZIP64ExtraField(t), this.fileComment = t.readData(this.fileCommentLength);
- }, processAttributes: function() {
- this.unixPermissions = null, this.dosPermissions = null;
- var t = this.versionMadeBy >> 8;
- this.dir = !!(16 & this.externalFileAttributes), t === 0 && (this.dosPermissions = 63 & this.externalFileAttributes), t === 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
- }, parseZIP64ExtraField: function() {
- if (this.extraFields[1]) {
- var t = fX(this.extraFields[1].value);
- this.uncompressedSize === Pn.MAX_VALUE_32BITS && (this.uncompressedSize = t.readInt(8)), this.compressedSize === Pn.MAX_VALUE_32BITS && (this.compressedSize = t.readInt(8)), this.localHeaderOffset === Pn.MAX_VALUE_32BITS && (this.localHeaderOffset = t.readInt(8)), this.diskNumberStart === Pn.MAX_VALUE_32BITS && (this.diskNumberStart = t.readInt(4));
- }
- }, readExtraFields: function(t) {
- var I, g, C, i = t.index + this.extraFieldsLength;
- for (this.extraFields || (this.extraFields = {}); t.index + 4 < i; ) I = t.readInt(2), g = t.readInt(2), C = t.readData(g), this.extraFields[I] = { id: I, length: g, value: C };
- t.setIndex(i);
- }, handleUTF8: function() {
- var t = S0g.uint8array ? "uint8array" : "array";
- if (this.useUTF8()) this.fileNameStr = qY.utf8decode(this.fileName), this.fileCommentStr = qY.utf8decode(this.fileComment);
- else {
- var I = this.findExtraFieldUnicodePath();
- if (I !== null) this.fileNameStr = I;
- else {
- var g = Pn.transformTo(t, this.fileName);
- this.fileNameStr = this.loadOptions.decodeFileName(g);
- }
- var C = this.findExtraFieldUnicodeComment();
- if (C !== null) this.fileCommentStr = C;
- else {
- var i = Pn.transformTo(t, this.fileComment);
- this.fileCommentStr = this.loadOptions.decodeFileName(i);
- }
- }
- }, findExtraFieldUnicodePath: function() {
- var t = this.extraFields[28789];
- if (t) {
- var I = fX(t.value);
- return I.readInt(1) !== 1 || Cq(this.fileName) !== I.readInt(4) ? null : qY.utf8decode(I.readData(t.length - 5));
- }
- return null;
- }, findExtraFieldUnicodeComment: function() {
- var t = this.extraFields[25461];
- if (t) {
- var I = fX(t.value);
- return I.readInt(1) !== 1 || Cq(this.fileComment) !== I.readInt(4) ? null : qY.utf8decode(I.readData(t.length - 5));
- }
- return null;
- } };
- var D0g = Htg, K0g = ftg, al = gt(), rA = utg, F0g = D0g, k0g = rt;
- function Xtg(t) {
- this.files = [], this.loadOptions = t;
- }
- Xtg.prototype = { checkSignature: function(t) {
- if (!this.reader.readAndCheckSignature(t)) {
- this.reader.index -= 4;
- var I = this.reader.readString(4);
- throw new Error("Corrupted zip or bug: unexpected signature (" + al.pretty(I) + ", expected " + al.pretty(t) + ")");
- }
- }, isSignature: function(t, I) {
- var g = this.reader.index;
- this.reader.setIndex(t);
- var C = this.reader.readString(4) === I;
- return this.reader.setIndex(g), C;
- }, readBlockEndOfCentral: function() {
- this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
- var t = this.reader.readData(this.zipCommentLength), I = k0g.uint8array ? "uint8array" : "array", g = al.transformTo(I, t);
- this.zipComment = this.loadOptions.decodeFileName(g);
- }, readBlockZip64EndOfCentral: function() {
- this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
- for (var t, I, g, C = this.zip64EndOfCentralSize - 44; 0 < C; ) t = this.reader.readInt(2), I = this.reader.readInt(4), g = this.reader.readData(I), this.zip64ExtensibleData[t] = { id: t, length: I, value: g };
- }, readBlockZip64EndOfCentralLocator: function() {
- if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), this.disksCount > 1) throw new Error("Multi-volumes zip are not supported");
- }, readLocalFiles: function() {
- var t, I;
- for (t = 0; t < this.files.length; t++) I = this.files[t], this.reader.setIndex(I.localHeaderOffset), this.checkSignature(rA.LOCAL_FILE_HEADER), I.readLocalPart(this.reader), I.handleUTF8(), I.processAttributes();
- }, readCentralDir: function() {
- var t;
- for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(rA.CENTRAL_FILE_HEADER); ) (t = new F0g({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(t);
- if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
- }, readEndOfCentral: function() {
- var t = this.reader.lastIndexOfSignature(rA.CENTRAL_DIRECTORY_END);
- if (t < 0) throw this.isSignature(0, rA.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
- this.reader.setIndex(t);
- var I = t;
- if (this.checkSignature(rA.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === al.MAX_VALUE_16BITS || this.diskWithCentralDirStart === al.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === al.MAX_VALUE_16BITS || this.centralDirRecords === al.MAX_VALUE_16BITS || this.centralDirSize === al.MAX_VALUE_32BITS || this.centralDirOffset === al.MAX_VALUE_32BITS) {
- if (this.zip64 = !0, (t = this.reader.lastIndexOfSignature(rA.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
- if (this.reader.setIndex(t), this.checkSignature(rA.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, rA.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(rA.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
- this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(rA.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
- }
- var g = this.centralDirOffset + this.centralDirSize;
- this.zip64 && (g += 20, g += 12 + this.zip64EndOfCentralSize);
- var C = I - g;
- if (C > 0) this.isSignature(I, rA.CENTRAL_FILE_HEADER) || (this.reader.zero = C);
- else if (C < 0) throw new Error("Corrupted zip: missing " + Math.abs(C) + " bytes.");
- }, prepareReader: function(t) {
- this.reader = K0g(t);
- }, load: function(t) {
- this.prepareReader(t), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
- } };
- var z0g = Xtg, HX = gt(), _N = mG, J0g = M0, L0g = z0g, v0g = ECg, tq = cM;
- function T0g(t) {
- return new _N.Promise(function(I, g) {
- var C = t.decompressed.getContentWorker().pipe(new v0g());
- C.on("error", function(i) {
- g(i);
- }).on("end", function() {
- C.streamInfo.crc32 !== t.decompressed.crc32 ? g(new Error("Corrupted zip : CRC32 mismatch")) : I();
- }).resume();
- });
- }
- function $e() {
- if (!(this instanceof $e)) return new $e();
- if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
- this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
- var t = new $e();
- for (var I in this) typeof this[I] != "function" && (t[I] = this[I]);
- return t;
- };
- }
- $e.prototype = y0g, $e.prototype.loadAsync = function(t, I) {
- var g = this;
- return I = HX.extend(I || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: J0g.utf8decode }), tq.isNode && tq.isStream(t) ? _N.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : HX.prepareContent("the loaded zip file", t, !0, I.optimizedBinaryString, I.base64).then(function(C) {
- var i = new L0g(I);
- return i.load(C), i;
- }).then(function(C) {
- var i = [_N.Promise.resolve(C)], e = C.files;
- if (I.checkCRC32) for (var A = 0; A < e.length; A++) i.push(T0g(e[A]));
- return _N.Promise.all(i);
- }).then(function(C) {
- for (var i = C.shift(), e = i.files, A = 0; A < e.length; A++) {
- var s = e[A], l = s.fileNameStr, n = HX.resolve(s.fileNameStr);
- g.file(n, s.decompressed, { binary: !0, optimizedBinaryString: !0, date: s.date, dir: s.dir, comment: s.fileCommentStr.length ? s.fileCommentStr : null, unixPermissions: s.unixPermissions, dosPermissions: s.dosPermissions, createFolders: I.createFolders }), s.dir || (g.file(n).unsafeOriginalName = l);
- }
- return i.zipComment.length && (g.comment = i.zipComment), g;
- });
- }, $e.support = rt, $e.defaults = QCg, $e.version = "3.10.1", $e.loadAsync = function(t, I) {
- return new $e().loadAsync(t, I);
- }, $e.external = mG;
- var x0g = $e;
- function j0g(t, I) {
- var g = (I = I || {}).pos || 0, C = !!I.keepComments, i = !!I.keepWhitespace, e = 60, A = 62, s = 45, l = 47, n = 33, a = 39, d = 34, o = 91, c = 93;
- function r(R) {
- for (var X = []; t[g]; ) if (t.charCodeAt(g) == e) {
- if (t.charCodeAt(g + 1) === l) {
- var H = g + 2;
- if (g = t.indexOf(">", g), t.substring(H, g).indexOf(R) == -1) {
- var S = t.substring(0, g).split(`
- `);
- throw new Error(`Unexpected close tag
- Line: ` + (S.length - 1) + `
- Column: ` + (S[S.length - 1].length + 1) + `
- Char: ` + t[g]);
- }
- return g + 1 && (g += 1), X;
- }
- if (t.charCodeAt(g + 1) === n) {
- if (t.charCodeAt(g + 2) == s) {
- const B = g;
- for (; g !== -1 && (t.charCodeAt(g) !== A || t.charCodeAt(g - 1) != s || t.charCodeAt(g - 2) != s || g == -1); ) g = t.indexOf(">", g + 1);
- g === -1 && (g = t.length), C && X.push(t.substring(B, g + 1));
- } else {
- if (t.charCodeAt(g + 2) === o && t.charCodeAt(g + 8) === o && t.substr(g + 3, 5).toLowerCase() === "cdata") {
- var z = t.indexOf("]]>", g);
- z == -1 ? (X.push(t.substr(g + 9)), g = t.length) : (X.push(t.substring(g + 9, z)), g = z + 3);
- continue;
- }
- {
- const B = g + 1;
- g += 2;
- for (var v = !1; (t.charCodeAt(g) !== A || v === !0) && t[g]; ) t.charCodeAt(g) === o ? v = !0 : v === !0 && t.charCodeAt(g) === c && (v = !1), g++;
- X.push(t.substring(B, g));
- }
- }
- g++;
- continue;
- }
- var K = m();
- X.push(K), K.tagName[0] === "?" && (X.push(...K.children), K.children = []);
- } else {
- var V = h();
- if (i) V.length > 0 && X.push(V);
- else {
- var N = V.trim();
- N.length > 0 && X.push(N);
- }
- g++;
- }
- return X;
- }
- function h() {
- var R = g;
- return (g = t.indexOf("<", g) - 1) === -2 && (g = t.length), t.slice(R, g + 1);
- }
- function b() {
- for (var R = g; `\r
- >/= `.indexOf(t[g]) === -1 && t[g]; ) g++;
- return t.slice(R, g);
- }
- var u = I.noChildNodes || ["img", "br", "input", "meta", "link", "hr"];
- function m() {
- g++;
- const R = b(), X = {};
- let H = [];
- for (; t.charCodeAt(g) !== A && t[g]; ) {
- var S = t.charCodeAt(g);
- if (S > 64 && S < 91 || S > 96 && S < 123) {
- for (var z = b(), v = t.charCodeAt(g); v && v !== a && v !== d && !(v > 64 && v < 91 || v > 96 && v < 123) && v !== A; ) g++, v = t.charCodeAt(g);
- if (v === a || v === d) {
- var K = Z();
- if (g === -1) return { tagName: R, attributes: X, children: H };
- } else K = null, g--;
- X[z] = K;
- }
- g++;
- }
- if (t.charCodeAt(g - 1) !== l) if (R == "script") {
- var V = g + 1;
- g = t.indexOf("<\/script>", g), H = [t.slice(V, g)], g += 9;
- } else R == "style" ? (V = g + 1, g = t.indexOf("</style>", g), H = [t.slice(V, g)], g += 8) : u.indexOf(R) === -1 ? (g++, H = r(R)) : g++;
- else g++;
- return { tagName: R, attributes: X, children: H };
- }
- function Z() {
- var R = t[g], X = g + 1;
- return g = t.indexOf(R, X), t.slice(X, g);
- }
- var p, Y = null;
- if (I.attrValue !== void 0)
- for (I.attrName = I.attrName || "id", Y = []; p = void 0, p = new RegExp("\\s" + I.attrName + `\\s*=['"]` + I.attrValue + `['"]`).exec(t), (g = p ? p.index : -1) !== -1; ) (g = t.lastIndexOf("<", g)) !== -1 && Y.push(m()), t = t.substr(g), g = 0;
- else Y = I.parseNode ? m() : r("");
- return I.filter && (Y = Dtg(Y, I.filter)), I.simplify ? Stg(Array.isArray(Y) ? Y : [Y]) : (I.setPos && (Y.pos = g), Y);
- }
- function Stg(t) {
- var I = {};
- if (!t.length) return "";
- if (t.length === 1 && typeof t[0] == "string") return t[0];
- for (var g in t.forEach(function(C) {
- if (typeof C == "object") {
- I[C.tagName] || (I[C.tagName] = []);
- var i = Stg(C.children);
- I[C.tagName].push(i), Object.keys(C.attributes).length && typeof i != "string" && (i._attributes = C.attributes);
- }
- }), I) I[g].length == 1 && (I[g] = I[g][0]);
- return I;
- }
- function Dtg(t, I, g = 0, C = "") {
- var i = [];
- return t.forEach(function(e, A) {
- if (typeof e == "object" && I(e, A, g, C) && i.push(e), e.children) {
- var s = Dtg(e.children, I, g + 1, (C ? C + "." : "") + A + "." + e.tagName);
- i = i.concat(s);
- }
- }), i;
- }
- function Q0g(t, I) {
- var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
- if (!g) {
- if (Array.isArray(t) || (g = function(l, n) {
- if (l) {
- if (typeof l == "string") return iq(l, n);
- var a = Object.prototype.toString.call(l).slice(8, -1);
- if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
- if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return iq(l, n);
- }
- }(t)) || I) {
- g && (t = g);
- var C = 0, i = function() {
- };
- return { s: i, n: function() {
- return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
- }, e: function(l) {
- throw l;
- }, f: i };
- }
- throw new TypeError(`Invalid attempt to iterate non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }
- var e, A = !0, s = !1;
- return { s: function() {
- g = g.call(t);
- }, n: function() {
- var l = g.next();
- return A = l.done, l;
- }, e: function(l) {
- s = !0, e = l;
- }, f: function() {
- try {
- A || g.return == null || g.return();
- } finally {
- if (s) throw e;
- }
- } };
- }
- function iq(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function eq(t, I) {
- var g = Object.keys(t);
- if (Object.getOwnPropertySymbols) {
- var C = Object.getOwnPropertySymbols(t);
- I && (C = C.filter(function(i) {
- return Object.getOwnPropertyDescriptor(t, i).enumerable;
- })), g.push.apply(g, C);
- }
- return g;
- }
- function XX(t) {
- for (var I = 1; I < arguments.length; I++) {
- var g = arguments[I] != null ? arguments[I] : {};
- I % 2 ? eq(Object(g), !0).forEach(function(C) {
- f9(t, C, g[C]);
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : eq(Object(g)).forEach(function(C) {
- Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
- });
- }
- return t;
- }
- var SX = 0;
- function Ktg(t) {
- var I = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, g = {};
- if (!t.length) return g;
- if (t.length === 1 && typeof t[0] == "string") return Object.keys(I).length ? { attrs: XX({ order: SX++ }, I), value: t[0] } : t[0];
- var C, i = Q0g(t);
- try {
- for (i.s(); !(C = i.n()).done; ) {
- var e = C.value;
- if (_a(e) !== "object") return;
- if (e.tagName !== "?xml") {
- g[e.tagName] || (g[e.tagName] = []);
- var A = Ktg(e.children || [], e.attributes);
- _a(A) === "object" && (A.attrs ? A.attrs.order = SX++ : A.attrs = { order: SX++ }), Object.keys(e.attributes || {}).length && (A.attrs = XX(XX({}, A.attrs), e.attributes)), g[e.tagName].push(A);
- }
- }
- } catch (l) {
- i.e(l);
- } finally {
- i.f();
- }
- for (var s in g) g[s].length === 1 && (g[s] = g[s][0]);
- return g;
- }
- function yt(t, I) {
- return Ftg.apply(this, arguments);
- }
- function Ftg() {
- return (Ftg = SC(bI.mark(function t(I, g) {
- var C;
- return bI.wrap(function(i) {
- for (; ; ) switch (i.prev = i.next) {
- case 0:
- return i.prev = 0, i.next = 3, I.file(g).async("string");
- case 3:
- return C = i.sent, i.abrupt("return", Ktg(j0g(C)));
- case 7:
- return i.prev = 7, i.t0 = i.catch(0), i.abrupt("return", null);
- case 10:
- case "end":
- return i.stop();
- }
- }, t, null, [[0, 7]]);
- }))).apply(this, arguments);
- }
- function wV(t) {
- return wV = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
- return typeof I;
- } : function(I) {
- return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
- }, wV(t);
- }
- var O0g = /^\s+/, U0g = /\s+$/;
- function Qg(t, I) {
- if (I = I || {}, (t = t || "") instanceof Qg) return t;
- if (!(this instanceof Qg)) return new Qg(t, I);
- var g = function(C) {
- var i = { r: 0, g: 0, b: 0 }, e = 1, A = null, s = null, l = null, n = !1, a = !1;
- typeof C == "string" && (C = function(r) {
- r = r.replace(O0g, "").replace(U0g, "").toLowerCase();
- var h, b = !1;
- if (WD[r]) r = WD[r], b = !0;
- else if (r == "transparent") return { r: 0, g: 0, b: 0, a: 0, format: "name" };
- return (h = mA.rgb.exec(r)) ? { r: h[1], g: h[2], b: h[3] } : (h = mA.rgba.exec(r)) ? { r: h[1], g: h[2], b: h[3], a: h[4] } : (h = mA.hsl.exec(r)) ? { h: h[1], s: h[2], l: h[3] } : (h = mA.hsla.exec(r)) ? { h: h[1], s: h[2], l: h[3], a: h[4] } : (h = mA.hsv.exec(r)) ? { h: h[1], s: h[2], v: h[3] } : (h = mA.hsva.exec(r)) ? { h: h[1], s: h[2], v: h[3], a: h[4] } : (h = mA.hex8.exec(r)) ? { r: se(h[1]), g: se(h[2]), b: se(h[3]), a: oq(h[4]), format: b ? "name" : "hex8" } : (h = mA.hex6.exec(r)) ? { r: se(h[1]), g: se(h[2]), b: se(h[3]), format: b ? "name" : "hex" } : (h = mA.hex4.exec(r)) ? { r: se(h[1] + "" + h[1]), g: se(h[2] + "" + h[2]), b: se(h[3] + "" + h[3]), a: oq(h[4] + "" + h[4]), format: b ? "name" : "hex8" } : (h = mA.hex3.exec(r)) ? { r: se(h[1] + "" + h[1]), g: se(h[2] + "" + h[2]), b: se(h[3] + "" + h[3]), format: b ? "name" : "hex" } : !1;
- }(C)), wV(C) == "object" && (ol(C.r) && ol(C.g) && ol(C.b) ? (d = C.r, o = C.g, c = C.b, i = { r: 255 * JC(d, 255), g: 255 * JC(o, 255), b: 255 * JC(c, 255) }, n = !0, a = String(C.r).substr(-1) === "%" ? "prgb" : "rgb") : ol(C.h) && ol(C.s) && ol(C.v) ? (A = cm(C.s), s = cm(C.v), i = function(r, h, b) {
- r = 6 * JC(r, 360), h = JC(h, 100), b = JC(b, 100);
- var u = Math.floor(r), m = r - u, Z = b * (1 - h), p = b * (1 - m * h), Y = b * (1 - (1 - m) * h), R = u % 6;
- return { r: 255 * [b, p, Z, Z, Y, b][R], g: 255 * [Y, b, b, p, Z, Z][R], b: 255 * [Z, Z, Y, b, b, p][R] };
- }(C.h, A, s), n = !0, a = "hsv") : ol(C.h) && ol(C.s) && ol(C.l) && (A = cm(C.s), l = cm(C.l), i = function(r, h, b) {
- var u, m, Z;
- function p(X, H, S) {
- return S < 0 && (S += 1), S > 1 && (S -= 1), S < 1 / 6 ? X + 6 * (H - X) * S : S < 0.5 ? H : S < 2 / 3 ? X + (H - X) * (2 / 3 - S) * 6 : X;
- }
- if (r = JC(r, 360), h = JC(h, 100), b = JC(b, 100), h === 0) u = m = Z = b;
- else {
- var Y = b < 0.5 ? b * (1 + h) : b + h - b * h, R = 2 * b - Y;
- u = p(R, Y, r + 1 / 3), m = p(R, Y, r), Z = p(R, Y, r - 1 / 3);
- }
- return { r: 255 * u, g: 255 * m, b: 255 * Z };
- }(C.h, A, l), n = !0, a = "hsl"), C.hasOwnProperty("a") && (e = C.a));
- var d, o, c;
- return e = ktg(e), { ok: n, format: C.format || a, r: Math.min(255, Math.max(i.r, 0)), g: Math.min(255, Math.max(i.g, 0)), b: Math.min(255, Math.max(i.b, 0)), a: e };
- }(t);
- this._originalInput = t, this._r = g.r, this._g = g.g, this._b = g.b, this._a = g.a, this._roundA = Math.round(100 * this._a) / 100, this._format = I.format || g.format, this._gradientType = I.gradientType, this._r < 1 && (this._r = Math.round(this._r)), this._g < 1 && (this._g = Math.round(this._g)), this._b < 1 && (this._b = Math.round(this._b)), this._ok = g.ok;
- }
- function Aq(t, I, g) {
- t = JC(t, 255), I = JC(I, 255), g = JC(g, 255);
- var C, i, e = Math.max(t, I, g), A = Math.min(t, I, g), s = (e + A) / 2;
- if (e == A) C = i = 0;
- else {
- var l = e - A;
- switch (i = s > 0.5 ? l / (2 - e - A) : l / (e + A), e) {
- case t:
- C = (I - g) / l + (I < g ? 6 : 0);
- break;
- case I:
- C = (g - t) / l + 2;
- break;
- case g:
- C = (t - I) / l + 4;
- }
- C /= 6;
- }
- return { h: C, s: i, l: s };
- }
- function sq(t, I, g) {
- t = JC(t, 255), I = JC(I, 255), g = JC(g, 255);
- var C, i, e = Math.max(t, I, g), A = Math.min(t, I, g), s = e, l = e - A;
- if (i = e === 0 ? 0 : l / e, e == A) C = 0;
- else {
- switch (e) {
- case t:
- C = (I - g) / l + (I < g ? 6 : 0);
- break;
- case I:
- C = (g - t) / l + 2;
- break;
- case g:
- C = (t - I) / l + 4;
- }
- C /= 6;
- }
- return { h: C, s: i, v: s };
- }
- function lq(t, I, g, C) {
- var i = [KA(Math.round(t).toString(16)), KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16))];
- return C && i[0].charAt(0) == i[0].charAt(1) && i[1].charAt(0) == i[1].charAt(1) && i[2].charAt(0) == i[2].charAt(1) ? i[0].charAt(0) + i[1].charAt(0) + i[2].charAt(0) : i.join("");
- }
- function nq(t, I, g, C) {
- return [KA(ztg(C)), KA(Math.round(t).toString(16)), KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16))].join("");
- }
- function E0g(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = Qg(t).toHsl();
- return g.s -= I / 100, g.s = dM(g.s), Qg(g);
- }
- function P0g(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = Qg(t).toHsl();
- return g.s += I / 100, g.s = dM(g.s), Qg(g);
- }
- function _0g(t) {
- return Qg(t).desaturate(100);
- }
- function q0g(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = Qg(t).toHsl();
- return g.l += I / 100, g.l = dM(g.l), Qg(g);
- }
- function $0g(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = Qg(t).toRgb();
- return g.r = Math.max(0, Math.min(255, g.r - Math.round(-I / 100 * 255))), g.g = Math.max(0, Math.min(255, g.g - Math.round(-I / 100 * 255))), g.b = Math.max(0, Math.min(255, g.b - Math.round(-I / 100 * 255))), Qg(g);
- }
- function gbg(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = Qg(t).toHsl();
- return g.l -= I / 100, g.l = dM(g.l), Qg(g);
- }
- function Ibg(t, I) {
- var g = Qg(t).toHsl(), C = (g.h + I) % 360;
- return g.h = C < 0 ? 360 + C : C, Qg(g);
- }
- function Cbg(t) {
- var I = Qg(t).toHsl();
- return I.h = (I.h + 180) % 360, Qg(I);
- }
- function aq(t, I) {
- if (isNaN(I) || I <= 0) throw new Error("Argument to polyad must be a positive number");
- for (var g = Qg(t).toHsl(), C = [Qg(t)], i = 360 / I, e = 1; e < I; e++) C.push(Qg({ h: (g.h + e * i) % 360, s: g.s, l: g.l }));
- return C;
- }
- function tbg(t) {
- var I = Qg(t).toHsl(), g = I.h;
- return [Qg(t), Qg({ h: (g + 72) % 360, s: I.s, l: I.l }), Qg({ h: (g + 216) % 360, s: I.s, l: I.l })];
- }
- function ibg(t, I, g) {
- I = I || 6, g = g || 30;
- var C = Qg(t).toHsl(), i = 360 / g, e = [Qg(t)];
- for (C.h = (C.h - (i * I >> 1) + 720) % 360; --I; ) C.h = (C.h + i) % 360, e.push(Qg(C));
- return e;
- }
- function ebg(t, I) {
- I = I || 6;
- for (var g = Qg(t).toHsv(), C = g.h, i = g.s, e = g.v, A = [], s = 1 / I; I--; ) A.push(Qg({ h: C, s: i, v: e })), e = (e + s) % 1;
- return A;
- }
- Qg.prototype = { isDark: function() {
- return this.getBrightness() < 128;
- }, isLight: function() {
- return !this.isDark();
- }, isValid: function() {
- return this._ok;
- }, getOriginalInput: function() {
- return this._originalInput;
- }, getFormat: function() {
- return this._format;
- }, getAlpha: function() {
- return this._a;
- }, getBrightness: function() {
- var t = this.toRgb();
- return (299 * t.r + 587 * t.g + 114 * t.b) / 1e3;
- }, getLuminance: function() {
- var t, I, g, C = this.toRgb();
- return t = C.r / 255, I = C.g / 255, g = C.b / 255, 0.2126 * (t <= 0.03928 ? t / 12.92 : Math.pow((t + 0.055) / 1.055, 2.4)) + 0.7152 * (I <= 0.03928 ? I / 12.92 : Math.pow((I + 0.055) / 1.055, 2.4)) + 0.0722 * (g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4));
- }, setAlpha: function(t) {
- return this._a = ktg(t), this._roundA = Math.round(100 * this._a) / 100, this;
- }, toHsv: function() {
- var t = sq(this._r, this._g, this._b);
- return { h: 360 * t.h, s: t.s, v: t.v, a: this._a };
- }, toHsvString: function() {
- var t = sq(this._r, this._g, this._b), I = Math.round(360 * t.h), g = Math.round(100 * t.s), C = Math.round(100 * t.v);
- return this._a == 1 ? "hsv(" + I + ", " + g + "%, " + C + "%)" : "hsva(" + I + ", " + g + "%, " + C + "%, " + this._roundA + ")";
- }, toHsl: function() {
- var t = Aq(this._r, this._g, this._b);
- return { h: 360 * t.h, s: t.s, l: t.l, a: this._a };
- }, toHslString: function() {
- var t = Aq(this._r, this._g, this._b), I = Math.round(360 * t.h), g = Math.round(100 * t.s), C = Math.round(100 * t.l);
- return this._a == 1 ? "hsl(" + I + ", " + g + "%, " + C + "%)" : "hsla(" + I + ", " + g + "%, " + C + "%, " + this._roundA + ")";
- }, toHex: function(t) {
- return lq(this._r, this._g, this._b, t);
- }, toHexString: function(t) {
- return "#" + this.toHex(t);
- }, toHex8: function(t) {
- return function(I, g, C, i, e) {
- var A = [KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16)), KA(Math.round(C).toString(16)), KA(ztg(i))];
- return e && A[0].charAt(0) == A[0].charAt(1) && A[1].charAt(0) == A[1].charAt(1) && A[2].charAt(0) == A[2].charAt(1) && A[3].charAt(0) == A[3].charAt(1) ? A[0].charAt(0) + A[1].charAt(0) + A[2].charAt(0) + A[3].charAt(0) : A.join("");
- }(this._r, this._g, this._b, this._a, t);
- }, toHex8String: function(t) {
- return "#" + this.toHex8(t);
- }, toRgb: function() {
- return { r: Math.round(this._r), g: Math.round(this._g), b: Math.round(this._b), a: this._a };
- }, toRgbString: function() {
- return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
- }, toPercentageRgb: function() {
- return { r: Math.round(100 * JC(this._r, 255)) + "%", g: Math.round(100 * JC(this._g, 255)) + "%", b: Math.round(100 * JC(this._b, 255)) + "%", a: this._a };
- }, toPercentageRgbString: function() {
- return this._a == 1 ? "rgb(" + Math.round(100 * JC(this._r, 255)) + "%, " + Math.round(100 * JC(this._g, 255)) + "%, " + Math.round(100 * JC(this._b, 255)) + "%)" : "rgba(" + Math.round(100 * JC(this._r, 255)) + "%, " + Math.round(100 * JC(this._g, 255)) + "%, " + Math.round(100 * JC(this._b, 255)) + "%, " + this._roundA + ")";
- }, toName: function() {
- return this._a === 0 ? "transparent" : !(this._a < 1) && (Abg[lq(this._r, this._g, this._b, !0)] || !1);
- }, toFilter: function(t) {
- var I = "#" + nq(this._r, this._g, this._b, this._a), g = I, C = this._gradientType ? "GradientType = 1, " : "";
- if (t) {
- var i = Qg(t);
- g = "#" + nq(i._r, i._g, i._b, i._a);
- }
- return "progid:DXImageTransform.Microsoft.gradient(" + C + "startColorstr=" + I + ",endColorstr=" + g + ")";
- }, toString: function(t) {
- var I = !!t;
- t = t || this._format;
- var g = !1, C = this._a < 1 && this._a >= 0;
- return I || !C || t !== "hex" && t !== "hex6" && t !== "hex3" && t !== "hex4" && t !== "hex8" && t !== "name" ? (t === "rgb" && (g = this.toRgbString()), t === "prgb" && (g = this.toPercentageRgbString()), t !== "hex" && t !== "hex6" || (g = this.toHexString()), t === "hex3" && (g = this.toHexString(!0)), t === "hex4" && (g = this.toHex8String(!0)), t === "hex8" && (g = this.toHex8String()), t === "name" && (g = this.toName()), t === "hsl" && (g = this.toHslString()), t === "hsv" && (g = this.toHsvString()), g || this.toHexString()) : t === "name" && this._a === 0 ? this.toName() : this.toRgbString();
- }, clone: function() {
- return Qg(this.toString());
- }, _applyModification: function(t, I) {
- var g = t.apply(null, [this].concat([].slice.call(I)));
- return this._r = g._r, this._g = g._g, this._b = g._b, this.setAlpha(g._a), this;
- }, lighten: function() {
- return this._applyModification(q0g, arguments);
- }, brighten: function() {
- return this._applyModification($0g, arguments);
- }, darken: function() {
- return this._applyModification(gbg, arguments);
- }, desaturate: function() {
- return this._applyModification(E0g, arguments);
- }, saturate: function() {
- return this._applyModification(P0g, arguments);
- }, greyscale: function() {
- return this._applyModification(_0g, arguments);
- }, spin: function() {
- return this._applyModification(Ibg, arguments);
- }, _applyCombination: function(t, I) {
- return t.apply(null, [this].concat([].slice.call(I)));
- }, analogous: function() {
- return this._applyCombination(ibg, arguments);
- }, complement: function() {
- return this._applyCombination(Cbg, arguments);
- }, monochromatic: function() {
- return this._applyCombination(ebg, arguments);
- }, splitcomplement: function() {
- return this._applyCombination(tbg, arguments);
- }, triad: function() {
- return this._applyCombination(aq, [3]);
- }, tetrad: function() {
- return this._applyCombination(aq, [4]);
- } }, Qg.fromRatio = function(t, I) {
- if (wV(t) == "object") {
- var g = {};
- for (var C in t) t.hasOwnProperty(C) && (g[C] = C === "a" ? t[C] : cm(t[C]));
- t = g;
- }
- return Qg(t, I);
- }, Qg.equals = function(t, I) {
- return !(!t || !I) && Qg(t).toRgbString() == Qg(I).toRgbString();
- }, Qg.random = function() {
- return Qg.fromRatio({ r: Math.random(), g: Math.random(), b: Math.random() });
- }, Qg.mix = function(t, I, g) {
- g = g === 0 ? 0 : g || 50;
- var C = Qg(t).toRgb(), i = Qg(I).toRgb(), e = g / 100;
- return Qg({ r: (i.r - C.r) * e + C.r, g: (i.g - C.g) * e + C.g, b: (i.b - C.b) * e + C.b, a: (i.a - C.a) * e + C.a });
- }, Qg.readability = function(t, I) {
- var g = Qg(t), C = Qg(I);
- return (Math.max(g.getLuminance(), C.getLuminance()) + 0.05) / (Math.min(g.getLuminance(), C.getLuminance()) + 0.05);
- }, Qg.isReadable = function(t, I, g) {
- var C, i, e = Qg.readability(t, I);
- switch (i = !1, (C = function(A) {
- var s, l;
- return s = ((A = A || { level: "AA", size: "small" }).level || "AA").toUpperCase(), l = (A.size || "small").toLowerCase(), s !== "AA" && s !== "AAA" && (s = "AA"), l !== "small" && l !== "large" && (l = "small"), { level: s, size: l };
- }(g)).level + C.size) {
- case "AAsmall":
- case "AAAlarge":
- i = e >= 4.5;
- break;
- case "AAlarge":
- i = e >= 3;
- break;
- case "AAAsmall":
- i = e >= 7;
- }
- return i;
- }, Qg.mostReadable = function(t, I, g) {
- var C, i, e, A, s = null, l = 0;
- i = (g = g || {}).includeFallbackColors, e = g.level, A = g.size;
- for (var n = 0; n < I.length; n++) (C = Qg.readability(t, I[n])) > l && (l = C, s = Qg(I[n]));
- return Qg.isReadable(t, s, { level: e, size: A }) || !i ? s : (g.includeFallbackColors = !1, Qg.mostReadable(t, ["#fff", "#000"], g));
- };
- var WD = Qg.names = { aliceblue: "f0f8ff", antiquewhite: "faebd7", aqua: "0ff", aquamarine: "7fffd4", azure: "f0ffff", beige: "f5f5dc", bisque: "ffe4c4", black: "000", blanchedalmond: "ffebcd", blue: "00f", blueviolet: "8a2be2", brown: "a52a2a", burlywood: "deb887", burntsienna: "ea7e5d", cadetblue: "5f9ea0", chartreuse: "7fff00", chocolate: "d2691e", coral: "ff7f50", cornflowerblue: "6495ed", cornsilk: "fff8dc", crimson: "dc143c", cyan: "0ff", darkblue: "00008b", darkcyan: "008b8b", darkgoldenrod: "b8860b", darkgray: "a9a9a9", darkgreen: "006400", darkgrey: "a9a9a9", darkkhaki: "bdb76b", darkmagenta: "8b008b", darkolivegreen: "556b2f", darkorange: "ff8c00", darkorchid: "9932cc", darkred: "8b0000", darksalmon: "e9967a", darkseagreen: "8fbc8f", darkslateblue: "483d8b", darkslategray: "2f4f4f", darkslategrey: "2f4f4f", darkturquoise: "00ced1", darkviolet: "9400d3", deeppink: "ff1493", deepskyblue: "00bfff", dimgray: "696969", dimgrey: "696969", dodgerblue: "1e90ff", firebrick: "b22222", floralwhite: "fffaf0", forestgreen: "228b22", fuchsia: "f0f", gainsboro: "dcdcdc", ghostwhite: "f8f8ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", grey: "808080", honeydew: "f0fff0", hotpink: "ff69b4", indianred: "cd5c5c", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lavender: "e6e6fa", lavenderblush: "fff0f5", lawngreen: "7cfc00", lemonchiffon: "fffacd", lightblue: "add8e6", lightcoral: "f08080", lightcyan: "e0ffff", lightgoldenrodyellow: "fafad2", lightgray: "d3d3d3", lightgreen: "90ee90", lightgrey: "d3d3d3", lightpink: "ffb6c1", lightsalmon: "ffa07a", lightseagreen: "20b2aa", lightskyblue: "87cefa", lightslategray: "789", lightslategrey: "789", lightsteelblue: "b0c4de", lightyellow: "ffffe0", lime: "0f0", limegreen: "32cd32", linen: "faf0e6", magenta: "f0f", maroon: "800000", mediumaquamarine: "66cdaa", mediumblue: "0000cd", mediumorchid: "ba55d3", mediumpurple: "9370db", mediumseagreen: "3cb371", mediumslateblue: "7b68ee", mediumspringgreen: "00fa9a", mediumturquoise: "48d1cc", mediumvioletred: "c71585", midnightblue: "191970", mintcream: "f5fffa", mistyrose: "ffe4e1", moccasin: "ffe4b5", navajowhite: "ffdead", navy: "000080", oldlace: "fdf5e6", olive: "808000", olivedrab: "6b8e23", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", palegoldenrod: "eee8aa", palegreen: "98fb98", paleturquoise: "afeeee", palevioletred: "db7093", papayawhip: "ffefd5", peachpuff: "ffdab9", peru: "cd853f", pink: "ffc0cb", plum: "dda0dd", powderblue: "b0e0e6", purple: "800080", rebeccapurple: "663399", red: "f00", rosybrown: "bc8f8f", royalblue: "4169e1", saddlebrown: "8b4513", salmon: "fa8072", sandybrown: "f4a460", seagreen: "2e8b57", seashell: "fff5ee", sienna: "a0522d", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", slategrey: "708090", snow: "fffafa", springgreen: "00ff7f", steelblue: "4682b4", tan: "d2b48c", teal: "008080", thistle: "d8bfd8", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "fff", whitesmoke: "f5f5f5", yellow: "ff0", yellowgreen: "9acd32" }, Abg = Qg.hexNames = function(t) {
- var I = {};
- for (var g in t) t.hasOwnProperty(g) && (I[t[g]] = g);
- return I;
- }(WD);
- function ktg(t) {
- return t = parseFloat(t), (isNaN(t) || t < 0 || t > 1) && (t = 1), t;
- }
- function JC(t, I) {
- (function(C) {
- return typeof C == "string" && C.indexOf(".") != -1 && parseFloat(C) === 1;
- })(t) && (t = "100%");
- var g = function(C) {
- return typeof C == "string" && C.indexOf("%") != -1;
- }(t);
- return t = Math.min(I, Math.max(0, parseFloat(t))), g && (t = parseInt(t * I, 10) / 100), Math.abs(t - I) < 1e-6 ? 1 : t % I / parseFloat(I);
- }
- function dM(t) {
- return Math.min(1, Math.max(0, t));
- }
- function se(t) {
- return parseInt(t, 16);
- }
- function KA(t) {
- return t.length == 1 ? "0" + t : "" + t;
- }
- function cm(t) {
- return t <= 1 && (t = 100 * t + "%"), t;
- }
- function ztg(t) {
- return Math.round(255 * parseFloat(t)).toString(16);
- }
- function oq(t) {
- return se(t) / 255;
- }
- var _n, gN, IN, mA = (gN = "[\\s|\\(]+(" + (_n = "(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)") + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")\\s*\\)?", IN = "[\\s|\\(]+(" + _n + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")\\s*\\)?", { CSS_UNIT: new RegExp(_n), rgb: new RegExp("rgb" + gN), rgba: new RegExp("rgba" + IN), hsl: new RegExp("hsl" + gN), hsla: new RegExp("hsla" + IN), hsv: new RegExp("hsv" + gN), hsva: new RegExp("hsva" + IN), hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ });
- function ol(t) {
- return !!mA.CSS_UNIT.exec(t);
- }
- function sbg(t, I) {
- var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
- if (!g) {
- if (Array.isArray(t) || (g = function(l, n) {
- if (l) {
- if (typeof l == "string") return cq(l, n);
- var a = Object.prototype.toString.call(l).slice(8, -1);
- if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
- if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return cq(l, n);
- }
- }(t)) || I) {
- g && (t = g);
- var C = 0, i = function() {
- };
- return { s: i, n: function() {
- return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
- }, e: function(l) {
- throw l;
- }, f: i };
- }
- throw new TypeError(`Invalid attempt to iterate non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }
- var e, A = !0, s = !1;
- return { s: function() {
- g = g.call(t);
- }, n: function() {
- var l = g.next();
- return A = l.done, l;
- }, e: function(l) {
- s = !0, e = l;
- }, f: function() {
- try {
- A || g.return == null || g.return();
- } finally {
- if (s) throw e;
- }
- } };
- }
- function cq(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function Jtg(t) {
- for (var I, g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", C = new Uint8Array(t), i = C.byteLength, e = i % 3, A = i - e, s = "", l = 0; l < A; l += 3) s += g[(16515072 & (I = C[l] << 16 | C[l + 1] << 8 | C[l + 2])) >> 18] + g[(258048 & I) >> 12] + g[(4032 & I) >> 6] + g[63 & I];
- return e === 1 ? s += g[(252 & (I = C[A])) >> 2] + g[(3 & I) << 4] + "==" : e === 2 && (s += g[(64512 & (I = C[A] << 8 | C[A + 1])) >> 10] + g[(1008 & I) >> 4] + g[(15 & I) << 2] + "="), s;
- }
- function DX(t) {
- return t.substr(2 + (~-t.lastIndexOf(".") >>> 0));
- }
- function zr(t, I) {
- if (!t) return t;
- var g = "";
- if (t.constructor === Array) for (var C = 0; C < t.length; C++) g += I(t[C], C);
- else g += I(t, 0);
- return g;
- }
- function U(t, I) {
- if (!t) return t;
- var g, C = sbg(I);
- try {
- for (C.s(); !(g = C.n()).done; )
- if (!(t = t[g.value])) return t;
- } catch (i) {
- C.e(i);
- } finally {
- C.f();
- }
- return t;
- }
- function Y0(t) {
- return t ? Math.round(t / 6e4) : 0;
- }
- function pV(t) {
- var I = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" };
- return t.replace(/[&<>"']/g, function(g) {
- return I[g];
- });
- }
- function yD(t) {
- var I = "";
- switch (t.toLowerCase()) {
- case "jpg":
- case "jpeg":
- I = "image/jpeg";
- break;
- case "png":
- I = "image/png";
- break;
- case "gif":
- I = "image/gif";
- break;
- case "emf":
- I = "image/x-emf";
- break;
- case "wmf":
- I = "image/x-wmf";
- break;
- case "svg":
- I = "image/svg+xml";
- break;
- case "mp4":
- I = "video/mp4";
- break;
- case "webm":
- I = "video/webm";
- break;
- case "ogg":
- I = "video/ogg";
- break;
- case "avi":
- I = "video/avi";
- break;
- case "mpg":
- I = "video/mpg";
- break;
- case "wmv":
- I = "video/wmv";
- break;
- case "mp3":
- I = "audio/mpeg";
- break;
- case "wav":
- I = "audio/wav";
- break;
- case "tif":
- case "tiff":
- I = "image/tiff";
- }
- return I;
- }
- function lbg(t) {
- return /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/.test(t);
- }
- function Jr(t) {
- for (var I = t.toString(16); I.length < 2; ) I = "0" + I;
- return I;
- }
- function Ltg(t) {
- if (typeof DOMParser > "u") return t.replace(/<[^>]+>/g, "").replace(/\s+/g, " ").trim() !== "";
- var I = new DOMParser().parseFromString(t, "text/html");
- return (I.body.textContent || I.body.innerText).trim() !== "";
- }
- function Lt(t) {
- var I = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
- return parseFloat(t.toFixed(I));
- }
- function YD(t, I, g, C) {
- var i, e;
- if (g) e = g;
- else {
- var A = U(I.slideContent, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]);
- e = A || (A = U(I.slideLayoutContent, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) || U(I.slideMasterContent, ["p:sldMaster", "p:clrMap", "attrs"]);
- }
- var s = t.substr(2);
- if (s === "phClr" && C) i = C;
- else {
- if (e) switch (s) {
- case "tx1":
- case "tx2":
- case "bg1":
- case "bg2":
- t = "a:" + e[s];
- }
- else switch (s) {
- case "tx1":
- t = "a:dk1";
- break;
- case "tx2":
- t = "a:dk2";
- break;
- case "bg1":
- t = "a:lt1";
- break;
- case "bg2":
- t = "a:lt2";
- }
- var l = U(I.themeContent, ["a:theme", "a:themeElements", "a:clrScheme", t]);
- !(i = U(l, ["a:srgbClr", "attrs", "val"])) && l && (i = U(l, ["a:sysClr", "attrs", "lastClr"]));
- }
- return i;
- }
- function Fs(t, I, g) {
- var C = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [], i = U(t, ["p:spPr", "a:ln"]), e = !!U(i, ["a:grpFill"]);
- if ((!i || e) && C && C.length) for (var A = C.length - 1; A >= 0; A--) {
- var s = U(C[A], ["p:grpSpPr", "a:ln"]);
- if (s) {
- i = s;
- break;
- }
- }
- if (!i) {
- var l = U(t, ["p:style", "a:lnRef"]);
- if (l) {
- var n = U(l, ["attrs", "idx"]);
- i = g.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:lnStyleLst"]["a:ln"][Number(n) - 1];
- }
- }
- i || (i = t);
- var a = U(i, ["a:noFill"]), d = U(i, ["attrs", "w"]), o = !!(d !== void 0 || U(i, ["a:prstDash"]) || U(i, ["a:solidFill"]) || U(i, ["a:gradFill"]) || U(i, ["a:pattFill"])), c = 0;
- !a && o && (c = parseInt(d) / 12700, (!Number.isFinite(c) || c <= 0) && (c = 1));
- var r = U(i, ["a:solidFill", "a:srgbClr", "attrs", "val"]);
- if (!r) {
- var h = U(i, ["a:solidFill", "a:schemeClr"]), b = "a:" + U(h, ["attrs", "val"]);
- r = YD(b, g);
- }
- if (!r) {
- var u = U(t, ["p:style", "a:lnRef", "a:schemeClr"]), m = "a:" + U(u, ["attrs", "val"]);
- if (r = YD(m, g)) {
- var Z = U(u, ["a:shade", "attrs", "val"]);
- if (Z) {
- Z = parseInt(Z) / 1e5;
- var p = Qg("#" + r).toHsl();
- r = Qg({ h: p.h, s: p.s, l: p.l * Z, a: p.a }).toHex();
- }
- }
- }
- r = r ? "#".concat(r) : "#000000";
- var Y = U(i, ["a:prstDash", "attrs", "val"]), R = "solid", X = "0";
- switch (Y) {
- case "solid":
- R = "solid", X = "0";
- break;
- case "dash":
- R = "dashed", X = "5";
- break;
- case "dashDot":
- R = "dashed", X = "5, 5, 1, 5";
- break;
- case "dot":
- R = "dotted", X = "1, 5";
- break;
- case "lgDash":
- R = "dashed", X = "10, 5";
- break;
- case "lgDashDotDot":
- R = "dotted", X = "10, 5, 1, 5, 1, 5";
- break;
- case "sysDash":
- R = "dashed", X = "5, 2";
- break;
- case "sysDashDot":
- R = "dotted", X = "5, 2, 1, 5";
- break;
- case "sysDashDotDot":
- R = "dotted", X = "5, 2, 1, 5, 1, 5";
- break;
- case "sysDot":
- R = "dotted", X = "2, 5";
- }
- return { borderColor: r, borderWidth: c, borderType: R, strokeDasharray: X };
- }
- function KX(t, I, g) {
- return g < 0 && (g += 6), g >= 6 && (g -= 6), g < 1 ? (I - t) * g + t : g < 3 ? I : g < 4 ? (I - t) * (4 - g) + t : t;
- }
- function vtg(t, I, g) {
- var C = Qg(t).toHsl();
- I >= 1 && (I = 1);
- var i = C.l * I + (1 - I);
- return g ? Qg({ h: C.h, s: C.s, l: i, a: C.a }).toHex8() : Qg({ h: C.h, s: C.s, l: i, a: C.a }).toHex();
- }
- function dq(t, I) {
- var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
- if (!g) {
- if (Array.isArray(t) || (g = function(l, n) {
- if (l) {
- if (typeof l == "string") return rq(l, n);
- var a = Object.prototype.toString.call(l).slice(8, -1);
- if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
- if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return rq(l, n);
- }
- }(t)) || I) {
- g && (t = g);
- var C = 0, i = function() {
- };
- return { s: i, n: function() {
- return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
- }, e: function(l) {
- throw l;
- }, f: i };
- }
- throw new TypeError(`Invalid attempt to iterate non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }
- var e, A = !0, s = !1;
- return { s: function() {
- g = g.call(t);
- }, n: function() {
- var l = g.next();
- return A = l.done, l;
- }, e: function(l) {
- s = !0, e = l;
- }, f: function() {
- try {
- A || g.return == null || g.return();
- } finally {
- if (s) throw e;
- }
- } };
- }
- function rq(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function Hs(t) {
- var I = "";
- return t["a:noFill"] && (I = "NO_FILL"), t["a:solidFill"] && (I = "SOLID_FILL"), t["a:gradFill"] && (I = "GRADIENT_FILL"), t["a:pattFill"] && (I = "PATTERN_FILL"), t["a:blipFill"] && (I = "PIC_FILL"), t["a:grpFill"] && (I = "GROUP_FILL"), I;
- }
- function rM(t, I, g) {
- return ND.apply(this, arguments);
- }
- function ND() {
- return ND = SC(bI.mark(function t(I, g, C) {
- var i, e, A, s, l, n, a;
- return bI.wrap(function(d) {
- for (; ; ) switch (d.prev = d.next) {
- case 0:
- if (g) {
- d.next = 2;
- break;
- }
- return d.abrupt("return", "");
- case 2:
- if (e = U(g, ["a:blip", "attrs", "r:embed"]), I === "slideBg" || I === "slide" ? A = U(C, ["slideResObj", e, "target"]) : I === "slideLayoutBg" ? A = U(C, ["layoutResObj", e, "target"]) : I === "slideMasterBg" ? A = U(C, ["masterResObj", e, "target"]) : I === "themeBg" ? A = U(C, ["themeResObj", e, "target"]) : I === "diagramBg" && (A = U(C, ["diagramResObj", e, "target"])), A) {
- d.next = 6;
- break;
- }
- return d.abrupt("return", A);
- case 6:
- if (i = U(C, ["loaded-images", A])) {
- d.next = 20;
- break;
- }
- if (A = pV(A), (s = A.split(".").pop()) !== "xml") {
- d.next = 12;
- break;
- }
- return d.abrupt("return", "");
- case 12:
- return d.next = 14, C.zip.file(A).async("arraybuffer");
- case 14:
- l = d.sent, n = yD(s), i = "data:".concat(n, ";base64,").concat(Jtg(l)), (a = C["loaded-images"] || {})[A] = i, C["loaded-images"] = a;
- case 20:
- return d.abrupt("return", i);
- case 21:
- case "end":
- return d.stop();
- }
- }, t);
- })), ND.apply(this, arguments);
- }
- function Ttg(t) {
- var I = U(t["a:blip"], ["a:alphaModFix", "attrs"]), g = 1;
- return I && I.amt && I.amt !== "" && (g = parseInt(I.amt) / 1e5), g;
- }
- function nbg(t) {
- if (!t) return null;
- var I = t["a:blip"];
- if (!I) return null;
- var g = {}, C = I["a:extLst"];
- if (C && C["a:ext"]) {
- var i, e = dq(Array.isArray(C["a:ext"]) ? C["a:ext"] : [C["a:ext"]]);
- try {
- for (e.s(); !(i = e.n()).done; ) {
- var A = i.value;
- if (A["a14:imgProps"] && A["a14:imgProps"]["a14:imgLayer"]) {
- var s = A["a14:imgProps"]["a14:imgLayer"]["a14:imgEffect"];
- if (s) {
- var l, n = dq(Array.isArray(s) ? s : [s]);
- try {
- for (n.s(); !(l = n.n()).done; ) {
- var a = l.value;
- if (a["a14:saturation"]) {
- var d = U(a, ["a14:saturation", "attrs", "sat"]);
- d && (g.saturation = parseInt(d) / 1e5);
- }
- if (a["a14:brightnessContrast"]) {
- var o = U(a, ["a14:brightnessContrast", "attrs", "bright"]), c = U(a, ["a14:brightnessContrast", "attrs", "contrast"]);
- o && (g.brightness = parseInt(o) / 1e5), c && (g.contrast = parseInt(c) / 1e5);
- }
- if (a["a14:sharpenSoften"]) {
- var r = U(a, ["a14:sharpenSoften", "attrs", "amount"]);
- if (r) {
- var h = parseInt(r) / 1e5;
- h > 0 ? g.sharpen = h : g.soften = Math.abs(h);
- }
- }
- if (a["a14:colorTemperature"]) {
- var b = U(a, ["a14:colorTemperature", "attrs", "colorTemp"]);
- b && (g.colorTemperature = parseInt(b));
- }
- }
- } catch (u) {
- n.e(u);
- } finally {
- n.f();
- }
- }
- }
- }
- } catch (u) {
- e.e(u);
- } finally {
- e.f();
- }
- }
- return Object.keys(g).length > 0 ? g : null;
- }
- function zu(t, I, g) {
- return xtg.apply(this, arguments);
- }
- function xtg() {
- return (xtg = SC(bI.mark(function t(I, g, C) {
- var i, e, A, s;
- return bI.wrap(function(l) {
- for (; ; ) switch (l.prev = l.next) {
- case 0:
- return l.next = 2, rM(g, I["a:blipFill"], C);
- case 2:
- return i = l.sent, e = I["a:blipFill"]["a:blip"], A = U(e, ["a:alphaModFix", "attrs"]), s = 1, A && A.amt && A.amt !== "" && (s = parseInt(A.amt) / 1e5), l.abrupt("return", { picBase64: i, opacity: s });
- case 8:
- case "end":
- return l.stop();
- }
- }, t);
- }))).apply(this, arguments);
- }
- function j9(t, I) {
- for (var g = t["a:gsLst"]["a:gs"], C = [], i = 0; i < g.length; i++) {
- var e = eC(g[i], void 0, void 0, I), A = U(g[i], ["attrs", "pos"]);
- C[i] = { pos: A ? A / 1e3 + "%" : "", color: e };
- }
- var s = t["a:lin"], l = 0, n = "line";
- if (s) l = Y0(s.attrs.ang);
- else {
- var a = t["a:path"];
- a && a.attrs && a.attrs.path && (n = a.attrs.path);
- }
- return { rot: l, path: n, colors: C.sort(function(d, o) {
- return parseInt(d.pos) - parseInt(o.pos);
- }) };
- }
- function Eo(t, I) {
- if (!t) return null;
- var g = t["a:pattFill"];
- if (!g) return null;
- var C = U(g, ["attrs", "prst"]), i = g["a:fgClr"], e = g["a:bgClr"], A = "#000000", s = "#FFFFFF";
- return i && (A = eC(i, void 0, void 0, I)), e && (s = eC(e, void 0, void 0, I)), { type: C, foregroundColor: A, backgroundColor: s };
- }
- function Lr(t, I, g, C) {
- if (t) {
- for (var i = t["a:gradFill"], e = i["a:gsLst"]["a:gs"], A = [], s = 0; s < e.length; s++) {
- var l = eC(e[s], g["p:sldMaster"]["p:clrMap"].attrs, I, C), n = U(e[s], ["attrs", "pos"]);
- A[s] = { pos: n ? n / 1e3 + "%" : "", color: l };
- }
- var a = i["a:lin"], d = 0, o = "line";
- if (a) d = Y0(a.attrs.ang) + 0;
- else {
- var c = i["a:path"];
- c && c.attrs && c.attrs.path && (o = c.attrs.path);
- }
- return { rot: d, path: o, colors: A.sort(function(r, h) {
- return parseInt(r.pos) - parseInt(h.pos);
- }) };
- }
- return I ? I.indexOf("#") === -1 ? "#".concat(I) : I : null;
- }
- function abg(t) {
- return VD.apply(this, arguments);
- }
- function VD() {
- return VD = SC(bI.mark(function t(I) {
- var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg, dg, Bg, Zg, Xg, Kg, kg;
- return bI.wrap(function(Wg) {
- for (; ; ) switch (Wg.prev = Wg.next) {
- case 0:
- if (g = I.slideContent, C = I.slideLayoutContent, i = I.slideMasterContent, e = U(g, ["p:sld", "p:cSld", "p:bg", "p:bgPr"]), A = U(g, ["p:sld", "p:cSld", "p:bg", "p:bgRef"]), s = "#fff", l = "color", !e) {
- Wg.next = 32;
- break;
- }
- if ((n = Hs(e)) !== "SOLID_FILL") {
- Wg.next = 17;
- break;
- }
- a = e["a:solidFill"], (o = U(g, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) ? d = o : (c = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), d = c || U(i, ["p:sldMaster", "p:clrMap", "attrs"])), r = eC(a, d, void 0, I), s = r, Wg.next = 30;
- break;
- case 17:
- if (n !== "GRADIENT_FILL") {
- Wg.next = 22;
- break;
- }
- typeof (h = Lr(e, void 0, i, I)) == "string" ? s = h : h && (s = h, l = "gradient"), Wg.next = 30;
- break;
- case 22:
- if (n !== "PIC_FILL") {
- Wg.next = 29;
- break;
- }
- return Wg.next = 25, zu(e, "slideBg", I);
- case 25:
- s = Wg.sent, l = "image", Wg.next = 30;
- break;
- case 29:
- n === "PATTERN_FILL" && (b = Eo(e, I)) && (s = b, l = "pattern");
- case 30:
- Wg.next = 157;
- break;
- case 32:
- if (!A) {
- Wg.next = 40;
- break;
- }
- (m = U(g, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) ? u = m : (Z = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), u = Z || U(i, ["p:sldMaster", "p:clrMap", "attrs"])), p = eC(A, u, void 0, I), (Y = Number(A.attrs.idx)) > 1e3 && (R = Y - 1e3, X = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], H = [], Object.keys(X).forEach(function(Ng) {
- var wg = X[Ng];
- if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
- var Jg = {};
- Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), H.push(Jg);
- }
- else {
- var zg = {};
- zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), H.push(zg);
- }
- }), (S = H.slice(0)).sort(function(Ng, wg) {
- return Ng.idex - wg.idex;
- }), z = S[R - 1], (v = Hs(z)) === "SOLID_FILL" ? (K = z["a:solidFill"], V = eC(K, u, void 0, I), s = V) : v === "GRADIENT_FILL" && (typeof (N = Lr(z, p, i, I)) == "string" ? s = N : N && (s = N, l = "gradient"))), Wg.next = 157;
- break;
- case 40:
- if (e = U(C, ["p:sldLayout", "p:cSld", "p:bg", "p:bgPr"]), A = U(C, ["p:sldLayout", "p:cSld", "p:bg", "p:bgRef"]), G = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), B = G || U(i, ["p:sldMaster", "p:clrMap", "attrs"]), !e) {
- Wg.next = 67;
- break;
- }
- if ((w = Hs(e)) !== "SOLID_FILL") {
- Wg.next = 52;
- break;
- }
- W = e["a:solidFill"], y = eC(W, B, void 0, I), s = y, Wg.next = 65;
- break;
- case 52:
- if (w !== "GRADIENT_FILL") {
- Wg.next = 57;
- break;
- }
- typeof (f = Lr(e, void 0, i, I)) == "string" ? s = f : f && (s = f, l = "gradient"), Wg.next = 65;
- break;
- case 57:
- if (w !== "PIC_FILL") {
- Wg.next = 64;
- break;
- }
- return Wg.next = 60, zu(e, "slideLayoutBg", I);
- case 60:
- s = Wg.sent, l = "image", Wg.next = 65;
- break;
- case 64:
- w === "PATTERN_FILL" && (D = Eo(e, I)) && (s = D, l = "pattern");
- case 65:
- Wg.next = 157;
- break;
- case 67:
- if (!A) {
- Wg.next = 100;
- break;
- }
- if (F = eC(A, B, void 0, I), !((T = Number(A.attrs.idx)) > 1e3)) {
- Wg.next = 98;
- break;
- }
- if (Q = T - 1e3, P = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], L = [], Object.keys(P).forEach(function(Ng) {
- var wg = P[Ng];
- if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
- var Jg = {};
- Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), L.push(Jg);
- }
- else {
- var zg = {};
- zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), L.push(zg);
- }
- }), (E = L.slice(0)).sort(function(Ng, wg) {
- return Ng.idex - wg.idex;
- }), J = E[Q - 1], (k = Hs(J)) !== "SOLID_FILL") {
- Wg.next = 85;
- break;
- }
- j = J["a:solidFill"], q = eC(j, B, void 0, I), s = q, Wg.next = 98;
- break;
- case 85:
- if (k !== "GRADIENT_FILL") {
- Wg.next = 90;
- break;
- }
- typeof (Cg = Lr(J, F, i, I)) == "string" ? s = Cg : Cg && (s = Cg, l = "gradient"), Wg.next = 98;
- break;
- case 90:
- if (k !== "PIC_FILL") {
- Wg.next = 97;
- break;
- }
- return Wg.next = 93, zu(J, "themeBg", I);
- case 93:
- s = Wg.sent, l = "image", Wg.next = 98;
- break;
- case 97:
- k === "PATTERN_FILL" && (Ig = Eo(J, I)) && (s = Ig, l = "pattern");
- case 98:
- Wg.next = 157;
- break;
- case 100:
- if (e = U(i, ["p:sldMaster", "p:cSld", "p:bg", "p:bgPr"]), A = U(i, ["p:sldMaster", "p:cSld", "p:bg", "p:bgRef"]), x = U(i, ["p:sldMaster", "p:clrMap", "attrs"]), !e) {
- Wg.next = 126;
- break;
- }
- if ((Ag = Hs(e)) !== "SOLID_FILL") {
- Wg.next = 111;
- break;
- }
- eg = e["a:solidFill"], O = eC(eg, x, void 0, I), s = O, Wg.next = 124;
- break;
- case 111:
- if (Ag !== "GRADIENT_FILL") {
- Wg.next = 116;
- break;
- }
- typeof (_ = Lr(e, void 0, i, I)) == "string" ? s = _ : _ && (s = _, l = "gradient"), Wg.next = 124;
- break;
- case 116:
- if (Ag !== "PIC_FILL") {
- Wg.next = 123;
- break;
- }
- return Wg.next = 119, zu(e, "slideMasterBg", I);
- case 119:
- s = Wg.sent, l = "image", Wg.next = 124;
- break;
- case 123:
- Ag === "PATTERN_FILL" && (gg = Eo(e, I)) && (s = gg, l = "pattern");
- case 124:
- Wg.next = 157;
- break;
- case 126:
- if (!A) {
- Wg.next = 157;
- break;
- }
- if (lg = eC(A, x, void 0, I), !((ng = Number(A.attrs.idx)) > 1e3)) {
- Wg.next = 157;
- break;
- }
- if (sg = ng - 1e3, og = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], cg = [], Object.keys(og).forEach(function(Ng) {
- var wg = og[Ng];
- if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
- var Jg = {};
- Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), cg.push(Jg);
- }
- else {
- var zg = {};
- zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), cg.push(zg);
- }
- }), (rg = cg.slice(0)).sort(function(Ng, wg) {
- return Ng.idex - wg.idex;
- }), dg = rg[sg - 1], (Bg = Hs(dg)) !== "SOLID_FILL") {
- Wg.next = 144;
- break;
- }
- Zg = dg["a:solidFill"], Xg = eC(Zg, B, void 0, I), s = Xg, Wg.next = 157;
- break;
- case 144:
- if (Bg !== "GRADIENT_FILL") {
- Wg.next = 149;
- break;
- }
- typeof (Kg = Lr(dg, lg, i, I)) == "string" ? s = Kg : Kg && (s = Kg, l = "gradient"), Wg.next = 157;
- break;
- case 149:
- if (Bg !== "PIC_FILL") {
- Wg.next = 156;
- break;
- }
- return Wg.next = 152, zu(dg, "themeBg", I);
- case 152:
- s = Wg.sent, l = "image", Wg.next = 157;
- break;
- case 156:
- Bg === "PATTERN_FILL" && (kg = Eo(dg, I)) && (s = kg, l = "pattern");
- case 157:
- return Wg.abrupt("return", { type: l, value: s });
- case 158:
- case "end":
- return Wg.stop();
- }
- }, t);
- })), VD.apply(this, arguments);
- }
- function jtg(t, I, g, C, i) {
- return MD.apply(this, arguments);
- }
- function MD() {
- return MD = SC(bI.mark(function t(I, g, C, i, e) {
- var A, s, l, n, a, d, o, c, r, h, b, u = arguments;
- return bI.wrap(function(m) {
- for (; ; ) switch (m.prev = m.next) {
- case 0:
- if (A = u.length > 5 && u[5] !== void 0 ? u[5] : [], s = Hs(U(I, ["p:spPr"])), l = "color", n = "", s !== "NO_FILL") {
- m.next = 8;
- break;
- }
- return m.abrupt("return", C ? "none" : "");
- case 8:
- if (s !== "SOLID_FILL") {
- m.next = 14;
- break;
- }
- a = I["p:spPr"]["a:solidFill"], n = eC(a, void 0, void 0, i), l = "color", m.next = 38;
- break;
- case 14:
- if (s !== "GRADIENT_FILL") {
- m.next = 20;
- break;
- }
- d = I["p:spPr"]["a:gradFill"], n = j9(d, i), l = "gradient", m.next = 38;
- break;
- case 20:
- if (s !== "PIC_FILL") {
- m.next = 30;
- break;
- }
- return o = I["p:spPr"]["a:blipFill"], m.next = 24, rM(e, o, i);
- case 24:
- c = m.sent, r = Ttg(o), n = { picBase64: c, opacity: r }, l = "image", m.next = 38;
- break;
- case 30:
- if (s !== "PATTERN_FILL") {
- m.next = 36;
- break;
- }
- h = I["p:spPr"]["a:pattFill"], n = Eo({ "a:pattFill": h }, i), l = "pattern", m.next = 38;
- break;
- case 36:
- if (s !== "GROUP_FILL") {
- m.next = 38;
- break;
- }
- return m.abrupt("return", obg(A, i, e));
- case 38:
- if (n || (b = U(I, ["p:style", "a:fillRef"]), n = eC(b, void 0, void 0, i), l = "color"), n || !g || s !== "NO_FILL") {
- m.next = 41;
- break;
- }
- return m.abrupt("return", C ? "none" : "");
- case 41:
- return m.abrupt("return", { type: l, value: n });
- case 42:
- case "end":
- return m.stop();
- }
- }, t);
- })), MD.apply(this, arguments);
- }
- function obg(t, I, g) {
- return RD.apply(this, arguments);
- }
- function RD() {
- return RD = SC(bI.mark(function t(I, g, C) {
- var i, e, A, s, l, n, a, d, o, c, r, h, b;
- return bI.wrap(function(u) {
- for (; ; ) switch (u.prev = u.next) {
- case 0:
- i = I.length - 1;
- case 1:
- if (!(i >= 0)) {
- u.next = 39;
- break;
- }
- if ((e = I[i]) && e["p:grpSpPr"]) {
- u.next = 5;
- break;
- }
- return u.abrupt("continue", 36);
- case 5:
- if (A = e["p:grpSpPr"], (s = Hs(A)) !== "SOLID_FILL") {
- u.next = 14;
- break;
- }
- if (l = A["a:solidFill"], !(n = eC(l, void 0, void 0, g))) {
- u.next = 12;
- break;
- }
- return u.abrupt("return", { type: "color", value: n });
- case 12:
- u.next = 36;
- break;
- case 14:
- if (s !== "GRADIENT_FILL") {
- u.next = 21;
- break;
- }
- if (a = A["a:gradFill"], !(d = j9(a, g))) {
- u.next = 19;
- break;
- }
- return u.abrupt("return", { type: "gradient", value: d });
- case 19:
- u.next = 36;
- break;
- case 21:
- if (s !== "PIC_FILL") {
- u.next = 31;
- break;
- }
- return o = A["a:blipFill"], u.next = 25, rM(C, o, g);
- case 25:
- if (c = u.sent, r = Ttg(o), !c) {
- u.next = 29;
- break;
- }
- return u.abrupt("return", { type: "image", value: { picBase64: c, opacity: r } });
- case 29:
- u.next = 36;
- break;
- case 31:
- if (s !== "PATTERN_FILL") {
- u.next = 36;
- break;
- }
- if (h = A["a:pattFill"], !(b = Eo({ "a:pattFill": h }, g))) {
- u.next = 36;
- break;
- }
- return u.abrupt("return", { type: "pattern", value: b });
- case 36:
- i--, u.next = 1;
- break;
- case 39:
- return u.abrupt("return", null);
- case 40:
- case "end":
- return u.stop();
- }
- }, t);
- })), RD.apply(this, arguments);
- }
- function eC(t, I, g, C) {
- if (!t) return "";
- var i, e, A, s = "";
- if (t["a:srgbClr"]) s = U(i = t["a:srgbClr"], ["attrs", "val"]);
- else if (t["a:schemeClr"])
- s = YD("a:" + U(i = t["a:schemeClr"], ["attrs", "val"]), C, I, g) || "";
- else if (t["a:scrgbClr"]) {
- var l = (i = t["a:scrgbClr"]).attrs, n = l.r.indexOf("%") !== -1 ? l.r.split("%").shift() : l.r, a = l.g.indexOf("%") !== -1 ? l.g.split("%").shift() : l.g, d = l.b.indexOf("%") !== -1 ? l.b.split("%").shift() : l.b;
- s = Jr(Number(n) / 100 * 255) + Jr(Number(a) / 100 * 255) + Jr(Number(d) / 100 * 255);
- } else if (t["a:prstClr"]) {
- var o = U(i = t["a:prstClr"], ["attrs", "val"]);
- (A = ["white", "AliceBlue", "AntiqueWhite", "Aqua", "Aquamarine", "Azure", "Beige", "Bisque", "black", "BlanchedAlmond", "Blue", "BlueViolet", "Brown", "BurlyWood", "CadetBlue", "Chartreuse", "Chocolate", "Coral", "CornflowerBlue", "Cornsilk", "Crimson", "Cyan", "DarkBlue", "DarkCyan", "DarkGoldenRod", "DarkGray", "DarkGrey", "DarkGreen", "DarkKhaki", "DarkMagenta", "DarkOliveGreen", "DarkOrange", "DarkOrchid", "DarkRed", "DarkSalmon", "DarkSeaGreen", "DarkSlateBlue", "DarkSlateGray", "DarkSlateGrey", "DarkTurquoise", "DarkViolet", "DeepPink", "DeepSkyBlue", "DimGray", "DimGrey", "DodgerBlue", "FireBrick", "FloralWhite", "ForestGreen", "Fuchsia", "Gainsboro", "GhostWhite", "Gold", "GoldenRod", "Gray", "Grey", "Green", "GreenYellow", "HoneyDew", "HotPink", "IndianRed", "Indigo", "Ivory", "Khaki", "Lavender", "LavenderBlush", "LawnGreen", "LemonChiffon", "LightBlue", "LightCoral", "LightCyan", "LightGoldenRodYellow", "LightGray", "LightGrey", "LightGreen", "LightPink", "LightSalmon", "LightSeaGreen", "LightSkyBlue", "LightSlateGray", "LightSlateGrey", "LightSteelBlue", "LightYellow", "Lime", "LimeGreen", "Linen", "Magenta", "Maroon", "MediumAquaMarine", "MediumBlue", "MediumOrchid", "MediumPurple", "MediumSeaGreen", "MediumSlateBlue", "MediumSpringGreen", "MediumTurquoise", "MediumVioletRed", "MidnightBlue", "MintCream", "MistyRose", "Moccasin", "NavajoWhite", "Navy", "OldLace", "Olive", "OliveDrab", "Orange", "OrangeRed", "Orchid", "PaleGoldenRod", "PaleGreen", "PaleTurquoise", "PaleVioletRed", "PapayaWhip", "PeachPuff", "Peru", "Pink", "Plum", "PowderBlue", "Purple", "RebeccaPurple", "Red", "RosyBrown", "RoyalBlue", "SaddleBrown", "Salmon", "SandyBrown", "SeaGreen", "SeaShell", "Sienna", "Silver", "SkyBlue", "SlateBlue", "SlateGray", "SlateGrey", "Snow", "SpringGreen", "SteelBlue", "Tan", "Teal", "Thistle", "Tomato", "Turquoise", "Violet", "Wheat", "White", "WhiteSmoke", "Yellow", "YellowGreen"].indexOf(o)) !== -1 && (e = ["ffffff", "f0f8ff", "faebd7", "00ffff", "7fffd4", "f0ffff", "f5f5dc", "ffe4c4", "000000", "ffebcd", "0000ff", "8a2be2", "a52a2a", "deb887", "5f9ea0", "7fff00", "d2691e", "ff7f50", "6495ed", "fff8dc", "dc143c", "00ffff", "00008b", "008b8b", "b8860b", "a9a9a9", "a9a9a9", "006400", "bdb76b", "8b008b", "556b2f", "ff8c00", "9932cc", "8b0000", "e9967a", "8fbc8f", "483d8b", "2f4f4f", "2f4f4f", "00ced1", "9400d3", "ff1493", "00bfff", "696969", "696969", "1e90ff", "b22222", "fffaf0", "228b22", "ff00ff", "dcdcdc", "f8f8ff", "ffd700", "daa520", "808080", "808080", "008000", "adff2f", "f0fff0", "ff69b4", "cd5c5c", "4b0082", "fffff0", "f0e68c", "e6e6fa", "fff0f5", "7cfc00", "fffacd", "add8e6", "f08080", "e0ffff", "fafad2", "d3d3d3", "d3d3d3", "90ee90", "ffb6c1", "ffa07a", "20b2aa", "87cefa", "778899", "778899", "b0c4de", "ffffe0", "00ff00", "32cd32", "faf0e6", "ff00ff", "800000", "66cdaa", "0000cd", "ba55d3", "9370db", "3cb371", "7b68ee", "00fa9a", "48d1cc", "c71585", "191970", "f5fffa", "ffe4e1", "ffe4b5", "ffdead", "000080", "fdf5e6", "808000", "6b8e23", "ffa500", "ff4500", "da70d6", "eee8aa", "98fb98", "afeeee", "db7093", "ffefd5", "ffdab9", "cd853f", "ffc0cb", "dda0dd", "b0e0e6", "800080", "663399", "ff0000", "bc8f8f", "4169e1", "8b4513", "fa8072", "f4a460", "2e8b57", "fff5ee", "a0522d", "c0c0c0", "87ceeb", "6a5acd", "708090", "708090", "fffafa", "00ff7f", "4682b4", "d2b48c", "008080", "d8bfd8", "ff6347", "40e0d0", "ee82ee", "f5deb3", "ffffff", "f5f5f5", "ffff00", "9acd32"][A]), s = e;
- } else if (t["a:hslClr"]) {
- var c = (i = t["a:hslClr"]).attrs, r = function(S, z, v) {
- var K, V = 2 * v - (K = v <= 0.5 ? v * (z + 1) : v + z - v * z);
- return { r: 255 * KX(V, K, 2 + (S /= 60)), g: 255 * KX(V, K, S), b: 255 * KX(V, K, S - 2) };
- }(Number(c.hue) / 1e5, Number(c.sat.indexOf("%") !== -1 ? c.sat.split("%").shift() : c.sat) / 100, Number(c.lum.indexOf("%") !== -1 ? c.lum.split("%").shift() : c.lum) / 100);
- s = Jr(r.r) + Jr(r.g) + Jr(r.b);
- } else if (t["a:sysClr"]) {
- var h = U(i = t["a:sysClr"], ["attrs", "lastClr"]);
- h && (s = h);
- }
- var b = !1, u = parseInt(U(i, ["a:alpha", "attrs", "val"])) / 1e5;
- if (!isNaN(u)) {
- var m = Qg(s);
- m.setAlpha(u), s = m.toHex8(), b = !0;
- }
- var Z = parseInt(U(i, ["a:hueMod", "attrs", "val"])) / 1e5;
- isNaN(Z) || (s = function(S, z, v) {
- var K = Qg(S).toHsl(), V = K.h * z;
- return V >= 360 && (V -= 360), v ? Qg({ h: V, s: K.s, l: K.l, a: K.a }).toHex8() : Qg({ h: V, s: K.s, l: K.l, a: K.a }).toHex();
- }(s, Z, b));
- var p = parseInt(U(i, ["a:lumMod", "attrs", "val"])) / 1e5;
- isNaN(p) || (s = function(S, z, v) {
- var K = Qg(S).toHsl(), V = K.l * z;
- return V >= 1 && (V = 1), v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
- }(s, p, b));
- var Y = parseInt(U(i, ["a:lumOff", "attrs", "val"])) / 1e5;
- isNaN(Y) || (s = function(S, z, v) {
- var K = Qg(S).toHsl(), V = z + K.l;
- return V >= 1 ? v ? Qg({ h: K.h, s: K.s, l: 1, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: 1, a: K.a }).toHex() : v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
- }(s, Y, b));
- var R = parseInt(U(i, ["a:satMod", "attrs", "val"])) / 1e5;
- isNaN(R) || (s = function(S, z, v) {
- var K = Qg(S).toHsl(), V = K.s * z;
- return V >= 1 && (V = 1), v ? Qg({ h: K.h, s: V, l: K.l, a: K.a }).toHex8() : Qg({ h: K.h, s: V, l: K.l, a: K.a }).toHex();
- }(s, R, b));
- var X = parseInt(U(i, ["a:shade", "attrs", "val"])) / 1e5;
- isNaN(X) || (s = function(S, z, v) {
- var K = Qg(S).toHsl();
- z >= 1 && (z = 1);
- var V = Math.min(K.l * z, 1);
- return v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
- }(s, X, b));
- var H = parseInt(U(i, ["a:tint", "attrs", "val"])) / 1e5;
- return isNaN(H) || (s = vtg(s, H, b)), s && s.indexOf("#") === -1 && (s = "#" + s), s;
- }
- function cbg(t, I) {
- var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
- if (!g) {
- if (Array.isArray(t) || (g = function(l, n) {
- if (l) {
- if (typeof l == "string") return hq(l, n);
- var a = Object.prototype.toString.call(l).slice(8, -1);
- if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
- if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return hq(l, n);
- }
- }(t)) || I) {
- g && (t = g);
- var C = 0, i = function() {
- };
- return { s: i, n: function() {
- return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
- }, e: function(l) {
- throw l;
- }, f: i };
- }
- throw new TypeError(`Invalid attempt to iterate non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }
- var e, A = !0, s = !1;
- return { s: function() {
- g = g.call(t);
- }, n: function() {
- var l = g.next();
- return A = l.done, l;
- }, e: function(l) {
- s = !0, e = l;
- }, f: function() {
- try {
- A || g.return == null || g.return();
- } finally {
- if (s) throw e;
- }
- } };
- }
- function hq(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function Li(t, I) {
- t.constructor !== Array && (t = [t]);
- var g, C = [], i = cbg(t);
- try {
- for (i.s(); !(g = i.n()).done; ) {
- var e = g.value, A = U(e, ["c:spPr", "a:solidFill", "a:schemeClr"]);
- A || (A = U(e, ["c:spPr", "a:ln", "a:solidFill", "a:schemeClr"])), A || (A = U(e, ["c:marker", "c:spPr", "a:ln", "a:solidFill", "a:schemeClr"]));
- var s = U(A, ["attrs", "val"]);
- if (s) {
- s = U(I.themeContent, ["a:theme", "a:themeElements", "a:clrScheme", "a:".concat(s), "a:srgbClr", "attrs", "val"]);
- var l = U(A, ["a:tint", "attrs", "val"]) / 1e5;
- s && !isNaN(l) && (s = vtg(s, l));
- } else s = U(e, ["c:spPr", "a:solidFill", "a:srgbClr", "attrs", "val"]);
- s && (s = "#" + s), C.push(s);
- }
- } catch (n) {
- i.e(n);
- } finally {
- i.f();
- }
- return C;
- }
- function yi(t) {
- var I = [];
- if (!t) return I;
- if (t["c:xVal"]) {
- var g = [];
- zr(t["c:xVal"]["c:numRef"]["c:numCache"]["c:pt"], function(C) {
- return g.push(parseFloat(C["c:v"])), "";
- }), I.push(g), g = [], zr(t["c:yVal"]["c:numRef"]["c:numCache"]["c:pt"], function(C) {
- return g.push(parseFloat(C["c:v"])), "";
- }), I.push(g);
- } else zr(t, function(C, i) {
- var e = [], A = U(C, ["c:tx", "c:strRef", "c:strCache", "c:pt", "c:v"]) || i, s = {};
- return U(C, ["c:cat", "c:strRef", "c:strCache", "c:pt"]) ? zr(C["c:cat"]["c:strRef"]["c:strCache"]["c:pt"], function(l) {
- return s[l.attrs.idx] = l["c:v"], "";
- }) : U(C, ["c:cat", "c:numRef", "c:numCache", "c:pt"]) && zr(C["c:cat"]["c:numRef"]["c:numCache"]["c:pt"], function(l) {
- return s[l.attrs.idx] = l["c:v"], "";
- }), U(C, ["c:val", "c:numRef", "c:numCache", "c:pt"]) && zr(C["c:val"]["c:numRef"]["c:numCache"]["c:pt"], function(l) {
- return e.push({ x: l.attrs.idx, y: parseFloat(l["c:v"]) }), "";
- }), I.push({ key: A, values: e, xlabels: s }), "";
- });
- return I;
- }
- function dbg(t, I) {
- var g = null;
- for (var C in t) switch (C) {
- case "c:lineChart":
- g = { type: "lineChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), marker: !!t[C]["c:marker"] };
- break;
- case "c:line3DChart":
- g = { type: "line3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
- break;
- case "c:barChart":
- g = { type: "barChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), barDir: U(t[C], ["c:barDir", "attrs", "val"]) };
- break;
- case "c:bar3DChart":
- g = { type: "bar3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), barDir: U(t[C], ["c:barDir", "attrs", "val"]) };
- break;
- case "c:pieChart":
- g = { type: "pieChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I) };
- break;
- case "c:pie3DChart":
- g = { type: "pie3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I) };
- break;
- case "c:doughnutChart":
- g = { type: "doughnutChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I), holeSize: U(t[C], ["c:holeSize", "attrs", "val"]) };
- break;
- case "c:areaChart":
- g = { type: "areaChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
- break;
- case "c:area3DChart":
- g = { type: "area3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
- break;
- case "c:scatterChart":
- g = { type: "scatterChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), style: U(t[C], ["c:scatterStyle", "attrs", "val"]) };
- break;
- case "c:bubbleChart":
- g = { type: "bubbleChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
- break;
- case "c:radarChart":
- g = { type: "radarChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), style: U(t[C], ["c:radarStyle", "attrs", "val"]) };
- break;
- case "c:surfaceChart":
- g = { type: "surfaceChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
- break;
- case "c:surface3DChart":
- g = { type: "surface3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
- break;
- case "c:stockChart":
- g = { type: "stockChart", data: yi(t[C]["c:ser"]), colors: [] };
- }
- return g;
- }
- function rbg(t, I, g, C) {
- var i = U(t, ["a:pPr", "attrs", "algn"]);
- if (i || (i = U(I, ["a:pPr", "attrs", "algn"])), !i) if (g === "title" || g === "ctrTitle" || g === "subTitle") {
- var e = 1, A = U(I, ["a:pPr", "attrs", "lvl"]);
- A && (e = parseInt(A) + 1);
- var s = "a:lvl" + e + "pPr";
- (i = U(C, ["slideLayoutTables", "typeTable", g, "p:txBody", "a:lstStyle", s, "attrs", "algn"])) || (i = U(C, ["slideMasterTables", "typeTable", g, "p:txBody", "a:lstStyle", s, "attrs", "algn"])), i || (i = U(C, ["slideMasterTextStyles", "p:titleStyle", s, "attrs", "algn"])), i || g !== "subTitle" || (i = U(C, ["slideMasterTextStyles", "p:bodyStyle", s, "attrs", "algn"]));
- } else i = U(C, g === "body" ? ["slideMasterTextStyles", "p:bodyStyle", "a:lvl1pPr", "attrs", "algn"] : ["slideMasterTables", "typeTable", g, "p:txBody", "a:lstStyle", "a:lvl1pPr", "attrs", "algn"]);
- var l = "left";
- if (i) switch (i) {
- case "l":
- l = "left";
- break;
- case "r":
- l = "right";
- break;
- case "ctr":
- l = "center";
- break;
- case "just":
- case "dist":
- l = "justify";
- break;
- default:
- l = "inherit";
- }
- return l;
- }
- function hbg(t, I, g) {
- var C = U(t, ["p:txBody", "a:bodyPr", "attrs", "anchor"]);
- return C || (C = U(I, ["p:txBody", "a:bodyPr", "attrs", "anchor"])) || (C = U(g, ["p:txBody", "a:bodyPr", "attrs", "anchor"])) || (C = "t"), C === "ctr" ? "mid" : C === "b" ? "down" : "up";
- }
- function bbg(t, I, g) {
- function C(s) {
- if (!s) return null;
- if (s["a:noAutofit"]) return { result: null };
- if (s["a:spAutoFit"]) return { result: { type: "shape" } };
- if (s["a:normAutofit"]) {
- var l = U(s["a:normAutofit"], ["attrs", "fontScale"]);
- return l ? { result: { type: "text", fontScale: parseInt(l) / 1e3 } } : { result: { type: "text" } };
- }
- return null;
- }
- var i = C(U(t, ["p:txBody", "a:bodyPr"]));
- if (i) return i.result;
- var e = C(U(I, ["p:txBody", "a:bodyPr"]));
- if (e) return e.result;
- var A = C(U(g, ["p:txBody", "a:bodyPr"]));
- return A ? A.result : null;
- }
- var Gg = 72 / 914400;
- function f0(t, I, g) {
- var C;
- return t ? C = t["a:off"].attrs : I ? C = I["a:off"].attrs : g && (C = g["a:off"].attrs), C ? { top: Lt(parseInt(C.y) * Gg), left: Lt(parseInt(C.x) * Gg) } : { top: 0, left: 0 };
- }
- function H0(t, I, g) {
- var C;
- return t ? C = t["a:ext"].attrs : I ? C = I["a:ext"].attrs : g && (C = g["a:ext"].attrs), C ? { width: Lt(parseInt(C.cx) * Gg), height: Lt(parseInt(C.cy) * Gg) } : { width: 0, height: 0 };
- }
- function ubg(t, I) {
- return function(g) {
- if (Array.isArray(g)) return g;
- }(t) || function(g, C) {
- var i = g == null ? null : typeof Symbol < "u" && g[Symbol.iterator] || g["@@iterator"];
- if (i != null) {
- var e, A, s = [], l = !0, n = !1;
- try {
- for (i = i.call(g); !(l = (e = i.next()).done) && (s.push(e.value), !C || s.length !== C); l = !0) ;
- } catch (a) {
- n = !0, A = a;
- } finally {
- try {
- l || i.return == null || i.return();
- } finally {
- if (n) throw A;
- }
- }
- return s;
- }
- }(t, I) || tCg(t, I) || function() {
- throw new TypeError(`Invalid attempt to destructure non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }();
- }
- function Qtg(t, I) {
- var g = eC(t, void 0, void 0, I), C = t.attrs, i = C.dir ? parseInt(C.dir) / 6e4 : 0, e = C.dist ? parseInt(C.dist) * Gg : 0, A = C.blurRad ? parseInt(C.blurRad) * Gg : "", s = e * Math.sin(i * Math.PI / 180);
- return { h: e * Math.cos(i * Math.PI / 180), v: s, blur: A, color: g };
- }
- function bq(t, I) {
- var g = Object.keys(t);
- if (Object.getOwnPropertySymbols) {
- var C = Object.getOwnPropertySymbols(t);
- I && (C = C.filter(function(i) {
- return Object.getOwnPropertyDescriptor(t, i).enumerable;
- })), g.push.apply(g, C);
- }
- return g;
- }
- function os(t) {
- for (var I = 1; I < arguments.length; I++) {
- var g = arguments[I] != null ? arguments[I] : {};
- I % 2 ? bq(Object(g), !0).forEach(function(C) {
- f9(t, C, g[C]);
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : bq(Object(g)).forEach(function(C) {
- Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
- });
- }
- return t;
- }
- function uq(t, I) {
- var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
- if (!g) {
- if (Array.isArray(t) || (g = function(l, n) {
- if (l) {
- if (typeof l == "string") return mq(l, n);
- var a = Object.prototype.toString.call(l).slice(8, -1);
- if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
- if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return mq(l, n);
- }
- }(t)) || I) {
- g && (t = g);
- var C = 0, i = function() {
- };
- return { s: i, n: function() {
- return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
- }, e: function(l) {
- throw l;
- }, f: i };
- }
- throw new TypeError(`Invalid attempt to iterate non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }
- var e, A = !0, s = !1;
- return { s: function() {
- g = g.call(t);
- }, n: function() {
- var l = g.next();
- return A = l.done, l;
- }, e: function(l) {
- s = !0, e = l;
- }, f: function() {
- try {
- A || g.return == null || g.return();
- } finally {
- if (s) throw e;
- }
- } };
- }
- function mq(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function BV(t, I, g, C, i) {
- if (!t) return "";
- var e, A = "", s = U(I, ["p:style", "a:fontRef"]), l = t["a:p"], n = l.constructor === Array ? l : [l], a = null, d = /* @__PURE__ */ new Map(), o = uq(n);
- try {
- for (o.s(); !(e = o.n()).done; ) {
- var c = e.value, r = c["a:r"], h = c["a:fld"], b = c["a:br"];
- r && (r = r.constructor === Array ? r : [r], h && (h = h.constructor === Array ? h : [h], r = r.concat(h)), b && ((b = b.constructor === Array ? b : [b]).forEach(function(G) {
- return G.type = "br";
- }), b.length > 1 && b.shift(), (r = r.concat(b)).sort(function(G, w) {
- return !G.attrs || !w.attrs || G.attrs.order - w.attrs.order;
- })));
- var u = rbg(c, I, C, i), m = mbg(c, t, g, C, i);
- if (m) {
- var Z = Zbg(m);
- if (!a || a.key !== Z) {
- a && (A += "</".concat(a.tag, ">")), A += "<".concat(m.tag, ' style="list-style: none; padding-left: 0; margin: 0;">');
- var p = m.kind === "autoNum" ? d.has(Z) ? d.get(Z) : m.startAt : null;
- a = { key: Z, tag: m.tag, listInfo: m, counter: p };
- }
- var Y = wbg(a);
- a.listInfo.kind === "autoNum" && d.set(a.key, a.counter);
- var R = Gbg(a.listInfo), X = 1.5 * (m.lvl - 1);
- A += '<li style="text-align: '.concat(u, "; margin-left: ").concat(X, 'em;"><span style="').concat(R, '">').concat(Y, "</span>");
- } else a && (A += "</".concat(a.tag, ">"), a = null, d.clear()), A += '<p style="text-align: '.concat(u, ';">');
- if (r) {
- var H, S = null, z = "", v = uq(r);
- try {
- for (v.s(); !(H = v.n()).done; ) {
- var K = Otg(H.value, c, t, s, g, C, i);
- if (!S || S.styleText !== K.styleText || S.hasLink !== K.hasLink || K.hasLink) {
- if (z) {
- var V = z.replace(/\t/g, " ").replace(/\s/g, " ");
- A += '<span style="'.concat(S.styleText, '">').concat(V, "</span>"), z = "";
- }
- if (K.hasLink) {
- var N = K.text.replace(/\t/g, " ").replace(/\s/g, " ");
- A += '<span style="'.concat(K.styleText, '"><a href="').concat(K.linkURL, '" target="_blank">').concat(N, "</a></span>"), S = null;
- } else S = K, z = K.text;
- } else z += K.text;
- }
- } catch (G) {
- v.e(G);
- } finally {
- v.f();
- }
- if (z && S) {
- var B = z.replace(/\t/g, " ").replace(/\s/g, " ");
- A += '<span style="'.concat(S.styleText, '">').concat(B, "</span>");
- }
- } else A += pbg(c, I, t, s, g, C, i);
- A += m ? "</li>" : "</p>";
- }
- } catch (G) {
- o.e(G);
- } finally {
- o.f();
- }
- return a && (A += "</".concat(a.tag, ">")), A;
- }
- function mbg(t, I, g, C, i) {
- var e = t["a:pPr"];
- if (!e || e["a:buNone"]) return null;
- var A = 1, s = U(e, ["attrs", "lvl"]);
- s !== void 0 && (A = parseInt(s) + 1);
- var l = Ju(e);
- if (l) return os(os({}, l), {}, { lvl: A });
- var n = Ju(U(I, ["a:lstStyle", "a:lvl".concat(A, "pPr")]));
- if (n) return os(os({}, n), {}, { lvl: A });
- var a = Ju(U(g, ["p:txBody", "a:lstStyle", "a:lvl".concat(A, "pPr")]));
- if (a) return os(os({}, a), {}, { lvl: A });
- var d = i && i.slideMasterTextStyles;
- if (d) {
- var o = function(h, b) {
- return b ? h === "title" || h === "ctrTitle" ? "p:titleStyle" : h === "subTitle" ? b["p:titleStyle"] ? "p:titleStyle" : "p:bodyStyle" : h === "body" ? "p:bodyStyle" : "p:otherStyle" : null;
- }(C, d);
- if (o) {
- var c = Ju(U(d, [o, "a:lvl".concat(A, "pPr")]));
- if (c) return os(os({}, c), {}, { lvl: A });
- var r = Ju(U(d, [o, "a:lvl1pPr"]));
- if (r) return os(os({}, r), {}, { lvl: A });
- }
- }
- return null;
- }
- function Ju(t) {
- if (!t || t["a:buNone"]) return null;
- if (t["a:buChar"]) return { kind: "char", tag: "ul", char: U(t, ["a:buChar", "attrs", "char"]) || "•", font: U(t, ["a:buFont", "attrs", "typeface"]) || "" };
- if (t["a:buAutoNum"]) {
- var I = t["a:buAutoNum"], g = U(I, ["attrs", "type"]) || "arabicPeriod", C = U(I, ["attrs", "startAt"]), i = C ? parseInt(C) : 1, e = U(t, ["a:buFont", "attrs", "typeface"]) || "";
- return { kind: "autoNum", tag: "ol", numType: g, startAt: isNaN(i) ? 1 : i, font: e };
- }
- return null;
- }
- function Zbg(t) {
- return t ? t.kind === "autoNum" ? "".concat(t.tag, ":").concat(t.kind, ":").concat(t.numType, ":").concat(t.startAt, ":").concat(t.lvl, ":").concat(t.font) : "".concat(t.tag, ":").concat(t.kind, ":").concat(t.char, ":").concat(t.lvl, ":").concat(t.font) : "";
- }
- function Gbg(t) {
- var I = "display: inline-block; min-width: 1.4em; margin-right: 0.4em;";
- return t.font && (I += "font-family: ".concat(t.font, ";")), I;
- }
- function wbg(t) {
- var I = t.listInfo;
- if (I.kind === "char") return pV(I.char);
- var g = t.counter;
- return t.counter += 1, pV(function(C, i) {
- if (/circle/i.test(i)) return function(d) {
- var o = parseInt(d);
- return isNaN(o) || o <= 0 ? String(d) : o >= 1 && o <= 20 ? String.fromCharCode(o - 1 + 9312) : o >= 21 && o <= 35 ? String.fromCharCode(o - 21 + 12881) : o >= 36 && o <= 50 ? String.fromCharCode(o - 36 + 12977) : String(o);
- }(C);
- var e, A = String(i || "").toLowerCase(), s = A.includes("chs") || A.includes("cht"), l = i.includes("ParenBoth"), n = "";
- if (l || (i.includes("ParenR") ? n = ")" : i.includes("Period") ? n = "." : i.includes("Comma") && (n = ",")), e = i.includes("alphaLc") ? Zq(C, !1) : i.includes("alphaUc") ? Zq(C, !0) : i.includes("romanLc") ? Gq(C, !1) : i.includes("romanUc") ? Gq(C, !0) : s ? function(d, o, c) {
- var r = parseInt(d);
- if (isNaN(r) || r <= 0) return String(d);
- var h = c ? ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"] : ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"], b = c ? ["", "拾", "佰", "仟"] : ["", "十", "百", "千"], u = o ? ["", "萬", "億", "兆"] : ["", "万", "亿", "兆"], m = function(S) {
- var z = S % 1e4;
- if (z === 0) return "";
- for (var v = [], K = [Math.floor(z / 1e3), Math.floor(z % 1e3 / 100), Math.floor(z % 100 / 10), z % 10], V = [b[3], b[2], b[1], b[0]], N = !1, B = 0; B < K.length; B++) {
- var G = K[B], w = V[B], W = B === K.length - 1;
- G !== 0 ? (N && (v.push(h[0]), N = !1), w === b[1] && G === 1 && v.length === 0 ? v.push(w) : v.push(h[G] + w)) : !W && v.length && K.slice(B + 1).some(function(y) {
- return y !== 0;
- }) && (N = !0);
- }
- return v.join("");
- };
- if (r < 1e4) return m(r);
- for (var Z = [], p = r; p > 0; ) Z.push(p % 1e4), p = Math.floor(p / 1e4);
- for (var Y = "", R = Z.length - 1; R >= 0; R--) {
- var X = Z[R];
- if (X !== 0) {
- if (Y) {
- var H = Y.endsWith(h[0]);
- !H && X < 1e3 && (Y += h[0]), H && X >= 1e3 && (Y = Y.slice(0, -h[0].length));
- }
- Y += m(X) + (u[R] || "");
- } else Y && !Y.endsWith(h[0]) && (Y += h[0]);
- }
- return (Y = Y.replace(/零+$/g, "")) || h[0];
- }(C, A.includes("cht"), A.includes("db")) : String(C), l) return "(".concat(e, ")");
- var a = s && n === "." ? "、" : n;
- return "".concat(e).concat(a);
- }(g, I.numType));
- }
- function Zq(t, I) {
- for (var g = t, C = ""; g > 0; ) g -= 1, C = String.fromCharCode(g % 26 + 65) + C, g = Math.floor(g / 26);
- return I ? C : C.toLowerCase();
- }
- function Gq(t, I) {
- for (var g = "", C = Math.max(1, Math.min(3999, t)), i = 0, e = [[1e3, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]]; i < e.length; i++) for (var A = ubg(e[i], 2), s = A[0], l = A[1]; C >= s; ) g += l, C -= s;
- return I ? g : g.toLowerCase();
- }
- function pbg(t, I, g, C, i, e, A) {
- var s = Otg(t, I, g, C, i, e, A), l = s.styleText, n = s.text, a = s.hasLink, d = s.linkURL, o = n.replace(/\t/g, " ").replace(/\s/g, " ");
- return a ? '<span style="'.concat(l, '"><a href="').concat(d, '" target="_blank">').concat(o, "</a></span>") : '<span style="'.concat(l, '">').concat(o, "</span>");
- }
- function Otg(t, I, g, C, i, e, A) {
- var s = g["a:lstStyle"], l = A.slideMasterTextStyles, n = 1, a = U(I["a:pPr"], ["attrs", "lvl"]);
- a !== void 0 && (n = parseInt(a) + 1);
- var d = t["a:t"];
- typeof d != "string" && (d = U(t, ["a:fld", "a:t"])), typeof d != "string" && (d = " ");
- var o = U(t, ["attrs", "type"]) || U(t, ["a:fld", "attrs", "type"]), c = typeof o == "string" ? o.toLowerCase() : "";
- if (c === "slidenum" && A && A.slideNo !== void 0 && A.slideNo !== null) d = String(A.slideNo);
- else if (c.startsWith("datetime")) {
- var r = typeof d == "string" ? d.replace(/\s+/g, " ").trim() : "";
- if (!r || r === "日期" || r.toLowerCase() === "date") {
- var h = /* @__PURE__ */ new Date(), b = String(h.getFullYear()), u = String(h.getMonth() + 1).padStart(2, "0"), m = String(h.getDate()).padStart(2, "0");
- d = "".concat(b, "-").concat(u, "-").concat(m);
- }
- }
- var Z = typeof d == "string" ? d.replace(/\s+/g, " ").trim() : "";
- if (e !== "sldNum" || Z !== "<#>" && Z !== "#" || !A || A.slideNo === void 0 || A.slideNo === null) {
- if (e === "dt" && (Z === "日期" || Z.toLowerCase() === "date")) {
- var p = /* @__PURE__ */ new Date(), Y = String(p.getFullYear()), R = String(p.getMonth() + 1).padStart(2, "0"), X = String(p.getDate()).padStart(2, "0");
- d = "".concat(Y, "-").concat(R, "-").concat(X);
- }
- } else d = String(A.slideNo);
- var H = "", S = function(P, L, E, J, k, j) {
- var q, Cg, Ig = U(P, ["a:rPr"]);
- if (Ig && ((q = Hs(Ig)) === "SOLID_FILL" && (Cg = eC(Ig["a:solidFill"], void 0, void 0, j)), q === "GRADIENT_FILL")) return j9(Ig["a:gradFill"], j);
- if (!Cg && U(E, ["a:lvl" + k + "pPr", "a:defRPr"])) {
- var x = U(E, ["a:lvl" + k + "pPr", "a:defRPr"]);
- (q = Hs(x)) === "SOLID_FILL" && (Cg = eC(x["a:solidFill"], void 0, void 0, j));
- }
- if (!Cg) {
- var Ag = U(L, ["p:style", "a:fontRef"]);
- Ag && (Cg = eC(Ag, void 0, void 0, j)), !Cg && J && (Cg = eC(J, void 0, void 0, j));
- }
- return Cg || "";
- }(t, I, s, C, n, A), z = function(P, L, E, J, k, j, q) {
- var Cg, Ig = 1;
- if (q) {
- var x = U(q, ["a:pPr", "attrs", "lvl"]);
- x !== void 0 && (Ig = parseInt(x) + 1);
- }
- if (U(P, ["a:rPr", "attrs", "sz"]) && (Cg = U(P, ["a:rPr", "attrs", "sz"]) / 100), !isNaN(Cg) && Cg || !q || U(q, ["a:endParaRPr", "attrs", "sz"]) && (Cg = U(q, ["a:endParaRPr", "attrs", "sz"]) / 100), (isNaN(Cg) || !Cg) && j) {
- var Ag = U(j, ["a:lstStyle"]);
- if (Ag) {
- var eg = U(Ag, ["a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]);
- eg && (Cg = parseInt(eg) / 100);
- }
- }
- if ((isNaN(Cg) || !Cg) && L) {
- var O = U(L, ["p:txBody", "a:lstStyle", "a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]);
- O && (Cg = parseInt(O) / 100);
- }
- if ((isNaN(Cg) || !Cg) && L) {
- var _ = U(L, ["p:txBody", "a:lstStyle", "a:lvl1pPr", "a:defRPr", "attrs", "sz"]);
- _ && (Cg = parseInt(_) / 100);
- }
- if ((isNaN(Cg) || !Cg) && q) {
- var gg = U(q, ["a:pPr", "a:defRPr", "attrs", "sz"]);
- gg && (Cg = parseInt(gg) / 100);
- }
- if (isNaN(Cg) || !Cg) if (E === "dt" || E === "sldNum") Cg = 12;
- else {
- var lg, ng = "a:lvl".concat(Ig, "pPr"), sg = function(cg) {
- var rg = U(J, [cg, ng, "a:defRPr", "attrs", "sz"]);
- if (rg) return parseInt(rg) / 100;
- var dg = U(J, [cg, "a:lvl1pPr", "a:defRPr", "attrs", "sz"]);
- return dg ? parseInt(dg) / 100 : null;
- };
- E === "title" || E === "ctrTitle" ? lg = sg("p:titleStyle") : E === "subTitle" ? (lg = sg("p:titleStyle")) === null && (lg = sg("p:bodyStyle")) : lg = sg(E === "body" ? "p:bodyStyle" : "p:otherStyle"), lg !== null && (Cg = lg);
- }
- if (isNaN(Cg) || !Cg) {
- var og = U(k, ["a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]) || U(k, ["a:defPPr", "a:defRPr", "attrs", "sz"]);
- og && (Cg = parseInt(og) / 100);
- }
- return (Cg = isNaN(Cg) || !Cg ? 18 : Cg) + "px";
- }(t, i, e, l, A.defaultTextStyle, g, I), v = function(P, L, E) {
- var J = U(P, ["a:t"]), k = typeof J == "string" && /[\u3040-\u30ff\u3400-\u9fff\uf900-\ufaff]/.test(J), j = (k ? U(P, ["a:rPr", "a:ea", "attrs", "typeface"]) : null) || U(P, ["a:rPr", "a:latin", "attrs", "typeface"]) || U(P, ["a:rPr", "a:ea", "attrs", "typeface"]) || U(P, ["a:rPr", "a:cs", "attrs", "typeface"]);
- if (!j) {
- var q, Cg = U(E.themeContent, ["a:theme", "a:themeElements", "a:fontScheme"]);
- q = U(Cg, L === "title" || L === "subTitle" || L === "ctrTitle" ? ["a:majorFont"] : ["a:minorFont"]), j = (k ? U(q, ["a:ea", "attrs", "typeface"]) : null) || U(q, ["a:latin", "attrs", "typeface"]) || U(q, ["a:ea", "attrs", "typeface"]) || U(q, ["a:cs", "attrs", "typeface"]);
- }
- return j || "";
- }(t, e, A), K = function(P) {
- return U(P, ["a:rPr", "attrs", "b"]) === "1" ? "bold" : "";
- }(t), V = function(P) {
- return U(P, ["a:rPr", "attrs", "i"]) === "1" ? "italic" : "";
- }(t), N = function(P) {
- return U(P, ["a:rPr", "attrs", "u"]) === "sng" ? "underline" : "";
- }(t), B = function(P) {
- return U(P, ["a:rPr", "attrs", "strike"]) === "sngStrike" ? "line-through" : "";
- }(t), G = function(P) {
- var L = U(P, ["a:rPr", "attrs", "spc"]);
- return L ? parseInt(L) / 100 + "pt" : "";
- }(t), w = function(P, L) {
- var E = U(P, ["a:rPr", "a:effectLst", "a:outerShdw"]);
- if (E) {
- var J = Qtg(E, L);
- if (J) {
- var k = J.h, j = J.v, q = J.blur, Cg = J.color;
- if (!isNaN(j) && !isNaN(k)) return k + "pt " + j + "pt " + (q ? q + "pt" : "") + " " + Cg;
- }
- }
- return "";
- }(t, A), W = function(P) {
- var L = U(P, ["a:rPr", "attrs", "baseline"]);
- return L ? parseInt(L) > 0 ? "super" : "sub" : "";
- }(t);
- if (S) {
- if (typeof S == "string") H += "color: ".concat(S, ";");
- else if (S.colors) {
- var y = S.colors, f = S.rot, D = y.map(function(P) {
- return "".concat(P.color, " ").concat(P.pos);
- }).join(", "), F = "linear-gradient(".concat(f + 90, "deg, ").concat(D, ")");
- H += "background: ".concat(F, "; background-clip: text; color: transparent;");
- }
- }
- z && (H += "font-size: ".concat(z, ";")), v && (H += "font-family: ".concat(v, ";")), K && (H += "font-weight: ".concat(K, ";")), V && (H += "font-style: ".concat(V, ";")), N && (H += "text-decoration: ".concat(N, ";")), B && (H += "text-decoration-line: ".concat(B, ";")), G && (H += "letter-spacing: ".concat(G, ";")), W && (H += "vertical-align: ".concat(W, ";")), w && (H += "text-shadow: ".concat(w, ";"));
- var T = U(t, ["a:rPr", "a:hlinkClick", "attrs", "r:id"]), Q = T && A.slideResObj[T];
- return { styleText: H, text: d, hasLink: Q, linkURL: Q ? A.slideResObj[T].target : null };
- }
- function Bbg(t, I, g, C, i, e, A) {
- var s, l = i;
- if (e >= i) for (; l <= e; ) {
- var n = l * (Math.PI / 180), a = t + Math.cos(n) * g, d = I + Math.sin(n) * C;
- l === i && (s = " M" + a + " " + d), s += " L" + a + " " + d, l++;
- }
- else for (; l > e; ) {
- var o = l * (Math.PI / 180), c = t + Math.cos(o) * g, r = I + Math.sin(o) * C;
- l === i && (s = " M " + c + " " + r), s += " L " + c + " " + r, l--;
- }
- return s += "";
- }
- function Wbg(t, I, g) {
- var C = U(t, ["a:pathLst"]), i = U(C, ["a:path"]);
- Array.isArray(i) && (i = i.shift());
- var e = parseInt(i.attrs.w), A = parseInt(i.attrs.h), s = e === 0 ? 0 : 1 / e * I, l = A === 0 ? 0 : 1 / A * g, n = "", a = U(i, ["a:moveTo"]), d = i["a:lnTo"], o = i["a:cubicBezTo"], c = i["a:arcTo"], r = U(i, ["a:close"]);
- Array.isArray(a) || (a = [a]);
- var h = [];
- if (a.length > 0) {
- if (Object.keys(a).forEach(function(N) {
- var B = a[N]["a:pt"];
- B && Object.keys(B).forEach(function(G) {
- var w = B[G], W = w.x, y = w.y, f = w.order;
- h.push({ type: "movto", x: W, y, order: f });
- });
- }), d && (Array.isArray(d) || (d = [d]), Object.keys(d).forEach(function(N) {
- var B = d[N]["a:pt"];
- B && Object.keys(B).forEach(function(G) {
- var w = B[G], W = w.x, y = w.y, f = w.order;
- h.push({ type: "lnto", x: W, y, order: f });
- });
- })), o) {
- var b = [];
- Array.isArray(o) || (o = [o]), Object.keys(o).forEach(function(N) {
- b.push(o[N]["a:pt"]);
- }), b.forEach(function(N) {
- var B = [];
- N.forEach(function(w) {
- var W = { x: w.attrs.x, y: w.attrs.y };
- B.push(W);
- });
- var G = N[0].attrs.order;
- h.push({ type: "cubicBezTo", cubBzPt: B, order: G });
- });
- }
- if (c) {
- var u = c.attrs, m = u.order, Z = u.hR, p = u.wR, Y = u.stAng, R = u.swAng, X = 0, H = 0, S = U(c, ["a:pt", "attrs"]);
- S && (X = S.x, H = S.y), h.push({ type: "arcTo", hR: Z, wR: p, stAng: Y, swAng: R, shftX: X, shftY: H, order: m });
- }
- r && (Array.isArray(r) || (r = [r]), Object.keys(r).forEach(function() {
- h.push({ type: "close", order: 1 / 0 });
- })), h.sort(function(N, B) {
- return N.order - B.order;
- });
- for (var z = 0; z < h.length; ) {
- if (h[z].type === "movto") n += " M" + parseInt(h[z].x) * s + "," + parseInt(h[z].y) * l;
- else if (h[z].type === "lnto")
- n += " L" + parseInt(h[z].x) * s + "," + parseInt(h[z].y) * l;
- else if (h[z].type === "cubicBezTo")
- n += " C" + parseInt(h[z].cubBzPt[0].x) * s + "," + parseInt(h[z].cubBzPt[0].y) * l + " " + parseInt(h[z].cubBzPt[1].x) * s + "," + parseInt(h[z].cubBzPt[1].y) * l + " " + parseInt(h[z].cubBzPt[2].x) * s + "," + parseInt(h[z].cubBzPt[2].y) * l;
- else if (h[z].type === "arcTo") {
- var v = parseInt(h[z].hR) * s, K = parseInt(h[z].wR) * l, V = parseInt(h[z].stAng) / 6e4;
- n += Bbg(K, v, K, v, V, V + parseInt(h[z].swAng) / 6e4);
- } else h[z].type === "close" && (n += "z");
- z++;
- }
- }
- return n;
- }
- function ybg(t, I) {
- var g = {};
- if (t["a:bottom"]) {
- var C = Fs({ "p:spPr": { "a:ln": t["a:bottom"]["a:ln"] } }, void 0, I);
- g.bottom = C;
- }
- if (t["a:top"]) {
- var i = Fs({ "p:spPr": { "a:ln": t["a:top"]["a:ln"] } }, void 0, I);
- g.top = i;
- }
- if (t["a:right"]) {
- var e = Fs({ "p:spPr": { "a:ln": t["a:right"]["a:ln"] } }, void 0, I);
- g.right = e;
- }
- if (t["a:left"]) {
- var A = Fs({ "p:spPr": { "a:ln": t["a:left"]["a:ln"] } }, void 0, I);
- g.left = A;
- }
- return g;
- }
- function wq(t, I, g, C) {
- return Utg.apply(this, arguments);
- }
- function Utg() {
- return (Utg = SC(bI.mark(function t(I, g, C, i) {
- var e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y;
- return bI.wrap(function(R) {
- for (; ; ) switch (R.prev = R.next) {
- case 0:
- if (e = U(I, ["attrs", "rowSpan"]), A = U(I, ["attrs", "gridSpan"]), s = U(I, ["attrs", "vMerge"]), l = U(I, ["attrs", "hMerge"]), !(o = U(I, ["a:tcPr"]))) {
- R.next = 11;
- break;
- }
- return c = { "p:spPr": o }, R.next = 9, jtg(c, void 0, !1, i, "slide");
- case 9:
- (r = R.sent) && r.type === "color" && r.value && (n = r.value);
- case 11:
- return n || (C && (h = U(g, [C, "a:tcStyle", "a:fill", "a:solidFill"])), h && (n = eC(h, void 0, void 0, i))), C && (b = U(g, [C, "a:tcTxStyle"])), b && (a = eC(b, void 0, void 0, i), U(b, ["attrs", "b"]) === "on" && (d = !0)), (u = U(I, ["a:tcPr", "a:lnB"])) || (C && (u = U(g[C], ["a:tcStyle", "a:tcBdr", "a:bottom", "a:ln"])), u || (u = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:bottom", "a:ln"]))), (m = U(I, ["a:tcPr", "a:lnT"])) || (C && (m = U(g[C], ["a:tcStyle", "a:tcBdr", "a:top", "a:ln"])), m || (m = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:top", "a:ln"]))), (Z = U(I, ["a:tcPr", "a:lnL"])) || (C && (Z = U(g[C], ["a:tcStyle", "a:tcBdr", "a:left", "a:ln"])), Z || (Z = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:left", "a:ln"]))), (p = U(I, ["a:tcPr", "a:lnR"])) || (C && (p = U(g[C], ["a:tcStyle", "a:tcBdr", "a:right", "a:ln"])), p || (p = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:right", "a:ln"]))), Y = {}, u && (Y.bottom = Fs(u, void 0, i)), m && (Y.top = Fs(m, void 0, i)), Z && (Y.left = Fs(Z, void 0, i)), p && (Y.right = Fs(p, void 0, i)), R.abrupt("return", { fillColor: n, fontColor: a, fontBold: d, borders: Y, rowSpan: e ? +e : void 0, colSpan: A ? +A : void 0, vMerge: s ? +s : void 0, hMerge: l ? +l : void 0 });
- case 28:
- case "end":
- return R.stop();
- }
- }, t);
- }))).apply(this, arguments);
- }
- function Ybg(t, I, g, C, i) {
- var e, A, s;
- if (C && C["a:wholeTbl"]) {
- var l = U(C, ["a:wholeTbl", "a:tcStyle", "a:fill", "a:solidFill"]);
- if (l) {
- var n = eC(l, void 0, void 0, i);
- n && (e = n);
- }
- var a = U(C, ["a:wholeTbl", "a:tcTxStyle"]);
- if (a) {
- var d = eC(a, void 0, void 0, i);
- d && (A = d), U(a, ["attrs", "b"]) === "on" && (s = !0);
- }
- }
- if (I === 0 && g.isFrstRowAttr === 1 && C) {
- var o = U(C, ["a:firstRow", "a:tcStyle", "a:fill", "a:solidFill"]);
- if (o) {
- var c = eC(o, void 0, void 0, i);
- c && (e = c);
- }
- var r = U(C, ["a:firstRow", "a:tcTxStyle"]);
- if (r) {
- var h = eC(r, void 0, void 0, i);
- h && (A = h), U(r, ["attrs", "b"]) === "on" && (s = !0);
- }
- } else if (I > 0 && g.isBandRowAttr === 1 && C) {
- if (e = "", I % 2 == 0 && C["a:band2H"]) {
- var b = U(C, ["a:band2H", "a:tcStyle", "a:fill", "a:solidFill"]);
- if (b) {
- var u = eC(b, void 0, void 0, i);
- u && (e = u);
- }
- var m = U(C, ["a:band2H", "a:tcTxStyle"]);
- if (m) {
- var Z = eC(m, void 0, void 0, i);
- Z && (A = Z);
- }
- U(m, ["attrs", "b"]) === "on" && (s = !0);
- }
- if (I % 2 != 0 && C["a:band1H"]) {
- var p = U(C, ["a:band1H", "a:tcStyle", "a:fill", "a:solidFill"]);
- if (p) {
- var Y = eC(p, void 0, void 0, i);
- Y && (e = Y);
- }
- var R = U(C, ["a:band1H", "a:tcTxStyle"]);
- if (R) {
- var X = eC(R, void 0, void 0, i);
- X && (A = X), U(R, ["attrs", "b"]) === "on" && (s = !0);
- }
- }
- }
- if (I === t.length - 1 && g.isLstRowAttr === 1 && C) {
- var H = U(C, ["a:lastRow", "a:tcStyle", "a:fill", "a:solidFill"]);
- if (H) {
- var S = eC(H, void 0, void 0, i);
- S && (e = S);
- }
- var z = U(C, ["a:lastRow", "a:tcTxStyle"]);
- if (z) {
- var v = eC(z, void 0, void 0, i);
- v && (A = v), U(z, ["attrs", "b"]) === "on" && (s = !0);
- }
- }
- return { fillColor: e, fontColor: A, fontBold: s };
- }
- function Etg(t) {
- var I = [];
- return _a(t) !== "object" || (t["m:oMath"] && (I = I.concat(t["m:oMath"])), Object.values(t).forEach(function(g) {
- (Array.isArray(g) || _a(g) === "object") && (I = I.concat(Etg(g)));
- })), I;
- }
- function pq(t, I) {
- var g = HC(t["m:e"]), C = HC(t["m:lim"]);
- return I === "low" ? "".concat(g, "_{").concat(C, "}") : "".concat(g, "^{").concat(C, "}");
- }
- function HC(t) {
- if (!t) return "";
- if (Array.isArray(t)) return t.map(function(A) {
- return HC(A);
- }).join("");
- for (var I = [], g = Object.keys(t), C = function() {
- var A = e[i];
- Array.isArray(t[A]) ? I.push.apply(I, R9(t[A].map(function(s) {
- return { key: A, value: s };
- }))) : I.push({ key: A, value: t[A] });
- }, i = 0, e = g; i < e.length; i++) C();
- return I.sort(function(A, s) {
- var l = 0;
- A.key === "m:r" && A.value && A.value["a:rPr"] ? l = A.value["a:rPr"].attrs.order : A.value["".concat(A.key, "Pr")] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"] && (l = A.value["".concat(A.key, "Pr")] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"].attrs.order);
- var n = 0;
- return s.key === "m:r" && s.value && s.value["a:rPr"] ? n = s.value["a:rPr"].attrs.order : s.value["".concat(s.key, "Pr")] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"] && (n = s.value["".concat(s.key, "Pr")] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"].attrs.order), l - n;
- }), I.map(function(A) {
- var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H = A.key, S = A.value;
- return H === "m:f" ? (l = HC((s = S)["m:num"]), n = HC(s["m:den"]), "\\frac{".concat(l, "}{").concat(n, "}")) : H === "m:sSup" ? (d = HC((a = S)["m:e"]), o = HC(a["m:sup"]), "".concat(d, "^{").concat(o, "}")) : H === "m:sSub" ? function(z) {
- var v = HC(z["m:e"]), K = HC(z["m:sub"]);
- return "".concat(v, "_{").concat(K, "}");
- }(S) : H === "m:rad" ? (r = HC((c = S)["m:deg"]), h = HC(c["m:e"]), r ? "\\sqrt[".concat(r, "]{").concat(h, "}") : "\\sqrt{".concat(h, "}")) : H === "m:nary" ? function(z) {
- var v = U(z, ["m:naryPr", "m:chr", "attrs", "m:val"]) || "∫", K = HC(z["m:sub"]), V = HC(z["m:sup"]), N = HC(z["m:e"]);
- return "".concat(v, "_{").concat(K, "}^{").concat(V, "}{").concat(N, "}");
- }(S) : H === "m:limLow" ? pq(S, "low") : H === "m:limUpp" ? pq(S, "upp") : H === "m:d" ? function(z) {
- var v = U(z, ["m:dPr", "m:begChr", "attrs", "m:val"]), K = U(z, ["m:dPr", "m:endChr", "attrs", "m:val"]);
- v || K || (v = "(", K = ")"), v && K && (v = "\\left".concat(v), K = "\\right".concat(K));
- var V = HC(z["m:e"]);
- return "".concat(v).concat(V).concat(K);
- }(S) : H === "m:func" ? (u = HC((b = S)["m:fName"]), m = HC(b["m:e"]), "\\".concat(u, "{").concat(m, "}")) : H === "m:groupChr" ? (p = U(Z = S, ["m:groupChrPr", "m:chr", "attrs", "m:val"]), Y = HC(Z["m:e"]), "".concat(p).concat(Y).concat(p)) : H === "m:eqArr" ? (R = S["m:e"].map(function(z) {
- return HC(z);
- }).join(" \\\\ "), "\\begin{cases} ".concat(R, " \\end{cases}")) : H === "m:bar" ? function(z) {
- var v = HC(z["m:e"]);
- return U(z, ["m:barPr", "m:pos", "attrs", "m:val"]) === "top" ? "\\overline{".concat(v, "}") : "\\underline{".concat(v, "}");
- }(S) : H === "m:acc" ? function(z) {
- var v = U(z, ["m:accPr", "m:chr", "attrs", "m:val"]) || "^", K = HC(z["m:e"]);
- switch (v) {
- case "́":
- return "\\acute{".concat(K, "}");
- case "̀":
- return "\\grave{".concat(K, "}");
- case "̂":
- return "\\hat{".concat(K, "}");
- case "̃":
- return "\\tilde{".concat(K, "}");
- case "̄":
- return "\\bar{".concat(K, "}");
- case "̆":
- return "\\breve{".concat(K, "}");
- case "̇":
- return "\\dot{".concat(K, "}");
- case "̈":
- return "\\ddot{".concat(K, "}");
- case "̊":
- return "\\mathring{".concat(K, "}");
- case "̋":
- return "\\H{".concat(K, "}");
- case "̌":
- return "\\check{".concat(K, "}");
- case "̧":
- return "\\c{".concat(K, "}");
- default:
- return "\\".concat(v, "{").concat(K, "}");
- }
- }(S) : H === "m:borderBox" ? function(z) {
- var v = HC(z["m:e"]);
- return "\\boxed{".concat(v, "}");
- }(S) : H === "m:m" ? (X = S["m:mr"].map(function(z) {
- return z["m:e"].map(function(v) {
- return HC(v);
- }).join(" & ");
- }), "\\begin{matrix} ".concat(X.join(" \\\\ "), " \\end{matrix}")) : H === "m:r" ? HC(S) : H === "m:t" ? S : "";
- }).join("");
- }
- function Nbg(t) {
- return t.replaceAll(/</g, "<").replaceAll(/>/g, ">").replaceAll(/&/g, "&").replaceAll(/'/g, "'").replaceAll(/"/g, '"');
- }
- function HI(t, I) {
- var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
- if (!g) {
- if (Array.isArray(t) || (g = function(l, n) {
- if (l) {
- if (typeof l == "string") return Bq(l, n);
- var a = Object.prototype.toString.call(l).slice(8, -1);
- if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
- if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return Bq(l, n);
- }
- }(t)) || I) {
- g && (t = g);
- var C = 0, i = function() {
- };
- return { s: i, n: function() {
- return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
- }, e: function(l) {
- throw l;
- }, f: i };
- }
- throw new TypeError(`Invalid attempt to iterate non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }
- var e, A = !0, s = !1;
- return { s: function() {
- g = g.call(t);
- }, n: function() {
- var l = g.next();
- return A = l.done, l;
- }, e: function(l) {
- s = !0, e = l;
- }, f: function() {
- try {
- A || g.return == null || g.return();
- } finally {
- if (s) throw e;
- }
- } };
- }
- function Bq(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function Wq(t, I, g, C, i) {
- return { x: t + Math.cos(i) * g, y: I + Math.sin(i) * C };
- }
- function yq(t, I, g, C, i, e, A) {
- var s = Wq(t, I, g, C, i), l = Wq(t, I, g, C, e), n = l, a = s, d = i - e, o = Math.abs(d) > Math.PI ? 1 : 0, c = d >= 0 ? 1 : 0;
- return "M ".concat(n.x, ",").concat(n.y, " A ").concat(g, ",").concat(C, " 0 ").concat(o, ",").concat(c, " ").concat(a.x, ",").concat(a.y, " Z");
- }
- function Vg(t, I, g, C, i, e, A) {
- for (var s, l = "", n = e >= i ? 1 : -1, a = i; s = a, n > 0 ? s <= e : s >= e; ) {
- var d = a * (Math.PI / 180), o = t + Math.cos(d) * g, c = I + Math.sin(d) * C;
- a === i && (l = " M".concat(o, " ").concat(c)), l += " L".concat(o, " ").concat(c), a += n;
- }
- return A && (l += " z"), l;
- }
- function Vbg(t, I, g, C) {
- var i = "";
- switch (t) {
- case "rect":
- case "actionButtonBlank":
- case "leftRightCircularArrow":
- case "chartPlus":
- case "chartStar":
- case "chartX":
- case "cornerTabs":
- case "flowChartOfflineStorage":
- case "folderCorner":
- case "funnel":
- case "lineInv":
- case "nonIsoscelesTrapezoid":
- case "plaqueTabs":
- case "squareTabs":
- case "upDownArrowCallout":
- default:
- i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z");
- break;
- case "flowChartPredefinedProcess":
- i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z M ").concat(I * (1 / 8), " 0 L ").concat(I * (1 / 8), " ").concat(g, " M ").concat(I * (7 / 8), " 0 L ").concat(I * (7 / 8), " ").concat(g);
- break;
- case "flowChartInternalStorage":
- i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z M ").concat(I * (1 / 8), " 0 L ").concat(I * (1 / 8), " ").concat(g, " M 0 ").concat(g * (1 / 8), " L ").concat(I, " ").concat(g * (1 / 8));
- break;
- case "flowChartCollate":
- i = "M 0,0 L ".concat(I, ",0 L 0,").concat(g, " L ").concat(I, ",").concat(g, " z");
- break;
- case "flowChartDocument":
- var e = 10800 * I / 21600, A = 17322 * g / 21600, s = 20172 * g / 21600, l = 23922 * g / 21600;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(A, " C ").concat(e, ",").concat(A, " ").concat(e, ",").concat(l, " 0,").concat(s, " z");
- break;
- case "flowChartMultidocument":
- var n = 18022 * g / 21600, a = 3675 * g / 21600, d = 23542 * g / 21600, o = 1815 * g / 21600, c = 16252 * g / 21600, r = 16352 * g / 21600, h = 14392 * g / 21600, b = 20782 * g / 21600, u = 14467 * g / 21600, m = 1532 * I / 21600, Z = 2e4 * I / 21600, p = 9298 * I / 21600, Y = 19298 * I / 21600, R = 18595 * I / 21600, X = 2972 * I / 21600, H = 20800 * I / 21600;
- i = "M 0,".concat(a, " L ").concat(R, ",").concat(a, " L ").concat(R, ",").concat(n, " C ").concat(p, ",").concat(n, " ").concat(p, ",").concat(d, " 0,").concat(b, " z M ").concat(m, ",").concat(a, " L ").concat(m, ",").concat(o, " L ").concat(Z, ",").concat(o, " L ").concat(Z, ",").concat(c, " C ").concat(Y, ",").concat(c, " ").concat(R, ",").concat(r, " ").concat(R, ",").concat(r, " M ").concat(X, ",").concat(o, " L ").concat(X, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(h, " C ").concat(H, ",").concat(h, " ").concat(Z, ",").concat(u, " ").concat(Z, ",").concat(u);
- break;
- case "actionButtonBackPrevious":
- var S = I / 2, z = g / 2, v = 3 * Math.min(I, g) / 8, K = z - v, V = z + v, N = S - v, B = S + v;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(N, ",").concat(z, " L ").concat(B, ",").concat(K, " L ").concat(B, ",").concat(V, " z");
- break;
- case "actionButtonBeginning":
- var G = I / 2, w = g / 2, W = Math.min(I, g), y = 3 * W / 8, f = w - y, D = w + y, F = G - y, T = G + y, Q = 3 * W / 4, P = F + Q / 8, L = F + Q / 4;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(L, ",").concat(w, " L ").concat(T, ",").concat(f, " L ").concat(T, ",").concat(D, " z M ").concat(P, ",").concat(f, " L ").concat(F, ",").concat(f, " L ").concat(F, ",").concat(D, " L ").concat(P, ",").concat(D, " z");
- break;
- case "actionButtonDocument":
- var E = I / 2, J = g / 2, k = Math.min(I, g), j = 3 * k / 8, q = J - j, Cg = J + j, Ig = 9 * k / 32, x = E - Ig, Ag = E + Ig, eg = 3 * k / 16, O = Ag - eg, _ = q + eg;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(x, ",").concat(q, " L ").concat(O, ",").concat(q, " L ").concat(Ag, ",").concat(_, " L ").concat(Ag, ",").concat(Cg, " L ").concat(x, ",").concat(Cg, " z M ").concat(O, ",").concat(q, " L ").concat(O, ",").concat(_, " L ").concat(Ag, ",").concat(_, " z");
- break;
- case "actionButtonEnd":
- var gg = I / 2, lg = g / 2, ng = Math.min(I, g), sg = 3 * ng / 8, og = lg - sg, cg = lg + sg, rg = gg - sg, dg = gg + sg, Bg = 3 * ng / 4, Zg = rg + 3 * Bg / 4, Xg = rg + 7 * Bg / 8;
- i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Xg, ",").concat(og, " L ").concat(dg, ",").concat(og, " L ").concat(dg, ",").concat(cg, " L ").concat(Xg, ",").concat(cg, " z M ").concat(Zg, ",").concat(lg, " L ").concat(rg, ",").concat(og, " L ").concat(rg, ",").concat(cg, " z");
- break;
- case "actionButtonForwardNext":
- var Kg = I / 2, kg = g / 2, Wg = 3 * Math.min(I, g) / 8, Ng = kg - Wg, wg = kg + Wg, fg = Kg - Wg, Jg = Kg + Wg;
- i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Jg, ",").concat(kg, " L ").concat(fg, ",").concat(Ng, " L ").concat(fg, ",").concat(wg, " z");
- break;
- case "actionButtonHelp":
- var zg = I / 2, cI = g / 2, YI = Math.min(I, g), Eg = 3 * YI / 8, aI = cI - Eg, dI = zg - Eg, _g = 3 * YI / 4, xI = _g / 7, SI = 3 * _g / 14, eI = 2 * _g / 7, NI = aI + eI, EI = aI + 17 * _g / 28, oI = aI + 21 * _g / 28, LI = aI + 11 * _g / 14, pg = dI + SI, uI = dI + 3 * _g / 7, hg = dI + 4 * _g / 7, bg = _g / 14, Rg = 3 * _g / 28, Tg = pg + eI, rI = uI + xI, jg = LI + Rg, GI = (hg + uI + eI) / 2;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(pg, ",").concat(NI, " ").concat(Vg(Tg, NI, eI, eI, 180, 360, !1).replace("M", "L"), " ").concat(Vg(GI, NI, xI, SI, 0, 90, !1).replace("M", "L"), " ").concat(Vg(GI, EI, bg, Rg, 270, 180, !1).replace("M", "L"), " L ").concat(hg, ",").concat(oI, " L ").concat(uI, ",").concat(oI, " L ").concat(uI, ",").concat(EI, " ").concat(Vg(rI, EI, xI, SI, 180, 270, !1).replace("M", "L"), " ").concat(Vg(hg, NI, bg, Rg, 90, 0, !1).replace("M", "L"), " ").concat(Vg(Tg, NI, xI, xI, 0, -180, !1).replace("M", "L"), " z M ").concat(zg, ",").concat(LI, " ").concat(Vg(zg, jg, Rg, Rg, 270, 630, !1).replace("M", "L"), " z");
- break;
- case "actionButtonHome":
- var nI = I / 2, CI = g / 2, WI = Math.min(I, g), mI = 3 * WI / 8, VI = CI - mI, yC = CI + mI, gC = nI - mI, It = nI + mI, dC = 3 * WI / 4, Tt = VI + dC / 16, ag = VI + 3 * dC / 16, mg = VI + 5 * dC / 16, Sg = VI + 3 * dC / 4, Fg = gC + dC / 8, tI = gC + 7 * dC / 16, vg = gC + 9 * dC / 16, xg = gC + 11 * dC / 16, vI = gC + 13 * dC / 16, fI = gC + 7 * dC / 8;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(nI, ",").concat(VI, " L ").concat(gC, ",").concat(CI, " L ").concat(Fg, ",").concat(CI, " L ").concat(Fg, ",").concat(yC, " L ").concat(fI, ",").concat(yC, " L ").concat(fI, ",").concat(CI, " L ").concat(It, ",").concat(CI, " L ").concat(vI, ",").concat(mg, " L ").concat(vI, ",").concat(Tt, " L ").concat(xg, ",").concat(Tt, " L ").concat(xg, ",").concat(ag, " z M ").concat(tI, ",").concat(Sg, " L ").concat(vg, ",").concat(Sg, " L ").concat(vg, ",").concat(yC, " L ").concat(tI, ",").concat(yC, " z");
- break;
- case "actionButtonInformation":
- var MI = I / 2, hI = g / 2, AC = Math.min(I, g), PI = 3 * AC / 8, jI = hI - PI, mC = MI - PI, ZC = 3 * AC / 4, Vt = 5 * ZC / 16, Si = jI + ZC / 32, LA = jI + Vt, vs = jI + 3 * ZC / 8, AA = jI + 13 * ZC / 16, Ts = jI + 7 * ZC / 8, IC = mC + Vt, QI = mC + 13 * ZC / 32, sA = mC + 19 * ZC / 32, vA = mC + 11 * ZC / 16, An = 3 * ZC / 32, Bi = jI + PI, lA = Si + An;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(MI, ",").concat(jI, " ").concat(Vg(MI, Bi, PI, PI, 270, 630, !1).replace("M", "L"), " z M ").concat(MI, ",").concat(Si, " ").concat(Vg(MI, lA, An, An, 270, 630, !1).replace("M", "L"), " M ").concat(IC, ",").concat(LA, " L ").concat(sA, ",").concat(LA, " L ").concat(sA, ",").concat(AA, " L ").concat(vA, ",").concat(AA, " L ").concat(vA, ",").concat(Ts, " L ").concat(IC, ",").concat(Ts, " L ").concat(IC, ",").concat(AA, " L ").concat(QI, ",").concat(AA, " L ").concat(QI, ",").concat(vs, " L ").concat(IC, ",").concat(vs, " z");
- break;
- case "actionButtonMovie":
- var nA = I / 2, Io = g / 2, xs = Math.min(I, g), xt = nA - 3 * xs / 8, Mt = Io - 3 * xs / 8, S0 = nA + 3 * xs / 8, _C = 3 * xs / 4, Gd = xt + 1455 * _C / 21600, Co = xt + 1905 * _C / 21600, to = xt + 2325 * _C / 21600, pG = xt + 16155 * _C / 21600, js = xt + 17010 * _C / 21600, wd = xt + 19335 * _C / 21600, Vig = xt + 19725 * _C / 21600, s1 = xt + 20595 * _C / 21600, l1 = Mt + 5280 * _C / 21600, n1 = Mt + 5730 * _C / 21600, uM = Mt + 6630 * _C / 21600, a1 = Mt + 7492 * _C / 21600, o1 = Mt + 9067 * _C / 21600, c1 = Mt + 9555 * _C / 21600, d1 = Mt + 13342 * _C / 21600, r1 = Mt + 14580 * _C / 21600, h1 = Mt + 15592 * _C / 21600;
- i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(xt, ",").concat(l1, " L ").concat(xt, ",").concat(c1, " L ").concat(Gd, ",").concat(c1, " L ").concat(Co, ",").concat(o1, " L ").concat(to, ",").concat(o1, " L ").concat(to, ",").concat(h1, " L ").concat(js, ",").concat(h1, " L ").concat(js, ",").concat(d1, " L ").concat(wd, ",").concat(d1, " L ").concat(s1, ",").concat(r1, " L ").concat(S0, ",").concat(r1, " L ").concat(S0, ",").concat(uM, " L ").concat(s1, ",").concat(uM, " L ").concat(Vig, ",").concat(a1, " L ").concat(js, ",").concat(a1, " L ").concat(js, ",").concat(uM, " L ").concat(pG, ",").concat(n1, " L ").concat(Co, ",").concat(n1, " L ").concat(Gd, ",").concat(l1, " z");
- break;
- case "actionButtonReturn":
- var D0 = I / 2, b1 = g / 2, u1 = Math.min(I, g), BG = 3 * u1 / 8, WG = b1 - BG, m1 = b1 + BG, sn = D0 - BG, Mig = D0 + BG, pd = 3 * u1 / 4, Z1 = 3 * pd / 4, G1 = 5 * pd / 8, io = 3 * pd / 8, w1 = pd / 4, p1 = WG + Z1, yG = WG + G1, Bd = WG + w1, Rig = sn + 7 * pd / 8, fig = sn + Z1, mM = sn + G1, B1 = sn + io, Hig = sn + w1, Wd = pd / 8, Xig = mM - Wd, Sig = p1 - Wd, Dig = sn + io, Kig = m1 - io;
- i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Mig, ",").concat(Bd, " L ").concat(fig, ",").concat(WG, " L ").concat(D0, ",").concat(Bd, " L ").concat(mM, ",").concat(Bd, " L ").concat(mM, ",").concat(yG, " ").concat(Vg(Xig, yG, Wd, Wd, 0, 90, !1).replace("M", "L"), " L ").concat(B1, ",").concat(p1, " ").concat(Vg(B1, Sig, Wd, Wd, 90, 180, !1).replace("M", "L"), " L ").concat(Hig, ",").concat(Bd, " L ").concat(sn, ",").concat(Bd, " L ").concat(sn, ",").concat(yG, " ").concat(Vg(Dig, yG, io, io, 180, 90, !1).replace("M", "L"), " L ").concat(D0, ",").concat(m1, " ").concat(Vg(D0, Kig, io, io, 90, 0, !1).replace("M", "L"), " L ").concat(Rig, ",").concat(Bd, " z");
- break;
- case "actionButtonSound":
- var W1 = I / 2, YG = g / 2, y1 = Math.min(I, g), NG = 3 * y1 / 8, K0 = YG - NG, Fig = YG + NG, F0 = W1 - NG, ZM = W1 + NG, yd = 3 * y1 / 4, Y1 = 5 * yd / 16, kig = K0 + yd / 8, GM = K0 + Y1, wM = K0 + 11 * yd / 16, zig = K0 + 7 * yd / 8, N1 = F0 + Y1, V1 = F0 + 5 * yd / 8, pM = F0 + 3 * yd / 4;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(F0, ",").concat(GM, " L ").concat(N1, ",").concat(GM, " L ").concat(V1, ",").concat(K0, " L ").concat(V1, ",").concat(Fig, " L ").concat(N1, ",").concat(wM, " L ").concat(F0, ",").concat(wM, " z M ").concat(pM, ",").concat(GM, " L ").concat(ZM, ",").concat(kig, " M ").concat(pM, ",").concat(YG, " L ").concat(ZM, ",").concat(YG, " M ").concat(pM, ",").concat(wM, " L ").concat(ZM, ",").concat(zig);
- break;
- case "irregularSeal1":
- i = "M ".concat(10800 * I / 21600, ",").concat(5800 * g / 21600, " L ").concat(14522 * I / 21600, ",0 L ").concat(14155 * I / 21600, ",").concat(5325 * g / 21600, " L ").concat(18380 * I / 21600, ",").concat(4457 * g / 21600, " L ").concat(16702 * I / 21600, ",").concat(7315 * g / 21600, " L ").concat(21097 * I / 21600, ",").concat(8137 * g / 21600, " L ").concat(17607 * I / 21600, ",").concat(10475 * g / 21600, " L ").concat(I, ",").concat(13290 * g / 21600, " L ").concat(16837 * I / 21600, ",").concat(12942 * g / 21600, " L ").concat(18145 * I / 21600, ",").concat(18095 * g / 21600, " L ").concat(14020 * I / 21600, ",").concat(14457 * g / 21600, " L ").concat(13247 * I / 21600, ",").concat(19737 * g / 21600, " L ").concat(10532 * I / 21600, ",").concat(14935 * g / 21600, " L ").concat(8485 * I / 21600, ",").concat(g, " L ").concat(7715 * I / 21600, ",").concat(15627 * g / 21600, " L ").concat(4762 * I / 21600, ",").concat(17617 * g / 21600, " L ").concat(5667 * I / 21600, ",").concat(13937 * g / 21600, " L ").concat(135 * I / 21600, ",").concat(14587 * g / 21600, " L ").concat(3722 * I / 21600, ",").concat(11775 * g / 21600, " L 0,").concat(8615 * g / 21600, " L ").concat(4627 * I / 21600, ",").concat(7617 * g / 21600, " L ").concat(370 * I / 21600, ",").concat(2295 * g / 21600, " L ").concat(7312 * I / 21600, ",").concat(6320 * g / 21600, " L ").concat(8352 * I / 21600, ",").concat(2295 * g / 21600, " z");
- break;
- case "irregularSeal2":
- i = "M ".concat(11462 * I / 21600, ",").concat(4342 * g / 21600, " L ").concat(14790 * I / 21600, ",0 L ").concat(14525 * I / 21600, ",").concat(5777 * g / 21600, " L ").concat(18007 * I / 21600, ",").concat(3172 * g / 21600, " L ").concat(16380 * I / 21600, ",").concat(6532 * g / 21600, " L ").concat(I, ",").concat(6645 * g / 21600, " L ").concat(16985 * I / 21600, ",").concat(9402 * g / 21600, " L ").concat(18270 * I / 21600, ",").concat(11290 * g / 21600, " L ").concat(16380 * I / 21600, ",").concat(12310 * g / 21600, " L ").concat(18877 * I / 21600, ",").concat(15632 * g / 21600, " L ").concat(14640 * I / 21600, ",").concat(14350 * g / 21600, " L ").concat(14942 * I / 21600, ",").concat(17370 * g / 21600, " L ").concat(12180 * I / 21600, ",").concat(15935 * g / 21600, " L ").concat(11612 * I / 21600, ",").concat(18842 * g / 21600, " L ").concat(9872 * I / 21600, ",").concat(17370 * g / 21600, " L ").concat(8700 * I / 21600, ",").concat(19712 * g / 21600, " L ").concat(7527 * I / 21600, ",").concat(18125 * g / 21600, " L ").concat(4917 * I / 21600, ",").concat(g, " L ").concat(4805 * I / 21600, ",").concat(18240 * g / 21600, " L ").concat(1285 * I / 21600, ",").concat(17825 * g / 21600, " L ").concat(3330 * I / 21600, ",").concat(15370 * g / 21600, " L 0,").concat(12877 * g / 21600, " L ").concat(3935 * I / 21600, ",").concat(11592 * g / 21600, " L ").concat(1172 * I / 21600, ",").concat(8270 * g / 21600, " L ").concat(5372 * I / 21600, ",").concat(7817 * g / 21600, " L ").concat(4502 * I / 21600, ",").concat(3625 * g / 21600, " L ").concat(8550 * I / 21600, ",").concat(6382 * g / 21600, " L ").concat(9722 * I / 21600, ",").concat(1887 * g / 21600, " z");
- break;
- case "flowChartTerminator":
- var k0 = 3475 * I / 21600, M1 = 18125 * I / 21600, R1 = 10800 * g / 21600;
- i = "M ".concat(k0, ",0 L ").concat(M1, ",0 ").concat(Vg(M1, g / 2, k0, R1, 270, 450, !1).replace("M", "L"), " L ").concat(k0, ",").concat(g, " ").concat(Vg(k0, g / 2, k0, R1, 90, 270, !1).replace("M", "L"), " z");
- break;
- case "flowChartPunchedTape":
- var BM = 180, Yd = 5 * I / 20, eo = 2 * g / 20, WM = 18 * g / 20;
- i = "M 0,".concat(eo, " ").concat(Vg(Yd, eo, Yd, eo, BM, 0, !1).replace("M", "L"), " ").concat(Vg(I * (3 / 4), eo, Yd, eo, BM, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(WM, " ").concat(Vg(I * (3 / 4), WM, Yd, eo, 0, -180, !1).replace("M", "L"), " ").concat(Vg(Yd, WM, Yd, eo, 0, BM, !1).replace("M", "L"), " z");
- break;
- case "flowChartOnlineStorage":
- var z0 = 1 * I / 6, f1 = 3 * g / 6;
- i = "M ".concat(z0, ",0 L ").concat(I, ",0 ").concat(Vg(I, g / 2, z0, f1, 270, 90, !1).replace("M", "L"), " L ").concat(z0, ",").concat(g, " ").concat(Vg(z0, g / 2, z0, f1, 90, 270, !1).replace("M", "L"), " z");
- break;
- case "flowChartDisplay":
- var yM = 1 * I / 6, Jig = 5 * I / 6, H1 = 3 * g / 6;
- i = "M 0,".concat(H1, " L ").concat(yM, ",0 L ").concat(Jig, ",0 ").concat(Vg(I, g / 2, yM, H1, 270, 450, !1).replace("M", "L"), " L ").concat(yM, ",").concat(g, " z");
- break;
- case "flowChartDelay":
- var YM = I / 2, X1 = g / 2;
- i = "M 0,0 L ".concat(YM, ",0 ").concat(Vg(YM, X1, YM, X1, 270, 450, !1).replace("M", "L"), " L 0,").concat(g, " z");
- break;
- case "flowChartMagneticTape":
- var Qs = I / 2, TA = g / 2, Lig = TA + TA * Math.sin(Math.PI / 4), vig = 180 * Math.atan(g / I) / Math.PI;
- i = "M ".concat(Qs, ",").concat(g, " ").concat(Vg(Qs, TA, Qs, TA, 90, 180, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 180, 270, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 270, 360, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 0, vig, !1).replace("M", "L"), " L ").concat(I, ",").concat(Lig, " L ").concat(I, ",").concat(g, " z");
- break;
- case "ellipse":
- case "flowChartConnector":
- case "flowChartSummingJunction":
- case "flowChartOr":
- var J0 = I / 2, L0 = g / 2, v0 = I / 2, S1 = g / 2;
- if (i = "M ".concat(J0 - v0, ",").concat(L0, " A ").concat(v0, ",").concat(S1, " 0 1,0 ").concat(J0 + v0, ",").concat(L0, " A ").concat(v0, ",").concat(S1, " 0 1,0 ").concat(J0 - v0, ",").concat(L0, " Z"), t === "flowChartOr") i += " M ".concat(I / 2, " 0 L ").concat(I / 2, " ").concat(g, " M 0 ").concat(g / 2, " L ").concat(I, " ").concat(g / 2);
- else if (t === "flowChartSummingJunction") {
- var D1 = Math.PI / 4, K1 = I / 2 * Math.cos(D1), F1 = g / 2 * Math.sin(D1), k1 = J0 - K1, z1 = J0 + K1, J1 = L0 - F1, L1 = L0 + F1;
- i += " M ".concat(k1, " ").concat(J1, " L ").concat(z1, " ").concat(L1, " M ").concat(z1, " ").concat(J1, " L ").concat(k1, " ").concat(L1);
- }
- break;
- case "roundRect":
- case "round1Rect":
- case "round2DiagRect":
- case "round2SameRect":
- case "snip1Rect":
- case "snip2DiagRect":
- case "snip2SameRect":
- case "flowChartAlternateProcess":
- case "flowChartPunchedCard":
- var jt, Di, ln, nn, T0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- if (T0 && Array.isArray(T0)) {
- var v1, VG = HI(T0);
- try {
- for (VG.s(); !(v1 = VG.n()).done; ) {
- var NM = v1.value, T1 = U(NM, ["attrs", "name"]);
- if (T1 === "adj1") {
- var Tig = U(NM, ["attrs", "fmla"]);
- jt = parseInt(Tig.substring(4)) / 5e4;
- } else if (T1 === "adj2") {
- var xig = U(NM, ["attrs", "fmla"]);
- Di = parseInt(xig.substring(4)) / 5e4;
- }
- }
- } catch (Mg) {
- VG.e(Mg);
- } finally {
- VG.f();
- }
- } else if (T0) {
- var jig = U(T0, ["attrs", "fmla"]);
- jt = parseInt(jig.substring(4)) / 5e4, Di = 0;
- }
- var x1 = !1;
- switch (t) {
- case "roundRect":
- case "flowChartAlternateProcess":
- ln = "round", nn = "cornrAll", jt === void 0 && (jt = 0.33334), Di = 0;
- break;
- case "round1Rect":
- ln = "round", nn = "cornr1", jt === void 0 && (jt = 0.33334), Di = 0;
- break;
- case "round2DiagRect":
- ln = "round", nn = "diag", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
- break;
- case "round2SameRect":
- ln = "round", nn = "cornr2", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
- break;
- case "snip1Rect":
- case "flowChartPunchedCard":
- ln = "snip", nn = "cornr1", jt === void 0 && (jt = 0.33334), Di = 0, t === "flowChartPunchedCard" && (x1 = !0);
- break;
- case "snip2DiagRect":
- ln = "snip", nn = "diag", jt === void 0 && (jt = 0), Di === void 0 && (Di = 0.33334);
- break;
- case "snip2SameRect":
- ln = "snip", nn = "cornr2", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
- }
- i = function(Mg, RI, YC, QC, OC, zi) {
- var UC, Ct, Zt, Ht, ee;
- switch (zi) {
- case "cornr1":
- UC = 0, Ct = 0, Zt = 0, Ht = YC;
- break;
- case "cornr2":
- UC = YC, Ct = QC, Zt = QC, Ht = YC;
- break;
- case "cornrAll":
- UC = YC, Ct = YC, Zt = YC, Ht = YC;
- break;
- case "diag":
- UC = YC, Ct = QC, Zt = YC, Ht = QC;
- break;
- default:
- UC = Ct = Zt = Ht = 0;
- }
- if (OC === "round") {
- if (!Mg || !RI) return "";
- var Qt = function(Kr) {
- var Fr = Number(Kr);
- return Number.isFinite(Fr) ? Math.max(0, Math.min(1, Fr)) : 0;
- }, Gt = Math.min(Mg, RI), Ot = Qt(UC) * (Gt / 2), at = Qt(Ht) * (Gt / 2), Je = Qt(Zt) * (Gt / 2), Le = Qt(Ct) * (Gt / 2), RY = Ot + at > 0 ? Mg / (Ot + at) : 1, fY = Le + Je > 0 ? Mg / (Le + Je) : 1, HY = Ot + Le > 0 ? RI / (Ot + Le) : 1, Mu = at + Je > 0 ? RI / (at + Je) : 1, Jo = Math.min(1, RY, fY, HY, Mu);
- at *= Jo, Je *= Jo, Le *= Jo;
- var ve = function(Kr, Fr) {
- return "L".concat(Kr, ",").concat(Fr);
- }, XY = function(Kr, Fr, eag) {
- return "A".concat(Kr, ",").concat(Kr, " 0 0,1 ").concat(Fr, ",").concat(eag);
- }, nl = "";
- return nl += (ee = 0, "M".concat(Ot *= Jo, ",").concat(ee)), nl += ve(Mg - at, 0), nl += at > 0 ? XY(at, Mg, at) : ve(Mg, 0), nl += ve(Mg, RI - Je), nl += Je > 0 ? XY(Je, Mg - Je, RI) : ve(Mg, RI), nl += ve(Le, RI), nl += Le > 0 ? XY(Le, 0, RI - Le) : ve(0, RI), nl += ve(0, Ot), (nl += Ot > 0 ? XY(Ot, Ot, 0) : ve(0, 0)) + "Z";
- }
- return OC === "snip" ? "M0,".concat(UC * (RI / 2), " L0,").concat(RI / 2 + RI / 2 * (1 - Ct), " L").concat(Ct * (Mg / 2), ",").concat(RI, " L").concat(Mg / 2 + Mg / 2 * (1 - Zt), ",").concat(RI, " L").concat(Mg, ",").concat(RI / 2 + RI / 2 * (1 - Zt), " L").concat(Mg, ",").concat(Ht * (RI / 2), " L").concat(Mg / 2 + Mg / 2 * (1 - Ht), ",0 L").concat(Mg / 2 * UC, ",0 z") : "";
- }(I, g, jt, Di, ln, nn), x1 && (i = i.replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC) {
- var OC = I - parseFloat(YC);
- return "".concat(RI).concat(OC, " ").concat(QC);
- }).replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC, OC, zi) {
- var UC = I - parseFloat(YC), Ct = I - parseFloat(OC);
- return "".concat(RI).concat(UC, " ").concat(QC, " ").concat(Ct, " ").concat(zi);
- }));
- break;
- case "snipRoundRect":
- var j1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), VM = 0.33334, MM = 0.33334;
- if (j1) {
- var Q1, MG = HI(j1);
- try {
- for (MG.s(); !(Q1 = MG.n()).done; ) {
- var RM = Q1.value, O1 = U(RM, ["attrs", "name"]);
- if (O1 === "adj1") {
- var Qig = U(RM, ["attrs", "fmla"]);
- VM = parseInt(Qig.substring(4)) / 5e4;
- } else if (O1 === "adj2") {
- var Oig = U(RM, ["attrs", "fmla"]);
- MM = parseInt(Oig.substring(4)) / 5e4;
- }
- }
- } catch (Mg) {
- MG.e(Mg);
- } finally {
- MG.f();
- }
- }
- i = "M0,".concat(g, " L").concat(I, ",").concat(g, " L").concat(I, ",").concat(g / 2 * MM, " L").concat(I / 2 + I / 2 * (1 - MM), ",0 L").concat(I / 2 * VM, ",0 Q0,0 0,").concat(g / 2 * VM, " z");
- break;
- case "bentConnector2":
- i = "M ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g);
- break;
- case "rtTriangle":
- i = "M 0 0 L 0 ".concat(g, " L ").concat(I, " ").concat(g, " Z");
- break;
- case "triangle":
- case "flowChartExtract":
- case "flowChartMerge":
- var U1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), E1 = 0.5;
- U1 && (E1 = parseInt(U1.substring(4)) * Gg);
- var fM = I * E1, HM = 0, XM = 0, SM = g, DM = I, KM = g;
- if (t === "flowChartMerge") {
- var P1 = [I - fM, g - HM];
- fM = P1[0], HM = P1[1];
- var _1 = [I - XM, g - SM];
- XM = _1[0], SM = _1[1];
- var q1 = [I - DM, g - KM];
- DM = q1[0], KM = q1[1];
- }
- i = "M ".concat(fM, " ").concat(HM, " L ").concat(XM, " ").concat(SM, " L ").concat(DM, " ").concat(KM, " Z");
- break;
- case "diamond":
- case "flowChartDecision":
- case "flowChartSort":
- var $1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), gK = 5e4;
- if ($1) {
- var FM = U($1, ["attrs", "fmla"]);
- FM && FM.startsWith("val ") && (gK = parseInt(FM.substring(4)));
- }
- var Nd = gK / 1e5;
- i = "M ".concat(I * Nd, " 0 L 0 ").concat(g * Nd, " L ").concat(I * Nd, " ").concat(g, " L ").concat(I, " ").concat(g * Nd, " Z"), t === "flowChartSort" && (i += " M 0 ".concat(g * Nd, " L ").concat(I, " ").concat(g * Nd));
- break;
- case "trapezoid":
- case "flowChartManualOperation":
- case "flowChartManualInput":
- var IK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), x0 = 0.2;
- IK && (x0 = 0.5 * (parseInt(IK.substring(4)) * Gg) / 0.7407);
- var RG = I * x0, fG = 0, kM = 0, zM = g, JM = I, LM = g, HG = (1 - x0) * I, vM = 0;
- if (t === "flowChartManualInput" && (fG = g / 5, RG = I * (x0 = 0), HG = (1 - x0) * I), t === "flowChartManualOperation") {
- var CK = [I - RG, g - fG];
- RG = CK[0], fG = CK[1];
- var tK = [I - kM, g - zM];
- kM = tK[0], zM = tK[1];
- var iK = [I - JM, g - LM];
- JM = iK[0], LM = iK[1];
- var eK = [I - HG, g - vM];
- HG = eK[0], vM = eK[1];
- }
- i = "M ".concat(RG, " ").concat(fG, " L ").concat(kM, " ").concat(zM, " L ").concat(JM, " ").concat(LM, " L ").concat(HG, " ").concat(vM, " Z");
- break;
- case "parallelogram":
- case "flowChartInputOutput":
- var AK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), TM = 0.25;
- if (AK) {
- var Uig = I > g ? I / g : g / I;
- TM = parseInt(AK.substring(4)) / 1e5 / Uig;
- }
- i = "M ".concat(TM * I, " 0 L 0 ").concat(g, " L ").concat((1 - TM) * I, " ").concat(g, " L ").concat(I, " 0 Z");
- break;
- case "pentagon":
- i = "M ".concat(0.5 * I, " 0 L 0 ").concat(0.375 * g, " L ").concat(0.15 * I, " ").concat(g, " L ").concat(0.85 * I, " ").concat(g, " L ").concat(I, " ").concat(0.375 * g, " Z");
- break;
- case "hexagon":
- case "flowChartPreparation":
- var sK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), XG = 1.9685039370078738;
- sK && (XG = parseInt(sK.substring(4)) * Gg);
- var lK = 7.874015748031495, Eig = 60 * Math.PI / 180, nK = Math.min(I, g), aK = 3.9370078740157477 * I / nK, xM = nK * (XG < 0 ? 0 : XG > aK ? aK : XG) / lK, oK = I - xM, cK = 9.092125984251968 * (g / 2) / lK * Math.sin(Eig), SG = g / 2, dK = SG - cK, rK = SG + cK;
- i = "M 0,".concat(SG, " L ").concat(xM, ",").concat(dK, " L ").concat(oK, ",").concat(dK, " L ").concat(I, ",").concat(SG, " L ").concat(oK, ",").concat(rK, " L ").concat(xM, ",").concat(rK, " z");
- break;
- case "heptagon":
- i = "M ".concat(0.5 * I, " 0 L ").concat(I / 8, " ").concat(g / 4, " L 0 ").concat(5 / 8 * g, " L ").concat(I / 4, " ").concat(g, " L ").concat(3 / 4 * I, " ").concat(g, " L ").concat(I, " ").concat(5 / 8 * g, " L ").concat(7 / 8 * I, " ").concat(g / 4, " Z");
- break;
- case "octagon":
- var hK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Vd = 0.25;
- hK && (Vd = parseInt(hK.substring(4)) / 1e5);
- var DG = 1 - Vd;
- i = "M ".concat(Vd * I, " 0 L 0 ").concat(Vd * g, " L 0 ").concat(DG * g, " L ").concat(Vd * I, " ").concat(g, " L ").concat(DG * I, " ").concat(g, " L ").concat(I, " ").concat(DG * g, " L ").concat(I, " ").concat(Vd * g, " L ").concat(DG * I, " 0 Z");
- break;
- case "decagon":
- i = "M ".concat(3 / 8 * I, " 0 L ").concat(I / 8, " ").concat(g / 8, " L 0 ").concat(g / 2, " L ").concat(I / 8, " ").concat(7 / 8 * g, " L ").concat(3 / 8 * I, " ").concat(g, " L ").concat(5 / 8 * I, " ").concat(g, " L ").concat(7 / 8 * I, " ").concat(7 / 8 * g, " L ").concat(I, " ").concat(g / 2, " L ").concat(7 / 8 * I, " ").concat(g / 8, " L ").concat(5 / 8 * I, " 0 Z");
- break;
- case "dodecagon":
- i = "M ".concat(3 / 8 * I, " 0 L ").concat(I / 8, " ").concat(g / 8, " L 0 ").concat(3 / 8 * g, " L 0 ").concat(5 / 8 * g, " L ").concat(I / 8, " ").concat(7 / 8 * g, " L ").concat(3 / 8 * I, " ").concat(g, " L ").concat(5 / 8 * I, " ").concat(g, " L ").concat(7 / 8 * I, " ").concat(7 / 8 * g, " L ").concat(I, " ").concat(5 / 8 * g, " L ").concat(I, " ").concat(3 / 8 * g, " L ").concat(7 / 8 * I, " ").concat(g / 8, " L ").concat(5 / 8 * I, " 0 Z");
- break;
- case "star4":
- var KG = I / 2, FG = g / 2, Pig = I / 2, _ig = g / 2, kG = 1.503779527559055, zG = 3.9370078740157477, jM = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- jM && jM.attrs.name === "adj" && (kG = parseInt(jM.attrs.fmla.substring(4)) * Gg);
- var bK = kG < 0 ? 0 : kG > zG ? zG : kG, qig = _ig * bK / zG, uK = Pig * bK / zG * Math.cos(0.7853981634), mK = qig * Math.sin(0.7853981634), ZK = KG - uK, GK = KG + uK, wK = FG - mK, pK = FG + mK;
- i = "M 0,".concat(FG, " L ").concat(ZK, ",").concat(wK, " L ").concat(KG, ",0 L ").concat(GK, ",").concat(wK, " L ").concat(I, ",").concat(FG, " L ").concat(GK, ",").concat(pK, " L ").concat(KG, ",").concat(g, " L ").concat(ZK, ",").concat(pK, " z");
- break;
- case "star5":
- var xA = I / 2, $ig = g / 2, geg = I / 2, Ieg = g / 2, JG = 1.503779527559055, BK = 8.279212598425197, QM = 8.70527559055118, LG = 3.9370078740157477, OM = 7.874015748031495, Md = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- Md && Object.keys(Md).forEach(function(Mg) {
- var RI = Md[Mg].attrs.name;
- RI === "adj" ? JG = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" ? BK = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg : RI === "vf" && (QM = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg);
- });
- var WK = JG < 0 ? 0 : JG > LG ? LG : JG, UM = geg * BK / OM, EM = Ieg * QM / OM, j0 = $ig * QM / OM, yK = UM * Math.cos(0.31415926536), YK = UM * Math.cos(5.3407075111), Ceg = xA - yK, teg = xA - YK, ieg = xA + YK, eeg = xA + yK, NK = j0 - EM * Math.sin(0.31415926536), VK = j0 - EM * Math.sin(5.3407075111), MK = UM * WK / LG, PM = EM * WK / LG, RK = MK * Math.cos(5.9690260418), fK = MK * Math.cos(0.94247779608), Aeg = xA - RK, seg = xA - fK, leg = xA + fK, neg = xA + RK, HK = j0 - PM * Math.sin(0.94247779608), XK = j0 - PM * Math.sin(5.9690260418), aeg = j0 + PM;
- i = "M ".concat(Ceg, ",").concat(NK, " L ").concat(seg, ",").concat(HK, " L ").concat(xA, ",0 L ").concat(leg, ",").concat(HK, " L ").concat(eeg, ",").concat(NK, " L ").concat(neg, ",").concat(XK, " L ").concat(ieg, ",").concat(VK, " L ").concat(xA, ",").concat(aeg, " L ").concat(teg, ",").concat(VK, " L ").concat(Aeg, ",").concat(XK, " z");
- break;
- case "star6":
- var an = I / 2, Q0 = g / 2, oeg = I / 2, ceg = g / 2, _M = g / 4, vG = 2.2730708661417323, SK = 9.092125984251968, TG = 3.9370078740157477, O0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- O0 && Object.keys(O0).forEach(function(Mg) {
- var RI = O0[Mg].attrs.name;
- RI === "adj" ? vG = parseInt(O0[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" && (SK = parseInt(O0[Mg].attrs.fmla.substring(4)) * Gg);
- });
- var DK = vG < 0 ? 0 : vG > TG ? TG : vG, KK = oeg * SK / 7.874015748031495, FK = KK * Math.cos(0.5235987756), kK = an - FK, zK = an + FK, JK = Q0 + _M, qM = KK * DK / TG, LK = qM / 2, deg = an - qM, vK = an - LK, TK = an + LK, reg = an + qM, xK = ceg * DK / TG * Math.sin(1.0471975512), jK = Q0 - xK, QK = Q0 + xK;
- i = "M ".concat(kK, ",").concat(_M, " L ").concat(vK, ",").concat(jK, " L ").concat(an, ",0 L ").concat(TK, ",").concat(jK, " L ").concat(zK, ",").concat(_M, " L ").concat(reg, ",").concat(Q0, " L ").concat(zK, ",").concat(JK, " L ").concat(TK, ",").concat(QK, " L ").concat(an, ",").concat(g, " L ").concat(vK, ",").concat(QK, " L ").concat(kK, ",").concat(JK, " L ").concat(deg, ",").concat(Q0, " z");
- break;
- case "star7":
- var Ki = I / 2, heg = g / 2, beg = I / 2, ueg = g / 2, xG = 2.7244881889763777, OK = 8.076535433070866, $M = 8.284251968503936, jG = 3.9370078740157477, gR = 7.874015748031495, Rd = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- Rd && Object.keys(Rd).forEach(function(Mg) {
- var RI = Rd[Mg].attrs.name;
- RI === "adj" ? xG = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" ? OK = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg : RI === "vf" && ($M = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg);
- });
- var UK = xG < 0 ? 0 : xG > jG ? jG : xG, QG = beg * OK / gR, OG = ueg * $M / gR, Ao = heg * $M / gR, EK = 97493 * QG / 1e5, PK = 78183 * QG / 1e5, _K = 43388 * QG / 1e5, meg = Ki - PK, Zeg = Ki - _K, Geg = Ki + _K, weg = Ki + PK, peg = Ki + EK, qK = Ao - 62349 * OG / 1e5, $K = Ao + 22252 * OG / 1e5, gF = Ao + 90097 * OG / 1e5, IR = QG * UK / jG, UG = OG * UK / jG, IF = 97493 * IR / 1e5, CF = 78183 * IR / 1e5, tF = 43388 * IR / 1e5, Beg = Ki - IF, Weg = Ki - CF, yeg = Ki - tF, Yeg = Ki + tF, Neg = Ki + CF, Veg = Ki + IF, iF = Ao - 90097 * UG / 1e5, eF = Ao - 22252 * UG / 1e5, AF = Ao + 62349 * UG / 1e5, Meg = Ao + UG;
- i = "M ".concat(Ki - EK, ",").concat($K, " L ").concat(Beg, ",").concat(eF, " L ").concat(meg, ",").concat(qK, " L ").concat(yeg, ",").concat(iF, " L ").concat(Ki, ",0 L ").concat(Yeg, ",").concat(iF, " L ").concat(weg, ",").concat(qK, " L ").concat(Veg, ",").concat(eF, " L ").concat(peg, ",").concat($K, " L ").concat(Neg, ",").concat(AF, " L ").concat(Geg, ",").concat(gF, " L ").concat(Ki, ",").concat(Meg, " L ").concat(Zeg, ",").concat(gF, " L ").concat(Weg, ",").concat(AF, " z");
- break;
- case "star8":
- var on = I / 2, cn = g / 2, sF = I / 2, lF = g / 2, EG = 2.9527559055118107, PG = 3.9370078740157477, CR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- CR && CR.attrs.name === "adj" && (EG = parseInt(CR.attrs.fmla.substring(4)) * Gg);
- var nF = EG < 0 ? 0 : EG > PG ? PG : EG, aF = sF * Math.cos(0.7853981634), oF = on - aF, cF = on + aF, dF = lF * Math.sin(0.7853981634), rF = cn - dF, hF = cn + dF, bF = sF * nF / PG, uF = lF * nF / PG, mF = 92388 * bF / 1e5, ZF = 38268 * bF / 1e5, GF = 92388 * uF / 1e5, wF = 38268 * uF / 1e5, pF = on - mF, BF = on - ZF, WF = on + ZF, yF = on + mF, YF = cn - GF, NF = cn - wF, VF = cn + wF, MF = cn + GF;
- i = "M 0,".concat(cn, " L ").concat(pF, ",").concat(NF, " L ").concat(oF, ",").concat(rF, " L ").concat(BF, ",").concat(YF, " L ").concat(on, ",0 L ").concat(WF, ",").concat(YF, " L ").concat(cF, ",").concat(rF, " L ").concat(yF, ",").concat(NF, " L ").concat(I, ",").concat(cn, " L ").concat(yF, ",").concat(VF, " L ").concat(cF, ",").concat(hF, " L ").concat(WF, ",").concat(MF, " L ").concat(on, ",").concat(g, " L ").concat(BF, ",").concat(MF, " L ").concat(oF, ",").concat(hF, " L ").concat(pF, ",").concat(VF, " z");
- break;
- case "star10":
- var fe = I / 2, jA = g / 2, Reg = I / 2, tR = g / 2, _G = 3.349055118110236, RF = 8.279212598425197, qG = 3.9370078740157477, U0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- U0 && Object.keys(U0).forEach(function(Mg) {
- var RI = U0[Mg].attrs.name;
- RI === "adj" ? _G = parseInt(U0[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" && (RF = parseInt(U0[Mg].attrs.fmla.substring(4)) * Gg);
- });
- var fF = _G < 0 ? 0 : _G > qG ? qG : _G, iR = Reg * RF / 7.874015748031495, HF = 95106 * iR / 1e5, XF = 58779 * iR / 1e5, SF = fe - HF, DF = fe - XF, KF = fe + XF, FF = fe + HF, kF = 80902 * tR / 1e5, zF = 30902 * tR / 1e5, JF = jA - kF, LF = jA - zF, vF = jA + zF, TF = jA + kF, $G = iR * fF / qG, xF = tR * fF / qG, jF = 80902 * $G / 1e5, QF = 30902 * $G / 1e5, OF = 95106 * xF / 1e5, UF = 58779 * xF / 1e5, feg = fe - $G, EF = fe - jF, PF = fe - QF, _F = fe + QF, qF = fe + jF, Heg = fe + $G, $F = jA - OF, gk = jA - UF, Ik = jA + UF, Ck = jA + OF;
- i = "M ".concat(SF, ",").concat(LF, " L ").concat(EF, ",").concat(gk, " L ").concat(DF, ",").concat(JF, " L ").concat(PF, ",").concat($F, " L ").concat(fe, ",0 L ").concat(_F, ",").concat($F, " L ").concat(KF, ",").concat(JF, " L ").concat(qF, ",").concat(gk, " L ").concat(FF, ",").concat(LF, " L ").concat(Heg, ",").concat(jA, " L ").concat(FF, ",").concat(vF, " L ").concat(qF, ",").concat(Ik, " L ").concat(KF, ",").concat(TF, " L ").concat(_F, ",").concat(Ck, " L ").concat(fe, ",").concat(g, " L ").concat(PF, ",").concat(Ck, " L ").concat(DF, ",").concat(TF, " L ").concat(EF, ",").concat(Ik, " L ").concat(SF, ",").concat(vF, " L ").concat(feg, ",").concat(jA, " z");
- break;
- case "star12":
- var QA = I / 2, OA = g / 2, tk = I / 2, ik = g / 2, ek = g / 4, Ak = I / 4, gw = 2.9527559055118107, Iw = 3.9370078740157477, eR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- eR && eR.attrs.name === "adj" && (gw = parseInt(eR.attrs.fmla.substring(4)) * Gg);
- var sk = gw < 0 ? 0 : gw > Iw ? Iw : gw, lk = tk * Math.cos(0.5235987756), nk = ik * Math.sin(1.0471975512), ak = QA - lk, ok = 3 * I / 4, ck = QA + lk, dk = OA - nk, rk = 3 * g / 4, hk = OA + nk, AR = tk * sk / Iw, sR = ik * sk / Iw, bk = AR * Math.cos(0.2617993878), uk = AR * Math.cos(0.7853981634), mk = AR * Math.cos(1.308996939), Zk = sR * Math.sin(1.308996939), Gk = sR * Math.sin(0.7853981634), wk = sR * Math.sin(0.2617993878), pk = QA - bk, Bk = QA - uk, Wk = QA - mk, yk = QA + mk, Yk = QA + uk, Nk = QA + bk, Vk = OA - Zk, Mk = OA - Gk, Rk = OA - wk, fk = OA + wk, Hk = OA + Gk, Xk = OA + Zk;
- i = "M 0,".concat(OA, " L ").concat(pk, ",").concat(Rk, " L ").concat(ak, ",").concat(ek, " L ").concat(Bk, ",").concat(Mk, " L ").concat(Ak, ",").concat(dk, " L ").concat(Wk, ",").concat(Vk, " L ").concat(QA, ",0 L ").concat(yk, ",").concat(Vk, " L ").concat(ok, ",").concat(dk, " L ").concat(Yk, ",").concat(Mk, " L ").concat(ck, ",").concat(ek, " L ").concat(Nk, ",").concat(Rk, " L ").concat(I, ",").concat(OA, " L ").concat(Nk, ",").concat(fk, " L ").concat(ck, ",").concat(rk, " L ").concat(Yk, ",").concat(Hk, " L ").concat(ok, ",").concat(hk, " L ").concat(yk, ",").concat(Xk, " L ").concat(QA, ",").concat(g, " L ").concat(Wk, ",").concat(Xk, " L ").concat(Ak, ",").concat(hk, " L ").concat(Bk, ",").concat(Hk, " L ").concat(ak, ",").concat(rk, " L ").concat(pk, ",").concat(fk, " z");
- break;
- case "star16":
- var si = I / 2, li = g / 2, Cw = I / 2, tw = g / 2, iw = 2.9527559055118107, ew = 3.9370078740157477, lR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- lR && lR.attrs.name === "adj" && (iw = parseInt(lR.attrs.fmla.substring(4)) * Gg);
- var Sk = iw < 0 ? 0 : iw > ew ? ew : iw, Dk = 92388 * Cw / 1e5, Kk = 70711 * Cw / 1e5, Fk = 38268 * Cw / 1e5, kk = 92388 * tw / 1e5, zk = 70711 * tw / 1e5, Jk = 38268 * tw / 1e5, Lk = si - Dk, vk = si - Kk, Tk = si - Fk, xk = si + Fk, jk = si + Kk, Qk = si + Dk, Ok = li - kk, Uk = li - zk, Ek = li - Jk, Pk = li + Jk, _k = li + zk, qk = li + kk, Aw = Cw * Sk / ew, sw = tw * Sk / ew, $k = 98079 * Aw / 1e5, g3 = 83147 * Aw / 1e5, I3 = 55557 * Aw / 1e5, C3 = 19509 * Aw / 1e5, t3 = 98079 * sw / 1e5, i3 = 83147 * sw / 1e5, e3 = 55557 * sw / 1e5, A3 = 19509 * sw / 1e5, s3 = si - $k, l3 = si - g3, n3 = si - I3, a3 = si - C3, o3 = si + C3, c3 = si + I3, d3 = si + g3, r3 = si + $k, h3 = li - t3, b3 = li - i3, u3 = li - e3, m3 = li - A3, Z3 = li + A3, G3 = li + e3, w3 = li + i3, p3 = li + t3;
- i = "M 0,".concat(li, " L ").concat(s3, ",").concat(m3, " L ").concat(Lk, ",").concat(Ek, " L ").concat(l3, ",").concat(u3, " L ").concat(vk, ",").concat(Uk, " L ").concat(n3, ",").concat(b3, " L ").concat(Tk, ",").concat(Ok, " L ").concat(a3, ",").concat(h3, " L ").concat(si, ",0 L ").concat(o3, ",").concat(h3, " L ").concat(xk, ",").concat(Ok, " L ").concat(c3, ",").concat(b3, " L ").concat(jk, ",").concat(Uk, " L ").concat(d3, ",").concat(u3, " L ").concat(Qk, ",").concat(Ek, " L ").concat(r3, ",").concat(m3, " L ").concat(I, ",").concat(li, " L ").concat(r3, ",").concat(Z3, " L ").concat(Qk, ",").concat(Pk, " L ").concat(d3, ",").concat(G3, " L ").concat(jk, ",").concat(_k, " L ").concat(c3, ",").concat(w3, " L ").concat(xk, ",").concat(qk, " L ").concat(o3, ",").concat(p3, " L ").concat(si, ",").concat(g, " L ").concat(a3, ",").concat(p3, " L ").concat(Tk, ",").concat(qk, " L ").concat(n3, ",").concat(w3, " L ").concat(vk, ",").concat(_k, " L ").concat(l3, ",").concat(G3, " L ").concat(Lk, ",").concat(Pk, " L ").concat(s3, ",").concat(Z3, " z");
- break;
- case "star24":
- var DC = I / 2, KC = g / 2, E0 = I / 2, P0 = g / 2, Xeg = g / 4, Seg = I / 4, lw = 2.9527559055118107, nw = 3.9370078740157477, nR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- nR && nR.attrs.name === "adj" && (lw = parseInt(nR.attrs.fmla.substring(4)) * Gg);
- var B3 = lw < 0 ? 0 : lw > nw ? nw : lw, W3 = E0 * Math.cos(0.2617993878), y3 = E0 * Math.cos(0.5235987756), Y3 = E0 * Math.cos(0.7853981634), N3 = Seg, V3 = E0 * Math.cos(1.308996939), M3 = P0 * Math.sin(1.308996939), R3 = P0 * Math.sin(1.0471975512), f3 = P0 * Math.sin(0.7853981634), H3 = Xeg, X3 = P0 * Math.sin(0.2617993878), S3 = DC - W3, D3 = DC - y3, K3 = DC - Y3, F3 = DC - N3, k3 = DC - V3, z3 = DC + V3, J3 = DC + N3, L3 = DC + Y3, v3 = DC + y3, T3 = DC + W3, x3 = KC - M3, j3 = KC - R3, Q3 = KC - f3, O3 = KC - H3, U3 = KC - X3, E3 = KC + X3, P3 = KC + H3, _3 = KC + f3, q3 = KC + R3, $3 = KC + M3, fd = E0 * B3 / nw, Hd = P0 * B3 / nw, gz = 99144 * fd / 1e5, Iz = 92388 * fd / 1e5, Cz = 79335 * fd / 1e5, tz = 60876 * fd / 1e5, iz = 38268 * fd / 1e5, ez = 13053 * fd / 1e5, Az = 99144 * Hd / 1e5, sz = 92388 * Hd / 1e5, lz = 79335 * Hd / 1e5, nz = 60876 * Hd / 1e5, az = 38268 * Hd / 1e5, oz = 13053 * Hd / 1e5, cz = DC - gz, dz = DC - Iz, rz = DC - Cz, hz = DC - tz, bz = DC - iz, uz = DC - ez, mz = DC + ez, Zz = DC + iz, Gz = DC + tz, wz = DC + Cz, pz = DC + Iz, Bz = DC + gz, Wz = KC - Az, yz = KC - sz, Yz = KC - lz, Nz = KC - nz, Vz = KC - az, Mz = KC - oz, Rz = KC + oz, fz = KC + az, Hz = KC + nz, Xz = KC + lz, Sz = KC + sz, Dz = KC + Az;
- i = "M 0,".concat(KC, " L ").concat(cz, ",").concat(Mz, " L ").concat(S3, ",").concat(U3, " L ").concat(dz, ",").concat(Vz, " L ").concat(D3, ",").concat(O3, " L ").concat(rz, ",").concat(Nz, " L ").concat(K3, ",").concat(Q3, " L ").concat(hz, ",").concat(Yz, " L ").concat(F3, ",").concat(j3, " L ").concat(bz, ",").concat(yz, " L ").concat(k3, ",").concat(x3, " L ").concat(uz, ",").concat(Wz, " L ").concat(DC, ",0 L ").concat(mz, ",").concat(Wz, " L ").concat(z3, ",").concat(x3, " L ").concat(Zz, ",").concat(yz, " L ").concat(J3, ",").concat(j3, " L ").concat(Gz, ",").concat(Yz, " L ").concat(L3, ",").concat(Q3, " L ").concat(wz, ",").concat(Nz, " L ").concat(v3, ",").concat(O3, " L ").concat(pz, ",").concat(Vz, " L ").concat(T3, ",").concat(U3, " L ").concat(Bz, ",").concat(Mz, " L ").concat(I, ",").concat(KC, " L ").concat(Bz, ",").concat(Rz, " L ").concat(T3, ",").concat(E3, " L ").concat(pz, ",").concat(fz, " L ").concat(v3, ",").concat(P3, " L ").concat(wz, ",").concat(Hz, " L ").concat(L3, ",").concat(_3, " L ").concat(Gz, ",").concat(Xz, " L ").concat(J3, ",").concat(q3, " L ").concat(Zz, ",").concat(Sz, " L ").concat(z3, ",").concat($3, " L ").concat(mz, ",").concat(Dz, " L ").concat(DC, ",").concat(g, " L ").concat(uz, ",").concat(Dz, " L ").concat(k3, ",").concat($3, " L ").concat(bz, ",").concat(Sz, " L ").concat(F3, ",").concat(q3, " L ").concat(hz, ",").concat(Xz, " L ").concat(K3, ",").concat(_3, " L ").concat(rz, ",").concat(Hz, " L ").concat(D3, ",").concat(P3, " L ").concat(dz, ",").concat(fz, " L ").concat(S3, ",").concat(E3, " L ").concat(cz, ",").concat(Rz, " z");
- break;
- case "star32":
- var nC = I / 2, aC = g / 2, dn = I / 2, rn = g / 2, aw = 2.9527559055118107, ow = 3.9370078740157477, aR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- aR && aR.attrs.name === "adj" && (aw = parseInt(aR.attrs.fmla.substring(4)) * Gg);
- var Kz = aw < 0 ? 0 : aw > ow ? ow : aw, Fz = 98079 * dn / 1e5, kz = 92388 * dn / 1e5, zz = 83147 * dn / 1e5, Jz = dn * Math.cos(0.7853981634), Lz = 55557 * dn / 1e5, vz = 38268 * dn / 1e5, Tz = 19509 * dn / 1e5, xz = 98079 * rn / 1e5, jz = 92388 * rn / 1e5, Qz = 83147 * rn / 1e5, Oz = rn * Math.sin(0.7853981634), Uz = 55557 * rn / 1e5, Ez = 38268 * rn / 1e5, Pz = 19509 * rn / 1e5, _z = nC - Fz, qz = nC - kz, $z = nC - zz, gJ = nC - Jz, IJ = nC - Lz, CJ = nC - vz, tJ = nC - Tz, iJ = nC + Tz, eJ = nC + vz, AJ = nC + Lz, sJ = nC + Jz, lJ = nC + zz, nJ = nC + kz, aJ = nC + Fz, oJ = aC - xz, cJ = aC - jz, dJ = aC - Qz, rJ = aC - Oz, hJ = aC - Uz, bJ = aC - Ez, uJ = aC - Pz, mJ = aC + Pz, ZJ = aC + Ez, GJ = aC + Uz, wJ = aC + Oz, pJ = aC + Qz, BJ = aC + jz, WJ = aC + xz, hn = dn * Kz / ow, bn = rn * Kz / ow, yJ = 99518 * hn / 1e5, YJ = 95694 * hn / 1e5, NJ = 88192 * hn / 1e5, VJ = 77301 * hn / 1e5, MJ = 63439 * hn / 1e5, RJ = 47140 * hn / 1e5, fJ = 29028 * hn / 1e5, HJ = 9802 * hn / 1e5, XJ = 99518 * bn / 1e5, SJ = 95694 * bn / 1e5, DJ = 88192 * bn / 1e5, KJ = 77301 * bn / 1e5, FJ = 63439 * bn / 1e5, kJ = 47140 * bn / 1e5, zJ = 29028 * bn / 1e5, JJ = 9802 * bn / 1e5, LJ = nC - yJ, vJ = nC - YJ, TJ = nC - NJ, xJ = nC - VJ, jJ = nC - MJ, QJ = nC - RJ, OJ = nC - fJ, UJ = nC - HJ, EJ = nC + HJ, PJ = nC + fJ, _J = nC + RJ, qJ = nC + MJ, $J = nC + VJ, gL = nC + NJ, IL = nC + YJ, CL = nC + yJ, tL = aC - XJ, iL = aC - SJ, eL = aC - DJ, AL = aC - KJ, sL = aC - FJ, lL = aC - kJ, nL = aC - zJ, aL = aC - JJ, oL = aC + JJ, cL = aC + zJ, dL = aC + kJ, rL = aC + FJ, hL = aC + KJ, bL = aC + DJ, uL = aC + SJ, mL = aC + XJ;
- i = "M 0,".concat(aC, " L ").concat(LJ, ",").concat(aL, " L ").concat(_z, ",").concat(uJ, " L ").concat(vJ, ",").concat(nL, " L ").concat(qz, ",").concat(bJ, " L ").concat(TJ, ",").concat(lL, " L ").concat($z, ",").concat(hJ, " L ").concat(xJ, ",").concat(sL, " L ").concat(gJ, ",").concat(rJ, " L ").concat(jJ, ",").concat(AL, " L ").concat(IJ, ",").concat(dJ, " L ").concat(QJ, ",").concat(eL, " L ").concat(CJ, ",").concat(cJ, " L ").concat(OJ, ",").concat(iL, " L ").concat(tJ, ",").concat(oJ, " L ").concat(UJ, ",").concat(tL, " L ").concat(nC, ",0 L ").concat(EJ, ",").concat(tL, " L ").concat(iJ, ",").concat(oJ, " L ").concat(PJ, ",").concat(iL, " L ").concat(eJ, ",").concat(cJ, " L ").concat(_J, ",").concat(eL, " L ").concat(AJ, ",").concat(dJ, " L ").concat(qJ, ",").concat(AL, " L ").concat(sJ, ",").concat(rJ, " L ").concat($J, ",").concat(sL, " L ").concat(lJ, ",").concat(hJ, " L ").concat(gL, ",").concat(lL, " L ").concat(nJ, ",").concat(bJ, " L ").concat(IL, ",").concat(nL, " L ").concat(aJ, ",").concat(uJ, " L ").concat(CL, ",").concat(aL, " L ").concat(I, ",").concat(aC, " L ").concat(CL, ",").concat(oL, " L ").concat(aJ, ",").concat(mJ, " L ").concat(IL, ",").concat(cL, " L ").concat(nJ, ",").concat(ZJ, " L ").concat(gL, ",").concat(dL, " L ").concat(lJ, ",").concat(GJ, " L ").concat($J, ",").concat(rL, " L ").concat(sJ, ",").concat(wJ, " L ").concat(qJ, ",").concat(hL, " L ").concat(AJ, ",").concat(pJ, " L ").concat(_J, ",").concat(bL, " L ").concat(eJ, ",").concat(BJ, " L ").concat(PJ, ",").concat(uL, " L ").concat(iJ, ",").concat(WJ, " L ").concat(EJ, ",").concat(mL, " L ").concat(nC, ",").concat(g, " L ").concat(UJ, ",").concat(mL, " L ").concat(tJ, ",").concat(WJ, " L ").concat(OJ, ",").concat(uL, " L ").concat(CJ, ",").concat(BJ, " L ").concat(QJ, ",").concat(bL, " L ").concat(IJ, ",").concat(pJ, " L ").concat(jJ, ",").concat(hL, " L ").concat(gJ, ",").concat(wJ, " L ").concat(xJ, ",").concat(rL, " L ").concat($z, ",").concat(GJ, " L ").concat(TJ, ",").concat(dL, " L ").concat(qz, ",").concat(ZJ, " L ").concat(vJ, ",").concat(cL, " L ").concat(_z, ",").concat(mJ, " L ").concat(LJ, ",").concat(oL, " z");
- break;
- case "pie":
- case "pieWedge":
- case "arc":
- var _0, q0, cw, dw, rw = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- if (t === "pie" ? (_0 = 0, q0 = 270, cw = g, dw = !0) : t === "pieWedge" ? (_0 = 180, q0 = 270, cw = 2 * g, dw = !0) : t === "arc" && (_0 = 270, q0 = 0, cw = g, dw = !1), rw) {
- var $0 = U(rw, ["attrs", "fmla"]), oR = $0;
- $0 === void 0 && ($0 = rw[0].attrs.fmla, oR = rw[1].attrs.fmla), $0 && (_0 = parseInt($0.substring(4)) / 6e4), oR && (q0 = parseInt(oR.substring(4)) / 6e4);
- }
- i = function(Mg, RI, YC, QC, OC) {
- var zi = function(Mu) {
- var Jo = Number(Mu);
- if (!Number.isFinite(Jo)) return 0;
- var ve = Jo % 360;
- return ve < 0 && (ve += 360), ve;
- }, UC = zi(YC), Ct = zi(QC), Zt = Ct - UC;
- Zt < 0 && (Zt += 360), Zt = Math.min(Math.max(Zt, 0), 360);
- var Ht = Number(Mg), ee = Number(RI) / 2, Qt = Ht / 2, Gt = ee, Ot = Qt, at = function(Mu) {
- return Mu * (Math.PI / 180);
- }, Je = Gt + Math.cos(at(UC)) * ee, Le = Ot + Math.sin(at(UC)) * Qt, RY = Gt + Math.cos(at(Ct)) * ee, fY = Ot + Math.sin(at(Ct)) * Qt, HY = Zt > 180 ? 1 : 0;
- return OC ? "M".concat(Gt, ",").concat(Ot, " L").concat(Je, ",").concat(Le, " A").concat(ee, ",").concat(Qt, " 0 ").concat(HY, ",").concat(1, " ").concat(RY, ",").concat(fY, " Z") : "M".concat(Je, ",").concat(Le, " A").concat(ee, ",").concat(Qt, " 0 ").concat(HY, ",").concat(1, " ").concat(RY, ",").concat(fY);
- }(cw, I, _0, q0, dw);
- break;
- case "chord":
- var ZL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), GL = 45, wL = 270;
- if (ZL) {
- var pL, hw = HI(ZL);
- try {
- for (hw.s(); !(pL = hw.n()).done; ) {
- var cR = pL.value, BL = U(cR, ["attrs", "name"]);
- if (BL === "adj1") {
- var Deg = U(cR, ["attrs", "fmla"]);
- GL = parseInt(Deg.substring(4)) / 6e4;
- } else if (BL === "adj2") {
- var Keg = U(cR, ["attrs", "fmla"]);
- wL = parseInt(Keg.substring(4)) / 6e4;
- }
- }
- } catch (Mg) {
- hw.e(Mg);
- } finally {
- hw.f();
- }
- }
- var WL = g / 2, yL = I / 2;
- i = Vg(yL, WL, yL, WL, GL, wL, !0);
- break;
- case "frame":
- var YL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), bw = 0.9842519685039369, NL = 3.9370078740157477;
- YL && (bw = parseInt(YL.substring(4)) * Gg);
- var Feg = bw < 0 ? 0 : bw > NL ? NL : bw, Xd = Math.min(I, g) * Feg / 7.874015748031495, VL = I - Xd, ML = g - Xd;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(Xd, ",").concat(Xd, " L ").concat(Xd, ",").concat(ML, " L ").concat(VL, ",").concat(ML, " L ").concat(VL, ",").concat(Xd, " z");
- break;
- case "donut":
- var RL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), uw = 1.9685039370078738, fL = 3.9370078740157477;
- RL && (uw = parseInt(RL.substring(4)) * Gg);
- var keg = uw < 0 ? 0 : uw > fL ? fL : uw, HL = Math.min(I, g) * keg / 7.874015748031495, gb = I / 2 - HL, XL = g / 2 - HL, zeg = "M ".concat(I / 2 - I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 + I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 - I / 2, ",").concat(g / 2, " Z"), Jeg = "M ".concat(I / 2 + gb, ",").concat(g / 2, " A ").concat(gb, ",").concat(XL, " 0 1,1 ").concat(I / 2 - gb, ",").concat(g / 2, " A ").concat(gb, ",").concat(XL, " 0 1,1 ").concat(I / 2 + gb, ",").concat(g / 2, " Z");
- i = "".concat(zeg, " ").concat(Jeg);
- break;
- case "noSmoking":
- var SL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), mw = 1.4763779527559053, DL = 3.9370078740157477;
- SL && (mw = parseInt(SL.substring(4)) * Gg);
- var Leg = mw < 0 ? 0 : mw > DL ? DL : mw, dR = Math.min(I, g) * Leg / 7.874015748031495, Zw = I / 2 - dR, Gw = g / 2 - dR, rR = Math.atan(g / I), KL = Gw * Math.cos(rR), FL = Zw * Math.sin(rR), veg = Zw * Gw / Math.sqrt(KL * KL + FL * FL), Teg = dR / 2, kL = Math.atan(Teg / veg), zL = -Math.PI + 2 * kL, hR = rR - kL, JL = hR - Math.PI, xeg = "M ".concat(I / 2 - I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 + I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 - I / 2, ",").concat(g / 2, " Z"), LL = I / 2, vL = g / 2, jeg = yq(LL, vL, Zw, Gw, hR, hR + zL), Qeg = yq(LL, vL, Zw, Gw, JL, JL + zL);
- i = "".concat(xeg, " ").concat(jeg, " ").concat(Qeg);
- break;
- case "halfFrame":
- var TL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), ww = 3.5, pw = 3.5, Bw = 7.874015748031495;
- if (TL) {
- var xL, Ww = HI(TL);
- try {
- for (Ww.s(); !(xL = Ww.n()).done; ) {
- var bR = xL.value, jL = U(bR, ["attrs", "name"]);
- jL === "adj1" ? ww = parseInt(U(bR, ["attrs", "fmla"]).substring(4)) * Gg : jL === "adj2" && (pw = parseInt(U(bR, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- Ww.e(Mg);
- } finally {
- Ww.f();
- }
- }
- var yw = Math.min(I, g), QL = Bw * I / yw, Yw = yw * (pw < 0 ? 0 : pw > QL ? QL : pw) / Bw, OL = Bw * (g - g * Yw / I) / yw, uR = yw * (ww < 0 ? 0 : ww > OL ? OL : ww) / Bw, Oeg = I - uR * I / g, Ueg = g - Yw * g / I;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(Oeg, ",").concat(uR, " L ").concat(Yw, ",").concat(uR, " L ").concat(Yw, ",").concat(Ueg, " L 0,").concat(g, " z");
- break;
- case "blockArc":
- var UL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Nw = 180, Vw = 0, Mw = 1.9685039370078738, EL = 3.9370078740157477;
- if (UL) {
- var PL, Rw = HI(UL);
- try {
- for (Rw.s(); !(PL = Rw.n()).done; ) {
- var fw = PL.value, mR = U(fw, ["attrs", "name"]);
- mR === "adj1" ? Nw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) / 6e4 : mR === "adj2" ? Vw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) / 6e4 : mR === "adj3" && (Mw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- Rw.e(Mg);
- } finally {
- Rw.f();
- }
- }
- var ZR, GR, Ib = 360, Sd = Nw < 0 ? 0 : Nw > Ib ? Ib : Nw, Hw = Vw < 0 ? 0 : Vw > Ib ? Ib : Vw, Eeg = Mw < 0 ? 0 : Mw > EL ? EL : Mw, wR = Hw - Sd, _L = wR > 0 ? wR : wR + Ib, Cb = Sd + _L, Peg = Hw + -_L, Xw = Sd * Math.PI / 180, Sw = Hw * Math.PI / 180, un = I / 2, mn = g / 2, Dw = I / 2, Kw = g / 2;
- if (Sd > 90 && Sd < 270) {
- var qL = un * Math.sin(Math.PI / 2 - Xw), $L = mn * Math.cos(Math.PI / 2 - Xw);
- ZR = Dw - un * Math.cos(Math.atan($L / qL)), GR = Kw - mn * Math.sin(Math.atan($L / qL));
- } else {
- var gv = un * Math.sin(Xw), Iv = mn * Math.cos(Xw);
- ZR = Dw + un * Math.cos(Math.atan(gv / Iv)), GR = Kw + mn * Math.sin(Math.atan(gv / Iv));
- }
- var pR, BR, Cv = Math.min(I, g) * Eeg / 7.874015748031495, tb = un - Cv, ib = mn - Cv;
- if (Cb <= 450 && Cb > 270 || Cb >= 630 && Cb < 720) {
- var tv = tb * Math.sin(Sw), iv = ib * Math.cos(Sw);
- pR = Dw + tb * Math.cos(Math.atan(tv / iv)), BR = Kw + ib * Math.sin(Math.atan(tv / iv));
- } else {
- var ev = tb * Math.sin(Math.PI / 2 - Sw), Av = ib * Math.cos(Math.PI / 2 - Sw);
- pR = Dw - tb * Math.cos(Math.atan(Av / ev)), BR = Kw - ib * Math.sin(Math.atan(Av / ev));
- }
- i = "M ".concat(ZR, ",").concat(GR, " ").concat(Vg(un, mn, un, mn, Sd, Cb, !1).replace("M", "L"), " L ").concat(pR, ",").concat(BR, " ").concat(Vg(un, mn, tb, ib, Hw, Peg, !1).replace("M", "L"), " z");
- break;
- case "bracePair":
- var sv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Fw = 0.6561417322834645, lv = 1.9685039370078738;
- sv && (Fw = parseInt(sv.substring(4)) * Gg);
- var nv = g / 2, kw = 180, av = Fw < 0 ? 0 : Fw > lv ? lv : Fw, ov = Math.min(I, g), MC = ov * av / 7.874015748031495, zw = ov * av / 3.9370078740157477, WR = I - zw, cv = I - MC, yR = nv - MC, YR = nv + MC, NR = g - MC;
- i = "M ".concat(zw, ",").concat(g, " ").concat(Vg(zw, NR, MC, MC, 90, kw, !1).replace("M", "L"), " L ").concat(MC, ",").concat(YR, " ").concat(Vg(0, YR, MC, MC, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, yR, MC, MC, 90, 0, !1).replace("M", "L"), " L ").concat(MC, ",").concat(MC, " ").concat(Vg(zw, MC, MC, MC, kw, 270, !1).replace("M", "L"), " M ").concat(WR, ",0 ").concat(Vg(WR, MC, MC, MC, 270, 360, !1).replace("M", "L"), " L ").concat(cv, ",").concat(yR, " ").concat(Vg(I, yR, MC, MC, kw, 90, !1).replace("M", "L"), " ").concat(Vg(I, YR, MC, MC, 270, kw, !1).replace("M", "L"), " L ").concat(cv, ",").concat(NR, " ").concat(Vg(WR, NR, MC, MC, 0, 90, !1).replace("M", "L"));
- break;
- case "leftBrace":
- var dv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Jw = 0.6561417322834645, Lw = 3.9370078740157477, eb = 7.874015748031495;
- if (dv) {
- var rv, vw = HI(dv);
- try {
- for (vw.s(); !(rv = vw.n()).done; ) {
- var VR = rv.value, hv = U(VR, ["attrs", "name"]);
- hv === "adj1" ? Jw = parseInt(U(VR, ["attrs", "fmla"]).substring(4)) * Gg : hv === "adj2" && (Lw = parseInt(U(VR, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- vw.e(Mg);
- } finally {
- vw.f();
- }
- }
- var Tw = Lw < 0 ? 0 : Lw > eb ? eb : Lw, bv = Math.min(I, g), uv = eb - Tw, mv = (uv < Tw ? uv : Tw) / 2 * g / bv, Os = bv * (Jw < 0 ? 0 : Jw > mv ? mv : Jw) / eb, Zv = g * Tw / eb, _eg = Zv - Os, Gv = Zv + Os;
- i = "M ".concat(I, ",").concat(g, " ").concat(Vg(I, g - Os, I / 2, Os, 90, 180, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Gv, " ").concat(Vg(0, Gv, I / 2, Os, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, _eg, I / 2, Os, 90, 0, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Os, " ").concat(Vg(I, Os, I / 2, Os, 180, 270, !1).replace("M", "L"));
- break;
- case "rightBrace":
- var wv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), xw = 0.6561417322834645, jw = 3.9370078740157477, Ab = 7.874015748031495;
- if (wv) {
- var pv, Qw = HI(wv);
- try {
- for (Qw.s(); !(pv = Qw.n()).done; ) {
- var MR = pv.value, Bv = U(MR, ["attrs", "name"]);
- Bv === "adj1" ? xw = parseInt(U(MR, ["attrs", "fmla"]).substring(4)) * Gg : Bv === "adj2" && (jw = parseInt(U(MR, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- Qw.e(Mg);
- } finally {
- Qw.f();
- }
- }
- var Ow = jw < 0 ? 0 : jw > Ab ? Ab : jw, Wv = Math.min(I, g), yv = Ab - Ow, Yv = (yv < Ow ? yv : Ow) / 2 * g / Wv, Zn = Wv * (xw < 0 ? 0 : xw > Yv ? Yv : xw) / Ab, Nv = g * Ow / Ab, Vv = Nv - Zn, Mv = g - Zn;
- i = "M 0,0 ".concat(Vg(0, Zn, I / 2, Zn, 270, 360, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Vv, " ").concat(Vg(I, Vv, I / 2, Zn, 180, 90, !1).replace("M", "L"), " ").concat(Vg(I, Nv + Zn, I / 2, Zn, 270, 180, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Mv, " ").concat(Vg(0, Mv, I / 2, Zn, 0, 90, !1).replace("M", "L"));
- break;
- case "bracketPair":
- var Rv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Uw = 1.3123622047244095, fv = 3.9370078740157477;
- Rv && (Uw = parseInt(Rv.substring(4)) * Gg);
- var qeg = Uw < 0 ? 0 : Uw > fv ? fv : Uw, Fi = Math.min(I, g) * qeg / 7.874015748031495, Hv = I - Fi, Xv = g - Fi;
- i = "".concat(Vg(Fi, Fi, Fi, Fi, 270, 180, !1), " ").concat(Vg(Fi, Xv, Fi, Fi, 180, 90, !1).replace("M", "L"), " ").concat(Vg(Hv, Fi, Fi, Fi, 270, 360, !1), " ").concat(Vg(Hv, Xv, Fi, Fi, 0, 90, !1).replace("M", "L"));
- break;
- case "leftBracket":
- var Sv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Ew = 0.6561417322834645, Dv = 3.9370078740157477 * g / Math.min(I, g);
- Sv && (Ew = parseInt(Sv.substring(4)) * Gg);
- var $eg = Ew < 0 ? 0 : Ew > Dv ? Dv : Ew, aA = Math.min(I, g) * $eg / 7.874015748031495;
- aA > I && (aA = I);
- var gAg = g - aA;
- i = "M ".concat(I, ",").concat(g, " ").concat(Vg(aA, gAg, aA, aA, 90, 180, !1).replace("M", "L"), " L 0,").concat(aA, " ").concat(Vg(aA, aA, aA, aA, 180, 270, !1).replace("M", "L"), " L ").concat(I, ",0");
- break;
- case "rightBracket":
- var Kv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Pw = 0.6561417322834645, Fv = 3.9370078740157477 * g / Math.min(I, g);
- Kv && (Pw = parseInt(Kv.substring(4)) * Gg);
- var IAg = Pw < 0 ? 0 : Pw > Fv ? Fv : Pw, so = Math.min(I, g) * IAg / 7.874015748031495, CAg = g - so, kv = I - so;
- i = "M 0,".concat(g, " ").concat(Vg(kv, CAg, so, so, 90, 0, !1).replace("M", "L"), " L ").concat(I, ",").concat(g / 2, " ").concat(Vg(kv, so, so, so, 360, 270, !1).replace("M", "L"), " L 0,0");
- break;
- case "moon":
- var zv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Jv = 0.5;
- zv && (Jv = parseInt(zv.substring(4)) / 1e5);
- var _w = g / 2, tAg = (1 - Jv) * I;
- i = "M ".concat(I, ",").concat(g, " ").concat(Vg(I, _w, I, _w, 90, 270, !1).replace("M", "L"), " ").concat(Vg(I, _w, tAg, _w, 270, 90, !1).replace("M", "L"), " z");
- break;
- case "corner":
- var Lv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), qw = 3.9370078740157477, $w = 3.9370078740157477, gp = 7.874015748031495;
- if (Lv) {
- var vv, Ip = HI(Lv);
- try {
- for (Ip.s(); !(vv = Ip.n()).done; ) {
- var RR = vv.value, Tv = U(RR, ["attrs", "name"]);
- Tv === "adj1" ? qw = parseInt(U(RR, ["attrs", "fmla"]).substring(4)) * Gg : Tv === "adj2" && ($w = parseInt(U(RR, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- Ip.e(Mg);
- } finally {
- Ip.f();
- }
- }
- var Cp = Math.min(I, g), xv = gp * g / Cp, jv = gp * I / Cp, Qv = Cp * ($w < 0 ? 0 : $w > jv ? jv : $w) / gp, Ov = g - Cp * (qw < 0 ? 0 : qw > xv ? xv : qw) / gp;
- i = "M 0,0 L ".concat(Qv, ",0 L ").concat(Qv, ",").concat(Ov, " L ").concat(I, ",").concat(Ov, " L ").concat(I, ",").concat(g, " L 0,").concat(g, " z");
- break;
- case "diagStripe":
- var Uv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), tp = 3.9370078740157477, ip = 7.874015748031495;
- Uv && (tp = parseInt(Uv.substring(4)) * Gg);
- var Ev = tp < 0 ? 0 : tp > ip ? ip : tp, iAg = I * Ev / ip;
- i = "M 0,".concat(g * Ev / ip, " L ").concat(iAg, ",0 L ").concat(I, ",0 L 0,").concat(g, " z");
- break;
- case "gear6":
- case "gear9":
- i = function(Mg, RI) {
- for (var YC = 1.5 * Mg, QC = YC, OC = YC, zi = RI, UC = YC, Ct = Mg, Zt = 2 * Math.PI, Ht = Zt / (2 * zi), ee = 35 * Ht * 5e-3, Qt = 50 * Ht * 5e-3, Gt = Ht, Ot = !1, at = " M" + (QC + UC * Math.cos(Qt)) + " " + (OC + UC * Math.sin(Qt)); Gt <= Zt + Ht; Gt += Ht) Ot ? (at += " L" + (QC + Ct * Math.cos(Gt - ee)) + "," + (OC + Ct * Math.sin(Gt - ee)), at += " L" + (QC + UC * Math.cos(Gt + Qt)) + "," + (OC + UC * Math.sin(Gt + Qt))) : (at += " L" + (QC + UC * Math.cos(Gt - Qt)) + "," + (OC + UC * Math.sin(Gt - Qt)), at += " L" + (QC + Ct * Math.cos(Gt + ee)) + "," + (OC + Ct * Math.sin(Gt + ee))), Ot = !Ot;
- return at + " ";
- }(I, g / 3.5, parseInt(t.substring(4)));
- break;
- case "bentConnector3":
- var Pv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), fR = 0.5;
- Pv && (fR = parseInt(Pv.substring(4)) / 1e5), i = "M 0 0 L ".concat(fR * I, " 0 L ").concat(fR * I, " ").concat(g, " L ").concat(I, " ").concat(g);
- break;
- case "plus":
- var _v = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), UA = 0.25;
- _v && (UA = parseInt(_v.substring(4)) / 1e5);
- var Gn = 1 - UA;
- i = "M ".concat(UA * I, " 0 L ").concat(UA * I, " ").concat(UA * g, " L 0 ").concat(UA * g, " L 0 ").concat(Gn * g, " L ").concat(UA * I, " ").concat(Gn * g, " L ").concat(UA * I, " ").concat(g, " L ").concat(Gn * I, " ").concat(g, " L ").concat(Gn * I, " ").concat(Gn * g, " L ").concat(I, " ").concat(Gn * g, " L ").concat(I, " ").concat(UA * g, " L ").concat(Gn * I, " ").concat(UA * g, " L ").concat(Gn * I, " 0 Z");
- break;
- case "teardrop":
- var qv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), sb = 7.874015748031495, $v = sb, gT = 15.74803149606299;
- qv && (sb = parseInt(qv.substring(4)) * Gg);
- var IT = sb < 0 ? 0 : sb > gT ? gT : sb, CT = Math.sqrt(2), eAg = CT * (I / 2) * IT / $v, AAg = CT * (g / 2) * IT / $v, tT = 45 * Math.PI / 180, sAg = eAg * Math.cos(tT), lAg = AAg * Math.cos(tT), iT = I / 2 + sAg, eT = g / 2 - lAg, nAg = (I / 2 + iT) / 2, aAg = (g / 2 + eT) / 2;
- i = "".concat(Vg(I / 2, g / 2, I / 2, g / 2, 180, 270, !1), " Q ").concat(nAg, ",0 ").concat(iT, ",").concat(eT, " Q ").concat(I, ",").concat(aAg, " ").concat(I, ",").concat(g / 2, " ").concat(Vg(I / 2, g / 2, I / 2, g / 2, 0, 90, !1).replace("M", "L"), " ").concat(Vg(I / 2, g / 2, I / 2, g / 2, 90, 180, !1).replace("M", "L"), " z");
- break;
- case "plaque":
- var AT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), ep = 1.3123622047244095, sT = 3.9370078740157477;
- AT && (ep = parseInt(AT.substring(4)) * Gg);
- var He = (ep < 0 ? 0 : ep > sT ? sT : ep) * Math.min(I, g) / 7.874015748031495, oAg = I - He, cAg = g - He;
- i = "M 0,".concat(He, " ").concat(Vg(0, 0, He, He, 90, 0, !1).replace("M", "L"), " L ").concat(oAg, ",0 ").concat(Vg(I, 0, He, He, 180, 90, !1).replace("M", "L"), " L ").concat(I, ",").concat(cAg, " ").concat(Vg(I, g, He, He, 270, 180, !1).replace("M", "L"), " L ").concat(He, ",").concat(g, " ").concat(Vg(0, g, He, He, 0, -90, !1).replace("M", "L"), " z");
- break;
- case "sun":
- var lT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Us = Gg, Ap = 25e3 * Us, nT = 12500 * Us, aT = 46875 * Us;
- lT && (Ap = parseInt(lT.substring(4)) * Us);
- var oT = Ap < nT ? nT : Ap > aT ? aT : Ap, HR = 5e4 * Us, xC = 1e5 * Us, sp = HR - oT, lp = 3 * (HR - 30274 * sp / 32768) / 4, cT = 3 * (HR - 12540 * sp / 32768) / 4, XR = lp + 3662 * Us, SR = cT + 36620 * Us, DR = cT + 12500 * Us, dT = xC - lp, rT = xC - XR, hT = xC - SR, bT = xC - DR, uT = 18436 * I / 21600, mT = 3163 * g / 21600, ZT = 3163 * I / 21600, GT = 18436 * g / 21600, wT = I * lp / xC, pT = I * XR / xC, BT = I * SR / xC, WT = I * DR / xC, yT = I * dT / xC, YT = I * rT / xC, NT = I * hT / xC, VT = I * bT / xC, dAg = I * oT / xC, rAg = I * sp / xC, hAg = g * sp / xC, MT = g * lp / xC, RT = g * XR / xC, fT = g * SR / xC, HT = g * DR / xC, XT = g * dT / xC, ST = g * rT / xC, DT = g * hT / xC, KT = g * bT / xC;
- i = "M ".concat(I, ",").concat(g / 2, " L ").concat(yT, ",").concat(KT, " L ").concat(yT, ",").concat(HT, " z M ").concat(uT, ",").concat(mT, " L ").concat(YT, ",").concat(DT, " L ").concat(BT, ",").concat(RT, " z M ").concat(I / 2, ",0 L ").concat(VT, ",").concat(MT, " L ").concat(WT, ",").concat(MT, " z M ").concat(ZT, ",").concat(mT, " L ").concat(NT, ",").concat(RT, " L ").concat(pT, ",").concat(DT, " z M 0,").concat(g / 2, " L ").concat(wT, ",").concat(HT, " L ").concat(wT, ",").concat(KT, " z M ").concat(ZT, ",").concat(GT, " L ").concat(pT, ",").concat(fT, " L ").concat(NT, ",").concat(ST, " z M ").concat(I / 2, ",").concat(g, " L ").concat(WT, ",").concat(XT, " L ").concat(VT, ",").concat(XT, " z M ").concat(uT, ",").concat(GT, " L ").concat(BT, ",").concat(ST, " L ").concat(YT, ",").concat(fT, " z M ").concat(dAg, ",").concat(g / 2, " ").concat(Vg(I / 2, g / 2, rAg, hAg, 180, 540, !1).replace("M", "L"), " z");
- break;
- case "heart":
- var FT = 49 * I / 48, kT = 10 * I / 48, bAg = I / 2 - FT, uAg = I / 2 - kT, mAg = I / 2 + kT, ZAg = I / 2 + FT, zT = -g / 3;
- i = "M ".concat(I / 2, ",").concat(g / 4, " C ").concat(mAg, ",").concat(zT, " ").concat(ZAg, ",").concat(g / 4, " ").concat(I / 2, ",").concat(g, " C ").concat(bAg, ",").concat(g / 4, " ").concat(uAg, ",").concat(zT, " ").concat(I / 2, ",").concat(g / 4, " z");
- break;
- case "lightningBolt":
- var GAg = 5022 * I / 21600, wAg = 11050 * I / 21600, pAg = 10012 * I / 21600, BAg = 14767 * I / 21600, WAg = 12222 * I / 21600, yAg = 12860 * I / 21600, YAg = 7602 * I / 21600, NAg = 16577 * I / 21600, VAg = 3890 * g / 21600, MAg = 6080 * g / 21600, RAg = 6797 * g / 21600, fAg = 12877 * g / 21600, HAg = 9705 * g / 21600, XAg = 12007 * g / 21600, SAg = 13987 * g / 21600, DAg = 8382 * g / 21600, KAg = 14915 * g / 21600;
- i = "M ".concat(8472 * I / 21600, ",0 L ").concat(yAg, ",").concat(MAg, " L ").concat(wAg, ",").concat(RAg, " L ").concat(NAg, ",").concat(XAg, " L ").concat(BAg, ",").concat(fAg, " L ").concat(I, ",").concat(g, " L ").concat(pAg, ",").concat(KAg, " L ").concat(WAg, ",").concat(SAg, " L ").concat(GAg, ",").concat(HAg, " L ").concat(YAg, ",").concat(DAg, " L 0,").concat(VAg, " z");
- break;
- case "cube":
- var JT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), KR = Gg, np = 25e3 * KR;
- JT && (np = parseInt(JT.substring(4)) * KR);
- var FR = 1e5 * KR, wn = Math.min(I, g) * (np < 0 ? 0 : np > FR ? FR : np) / FR, FAg = g - wn, lb = I - wn;
- i = "M 0,".concat(wn, " L ").concat(wn, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(FAg, " L ").concat(lb, ",").concat(g, " L 0,").concat(g, " z M 0,").concat(wn, " L ").concat(lb, ",").concat(wn, " M ").concat(lb, ",").concat(wn, " L ").concat(I, ",0 M ").concat(lb, ",").concat(wn, " L ").concat(lb, ",").concat(g);
- break;
- case "bevel":
- var LT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), kR = Gg, ap = 12500 * kR;
- LT && (ap = parseInt(LT.substring(4)) * kR);
- var vT = 5e4 * kR, EA = Math.min(I, g) * (ap < 0 ? 0 : ap > vT ? vT : ap) / 7.874015748031495, op = I - EA, cp = g - EA;
- i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(EA, ",").concat(EA, " L ").concat(op, ",").concat(EA, " L ").concat(op, ",").concat(cp, " L ").concat(EA, ",").concat(cp, " z M 0,0 L ").concat(EA, ",").concat(EA, " M 0,").concat(g, " L ").concat(EA, ",").concat(cp, " M ").concat(I, ",0 L ").concat(op, ",").concat(EA, " M ").concat(I, ",").concat(g, " L ").concat(op, ",").concat(cp);
- break;
- case "foldedCorner":
- var TT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), zR = Gg, dp = 16667 * zR;
- TT && (dp = parseInt(TT.substring(4)) * zR);
- var xT = 5e4 * zR, JR = Math.min(I, g) * (dp < 0 ? 0 : dp > xT ? xT : dp) / 7.874015748031495, jT = JR / 5, LR = I - JR, kAg = LR + jT, vR = g - JR, zAg = vR + jT;
- i = "M ".concat(LR, ",").concat(g, " L ").concat(kAg, ",").concat(zAg, " L ").concat(I, ",").concat(vR, " L ").concat(LR, ",").concat(g, " L 0,").concat(g, " L 0,0 L ").concat(I, ",0 L ").concat(I, ",").concat(vR);
- break;
- case "cloud":
- case "cloudCallout":
- for (var QT = 3900 * I / 43200, OT = 14370 * g / 43200, JAg = 6753 * I / 43200, LAg = 9190 * g / 43200, UT = 5333 * I / 43200, vAg = 7267 * g / 43200, TAg = 4365 * I / 43200, ET = 5945 * g / 43200, xAg = 4857 * I / 43200, jAg = 6595 * g / 43200, QAg = 7273 * g / 43200, OAg = 6775 * I / 43200, UAg = 9220 * g / 43200, EAg = 5785 * I / 43200, PAg = 7867 * g / 43200, _Ag = 6752 * I / 43200, qAg = 9215 * g / 43200, $Ag = 7720 * I / 43200, gsg = 10543 * g / 43200, Isg = 4360 * I / 43200, Csg = 5918 * g / 43200, tsg = 4345 * I / 43200, isg = function(Mg, RI, YC, QC, OC, zi) {
- return Vg(Mg - YC * Math.cos(OC * Math.PI / 180), RI - QC * Math.sin(OC * Math.PI / 180), YC, QC, OC, OC + zi, !1).replace("M", "L");
- }, rp = "M ".concat(QT, ",").concat(OT), TR = [QT, OT], xR = 0, PT = [[JAg, LAg, -11429249 / 6e4, 7426832 / 6e4], [UT, vAg, -8646143 / 6e4, 5396714 / 6e4], [TAg, ET, -8748475 / 6e4, 5983381 / 6e4], [xAg, jAg, -7859164 / 6e4, 7034504 / 6e4], [UT, QAg, -4722533 / 6e4, 6541615 / 6e4], [OAg, UAg, -46.26725, 130.269], [EAg, PAg, 37501 / 6e4, 6842e3 / 6e4], [_Ag, qAg, 22.4516, 115.17255], [$Ag, gsg, 3974558 / 6e4, 4542661 / 6e4], [Isg, Csg, -16496525 / 6e4, 8804134 / 6e4], [tsg, ET, -246.8285, 152.51885]]; xR < PT.length; xR++) {
- var esg = PT[xR], jR = isg.apply(void 0, [TR[0], TR[1]].concat(R9(esg)));
- rp += jR;
- var Asg = jR.lastIndexOf("L"), _T = jR.substring(Asg + 1).split(" ");
- TR = [parseFloat(_T[0]), parseFloat(_T[1])];
- }
- if (rp += " z", t === "cloudCallout") {
- var qT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), nb = Gg, hp = -20833 * nb, $T = 62500 * nb;
- if (qT) {
- var gx, bp = HI(qT);
- try {
- for (bp.s(); !(gx = bp.n()).done; ) {
- var QR = gx.value, Ix = U(QR, ["attrs", "name"]);
- Ix === "adj1" ? hp = parseInt(U(QR, ["attrs", "fmla"]).substring(4)) * nb : Ix === "adj2" && ($T = parseInt(U(QR, ["attrs", "fmla"]).substring(4)) * nb);
- }
- } catch (Mg) {
- bp.e(Mg);
- } finally {
- bp.f();
- }
- }
- var Cx = 1e5 * nb, ab = Math.min(I, g), ob = I / 2, cb = g / 2, OR = I * hp / Cx, UR = g * $T / Cx, up = ob + OR, mp = cb + UR, tx = cb * Math.cos(Math.atan(UR / OR)), ix = ob * Math.sin(Math.atan(UR / OR)), ex = ob * Math.cos(Math.atan(ix / tx)), Ax = cb * Math.sin(Math.atan(ix / tx)), Zp = (hp >= 0 ? ob + ex : ob - ex) - up, Gp = (hp >= 0 ? cb + Ax : cb - Ax) - mp, db = Math.sqrt(Zp * Zp + Gp * Gp), sx = (db - 6600 * ab / 21600) / 3, rb = 1800 * ab / 21600, lx = sx + rb, nx = lx * Gp / db + mp, ax = 4800 * ab / 21600 + 2 * sx, ox = ax * Gp / db + mp, wp = 1200 * ab / 21600, pp = 600 * ab / 21600, cx = lx * Zp / db + up + wp, dx = ax * Zp / db + up + rb;
- rp += "".concat(Vg(up + pp - pp, mp, pp, pp, 0, 360, !0), " M ").concat(cx, ",").concat(nx, " ").concat(Vg(cx - wp, nx, wp, wp, 0, 360, !0).replace("M", "L"), " M ").concat(dx, ",").concat(ox, " ").concat(Vg(dx - rb, ox, rb, rb, 0, 360, !0).replace("M", "L"));
- }
- i = rp;
- break;
- case "smileyFace":
- var rx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), ER = Gg, Bp = 4653 * ER;
- rx && (Bp = parseInt(rx.substring(4)) * ER);
- var Wp = 4653 * ER, yp = I / 2, PR = g / 2, hx = Bp < -Wp ? -Wp : Bp > Wp ? Wp : Bp, ssg = 16640 * I / 21600, bx = 16515 * g / 21600, ux = g * hx / 7.874015748031495, _R = bx - ux, mx = bx + ux + g * hx / 3.9370078740157477, Zx = 1125 * I / 21600, Gx = 1125 * g / 21600, wx = 7570 * g / 21600, lsg = 13135 * I / 21600, px = 4969 * I / 21699;
- i = "".concat(Vg(6215 * I / 21600, wx, Zx, Gx, 0, 360, !0), " ").concat(Vg(lsg, wx, Zx, Gx, 0, 360, !0), " M ").concat(px, ",").concat(_R, " Q ").concat(yp, ",").concat(mx, " ").concat(ssg, ",").concat(_R, " Q ").concat(yp, ",").concat(mx, " ").concat(px, ",").concat(_R, " M 0,").concat(PR, " ").concat(Vg(yp, PR, yp, PR, 180, 540, !1).replace("M", "L"), " z");
- break;
- case "verticalScroll":
- case "horizontalScroll":
- var Bx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), qR = Gg, Yp = 12500 * qR;
- Bx && (Yp = parseInt(Bx.substring(4)) * qR);
- var Wx = 25e3 * qR, nsg = Math.min(I, g), hb = g, bb = I, GC = nsg * (Yp < 0 ? 0 : Yp > Wx ? Wx : Yp) / 7.874015748031495, BI = GC / 2, pn = GC / 4;
- if (t === "verticalScroll") {
- var Dd = GC + BI, asg = GC + GC, Np = bb - GC, yx = bb - BI, osg = Np - BI, $R = hb - GC, lo = hb - BI;
- i = "M ".concat(GC, ",").concat($R, " L ").concat(GC, ",").concat(BI, " ").concat(Vg(Dd, BI, BI, BI, 180, 270, !1).replace("M", "L"), " L ").concat(yx, ",").concat(0, " ").concat(Vg(yx, BI, BI, BI, 270, 450, !1).replace("M", "L"), " L ").concat(Np, ",").concat(GC, " L ").concat(Np, ",").concat(lo, " ").concat(Vg(osg, lo, BI, BI, 0, 90, !1).replace("M", "L"), " L ").concat(BI, ",").concat(hb, " ").concat(Vg(BI, lo, BI, BI, 90, 270, !1).replace("M", "L"), " z M ").concat(Dd, ",").concat(0, " ").concat(Vg(Dd, BI, BI, BI, 270, 450, !1).replace("M", "L"), " ").concat(Vg(Dd, Dd / 2, pn, pn, 90, 270, !1).replace("M", "L"), " L ").concat(asg, ",").concat(BI, " M ").concat(Np, ",").concat(GC, " L ").concat(Dd, ",").concat(GC, " M ").concat(GC, ",").concat(lo, " ").concat(Vg(BI, lo, BI, BI, 0, 270, !1).replace("M", "L"), " ").concat(Vg(BI, (lo + $R) / 2, pn, pn, 270, 450, !1).replace("M", "L"), " z M ").concat(GC, ",").concat(lo, " L ").concat(GC, ",").concat($R);
- } else if (t === "horizontalScroll") {
- var no = GC + BI, csg = GC + GC, gf = hb - GC, Yx = hb - BI, Nx = gf - BI, Vp = bb - GC, Kd = bb - BI;
- i = "M ".concat(0, ",").concat(no, " ").concat(Vg(BI, no, BI, BI, 180, 270, !1).replace("M", "L"), " L ").concat(Vp, ",").concat(GC, " L ").concat(Vp, ",").concat(BI, " ").concat(Vg(Kd, BI, BI, BI, 180, 360, !1).replace("M", "L"), " L ").concat(bb, ",").concat(Nx, " ").concat(Vg(Kd, Nx, BI, BI, 0, 90, !1).replace("M", "L"), " L ").concat(GC, ",").concat(gf, " L ").concat(GC, ",").concat(Yx, " ").concat(Vg(BI, Yx, BI, BI, 0, 180, !1).replace("M", "L"), " z M ").concat(Kd, ",").concat(GC, " ").concat(Vg(Kd, BI, BI, BI, 90, -180, !1).replace("M", "L"), " ").concat(Vg((Vp + Kd) / 2, BI, pn, pn, 180, 0, !1).replace("M", "L"), " z M ").concat(Kd, ",").concat(GC, " L ").concat(Vp, ",").concat(GC, " M ").concat(BI, ",").concat(csg, " L ").concat(BI, ",").concat(no, " ").concat(Vg(no / 2, no, pn, pn, 180, 360, !1).replace("M", "L"), " ").concat(Vg(BI, no, BI, BI, 0, 180, !1).replace("M", "L"), " M ").concat(GC, ",").concat(no, " L ").concat(GC, ",").concat(gf);
- }
- break;
- case "wedgeEllipseCallout":
- var Vx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Mp = Gg, Mx = -20833 * Mp, Rx = 62500 * Mp;
- if (Vx) {
- var fx, Rp = HI(Vx);
- try {
- for (Rp.s(); !(fx = Rp.n()).done; ) {
- var If = fx.value, Hx = U(If, ["attrs", "name"]);
- Hx === "adj1" ? Mx = parseInt(U(If, ["attrs", "fmla"]).substring(4)) * Mp : Hx === "adj2" && (Rx = parseInt(U(If, ["attrs", "fmla"]).substring(4)) * Mp);
- }
- } catch (Mg) {
- Rp.e(Mg);
- } finally {
- Rp.f();
- }
- }
- var Xx = 7.874015748031495, Sx = 11 * Math.PI / 180, ao = g / 2, oo = I / 2, Dx = I * Mx / Xx, Kx = g * Rx / Xx, dsg = oo + Dx, rsg = ao + Kx, Fx = Math.atan2(Kx * I, Dx * g), Cf = Fx + Sx, tf = Fx - Sx, hsg = oo * Math.cos(Cf), bsg = ao + ao * Math.sin(Cf), usg = oo + oo * Math.cos(tf), msg = ao + ao * Math.sin(tf);
- i = "M ".concat(oo + hsg, ",").concat(bsg, " L ").concat(dsg, ",").concat(rsg, " L ").concat(usg, ",").concat(msg, " ").concat(Vg(oo, ao, oo, ao, 180 * tf / Math.PI, 180 * Cf / Math.PI, !0).replace("M", "L"));
- break;
- case "wedgeRectCallout":
- var kx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), fp = Gg, zx = -20833 * fp, Jx = 62500 * fp;
- if (kx) {
- var Lx, Hp = HI(kx);
- try {
- for (Hp.s(); !(Lx = Hp.n()).done; ) {
- var ef = Lx.value, vx = U(ef, ["attrs", "name"]);
- vx === "adj1" ? zx = parseInt(U(ef, ["attrs", "fmla"]).substring(4)) * fp : vx === "adj2" && (Jx = parseInt(U(ef, ["attrs", "fmla"]).substring(4)) * fp);
- }
- } catch (Mg) {
- Hp.e(Mg);
- } finally {
- Hp.f();
- }
- }
- var Tx = 7.874015748031495, Bn = I * zx / Tx, Wn = g * Jx / Tx, Xp = I / 2 + Bn, Sp = g / 2 + Wn, Zsg = Bn * g / I, yn = Math.abs(Wn) - Math.abs(Zsg), ub = I * (Bn > 0 ? 7 : 2) / 12, xx = I * (Bn > 0 ? 10 : 5) / 12, mb = g * (Wn > 0 ? 7 : 2) / 12, jx = g * (Wn > 0 ? 10 : 5) / 12, Gsg = yn > 0 || Bn > 0 ? 0 : Xp, wsg = yn > 0 ? Wn > 0 ? ub : Xp : ub, psg = yn > 0 ? I : Bn > 0 ? Xp : I, Bsg = yn > 0 && Wn > 0 ? Xp : ub, Wsg = yn > 0 || Bn > 0 ? mb : Sp, ysg = yn > 0 ? Wn > 0 ? 0 : Sp : 0, Ysg = yn > 0 ? mb : Bn > 0 ? Sp : mb, Nsg = yn > 0 && Wn > 0 ? Sp : g;
- i = "M 0,0 L ".concat(ub, ",0 L ").concat(wsg, ",").concat(ysg, " L ").concat(xx, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(mb, " L ").concat(psg, ",").concat(Ysg, " L ").concat(I, ",").concat(jx, " L ").concat(I, ",").concat(g, " L ").concat(xx, ",").concat(g, " L ").concat(Bsg, ",").concat(Nsg, " L ").concat(ub, ",").concat(g, " L 0,").concat(g, " L 0,").concat(jx, " L ").concat(Gsg, ",").concat(Wsg, " L 0,").concat(mb, " z");
- break;
- case "wedgeRoundRectCallout":
- var Qx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Fd = Gg, Ox = -20833 * Fd, Ux = 62500 * Fd, Ex = 16667 * Fd;
- if (Qx) {
- var Px, Dp = HI(Qx);
- try {
- for (Dp.s(); !(Px = Dp.n()).done; ) {
- var Kp = Px.value, Af = U(Kp, ["attrs", "name"]);
- Af === "adj1" ? Ox = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd : Af === "adj2" ? Ux = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd : Af === "adj3" && (Ex = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd);
- }
- } catch (Mg) {
- Dp.e(Mg);
- } finally {
- Dp.f();
- }
- }
- var sf = 7.874015748031495, Vsg = Math.min(I, g), Yn = I * Ox / sf, Nn = g * Ux / sf, Fp = I / 2 + Yn, kp = g / 2 + Nn, Msg = Yn * g / I, Vn = Math.abs(Nn) - Math.abs(Msg), Zb = I * (Yn > 0 ? 7 : 2) / 12, _x = I * (Yn > 0 ? 10 : 5) / 12, Gb = g * (Nn > 0 ? 7 : 2) / 12, qx = g * (Nn > 0 ? 10 : 5) / 12, Rsg = Vn > 0 || Yn > 0 ? 0 : Fp, fsg = Vn > 0 ? Nn > 0 ? Zb : Fp : Zb, Hsg = Vn > 0 ? I : Yn > 0 ? Fp : I, Xsg = Vn > 0 && Nn > 0 ? Fp : Zb, Ssg = Vn > 0 || Yn > 0 ? Gb : kp, Dsg = Vn > 0 ? Nn > 0 ? 0 : kp : 0, Ksg = Vn > 0 ? Gb : Yn > 0 ? kp : Gb, Fsg = Vn > 0 && Nn > 0 ? kp : g, ni = Vsg * Ex / sf, lf = I - ni, nf = g - ni;
- i = "M 0,".concat(ni, " ").concat(Vg(ni, ni, ni, ni, 180, 270, !1).replace("M", "L"), " L ").concat(Zb, ",0 L ").concat(fsg, ",").concat(Dsg, " L ").concat(_x, ",0 L ").concat(lf, ",0 ").concat(Vg(lf, ni, ni, ni, 270, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(Gb, " L ").concat(Hsg, ",").concat(Ksg, " L ").concat(I, ",").concat(qx, " L ").concat(I, ",").concat(nf, " ").concat(Vg(lf, nf, ni, ni, 0, 90, !1).replace("M", "L"), " L ").concat(_x, ",").concat(g, " L ").concat(Xsg, ",").concat(Fsg, " L ").concat(Zb, ",").concat(g, " L ").concat(ni, ",").concat(g, " ").concat(Vg(ni, nf, ni, ni, 90, 180, !1).replace("M", "L"), " L 0,").concat(qx, " L ").concat(Rsg, ",").concat(Ssg, " L 0,").concat(Gb, " z");
- break;
- case "accentBorderCallout1":
- case "accentBorderCallout2":
- case "accentBorderCallout3":
- case "borderCallout1":
- case "borderCallout2":
- case "borderCallout3":
- case "accentCallout1":
- case "accentCallout2":
- case "accentCallout3":
- case "callout1":
- case "callout2":
- case "callout3":
- var Mn = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), ZI = Gg, ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI;
- if (Mn) {
- var $x, zp = HI(Mn);
- try {
- for (zp.s(); !($x = zp.n()).done; ) {
- var _s = $x.value, Rn = U(_s, ["attrs", "name"]);
- Rn === "adj1" ? ge = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj2" ? Ie = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj3" ? Ce = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj4" ? te = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj5" ? Es = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj6" ? Ps = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj7" ? wb = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj8" && (pb = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI);
- }
- } catch (Mg) {
- zp.e(Mg);
- } finally {
- zp.f();
- }
- }
- var Rt, Xe, Se, De, fn, Hn, Jp, Lp, _I = 1e5 * ZI, kd = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z");
- switch (t) {
- case "borderCallout1":
- case "callout1":
- Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 112500 * ZI, te = -38333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De);
- break;
- case "borderCallout2":
- case "callout2":
- Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 112500 * ZI, Ps = -46667 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn);
- break;
- case "borderCallout3":
- case "callout3":
- Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, Lp = g * wb / _I, Jp = I * pb / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " L ").concat(Jp, ",").concat(Lp);
- break;
- case "accentBorderCallout1":
- case "accentCallout1":
- Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 112500 * ZI, te = -38333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
- break;
- case "accentBorderCallout2":
- case "accentCallout2":
- Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 112500 * ZI, Ps = -46667 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
- break;
- case "accentBorderCallout3":
- case "accentCallout3":
- Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, Lp = g * wb / _I, Jp = I * pb / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " L ").concat(Jp, ",").concat(Lp, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
- }
- break;
- case "leftRightRibbon":
- var gj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), qs = Gg, vp = 5e4 * qs, Tp = 5e4 * qs, xp = 16667 * qs;
- if (gj) {
- var Ij, jp = HI(gj);
- try {
- for (jp.s(); !(Ij = jp.n()).done; ) {
- var Qp = Ij.value, af = U(Qp, ["attrs", "name"]);
- af === "adj1" ? vp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs : af === "adj2" ? Tp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs : af === "adj3" && (xp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs);
- }
- } catch (Mg) {
- jp.e(Mg);
- } finally {
- jp.f();
- }
- }
- var Cj = 33333 * qs, of = 1e5 * qs, tj = 2e5 * qs, cf = Math.min(I, g), Xn = I / 2, ij = g / 2, df = xp < 0 ? 0 : xp > Cj ? Cj : xp, ej = of - df, Aj = of * (Xn - I / 32) / cf, Bb = cf * (Tp < 0 ? 0 : Tp > Aj ? Aj : Tp) / of, Op = I - Bb, rf = g * (vp < 0 ? 0 : vp > ej ? ej : vp) / tj, sj = g * df / -tj, Sn = ij + sj - rf, hf = ij + rf - sj, bf = Sn + rf, ksg = g - bf, zd = 2 * bf, uf = g - (zd - Sn), Jd = df * cf / 31.49606299212598, mf = Xn - I / 32, lj = Xn + I / 32, nj = Sn + Jd, aj = uf - Jd;
- i = "M 0,".concat(bf, " L ").concat(Bb, ",0 L ").concat(Bb, ",").concat(Sn, " L ").concat(Xn, ",").concat(Sn, " ").concat(Vg(Xn, nj, I / 32, Jd, 270, 450, !1).replace("M", "L"), " ").concat(Vg(Xn, aj, I / 32, Jd, 270, 90, !1).replace("M", "L"), " L ").concat(Op, ",").concat(uf, " L ").concat(Op, ",").concat(g - zd, " L ").concat(I, ",").concat(ksg, " L ").concat(Op, ",").concat(g, " L ").concat(Op, ",").concat(hf, " L ").concat(Xn, ",").concat(hf, " ").concat(Vg(Xn, hf - Jd, I / 32, Jd, 90, 180, !1).replace("M", "L"), " L ").concat(mf, ",").concat(zd - Sn, " L ").concat(Bb, ",").concat(zd - Sn, " L ").concat(Bb, ",").concat(zd, " z M ").concat(lj, ",").concat(nj, " L ").concat(lj, ",").concat(uf, " M ").concat(mf, ",").concat(aj, " L ").concat(mf, ",").concat(zd - Sn);
- break;
- case "ribbon":
- case "ribbon2":
- var oj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Up = 1.3123622047244095, Ep = 3.9370078740157477;
- if (oj) {
- var cj, Pp = HI(oj);
- try {
- for (Pp.s(); !(cj = Pp.n()).done; ) {
- var Zf = cj.value, dj = U(Zf, ["attrs", "name"]);
- dj === "adj1" ? Up = parseInt(U(Zf, ["attrs", "fmla"]).substring(4)) * Gg : dj === "adj2" && (Ep = parseInt(U(Zf, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- Pp.e(Mg);
- } finally {
- Pp.f();
- }
- }
- var rj = 1.9685039370078738, hj = 2.6246456692913385, bj = 5.905511811023621, uj = 7.874015748031495, Gf = 15.74803149606299, mj = I / 2, PA = g, Wb = I, yb = I / 8, ai = I / 32, Yb = Up < 0 ? 0 : Up > hj ? hj : Up, Zj = Wb - yb, Gj = I * (Ep < rj ? rj : Ep > bj ? bj : Ep) / Gf, $s = mj - Gj, gl = mj + Gj, co = $s + ai, ro = gl - ai, Nb = $s + yb, Vb = gl - yb, _p = Nb - ai, qp = Vb + ai, jC = g * Yb / 31.49606299212598;
- if (t === "ribbon2") {
- var wf = PA - g * Yb / Gf, wj = g * Yb / uj, pf = PA - wj, ho = 0 + wj, pj = (ho + PA) / 2, $p = PA - jC, gB = wf - jC;
- i = "M ".concat(0, ",").concat(PA, " L ").concat(yb, ",").concat(pj, " L ").concat(0, ",").concat(ho, " L ").concat($s, ",").concat(ho, " L ").concat($s, ",").concat(jC, " ").concat(Vg(co, jC, ai, jC, 180, 270, !1).replace("M", "L"), " L ").concat(ro, ",").concat(0, " ").concat(Vg(ro, jC, ai, jC, 270, 360, !1).replace("M", "L"), " L ").concat(gl, ",").concat(ho, " L ").concat(Wb, ",").concat(ho, " L ").concat(Zj, ",").concat(pj, " L ").concat(Wb, ",").concat(PA, " L ").concat(qp, ",").concat(PA, " ").concat(Vg(qp, $p, ai, jC, 90, 270, !1).replace("M", "L"), " L ").concat(ro, ",").concat(wf, " ").concat(Vg(ro, gB, ai, jC, 90, -90, !1).replace("M", "L"), " L ").concat(co, ",").concat(pf, " ").concat(Vg(co, gB, ai, jC, 270, 90, !1).replace("M", "L"), " L ").concat(_p, ",").concat(wf, " ").concat(Vg(_p, $p, ai, jC, 270, 450, !1).replace("M", "L"), " z M ").concat(Nb, ",").concat(pf, " L ").concat(Nb, ",").concat($p, " M ").concat(Vb, ",").concat($p, " L ").concat(Vb, ",").concat(pf, " M ").concat($s, ",").concat(gB, " L ").concat($s, ",").concat(ho, " M ").concat(gl, ",").concat(ho, " L ").concat(gl, ",").concat(gB);
- } else if (t === "ribbon") {
- var Bj = g * Yb / Gf, Mb = g * Yb / uj, bo = PA - Mb, Wj = bo / 2, Bf = PA - jC, IB = Mb - jC;
- i = "M ".concat(0, ",").concat(0, " L ").concat(_p, ",").concat(0, " ").concat(Vg(_p, jC, ai, jC, 270, 450, !1).replace("M", "L"), " L ").concat(co, ",").concat(Bj, " ").concat(Vg(co, IB, ai, jC, 270, 90, !1).replace("M", "L"), " L ").concat(ro, ",").concat(Mb, " ").concat(Vg(ro, IB, ai, jC, 90, -90, !1).replace("M", "L"), " L ").concat(qp, ",").concat(Bj, " ").concat(Vg(qp, jC, ai, jC, 90, 270, !1).replace("M", "L"), " L ").concat(Wb, ",").concat(0, " L ").concat(Zj, ",").concat(Wj, " L ").concat(Wb, ",").concat(bo, " L ").concat(gl, ",").concat(bo, " L ").concat(gl, ",").concat(Bf, " ").concat(Vg(ro, Bf, ai, jC, 0, 90, !1).replace("M", "L"), " L ").concat(co, ",").concat(PA, " ").concat(Vg(co, Bf, ai, jC, 90, 180, !1).replace("M", "L"), " L ").concat($s, ",").concat(bo, " L ").concat(0, ",").concat(bo, " L ").concat(yb, ",").concat(Wj, " z M ").concat(Nb, ",").concat(jC, " L ").concat(Nb, ",").concat(Mb, " M ").concat(Vb, ",").concat(Mb, " L ").concat(Vb, ",").concat(jC, " M ").concat($s, ",").concat(bo, " L ").concat($s, ",").concat(IB, " M ").concat(gl, ",").concat(IB, " L ").concat(gl, ",").concat(bo);
- }
- break;
- case "doubleWave":
- case "wave":
- var yj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), uo = t === "doubleWave" ? 0.49212598425196846 : 0.9842519685039369, mo = 0;
- if (yj) {
- var Yj, CB = HI(yj);
- try {
- for (CB.s(); !(Yj = CB.n()).done; ) {
- var Wf = Yj.value, Nj = U(Wf, ["attrs", "name"]);
- Nj === "adj1" ? uo = parseInt(U(Wf, ["attrs", "fmla"]).substring(4)) * Gg : Nj === "adj2" && (mo = parseInt(U(Wf, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- CB.e(Mg);
- } finally {
- CB.f();
- }
- }
- var tB = -0.7874015748031495, Vj = 3.9370078740157477, Ld = 7.874015748031495, Mj = g, iB = I;
- if (t === "doubleWave") {
- var Rj = 0.9842519685039369, Zo = g * (uo < 0 ? 0 : uo > Rj ? Rj : uo) / Ld, eB = 10 * Zo / 3, fj = Zo - eB, Hj = Zo + eB, Rb = Mj - Zo, Xj = Rb - eB, Sj = Rb + eB, AB = I * (mo < tB ? tB : mo > Ld ? Ld : mo) / Vj, sB = AB > 0 ? 0 : AB, lB = 0 - sB, Dj = AB > 0 ? AB : 0, fb = iB - Dj, nB = (sB + fb) / 6, zsg = lB + nB, Kj = (sB + fb) / 3, Jsg = lB + Kj, Fj = (lB + fb) / 2, kj = Fj + nB, Lsg = (kj + fb) / 2, aB = 0 + Dj, yf = iB + sB, vsg = aB + nB, Tsg = aB + Kj, zj = (aB + yf) / 2, Jj = zj + nB, xsg = (Jj + yf) / 2;
- i = "M ".concat(lB, ",").concat(Zo, " C ").concat(zsg, ",").concat(fj, " ").concat(Jsg, ",").concat(Hj, " ").concat(Fj, ",").concat(Zo, " C ").concat(kj, ",").concat(fj, " ").concat(Lsg, ",").concat(Hj, " ").concat(fb, ",").concat(Zo, " L ").concat(yf, ",").concat(Rb, " C ").concat(xsg, ",").concat(Sj, " ").concat(Jj, ",").concat(Xj, " ").concat(zj, ",").concat(Rb, " C ").concat(Tsg, ",").concat(Sj, " ").concat(vsg, ",").concat(Xj, " ").concat(aB, ",").concat(Rb, " z");
- } else if (t === "wave") {
- var Lj = 1.574803149606299, vd = g * (uo < 0 ? 0 : uo > Lj ? Lj : uo) / Ld, oB = 10 * vd / 3, jsg = vd - oB, Qsg = vd + oB, cB = Mj - vd, Osg = cB - oB, Usg = cB + oB, dB = I * (mo < tB ? tB : mo > Ld ? Ld : mo) / Vj, Yf = dB > 0 ? 0 : dB, vj = 0 - Yf, Tj = dB > 0 ? dB : 0, Nf = iB - Tj, xj = (Yf + Nf) / 3, jj = vj + xj, Esg = (jj + Nf) / 2, Qj = 0 + Tj, Oj = iB + Yf, Uj = Qj + xj, Psg = (Uj + Oj) / 2;
- i = "M ".concat(vj, ",").concat(vd, " C ").concat(jj, ",").concat(jsg, " ").concat(Esg, ",").concat(Qsg, " ").concat(Nf, ",").concat(vd, " L ").concat(Oj, ",").concat(cB, " C ").concat(Psg, ",").concat(Usg, " ").concat(Uj, ",").concat(Osg, " ").concat(Qj, ",").concat(cB, " z");
- }
- break;
- case "ellipseRibbon":
- case "ellipseRibbon2":
- var Ej = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), rB = 1.9685039370078738, hB = 3.9370078740157477, bB = 0.9842519685039369;
- if (Ej) {
- var Pj, uB = HI(Ej);
- try {
- for (uB.s(); !(Pj = uB.n()).done; ) {
- var mB = Pj.value, Vf = U(mB, ["attrs", "name"]);
- Vf === "adj1" ? rB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg : Vf === "adj2" ? hB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg : Vf === "adj3" && (bB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- uB.e(Mg);
- } finally {
- uB.f();
- }
- }
- var _j = 1.9685039370078738, qj = 5.905511811023621, Hb = 7.874015748031495, Xb = I / 2, ki = g, Il = I, ZB = I / 8, Td = rB < 0 ? 0 : rB > Hb ? Hb : rB, $j = Hb - Td, gQ = Td - $j / 2 > 0 ? Td - $j / 2 : 0, oi = Xb - I * (hB < _j ? _j : hB > qj ? qj : hB) / 15.74803149606299, oA = oi + ZB, xd = Il - oA, _A = Il - oi, IQ = Il - ZB, Go = g * (bB < gQ ? gQ : bB > Td ? Td : bB) / Hb, jd = 4 * Go / I, CQ = oA - oA * oA / I, Sb = oA / 2, tQ = Il - Sb, GB = g * Td / Hb, Dn = GB - Go, wB = jd * (oi - oi * oi / I), Ke = ki - GB, iQ = 14 * Go / 16, pB = oi / 2, eQ = jd * pB, AQ = Il - pB;
- if (t === "ellipseRibbon") {
- var Db = jd * CQ, sQ = jd * Sb, Qd = wB + Dn, lQ = Go + Dn - Qd + Go + Dn, nQ = (iQ + Ke) / 2, BB = wB + Ke, aQ = Qd + Ke, oQ = eQ + Ke, _sg = lQ + Ke, cQ = Db + Dn;
- i = "M ".concat(0, ",").concat(0, " Q ").concat(Sb, ",").concat(sQ, " ").concat(oA, ",").concat(Db, " L ").concat(oi, ",").concat(Qd, " Q ").concat(Xb, ",").concat(lQ, " ").concat(_A, ",").concat(Qd, " L ").concat(xd, ",").concat(Db, " Q ").concat(tQ, ",").concat(sQ, " ").concat(Il, ",").concat(0, " L ").concat(IQ, ",").concat(nQ, " L ").concat(Il, ",").concat(Ke, " Q ").concat(AQ, ",").concat(oQ, " ").concat(_A, ",").concat(BB, " L ").concat(_A, ",").concat(aQ, " Q ").concat(Xb, ",").concat(_sg, " ").concat(oi, ",").concat(aQ, " L ").concat(oi, ",").concat(BB, " Q ").concat(pB, ",").concat(oQ, " ").concat(0, ",").concat(Ke, " L ").concat(ZB, ",").concat(nQ, " z M ").concat(oi, ",").concat(BB, " L ").concat(oi, ",").concat(Qd, " M ").concat(_A, ",").concat(Qd, " L ").concat(_A, ",").concat(BB, " M ").concat(oA, ",").concat(Db, " L ").concat(oA, ",").concat(cQ, " M ").concat(xd, ",").concat(cQ, " L ").concat(xd, ",").concat(Db);
- } else if (t === "ellipseRibbon2") {
- var dQ = jd * CQ, WB = ki - dQ, rQ = ki - jd * Sb, Mf = wB + Dn, yB = ki - Mf, hQ = Go + Dn - Mf + Go + Dn, qsg = ki - hQ, bQ = ki - (iQ + Ke) / 2, YB = ki - (wB + Ke), uQ = ki - (Mf + Ke), mQ = ki - (eQ + Ke), $sg = ki - (hQ + Ke), ZQ = ki - (dQ + Dn);
- i = "M ".concat(0, ",").concat(ki, " L ").concat(ZB, ",").concat(bQ, " L ").concat(0, ",").concat(GB, " Q ").concat(pB, ",").concat(mQ, " ").concat(oi, ",").concat(YB, " L ").concat(oi, ",").concat(uQ, " Q ").concat(Xb, ",").concat($sg, " ").concat(_A, ",").concat(uQ, " L ").concat(_A, ",").concat(YB, " Q ").concat(AQ, ",").concat(mQ, " ").concat(Il, ",").concat(GB, " L ").concat(IQ, ",").concat(bQ, " L ").concat(Il, ",").concat(ki, " Q ").concat(tQ, ",").concat(rQ, " ").concat(xd, ",").concat(WB, " L ").concat(_A, ",").concat(yB, " Q ").concat(Xb, ",").concat(qsg, " ").concat(oi, ",").concat(yB, " L ").concat(oA, ",").concat(WB, " Q ").concat(Sb, ",").concat(rQ, " ").concat(0, ",").concat(ki, " z M ").concat(oi, ",").concat(yB, " L ").concat(oi, ",").concat(YB, " M ").concat(_A, ",").concat(YB, " L ").concat(_A, ",").concat(yB, " M ").concat(oA, ",").concat(ZQ, " L ").concat(oA, ",").concat(WB, " M ").concat(xd, ",").concat(WB, " L ").concat(xd, ",").concat(ZQ);
- }
- break;
- case "line":
- case "straightConnector1":
- case "bentConnector4":
- case "bentConnector5":
- case "curvedConnector2":
- case "curvedConnector3":
- case "curvedConnector4":
- case "curvedConnector5":
- i = "M 0 0 L ".concat(I, " ").concat(g);
- break;
- case "rightArrow":
- var GQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Kb = 0.25, Fb = 0.5;
- if (GQ) {
- var wQ, glg = I / g, NB = HI(GQ);
- try {
- for (NB.s(); !(wQ = NB.n()).done; ) {
- var Rf = wQ.value, pQ = U(Rf, ["attrs", "name"]);
- pQ === "adj1" ? Kb = 0.5 - parseInt(U(Rf, ["attrs", "fmla"]).substring(4)) / 2e5 : pQ === "adj2" && (Fb = 1 - parseInt(U(Rf, ["attrs", "fmla"]).substring(4)) / 1e5 / glg);
- }
- } catch (Mg) {
- NB.e(Mg);
- } finally {
- NB.f();
- }
- }
- i = "M ".concat(I, " ").concat(g / 2, " L ").concat(Fb * I, " 0 L ").concat(Fb * I, " ").concat(Kb * g, " L 0 ").concat(Kb * g, " L 0 ").concat((1 - Kb) * g, " L ").concat(Fb * I, " ").concat((1 - Kb) * g, " L ").concat(Fb * I, " ").concat(g, " Z");
- break;
- case "leftArrow":
- var BQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), kb = 0.25, zb = 0.5;
- if (BQ) {
- var WQ, Ilg = I / g, VB = HI(BQ);
- try {
- for (VB.s(); !(WQ = VB.n()).done; ) {
- var ff = WQ.value, yQ = U(ff, ["attrs", "name"]);
- yQ === "adj1" ? kb = 0.5 - parseInt(U(ff, ["attrs", "fmla"]).substring(4)) / 2e5 : yQ === "adj2" && (zb = parseInt(U(ff, ["attrs", "fmla"]).substring(4)) / 1e5 / Ilg);
- }
- } catch (Mg) {
- VB.e(Mg);
- } finally {
- VB.f();
- }
- }
- i = "M 0 ".concat(g / 2, " L ").concat(zb * I, " ").concat(g, " L ").concat(zb * I, " ").concat((1 - kb) * g, " L ").concat(I, " ").concat((1 - kb) * g, " L ").concat(I, " ").concat(kb * g, " L ").concat(zb * I, " ").concat(kb * g, " L ").concat(zb * I, " 0 Z");
- break;
- case "downArrow":
- case "flowChartOffpageConnector":
- var YQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Od = 0.25, Ud = 0.5;
- if (YQ) {
- var NQ, Clg = g / I, MB = HI(YQ);
- try {
- for (MB.s(); !(NQ = MB.n()).done; ) {
- var Hf = NQ.value, VQ = U(Hf, ["attrs", "name"]);
- VQ === "adj1" ? Od = parseInt(U(Hf, ["attrs", "fmla"]).substring(4)) / 2e5 : VQ === "adj2" && (Ud = parseInt(U(Hf, ["attrs", "fmla"]).substring(4)) / 1e5 / Clg);
- }
- } catch (Mg) {
- MB.e(Mg);
- } finally {
- MB.f();
- }
- }
- t === "flowChartOffpageConnector" && (Od = 0.5, Ud = 0.212), i = "M ".concat((0.5 - Od) * I, " 0 L ").concat((0.5 - Od) * I, " ").concat((1 - Ud) * g, " L 0 ").concat((1 - Ud) * g, " L ").concat(I / 2, " ").concat(g, " L ").concat(I, " ").concat((1 - Ud) * g, " L ").concat((0.5 + Od) * I, " ").concat((1 - Ud) * g, " L ").concat((0.5 + Od) * I, " 0 Z");
- break;
- case "upArrow":
- var MQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Jb = 0.25, Lb = 0.5;
- if (MQ) {
- var RQ, tlg = g / I, RB = HI(MQ);
- try {
- for (RB.s(); !(RQ = RB.n()).done; ) {
- var Xf = RQ.value, fQ = U(Xf, ["attrs", "name"]);
- fQ === "adj1" ? Jb = parseInt(U(Xf, ["attrs", "fmla"]).substring(4)) / 2e5 : fQ === "adj2" && (Lb = parseInt(U(Xf, ["attrs", "fmla"]).substring(4)) / 1e5 / tlg);
- }
- } catch (Mg) {
- RB.e(Mg);
- } finally {
- RB.f();
- }
- }
- i = "M ".concat(I / 2, " 0 L 0 ").concat(Lb * g, " L ").concat((0.5 - Jb) * I, " ").concat(Lb * g, " L ").concat((0.5 - Jb) * I, " ").concat(g, " L ").concat((0.5 + Jb) * I, " ").concat(g, " L ").concat((0.5 + Jb) * I, " ").concat(Lb * g, " L ").concat(I, " ").concat(Lb * g, " Z");
- break;
- case "leftRightArrow":
- var HQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), vb = 0.25, Cl = 0.25;
- if (HQ) {
- var XQ, ilg = I / g, fB = HI(HQ);
- try {
- for (fB.s(); !(XQ = fB.n()).done; ) {
- var Sf = XQ.value, SQ = U(Sf, ["attrs", "name"]);
- SQ === "adj1" ? vb = 0.5 - parseInt(U(Sf, ["attrs", "fmla"]).substring(4)) / 2e5 : SQ === "adj2" && (Cl = parseInt(U(Sf, ["attrs", "fmla"]).substring(4)) / 1e5 / ilg);
- }
- } catch (Mg) {
- fB.e(Mg);
- } finally {
- fB.f();
- }
- }
- i = "M 0 ".concat(g / 2, " L ").concat(Cl * I, " ").concat(g, " L ").concat(Cl * I, " ").concat((1 - vb) * g, " L ").concat((1 - Cl) * I, " ").concat((1 - vb) * g, " L ").concat((1 - Cl) * I, " ").concat(g, " L ").concat(I, " ").concat(g / 2, " L ").concat((1 - Cl) * I, " 0 L ").concat((1 - Cl) * I, " ").concat(vb * g, " L ").concat(Cl * I, " ").concat(vb * g, " L ").concat(Cl * I, " 0 Z");
- break;
- case "upDownArrow":
- var DQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Tb = 0.25, tl = 0.25;
- if (DQ) {
- var KQ, elg = g / I, HB = HI(DQ);
- try {
- for (HB.s(); !(KQ = HB.n()).done; ) {
- var Df = KQ.value, FQ = U(Df, ["attrs", "name"]);
- FQ === "adj1" ? Tb = 0.5 - parseInt(U(Df, ["attrs", "fmla"]).substring(4)) / 2e5 : FQ === "adj2" && (tl = parseInt(U(Df, ["attrs", "fmla"]).substring(4)) / 1e5 / elg);
- }
- } catch (Mg) {
- HB.e(Mg);
- } finally {
- HB.f();
- }
- }
- i = "M ".concat(I / 2, " 0 L 0 ").concat(tl * g, " L ").concat(Tb * I, " ").concat(tl * g, " L ").concat(Tb * I, " ").concat((1 - tl) * g, " L 0 ").concat((1 - tl) * g, " L ").concat(I / 2, " ").concat(g, " L ").concat(I, " ").concat((1 - tl) * g, " L ").concat((1 - Tb) * I, " ").concat((1 - tl) * g, " L ").concat((1 - Tb) * I, " ").concat(tl * g, " L ").concat(I, " ").concat(tl * g, " Z");
- break;
- case "quadArrow":
- var kQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), XB = 1.7716535433070866, SB = 1.7716535433070866, DB = 1.7716535433070866, zQ = 3.9370078740157477, Kf = 7.874015748031495;
- if (kQ) {
- var JQ, KB = HI(kQ);
- try {
- for (KB.s(); !(JQ = KB.n()).done; ) {
- var FB = JQ.value, Ff = U(FB, ["attrs", "name"]);
- Ff === "adj1" ? XB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg : Ff === "adj2" ? SB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg : Ff === "adj3" && (DB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- KB.e(Mg);
- } finally {
- KB.f();
- }
- }
- var Ed = g / 2, Pd = I / 2, kf = Math.min(I, g), LQ = SB < 0 ? 0 : SB > zQ ? zQ : SB, zf = 2 * LQ, vQ = (Kf - zf) / 2, qA = kf * (DB < 0 ? 0 : DB > vQ ? vQ : DB) / Kf, kB = kf * LQ / Kf, TQ = Pd - kB, xQ = Pd + kB, zB = kf * (XB < 0 ? 0 : XB > zf ? zf : XB) / 15.74803149606299, JB = Pd - zB, LB = Pd + zB, vB = I - qA, jQ = Ed - kB, QQ = Ed + kB, TB = Ed - zB, xB = Ed + zB, jB = g - qA;
- i = "M 0,".concat(Ed, " L ").concat(qA, ",").concat(jQ, " L ").concat(qA, ",").concat(TB, " L ").concat(JB, ",").concat(TB, " L ").concat(JB, ",").concat(qA, " L ").concat(TQ, ",").concat(qA, " L ").concat(Pd, ",0 L ").concat(xQ, ",").concat(qA, " L ").concat(LB, ",").concat(qA, " L ").concat(LB, ",").concat(TB, " L ").concat(vB, ",").concat(TB, " L ").concat(vB, ",").concat(jQ, " L ").concat(I, ",").concat(Ed, " L ").concat(vB, ",").concat(QQ, " L ").concat(vB, ",").concat(xB, " L ").concat(LB, ",").concat(xB, " L ").concat(LB, ",").concat(jB, " L ").concat(xQ, ",").concat(jB, " L ").concat(Pd, ",").concat(g, " L ").concat(TQ, ",").concat(jB, " L ").concat(JB, ",").concat(jB, " L ").concat(JB, ",").concat(xB, " L ").concat(qA, ",").concat(xB, " L ").concat(qA, ",").concat(QQ, " z");
- break;
- case "leftRightUpArrow":
- var OQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), QB = 1.9685039370078738, OB = 1.9685039370078738, UB = 1.9685039370078738, Jf = 3.9370078740157477, Lf = 7.874015748031495;
- if (OQ) {
- var UQ, EB = HI(OQ);
- try {
- for (EB.s(); !(UQ = EB.n()).done; ) {
- var PB = UQ.value, vf = U(PB, ["attrs", "name"]);
- vf === "adj1" ? QB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg : vf === "adj2" ? OB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg : vf === "adj3" && (UB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- EB.e(Mg);
- } finally {
- EB.f();
- }
- }
- var xb = I / 2, _B = Math.min(I, g), Tf = OB < 0 ? 0 : OB > Jf ? Jf : OB, xf = 2 * Tf, EQ = (Lf - xf) / 2, il = _B * (UB < 0 ? 0 : UB > EQ ? EQ : UB) / Lf, jf = _B * Tf / Lf, Alg = xb - jf, slg = xb + jf, qB = _B * (QB < 0 ? 0 : QB > xf ? xf : QB) / 15.74803149606299, PQ = xb - qB, _Q = xb + qB, $B = I - il, qQ = g - _B * Tf / Jf, gW = g - jf, IW = gW - qB, $Q = gW + qB;
- i = "M 0,".concat(gW, " L ").concat(il, ",").concat(qQ, " L ").concat(il, ",").concat(IW, " L ").concat(PQ, ",").concat(IW, " L ").concat(PQ, ",").concat(il, " L ").concat(Alg, ",").concat(il, " L ").concat(xb, ",0 L ").concat(slg, ",").concat(il, " L ").concat(_Q, ",").concat(il, " L ").concat(_Q, ",").concat(IW, " L ").concat($B, ",").concat(IW, " L ").concat($B, ",").concat(qQ, " L ").concat(I, ",").concat(gW, " L ").concat($B, ",").concat(g, " L ").concat($B, ",").concat($Q, " L ").concat(il, ",").concat($Q, " L ").concat(il, ",").concat(g, " z");
- break;
- case "leftUpArrow":
- var gO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), CW = 1.9685039370078738, tW = 1.9685039370078738, iW = 1.9685039370078738, Qf = 3.9370078740157477, Of = 7.874015748031495;
- if (gO) {
- var IO, eW = HI(gO);
- try {
- for (eW.s(); !(IO = eW.n()).done; ) {
- var AW = IO.value, Uf = U(AW, ["attrs", "name"]);
- Uf === "adj1" ? CW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg : Uf === "adj2" ? tW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg : Uf === "adj3" && (iW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- eW.e(Mg);
- } finally {
- eW.f();
- }
- }
- var sW = Math.min(I, g), Ef = tW < 0 ? 0 : tW > Qf ? Qf : tW, Pf = 2 * Ef, CO = Of - Pf, Kn = sW * (iW < 0 ? 0 : iW > CO ? CO : iW) / Of, tO = sW * Ef / Qf, llg = I - tO, nlg = g - tO, iO = sW * Ef / Of, _f = I - iO, qf = g - iO, lW = sW * (CW < 0 ? 0 : CW > Pf ? Pf : CW) / 15.74803149606299, eO = _f - lW, AO = _f + lW, sO = qf - lW, lO = qf + lW;
- i = "M 0,".concat(qf, " L ").concat(Kn, ",").concat(nlg, " L ").concat(Kn, ",").concat(sO, " L ").concat(eO, ",").concat(sO, " L ").concat(eO, ",").concat(Kn, " L ").concat(llg, ",").concat(Kn, " L ").concat(_f, ",0 L ").concat(I, ",").concat(Kn, " L ").concat(AO, ",").concat(Kn, " L ").concat(AO, ",").concat(lO, " L ").concat(Kn, ",").concat(lO, " L ").concat(Kn, ",").concat(g, " z");
- break;
- case "bentUpArrow":
- var nO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), nW = 1.9685039370078738, aW = 1.9685039370078738, oW = 1.9685039370078738, wo = 3.9370078740157477, $f = 7.874015748031495;
- if (nO) {
- var aO, cW = HI(nO);
- try {
- for (cW.s(); !(aO = cW.n()).done; ) {
- var dW = aO.value, g5 = U(dW, ["attrs", "name"]);
- g5 === "adj1" ? nW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg : g5 === "adj2" ? aW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg : g5 === "adj3" && (oW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- cW.e(Mg);
- } finally {
- cW.f();
- }
- }
- var jb = Math.min(I, g), oO = nW < 0 ? 0 : nW > wo ? wo : nW, cO = aW < 0 ? 0 : aW > wo ? wo : aW, rW = jb * (oW < 0 ? 0 : oW > wo ? wo : oW) / $f, alg = I - jb * cO / wo, I5 = I - jb * cO / $f, dO = jb * oO / 15.74803149606299, rO = I5 - dO, hO = I5 + dO, bO = g - jb * oO / $f;
- i = "M 0,".concat(bO, " L ").concat(rO, ",").concat(bO, " L ").concat(rO, ",").concat(rW, " L ").concat(alg, ",").concat(rW, " L ").concat(I5, ",0 L ").concat(I, ",").concat(rW, " L ").concat(hO, ",").concat(rW, " L ").concat(hO, ",").concat(g, " L 0,").concat(g, " z");
- break;
- case "bentArrow":
- var uO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), hW = 1.9685039370078738, bW = 1.9685039370078738, uW = 1.9685039370078738, mW = 3.444881889763779, ZW = 3.9370078740157477, Qb = 7.874015748031495;
- if (uO) {
- var mO, GW = HI(uO);
- try {
- for (GW.s(); !(mO = GW.n()).done; ) {
- var Ob = mO.value, wW = U(Ob, ["attrs", "name"]);
- wW === "adj1" ? hW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj2" ? bW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj3" ? uW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj4" && (mW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- GW.e(Mg);
- } finally {
- GW.f();
- }
- }
- var Ub = Math.min(I, g), ZO = bW < 0 ? 0 : bW > ZW ? ZW : bW, GO = 2 * ZO, Eb = Ub * (hW < 0 ? 0 : hW > GO ? GO : hW) / Qb, wO = Ub * ZO / Qb, Pb = wO - Eb / 2, pO = Ub * (uW < 0 ? 0 : uW > ZW ? ZW : uW) / Qb, BO = I - pO, WO = g - Pb, yO = Qb * (BO < WO ? BO : WO) / Ub, _b = Ub * (mW < 0 ? 0 : mW > yO ? yO : mW) / Qb, YO = _b - Eb, pW = YO > 0 ? YO : 0, NO = Eb + pW, BW = I - pO, WW = Pb + Eb, olg = WW + Pb, VO = Pb + _b, clg = WW + pW;
- i = "M 0,".concat(g, " L 0,").concat(VO, " ").concat(Vg(_b, VO, _b, _b, 180, 270, !1).replace("M", "L"), " L ").concat(BW, ",").concat(Pb, " L ").concat(BW, ",0 L ").concat(I, ",").concat(wO, " L ").concat(BW, ",").concat(olg, " L ").concat(BW, ",").concat(WW, " L ").concat(NO, ",").concat(WW, " ").concat(Vg(NO, clg, pW, pW, 270, 180, !1).replace("M", "L"), " L ").concat(Eb, ",").concat(g, " z");
- break;
- case "uturnArrow":
- var MO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), yW = 1.9685039370078738, YW = 1.9685039370078738, NW = 1.9685039370078738, VW = 3.444881889763779, MW = 5.905511811023621, RO = 1.9685039370078738, el = 7.874015748031495;
- if (MO) {
- var fO, RW = HI(MO);
- try {
- for (RW.s(); !(fO = RW.n()).done; ) {
- var _d = fO.value, qb = U(_d, ["attrs", "name"]);
- qb === "adj1" ? yW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj2" ? YW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj3" ? NW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj4" ? VW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj5" && (MW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- RW.e(Mg);
- } finally {
- RW.f();
- }
- }
- var Fn = Math.min(I, g), HO = YW < 0 ? 0 : YW > RO ? RO : YW, XO = 2 * HO, C5 = yW < 0 ? 0 : yW > XO ? XO : yW, SO = (el - C5 * Fn / g) * g / Fn, DO = NW < 0 ? 0 : NW > SO ? SO : NW, KO = (DO + C5) * Fn / g, $b = Fn * C5 / el, t5 = Fn * HO / el, FO = t5 - $b / 2, kO = g * (MW < KO ? KO : MW > el ? el : MW) / el, qd = kO - Fn * DO / el, i5 = I - FO, zO = i5 / 2, JO = el * (zO < qd ? zO : qd) / Fn, $A = Fn * (VW < 0 ? 0 : VW > JO ? JO : VW) / el, LO = $A - $b, $d = LO > 0 ? LO : 0, gu = $b + $d, vO = I - t5, TO = vO - t5, e5 = TO + FO, xO = i5 - $A, dlg = e5 - $d;
- i = "M 0,".concat(g, " L 0,").concat($A, " ").concat(Vg($A, $A, $A, $A, 180, 270, !1).replace("M", "L"), " L ").concat(xO, ",0 ").concat(Vg(xO, $A, $A, $A, 270, 360, !1).replace("M", "L"), " L ").concat(i5, ",").concat(qd, " L ").concat(I, ",").concat(qd, " L ").concat(vO, ",").concat(kO, " L ").concat(TO, ",").concat(qd, " L ").concat(e5, ",").concat(qd, " L ").concat(e5, ",").concat(gu, " ").concat(Vg(dlg, gu, $d, $d, 0, -90, !1).replace("M", "L"), " L ").concat(gu, ",").concat($b, " ").concat(Vg(gu, gu, $d, $d, 270, 180, !1).replace("M", "L"), " L ").concat($b, ",").concat(g, " z");
- break;
- case "stripedRightArrow":
- var jO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), fW = 3.9370078740157477, HW = 3.9370078740157477, A5 = 7.874015748031495;
- if (jO) {
- var QO, XW = HI(jO);
- try {
- for (XW.s(); !(QO = XW.n()).done; ) {
- var s5 = QO.value, OO = U(s5, ["attrs", "name"]);
- OO === "adj1" ? fW = parseInt(U(s5, ["attrs", "fmla"]).substring(4)) * Gg : OO === "adj2" && (HW = parseInt(U(s5, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- XW.e(Mg);
- } finally {
- XW.f();
- }
- }
- var l5 = g / 2, gr = Math.min(I, g), UO = 6.643700787401574 * I / gr, EO = 5 * gr / 32, SW = I - gr * (HW < 0 ? 0 : HW > UO ? UO : HW) / A5, PO = g * (fW < 0 ? 0 : fW > A5 ? A5 : fW) / 15.74803149606299, Ir = l5 - PO, Cr = l5 + PO, _O = gr / 8, qO = gr / 16, $O = gr / 32;
- i = "M 0,".concat(Ir, " L ").concat($O, ",").concat(Ir, " L ").concat($O, ",").concat(Cr, " L 0,").concat(Cr, " z M ").concat(qO, ",").concat(Ir, " L ").concat(_O, ",").concat(Ir, " L ").concat(_O, ",").concat(Cr, " L ").concat(qO, ",").concat(Cr, " z M ").concat(EO, ",").concat(Ir, " L ").concat(SW, ",").concat(Ir, " L ").concat(SW, ",0 L ").concat(I, ",").concat(l5, " L ").concat(SW, ",").concat(g, " L ").concat(SW, ",").concat(Cr, " L ").concat(EO, ",").concat(Cr, " z");
- break;
- case "notchedRightArrow":
- var g4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), DW = 3.9370078740157477, KW = 3.9370078740157477, FW = 7.874015748031495;
- if (g4) {
- var I4, kW = HI(g4);
- try {
- for (kW.s(); !(I4 = kW.n()).done; ) {
- var n5 = I4.value, C4 = U(n5, ["attrs", "name"]);
- C4 === "adj1" ? DW = parseInt(U(n5, ["attrs", "fmla"]).substring(4)) * Gg : C4 === "adj2" && (KW = parseInt(U(n5, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- kW.e(Mg);
- } finally {
- kW.f();
- }
- }
- var Iu = g / 2, rlg = Iu, t4 = Math.min(I, g), i4 = FW * I / t4, e4 = t4 * (KW < 0 ? 0 : KW > i4 ? i4 : KW) / FW, zW = I - e4, a5 = g * (DW < 0 ? 0 : DW > FW ? FW : DW) / 15.74803149606299, A4 = Iu - a5, s4 = Iu + a5, hlg = a5 * e4 / rlg;
- i = "M 0,".concat(A4, " L ").concat(zW, ",").concat(A4, " L ").concat(zW, ",0 L ").concat(I, ",").concat(Iu, " L ").concat(zW, ",").concat(g, " L ").concat(zW, ",").concat(s4, " L 0,").concat(s4, " L ").concat(hlg, ",").concat(Iu, " z");
- break;
- case "homePlate":
- var l4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), JW = 3.9370078740157477, n4 = 7.874015748031495;
- l4 && (JW = parseInt(l4.substring(4)) * Gg);
- var blg = g / 2, a4 = Math.min(I, g), o4 = n4 * I / a4, c4 = I - a4 * (JW < 0 ? 0 : JW > o4 ? o4 : JW) / n4;
- i = "M 0,0 L ".concat(c4, ",0 L ").concat(I, ",").concat(blg, " L ").concat(c4, ",").concat(g, " L 0,").concat(g, " z");
- break;
- case "chevron":
- var d4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), LW = 3.9370078740157477, r4 = 7.874015748031495;
- d4 && (LW = parseInt(d4.substring(4)) * Gg);
- var h4 = g / 2, b4 = Math.min(I, g), u4 = r4 * I / b4, m4 = b4 * (LW < 0 ? 0 : LW > u4 ? u4 : LW) / r4, Z4 = I - m4;
- i = "M 0,0 L ".concat(Z4, ",0 L ").concat(I, ",").concat(h4, " L ").concat(Z4, ",").concat(g, " L 0,").concat(g, " L ").concat(m4, ",").concat(h4, " z");
- break;
- case "rightArrowCallout":
- var G4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), vW = 1.9685039370078738, TW = 1.9685039370078738, xW = 1.9685039370078738, jW = 5.116299212598425, w4 = 3.9370078740157477, QW = 7.874015748031495;
- if (G4) {
- var p4, OW = HI(G4);
- try {
- for (OW.s(); !(p4 = OW.n()).done; ) {
- var Cu = p4.value, UW = U(Cu, ["attrs", "name"]);
- UW === "adj1" ? vW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj2" ? TW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj3" ? xW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj4" && (jW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- OW.e(Mg);
- } finally {
- OW.f();
- }
- }
- var tu = g / 2, B4 = I, W4 = g, tr = Math.min(I, g), y4 = w4 * g / tr, Y4 = TW < 0 ? 0 : TW > y4 ? y4 : TW, N4 = 2 * Y4, V4 = QW * I / tr, M4 = xW < 0 ? 0 : xW > V4 ? V4 : xW, R4 = w4 - M4 * tr / I, f4 = tr * Y4 / QW, H4 = tr * (vW < 0 ? 0 : vW > N4 ? N4 : vW) / 15.74803149606299, ulg = tu - f4, X4 = tu - H4, S4 = tu + H4, mlg = tu + f4, EW = B4 - tr * M4 / QW, PW = I * (jW < 0 ? 0 : jW > R4 ? R4 : jW) / QW;
- i = "M ".concat(0, ",").concat(0, " L ").concat(PW, ",").concat(0, " L ").concat(PW, ",").concat(X4, " L ").concat(EW, ",").concat(X4, " L ").concat(EW, ",").concat(ulg, " L ").concat(B4, ",").concat(tu, " L ").concat(EW, ",").concat(mlg, " L ").concat(EW, ",").concat(S4, " L ").concat(PW, ",").concat(S4, " L ").concat(PW, ",").concat(W4, " L ").concat(0, ",").concat(W4, " z");
- break;
- case "downArrowCallout":
- var D4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), _W = 1.9685039370078738, qW = 1.9685039370078738, $W = 1.9685039370078738, g2 = 5.116299212598425, iu = 7.874015748031495;
- if (D4) {
- var K4, I2 = HI(D4);
- try {
- for (I2.s(); !(K4 = I2.n()).done; ) {
- var eu = K4.value, C2 = U(eu, ["attrs", "name"]);
- C2 === "adj1" ? _W = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj2" ? qW = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj3" ? $W = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj4" && (g2 = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- I2.e(Mg);
- } finally {
- I2.f();
- }
- }
- var Au = I / 2, F4 = I, k4 = g, ir = Math.min(I, g), z4 = 3.9370078740157477 * I / ir, J4 = qW < 0 ? 0 : qW > z4 ? z4 : qW, L4 = 2 * J4, v4 = iu * g / ir, T4 = $W < 0 ? 0 : $W > v4 ? v4 : $W, x4 = iu - T4 * ir / g, j4 = ir * J4 / iu, Q4 = ir * (_W < 0 ? 0 : _W > L4 ? L4 : _W) / 15.74803149606299, Zlg = Au - j4, O4 = Au - Q4, U4 = Au + Q4, Glg = Au + j4, t2 = k4 - ir * T4 / iu, i2 = g * (g2 < 0 ? 0 : g2 > x4 ? x4 : g2) / iu;
- i = "M ".concat(0, ",").concat(0, " L ").concat(F4, ",").concat(0, " L ").concat(F4, ",").concat(i2, " L ").concat(U4, ",").concat(i2, " L ").concat(U4, ",").concat(t2, " L ").concat(Glg, ",").concat(t2, " L ").concat(Au, ",").concat(k4, " L ").concat(Zlg, ",").concat(t2, " L ").concat(O4, ",").concat(t2, " L ").concat(O4, ",").concat(i2, " L ").concat(0, ",").concat(i2, " z");
- break;
- case "leftArrowCallout":
- var E4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), e2 = 1.9685039370078738, A2 = 1.9685039370078738, s2 = 1.9685039370078738, l2 = 5.116299212598425, su = 7.874015748031495;
- if (E4) {
- var P4, n2 = HI(E4);
- try {
- for (n2.s(); !(P4 = n2.n()).done; ) {
- var lu = P4.value, a2 = U(lu, ["attrs", "name"]);
- a2 === "adj1" ? e2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj2" ? A2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj3" ? s2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj4" && (l2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- n2.e(Mg);
- } finally {
- n2.f();
- }
- }
- var nu = g / 2, o5 = I, _4 = g, er = Math.min(I, g), q4 = 3.9370078740157477 * g / er, $4 = A2 < 0 ? 0 : A2 > q4 ? q4 : A2, gU = 2 * $4, IU = su * I / er, CU = s2 < 0 ? 0 : s2 > IU ? IU : s2, tU = su - CU * er / I, iU = er * $4 / su, eU = er * (e2 < 0 ? 0 : e2 > gU ? gU : e2) / 15.74803149606299, wlg = nu - iU, AU = nu - eU, sU = nu + eU, plg = nu + iU, o2 = er * CU / su, c2 = o5 - I * (l2 < 0 ? 0 : l2 > tU ? tU : l2) / su;
- i = "M ".concat(0, ",").concat(nu, " L ").concat(o2, ",").concat(wlg, " L ").concat(o2, ",").concat(AU, " L ").concat(c2, ",").concat(AU, " L ").concat(c2, ",").concat(0, " L ").concat(o5, ",").concat(0, " L ").concat(o5, ",").concat(_4, " L ").concat(c2, ",").concat(_4, " L ").concat(c2, ",").concat(sU, " L ").concat(o2, ",").concat(sU, " L ").concat(o2, ",").concat(plg, " z");
- break;
- case "upArrowCallout":
- var lU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), d2 = 1.9685039370078738, r2 = 1.9685039370078738, h2 = 1.9685039370078738, b2 = 5.116299212598425, au = 7.874015748031495;
- if (lU) {
- var nU, u2 = HI(lU);
- try {
- for (u2.s(); !(nU = u2.n()).done; ) {
- var ou = nU.value, m2 = U(ou, ["attrs", "name"]);
- m2 === "adj1" ? d2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj2" ? r2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj3" ? h2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj4" && (b2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- u2.e(Mg);
- } finally {
- u2.f();
- }
- }
- var cu = I / 2, aU = I, c5 = g, Ar = Math.min(I, g), oU = 3.9370078740157477 * I / Ar, cU = r2 < 0 ? 0 : r2 > oU ? oU : r2, dU = 2 * cU, rU = au * g / Ar, hU = h2 < 0 ? 0 : h2 > rU ? rU : h2, bU = au - hU * Ar / g, uU = Ar * cU / au, mU = Ar * (d2 < 0 ? 0 : d2 > dU ? dU : d2) / 15.74803149606299, Blg = cu - uU, ZU = cu - mU, GU = cu + mU, Wlg = cu + uU, Z2 = Ar * hU / au, G2 = c5 - g * (b2 < 0 ? 0 : b2 > bU ? bU : b2) / au;
- i = "M ".concat(0, ",").concat(G2, " L ").concat(ZU, ",").concat(G2, " L ").concat(ZU, ",").concat(Z2, " L ").concat(Blg, ",").concat(Z2, " L ").concat(cu, ",").concat(0, " L ").concat(Wlg, ",").concat(Z2, " L ").concat(GU, ",").concat(Z2, " L ").concat(GU, ",").concat(G2, " L ").concat(aU, ",").concat(G2, " L ").concat(aU, ",").concat(c5, " L ").concat(0, ",").concat(c5, " z");
- break;
- case "leftRightArrowCallout":
- var wU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), w2 = 1.9685039370078738, p2 = 1.9685039370078738, B2 = 1.9685039370078738, W2 = 3.7892125984251965, pU = 3.9370078740157477, d5 = 7.874015748031495, BU = 15.74803149606299;
- if (wU) {
- var WU, y2 = HI(wU);
- try {
- for (y2.s(); !(WU = y2.n()).done; ) {
- var du = WU.value, Y2 = U(du, ["attrs", "name"]);
- Y2 === "adj1" ? w2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj2" ? p2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj3" ? B2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj4" && (W2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- y2.e(Mg);
- } finally {
- y2.f();
- }
- }
- var sr = g / 2, yU = I / 2, YU = I, NU = g, lr = Math.min(I, g), VU = pU * g / lr, MU = p2 < 0 ? 0 : p2 > VU ? VU : p2, RU = 2 * MU, fU = pU * I / lr, HU = B2 < 0 ? 0 : B2 > fU ? fU : B2, XU = d5 - HU * lr / (I / 2), SU = lr * MU / d5, DU = lr * (w2 < 0 ? 0 : w2 > RU ? RU : w2) / BU, KU = sr - SU, N2 = sr - DU, V2 = sr + DU, FU = sr + SU, ru = lr * HU / d5, M2 = YU - ru, kU = I * (W2 < 0 ? 0 : W2 > XU ? XU : W2) / BU, R2 = yU - kU, f2 = yU + kU;
- i = "M ".concat(0, ",").concat(sr, " L ").concat(ru, ",").concat(KU, " L ").concat(ru, ",").concat(N2, " L ").concat(R2, ",").concat(N2, " L ").concat(R2, ",").concat(0, " L ").concat(f2, ",").concat(0, " L ").concat(f2, ",").concat(N2, " L ").concat(M2, ",").concat(N2, " L ").concat(M2, ",").concat(KU, " L ").concat(YU, ",").concat(sr, " L ").concat(M2, ",").concat(FU, " L ").concat(M2, ",").concat(V2, " L ").concat(f2, ",").concat(V2, " L ").concat(f2, ",").concat(NU, " L ").concat(R2, ",").concat(NU, " L ").concat(R2, ",").concat(V2, " L ").concat(ru, ",").concat(V2, " L ").concat(ru, ",").concat(FU, " z");
- break;
- case "quadArrowCallout":
- var zU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), H2 = 1.4578740157480314, X2 = 1.4578740157480314, S2 = 1.4578740157480314, D2 = 3.7892125984251965, r5 = 3.9370078740157477, h5 = 7.874015748031495, b5 = 15.74803149606299;
- if (zU) {
- var JU, K2 = HI(zU);
- try {
- for (K2.s(); !(JU = K2.n()).done; ) {
- var hu = JU.value, F2 = U(hu, ["attrs", "name"]);
- F2 === "adj1" ? H2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj2" ? X2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj3" ? S2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj4" && (D2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- K2.e(Mg);
- } finally {
- K2.f();
- }
- }
- var kn = g / 2, zn = I / 2, LU = I, vU = g, u5 = Math.min(I, g), m5 = X2 < 0 ? 0 : X2 > r5 ? r5 : X2, TU = 2 * m5, Z5 = H2 < 0 ? 0 : H2 > TU ? TU : H2, xU = r5 - m5, jU = S2 < 0 ? 0 : S2 > xU ? xU : S2, QU = h5 - 2 * jU, OU = D2 < Z5 ? Z5 : D2 > QU ? QU : D2, k2 = u5 * m5 / h5, z2 = u5 * Z5 / b5, gs = u5 * jU / h5, UU = I * OU / b5, EU = g * OU / b5, J2 = LU - gs, L2 = zn - UU, v2 = zn + UU, PU = zn - k2, _U = zn + k2, T2 = zn - z2, x2 = zn + z2, j2 = vU - gs, Q2 = kn - EU, O2 = kn + EU, qU = kn - k2, $U = kn + k2, U2 = kn - z2, E2 = kn + z2;
- i = "M ".concat(0, ",").concat(kn, " L ").concat(gs, ",").concat(qU, " L ").concat(gs, ",").concat(U2, " L ").concat(L2, ",").concat(U2, " L ").concat(L2, ",").concat(Q2, " L ").concat(T2, ",").concat(Q2, " L ").concat(T2, ",").concat(gs, " L ").concat(PU, ",").concat(gs, " L ").concat(zn, ",").concat(0, " L ").concat(_U, ",").concat(gs, " L ").concat(x2, ",").concat(gs, " L ").concat(x2, ",").concat(Q2, " L ").concat(v2, ",").concat(Q2, " L ").concat(v2, ",").concat(U2, " L ").concat(J2, ",").concat(U2, " L ").concat(J2, ",").concat(qU, " L ").concat(LU, ",").concat(kn, " L ").concat(J2, ",").concat($U, " L ").concat(J2, ",").concat(E2, " L ").concat(v2, ",").concat(E2, " L ").concat(v2, ",").concat(O2, " L ").concat(x2, ",").concat(O2, " L ").concat(x2, ",").concat(j2, " L ").concat(_U, ",").concat(j2, " L ").concat(zn, ",").concat(vU, " L ").concat(PU, ",").concat(j2, " L ").concat(T2, ",").concat(j2, " L ").concat(T2, ",").concat(O2, " L ").concat(L2, ",").concat(O2, " L ").concat(L2, ",").concat(E2, " L ").concat(gs, ",").concat(E2, " L ").concat(gs, ",").concat($U, " z");
- break;
- case "curvedDownArrow":
- var gE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), P2 = 1.9685039370078738, _2 = 3.9370078740157477, q2 = 1.9685039370078738, nr = 7.874015748031495;
- if (gE) {
- var IE, $2 = HI(gE);
- try {
- for ($2.s(); !(IE = $2.n()).done; ) {
- var gy = IE.value, G5 = U(gy, ["attrs", "name"]);
- G5 === "adj1" ? P2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg : G5 === "adj2" ? _2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg : G5 === "adj3" && (q2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- $2.e(Mg);
- } finally {
- $2.f();
- }
- }
- var ylg = I / 2, Ylg = I, CE = g, Iy = 270, bu = Math.min(I, g), tE = 3.9370078740157477 * I / bu, po = bu * (P2 < 0 ? 0 : P2 > nr ? nr : P2) / nr, w5 = bu * (_2 < 0 ? 0 : _2 > tE ? tE : _2) / nr, Is = ylg - (po + w5) / 4, p5 = 2 * Is, iE = Math.sqrt(p5 * p5 - po * po) * g / p5, eE = nr * iE / bu, Cy = bu * (q2 < 0 ? 0 : q2 > eE ? eE : q2) / nr, uu = Is + po, B5 = Math.sqrt(g * g - Cy * Cy) * Is / g, W5 = Is + B5, AE = (w5 - po) / 2, Nlg = W5 - AE, Vlg = uu + B5 + AE, Mlg = Ylg - w5 / 2, ty = CE - Cy, y5 = 180 * Math.atan(B5 / Cy) / Math.PI, Rlg = -y5, Y5 = 180 * Math.atan(po / 2 / iE) / Math.PI, sE = Iy + y5, lE = Iy - Y5, flg = Y5 - 90, Hlg = 90 + Y5;
- i = "M ".concat(Mlg, ",").concat(CE, " L ").concat(Nlg, ",").concat(ty, " L ").concat(W5, ",").concat(ty, " ").concat(Vg(Is, g, Is, g, sE, sE + Rlg, !1).replace("M", "L"), " L ").concat(uu, ",").concat(0, " ").concat(Vg(uu, g, Is, g, Iy, Iy + y5, !1).replace("M", "L"), " L ").concat(W5 + po, ",").concat(ty, " L ").concat(Vlg, ",").concat(ty, " z M ").concat(uu, ",").concat(0, " ").concat(Vg(uu, g, Is, g, lE, lE + flg, !1).replace("M", "L"), " ").concat(Vg(Is, g, Is, g, 180, 180 + Hlg, !1).replace("M", "L"));
- break;
- case "curvedLeftArrow":
- var nE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), iy = 1.9685039370078738, ey = 3.9370078740157477, Ay = 1.9685039370078738, sy = 7.874015748031495;
- if (nE) {
- var aE, ly = HI(nE);
- try {
- for (ly.s(); !(aE = ly.n()).done; ) {
- var ny = aE.value, N5 = U(ny, ["attrs", "name"]);
- N5 === "adj1" ? iy = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg : N5 === "adj2" ? ey = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg : N5 === "adj3" && (Ay = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- ly.e(Mg);
- } finally {
- ly.f();
- }
- }
- var Xlg = g / 2, oE = I, Slg = g, cE = 270, mu = Math.min(I, g), dE = 3.9370078740157477 * g / mu, V5 = ey < 0 ? 0 : ey > dE ? dE : ey, ar = mu * (iy < 0 ? 0 : iy > V5 ? V5 : iy) / sy, M5 = mu * V5 / sy, ie = Xlg - (ar + M5) / 4, R5 = 2 * ie, rE = Math.sqrt(R5 * R5 - ar * ar) * I / R5, hE = sy * rE / mu, ay = mu * (Ay < 0 ? 0 : Ay > hE ? hE : Ay) / sy, or = ie + ar, f5 = Math.sqrt(I * I - ay * ay) * ie / I, bE = ie + f5, uE = or + f5, mE = (M5 - ar) / 2, Dlg = bE - mE, Klg = uE + mE, Flg = Slg - M5 / 2, oy = 0 + ay, ZE = Math.atan(f5 / ay), klg = Math.atan(ar / 2 / rE) - ZE, H5 = 180 * ZE / Math.PI, zlg = 180 * klg / Math.PI;
- i = "M ".concat(oE, ",").concat(or, " ").concat(Vg(0, ie, I, ie, 0, -90, !1).replace("M", "L"), " L ").concat(0, ",").concat(0, " ").concat(Vg(0, or, I, ie, cE, 360, !1).replace("M", "L"), " L ").concat(oE, ",").concat(or, " ").concat(Vg(0, or, I, ie, 0, H5, !1).replace("M", "L"), " L ").concat(oy, ",").concat(uE, " L ").concat(oy, ",").concat(Klg, " L ").concat(0, ",").concat(Flg, " L ").concat(oy, ",").concat(Dlg, " L ").concat(oy, ",").concat(bE, " ").concat(Vg(0, ie, I, ie, H5, H5 + zlg, !1).replace("M", "L"), " ").concat(Vg(0, ie, I, ie, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, or, I, ie, cE, 360, !1).replace("M", "L"));
- break;
- case "curvedRightArrow":
- var GE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), cy = 1.9685039370078738, dy = 3.9370078740157477, ry = 1.9685039370078738, hy = 7.874015748031495;
- if (GE) {
- var wE, by = HI(GE);
- try {
- for (by.s(); !(wE = by.n()).done; ) {
- var uy = wE.value, X5 = U(uy, ["attrs", "name"]);
- X5 === "adj1" ? cy = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg : X5 === "adj2" ? dy = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg : X5 === "adj3" && (ry = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- by.e(Mg);
- } finally {
- by.f();
- }
- }
- var Jlg = g / 2, S5 = I, Llg = g, D5 = 180, Zu = Math.min(I, g), pE = 3.9370078740157477 * g / Zu, K5 = dy < 0 ? 0 : dy > pE ? pE : dy, Bo = Zu * (cy < 0 ? 0 : cy > K5 ? K5 : cy) / hy, F5 = Zu * K5 / hy, Fe = Jlg - (Bo + F5) / 4, k5 = 2 * Fe, BE = Math.sqrt(k5 * k5 - Bo * Bo) * I / k5, WE = hy * BE / Zu, my = Zu * (ry < 0 ? 0 : ry > WE ? WE : ry) / hy, z5 = Fe + Bo, J5 = Math.sqrt(I * I - my * my) * Fe / I, yE = Fe + J5, YE = z5 + J5, NE = (F5 - Bo) / 2, vlg = yE - NE, Tlg = YE + NE, xlg = Llg - F5 / 2, Zy = S5 - my, L5 = Math.atan(J5 / my), jlg = Math.PI - L5, Qlg = -L5, Olg = Math.atan(Bo / 2 / BE) - Math.PI / 2, VE = 180 * jlg / Math.PI, Ulg = 180 * Qlg / Math.PI, Elg = 180 * L5 / Math.PI, Plg = 180 * Olg / Math.PI;
- i = "M ".concat(0, ",").concat(Fe, " ").concat(Vg(I, Fe, I, Fe, D5, D5 + Ulg, !1).replace("M", "L"), " L ").concat(Zy, ",").concat(yE, " L ").concat(Zy, ",").concat(vlg, " L ").concat(S5, ",").concat(xlg, " L ").concat(Zy, ",").concat(Tlg, " L ").concat(Zy, ",").concat(YE, " ").concat(Vg(I, z5, I, Fe, VE, VE + Elg, !1).replace("M", "L"), " L ").concat(0, ",").concat(Fe, " ").concat(Vg(I, Fe, I, Fe, D5, 270, !1).replace("M", "L"), " L ").concat(S5, ",").concat(Bo, " ").concat(Vg(I, z5, I, Fe, 270, 270 + Plg, !1).replace("M", "L"));
- break;
- case "curvedUpArrow":
- var ME = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Gy = 1.9685039370078738, wy = 3.9370078740157477, py = 1.9685039370078738, cr = 7.874015748031495;
- if (ME) {
- var RE, By = HI(ME);
- try {
- for (By.s(); !(RE = By.n()).done; ) {
- var Wy = RE.value, v5 = U(Wy, ["attrs", "name"]);
- v5 === "adj1" ? Gy = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg : v5 === "adj2" ? wy = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg : v5 === "adj3" && (py = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- By.e(Mg);
- } finally {
- By.f();
- }
- }
- var _lg = I / 2, qlg = I, $lg = g, Gu = Math.min(I, g), fE = 3.9370078740157477 * I / Gu, Wo = Gu * (Gy < 0 ? 0 : Gy > cr ? cr : Gy) / cr, T5 = Gu * (wy < 0 ? 0 : wy > fE ? fE : wy) / cr, cA = _lg - (Wo + T5) / 4, x5 = 2 * cA, HE = Math.sqrt(x5 * x5 - Wo * Wo) * g / x5, XE = cr * HE / Gu, yy = Gu * (py < 0 ? 0 : py > XE ? XE : py) / cr, j5 = cA + Wo, Q5 = Math.sqrt(g * g - yy * yy) * cA / g, SE = cA + Q5, DE = j5 + Q5, KE = (T5 - Wo) / 2, gng = SE - KE, Ing = DE + KE, Cng = qlg - T5 / 2, Yy = 0 + yy, O5 = Math.atan(Q5 / yy), FE = Math.atan(Wo / 2 / HE), tng = FE - O5, ing = Math.PI / 2 - O5, kE = 180 * (Math.PI / 2 - FE) / Math.PI, eng = 180 * tng / Math.PI, zE = 180 * ing / Math.PI, Ang = 180 * O5 / Math.PI;
- i = "".concat(Vg(cA, 0, cA, g, kE, kE + eng, !1), " L ").concat(SE, ",").concat(Yy, " L ").concat(gng, ",").concat(Yy, " L ").concat(Cng, ",").concat(0, " L ").concat(Ing, ",").concat(Yy, " L ").concat(DE, ",").concat(Yy, " ").concat(Vg(j5, 0, cA, g, zE, zE + Ang, !1).replace("M", "L"), " L ").concat(cA, ",").concat($lg, " ").concat(Vg(cA, 0, cA, g, 90, 180, !1).replace("M", "L"), " L ").concat(Wo, ",").concat(0, " ").concat(Vg(j5, 0, cA, g, 180, 90, !1).replace("M", "L"));
- break;
- case "mathDivide":
- case "mathEqual":
- case "mathMinus":
- case "mathMultiply":
- case "mathNotEqual":
- case "mathPlus":
- var CC, ft, ke, Ny = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
- if (Ny) if (Array.isArray(Ny)) {
- var JE, Vy = HI(Ny);
- try {
- for (Vy.s(); !(JE = Vy.n()).done; ) {
- var My = JE.value, U5 = U(My, ["attrs", "name"]);
- U5 === "adj1" ? CC = parseInt(U(My, ["attrs", "fmla"]).substring(4)) : U5 === "adj2" ? ft = parseInt(U(My, ["attrs", "fmla"]).substring(4)) : U5 === "adj3" && (ke = parseInt(U(My, ["attrs", "fmla"]).substring(4)));
- }
- } catch (Mg) {
- Vy.e(Mg);
- } finally {
- Vy.f();
- }
- } else CC = parseInt(U(Ny, ["attrs", "fmla"]).substring(4));
- var LE = 3.9370078740157477, Cs = 7.874015748031495, dA = 15.74803149606299, qC = I / 2, ci = g / 2, Al = g / 2;
- if (t === "mathNotEqual") {
- CC === void 0 && (CC = 23520), ft === void 0 && (ft = 66e5), ke === void 0 && (ke = 11760), CC *= Gg, ft = ft / 6e4 * Math.PI / 180, ke *= Gg;
- var vE = 70 * Math.PI / 180, TE = 110 * Math.PI / 180, xE = CC < 0 ? 0 : CC > LE ? LE : CC, jE = Cs - 2 * xE, wu = g * xE / Cs, QE = g * (ke < 0 ? 0 : ke > jE ? jE : ke) / dA, OE = 5.7866141732283465 * I / dA, Ry = qC - OE, fy = qC + OE, dr = ci - QE, rr = ci + QE, pu = dr - wu, Bu = rr + wu, Wu = (ft < vE ? vE : ft > TE ? TE : ft) - Math.PI / 2, Jn = Al * Math.tan(Wu), E5 = Math.sqrt(Jn * Jn + Al * Al), yo = E5 * wu / Al, Ln = qC + Jn - yo / 2, UE = Ln - Jn * pu / Al, EE = Ln - Jn * dr / Al, PE = Ln - Jn * rr / Al, _E = Ln - Jn * Bu / Al, sng = UE + yo, lng = EE + yo, nng = PE + yo, ang = _E + yo, qE = wu * Al / E5, $E = Wu > 0 ? Ln + qE : Ln + yo, g7 = Wu > 0 ? Ln : Ln + yo - qE, I7 = wu * Jn / E5, C7 = Wu > 0 ? I7 : 0, t7 = Wu > 0 ? 0 : -I7, ong = I - $E, cng = I - g7, dng = g - C7, rng = g - t7;
- i = "M ".concat(Ry, ",").concat(pu, " L ").concat(UE, ",").concat(pu, " L ").concat(g7, ",").concat(t7, " L ").concat($E, ",").concat(C7, " L ").concat(sng, ",").concat(pu, " L ").concat(fy, ",").concat(pu, " L ").concat(fy, ",").concat(dr, " L ").concat(lng, ",").concat(dr, " L ").concat(nng, ",").concat(rr, " L ").concat(fy, ",").concat(rr, " L ").concat(fy, ",").concat(Bu, " L ").concat(ang, ",").concat(Bu, " L ").concat(cng, ",").concat(rng, " L ").concat(ong, ",").concat(dng, " L ").concat(_E, ",").concat(Bu, " L ").concat(Ry, ",").concat(Bu, " L ").concat(Ry, ",").concat(rr, " L ").concat(PE, ",").concat(rr, " L ").concat(EE, ",").concat(dr, " L ").concat(Ry, ",").concat(dr, " z");
- } else if (t === "mathDivide") {
- CC === void 0 && (CC = 23520), ft === void 0 && (ft = 5880), ke === void 0 && (ke = 11760);
- var Hy = 0.07874015748031496, P5 = 2.8933070866141732, _5 = 5.7866141732283465, q5 = (CC *= Gg) < Hy ? Hy : CC > P5 ? P5 : CC, i7 = (_5 - q5) / 4, e7 = P5 * I / g, A7 = i7 < e7 ? i7 : e7, s7 = (ke *= Gg) < Hy ? Hy : ke > A7 ? A7 : ke, l7 = _5 - 4 * s7 - q5, n7 = g * q5 / dA, ze = g * s7 / Cs, a7 = I * _5 / dA, $5 = ci - n7, o7 = ci + n7, Xy = $5 - (g * ((ft *= Gg) < 0 ? 0 : ft > l7 ? l7 : ft) / Cs + ze) - ze, gH = g - Xy, c7 = qC - a7, d7 = qC + a7;
- i = "M ".concat(qC, ",").concat(Xy, " A ").concat(ze, ",").concat(ze, " 0 1,0 ").concat(qC, ",").concat(Xy + 2 * ze, " A ").concat(ze, ",").concat(ze, " 0 1,0 ").concat(qC, ",").concat(Xy, " z M ").concat(qC, ",").concat(gH, " A ").concat(ze, ",").concat(ze, " 0 1,1 ").concat(qC, ",").concat(gH - 2 * ze, " A ").concat(ze, ",").concat(ze, " 0 1,1 ").concat(qC, ",").concat(gH, " z M ").concat(c7, ",").concat($5, " L ").concat(d7, ",").concat($5, " L ").concat(d7, ",").concat(o7, " L ").concat(c7, ",").concat(o7, " z");
- } else if (t === "mathEqual") {
- CC === void 0 && (CC = 23520), ft === void 0 && (ft = 11760);
- var r7 = 2.8933070866141732, h7 = (CC *= Gg) < 0 ? 0 : CC > r7 ? r7 : CC, b7 = Cs - 2 * h7, u7 = g * h7 / Cs, m7 = g * ((ft *= Gg) < 0 ? 0 : ft > b7 ? b7 : ft) / dA, Z7 = 5.7866141732283465 * I / dA, IH = ci - m7, CH = ci + m7, G7 = IH - u7, w7 = CH + u7, Sy = qC - Z7, Dy = qC + Z7;
- i = "M ".concat(Sy, ",").concat(G7, " L ").concat(Dy, ",").concat(G7, " L ").concat(Dy, ",").concat(IH, " L ").concat(Sy, ",").concat(IH, " z M ").concat(Sy, ",").concat(CH, " L ").concat(Dy, ",").concat(CH, " L ").concat(Dy, ",").concat(w7, " L ").concat(Sy, ",").concat(w7, " z");
- } else if (t === "mathMinus") {
- CC === void 0 && (CC = 23520);
- var p7 = g * ((CC *= Gg) < 0 ? 0 : CC > Cs ? Cs : CC) / dA, B7 = 5.7866141732283465 * I / dA, W7 = ci - p7, y7 = ci + p7, Y7 = qC - B7, N7 = qC + B7;
- i = "M ".concat(Y7, ",").concat(W7, " L ").concat(N7, ",").concat(W7, " L ").concat(N7, ",").concat(y7, " L ").concat(Y7, ",").concat(y7, " z");
- } else if (t === "mathMultiply") {
- CC === void 0 && (CC = 23520), CC *= Gg;
- var tH = 4.091732283464567, V7 = Math.min(I, g) * (CC < 0 ? 0 : CC > tH ? tH : CC) / Cs, iH = Math.atan(g / I), M7 = Math.sin(iH), R7 = Math.cos(iH), eH = Math.tan(iH), f7 = Math.sqrt(I * I + g * g), H7 = f7 - f7 * tH / Cs, X7 = R7 * H7 / 2, S7 = M7 * H7 / 2, D7 = M7 * V7 / 2, K7 = R7 * V7 / 2, Ky = X7 - D7, yu = S7 + K7, Fy = X7 + D7, ky = S7 - K7, F7 = (qC - Fy) * eH + ky, k7 = I - Fy, AH = I - Ky, hng = AH - (ci - yu) / eH, bng = Ky + (ci - yu) / eH, z7 = g - yu, J7 = g - ky, ung = g - F7;
- i = "M ".concat(Ky, ",").concat(yu, " L ").concat(Fy, ",").concat(ky, " L ").concat(qC, ",").concat(F7, " L ").concat(k7, ",").concat(ky, " L ").concat(AH, ",").concat(yu, " L ").concat(hng, ",").concat(ci, " L ").concat(AH, ",").concat(z7, " L ").concat(k7, ",").concat(J7, " L ").concat(qC, ",").concat(ung, " L ").concat(Fy, ",").concat(J7, " L ").concat(Ky, ",").concat(z7, " L ").concat(bng, ",").concat(ci, " z");
- } else if (t === "mathPlus") {
- CC === void 0 && (CC = 23520), CC *= Gg;
- var zy = 5.7866141732283465, mng = Math.min(I, g), L7 = I * zy / dA, v7 = g * zy / dA, Jy = mng * (CC < 0 ? 0 : CC > zy ? zy : CC) / dA, T7 = qC - L7, Ly = qC - Jy, vy = qC + Jy, x7 = qC + L7, j7 = ci - v7, Ty = ci - Jy, xy = ci + Jy, Q7 = ci + v7;
- i = "M ".concat(T7, ",").concat(Ty, " L ").concat(Ly, ",").concat(Ty, " L ").concat(Ly, ",").concat(j7, " L ").concat(vy, ",").concat(j7, " L ").concat(vy, ",").concat(Ty, " L ").concat(x7, ",").concat(Ty, " L ").concat(x7, ",").concat(xy, " L ").concat(vy, ",").concat(xy, " L ").concat(vy, ",").concat(Q7, " L ").concat(Ly, ",").concat(Q7, " L ").concat(Ly, ",").concat(xy, " L ").concat(T7, ",").concat(xy, " z");
- }
- break;
- case "can":
- case "flowChartMagneticDisk":
- case "flowChartMagneticDrum":
- var O7 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Yu = 1.9685039370078738;
- O7 && (Yu = parseInt(O7.substring(4)) * Gg), t !== "flowChartMagneticDisk" && t !== "flowChartMagneticDrum" || (Yu = 3.9370078740157477);
- var U7 = Math.min(I, g), E7 = 3.9370078740157477 * g / U7, Yo = U7 * (Yu < 0 ? 0 : Yu > E7 ? E7 : Yu) / 15.74803149606299, P7 = g - Yo, sH = 180, hr = I / 2, lH = "".concat(Vg(hr, Yo, hr, Yo, 0, sH, !1), " ").concat(Vg(hr, Yo, hr, Yo, sH, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(P7, " ").concat(Vg(hr, P7, hr, Yo, 0, sH, !1).replace("M", "L"), " L 0,").concat(Yo);
- t === "flowChartMagneticDrum" && (lH = lH.replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC) {
- var OC = I / 2 - (parseFloat(QC) - g / 2), zi = g / 2 + (parseFloat(YC) - I / 2);
- return "".concat(RI).concat(OC, " ").concat(zi);
- }).replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC, OC, zi) {
- var UC = I / 2 - (parseFloat(QC) - g / 2), Ct = g / 2 + (parseFloat(YC) - I / 2), Zt = I / 2 - (parseFloat(zi) - g / 2), Ht = g / 2 + (parseFloat(OC) - I / 2);
- return "".concat(RI).concat(UC, " ").concat(Ct, " ").concat(Zt, " ").concat(Ht);
- })), i = lH;
- break;
- case "swooshArrow":
- var _7 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), No = Gg, jy = 25e3 * No, Qy = 16667 * No;
- if (_7) {
- var q7, Oy = HI(_7);
- try {
- for (Oy.s(); !(q7 = Oy.n()).done; ) {
- var nH = q7.value, $7 = U(nH, ["attrs", "name"]);
- $7 === "adj1" ? jy = parseInt(U(nH, ["attrs", "fmla"]).substring(4)) * No : $7 === "adj2" && (Qy = parseInt(U(nH, ["attrs", "fmla"]).substring(4)) * No);
- }
- } catch (Mg) {
- Oy.e(Mg);
- } finally {
- Oy.f();
- }
- }
- var gP = 1 * No, IP = 75e3 * No, CP = 1e5 * No, aH = Math.min(I, g), oH = aH / 8, cH = g / 6, tP = 5.511811023622047 * I / aH, iP = g * (jy < gP ? gP : jy > IP ? IP : jy) / CP, dH = I - aH * (Qy < 0 ? 0 : Qy > tP ? tP : Qy) / CP, eP = oH, AP = Math.PI / 2 / 14, sP = oH * Math.tan(AP), Zng = dH - sP, rH = eP + iP, lP = dH + iP * Math.tan(AP), Gng = lP + sP, nP = rH + oH, wng = nP / 2 - g / 20, png = cH + cH, Bng = I / 6, Wng = rH + cH / 2, yng = I / 4;
- i = "M 0,".concat(g, " Q ").concat(Bng, ",").concat(png, " ").concat(dH, ",").concat(eP, " L ").concat(Zng, ",0 L ").concat(I, ",").concat(wng, " L ").concat(Gng, ",").concat(nP, " L ").concat(lP, ",").concat(rH, " Q ").concat(yng, ",").concat(Wng, " 0,").concat(g, " z");
- break;
- case "circularArrow":
- var aP = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Uy = 0.9842519685039369, Ey = 19.03865 * Math.PI / 180, Py = 340.96135 * Math.PI / 180, _y = 180 * Math.PI / 180, qy = 0.9842519685039369;
- if (aP) {
- var oP, $y = HI(aP);
- try {
- for ($y.s(); !(oP = $y.n()).done; ) {
- var br = oP.value, Nu = U(br, ["attrs", "name"]);
- Nu === "adj1" ? Uy = parseInt(U(br, ["attrs", "fmla"]).substring(4)) * Gg : Nu === "adj2" ? Ey = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj3" ? Py = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj4" ? _y = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj5" && (qy = parseInt(U(br, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- $y.e(Mg);
- } finally {
- $y.f();
- }
- }
- var Vo = I / 2, Mo = g / 2, Yng = I / 2, Nng = g / 2, cP = Math.min(I, g), dP = 1.9685039370078738, rP = 7.874015748031495, hP = 1 / 6e4 * Math.PI / 180, gY = 21599999 / 6e4 * Math.PI / 180, Ro = 2 * Math.PI, bP = qy < 0 ? 0 : qy > dP ? dP : qy, uP = 2 * bP, ur = Py < hP ? hP : Py > gY ? gY : Py, hH = _y < 0 ? 0 : _y > gY ? gY : _y, bH = cP * (Uy < 0 ? 0 : Uy > uP ? uP : Uy) / rP, fo = cP * bP / rP, IY = bH / 2, mr = Yng + IY - fo, Zr = Nng + IY - fo, Ho = mr - bH, Xo = Zr - bH, CY = Ho + IY, tY = Xo + IY, mP = CY * Math.sin(ur), ZP = tY * Math.cos(ur), vn = CY * Math.cos(Math.atan2(mP, ZP)), Gr = tY * Math.sin(Math.atan2(mP, ZP)), GP = Vo + vn, wP = Mo + Gr, di = Math.min(Ho, Xo), Vng = 1 - (vn * vn - di * di) * (Gr * Gr - di * di) / (vn * vn * Gr * Gr), uH = (1 + Math.sqrt(Vng)) / ((vn * vn - di * di) / vn / Gr), mH = Math.atan2(uH, 1) > 0 ? Math.atan2(uH, 1) : Math.atan2(uH, 1) + Ro, ZH = mH - ur > 0 ? mH - ur : mH - ur + Ro, Mng = ZH - Math.PI > 0 ? ZH - Ro : ZH, pP = Math.abs(Mng), wr = ur + (Ey < 0 ? 0 : Ey > pP ? pP : Ey), BP = CY * Math.sin(wr), WP = tY * Math.cos(wr), Rng = Vo + CY * Math.cos(Math.atan2(BP, WP)), fng = Mo + tY * Math.sin(Math.atan2(BP, WP)), yP = GP + fo * Math.cos(wr), YP = wP + fo * Math.sin(wr), NP = GP - fo * Math.cos(wr), VP = wP - fo * Math.sin(wr), MP = NP - Vo, RP = VP - Mo, fP = yP - Vo, HP = YP - Mo, Tn = Math.min(mr, Zr), XP = MP * Tn / mr, SP = RP * Tn / Zr, iY = fP * Tn / mr, eY = HP * Tn / Zr, pr = iY - XP, So = eY - SP, ts = Math.sqrt(pr * pr + So * So), Br = XP * eY - iY * SP, AY = Math.sqrt(Math.max(0, Tn * Tn * ts * ts - Br * Br)), sY = -1 * So > 0 ? -1 : 1, DP = (Br * So + sY * pr * AY) / (ts * ts), KP = (Br * So - sY * pr * AY) / (ts * ts), FP = (-Br * pr + Math.abs(So) * AY) / (ts * ts), kP = (-Br * pr - Math.abs(So) * AY) / (ts * ts), zP = Math.sqrt(Math.pow(iY - KP, 2) + Math.pow(eY - kP, 2)) - Math.sqrt(Math.pow(iY - DP, 2) + Math.pow(eY - FP, 2)), GH = Vo + (zP > 0 ? DP : KP) * mr / Tn, wH = Mo + (zP > 0 ? FP : kP) * Zr / Tn, lY = MP * di / Ho, nY = RP * di / Xo, JP = fP * di / Ho, LP = HP * di / Xo, Wr = JP - lY, yr = LP - nY, is = Math.sqrt(Wr * Wr + yr * yr), Yr = lY * LP - JP * nY, aY = Math.sqrt(Math.max(0, di * di * is * is - Yr * Yr)), vP = (Yr * yr + sY * Wr * aY) / (is * is), TP = (Yr * yr - sY * Wr * aY) / (is * is), xP = (-Yr * Wr + Math.abs(yr) * aY) / (is * is), jP = (-Yr * Wr - Math.abs(yr) * aY) / (is * is), QP = Math.sqrt(Math.pow(lY - TP, 2) + Math.pow(nY - jP, 2)) - Math.sqrt(Math.pow(lY - vP, 2) + Math.pow(nY - xP, 2)), OP = QP > 0 ? vP : TP, UP = QP > 0 ? xP : jP, pH = Vo + OP * Ho / di, BH = Mo + UP * Xo / di, WH = Math.atan2(UP * Xo / di, OP * Ho / di), EP = WH > 0 ? WH : WH + Ro, yH = hH - EP, Hng = yH > 0 ? yH - Ro : yH, oY = Math.sqrt(Math.pow(GH - pH, 2) + Math.pow(wH - BH, 2)) / 2 - fo, Xng = oY > 0 ? GH : yP, Sng = oY > 0 ? wH : YP, Dng = oY > 0 ? pH : NP, Kng = oY > 0 ? BH : VP, YH = Math.atan2(wH - Mo, GH - Vo), NH = (YH > 0 ? YH : YH + Ro) - hH, Fng = NH > 0 ? NH : NH + Ro, PP = 180 * hH / Math.PI, kng = PP + 180 * Fng / Math.PI, _P = 180 * EP / Math.PI, zng = _P + 180 * Hng / Math.PI;
- i = "".concat(Vg(I / 2, g / 2, mr, Zr, PP, kng, !1), " L ").concat(Xng, ",").concat(Sng, " L ").concat(Rng, ",").concat(fng, " L ").concat(Dng, ",").concat(Kng, " L ").concat(pH, ",").concat(BH, " ").concat(Vg(I / 2, g / 2, Ho, Xo, _P, zng, !1).replace("M", "L"), " z");
- break;
- case "leftCircularArrow":
- var qP = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), cY = 0.9842519685039369, dY = -19.03865 * Math.PI / 180, rY = 19.03865 * Math.PI / 180, hY = 180 * Math.PI / 180, bY = 0.9842519685039369;
- if (qP) {
- var $P, uY = HI(qP);
- try {
- for (uY.s(); !($P = uY.n()).done; ) {
- var Nr = $P.value, Vu = U(Nr, ["attrs", "name"]);
- Vu === "adj1" ? cY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) * Gg : Vu === "adj2" ? dY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj3" ? rY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj4" ? hY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj5" && (bY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) * Gg);
- }
- } catch (Mg) {
- uY.e(Mg);
- } finally {
- uY.f();
- }
- }
- var sl = I / 2, ll = g / 2, Jng = I / 2, Lng = g / 2, g6 = Math.min(I, g), I6 = 1.9685039370078738, C6 = 7.874015748031495, t6 = 1 / 6e4 * Math.PI / 180, mY = 21599999 / 6e4 * Math.PI / 180, Do = 2 * Math.PI, i6 = bY < 0 ? 0 : bY > I6 ? I6 : bY, e6 = 2 * i6, Vr = rY < t6 ? t6 : rY > mY ? mY : rY, xn = hY < 0 ? 0 : hY > mY ? mY : hY, VH = g6 * (cY < 0 ? 0 : cY > e6 ? e6 : cY) / C6, Ko = g6 * i6 / C6, ZY = VH / 2, Fo = Jng + ZY - Ko, ko = Lng + ZY - Ko, jn = Fo - VH, Qn = ko - VH, A6 = jn + ZY, s6 = Qn + ZY, On = A6 * Math.cos(Vr), Mr = s6 * Math.sin(Vr), l6 = sl + On, n6 = ll + Mr, ri = Math.min(jn, Qn), vng = 1 - (On * On - ri * ri) * (Mr * Mr - ri * ri) / (On * On * Mr * Mr), MH = (1 + Math.sqrt(vng)) / ((On * On - ri * ri) / On / Mr), RH = Math.atan2(MH, 1) > 0 ? Math.atan2(MH, 1) : Math.atan2(MH, 1) + Do, fH = RH - Vr > 0 ? RH - Vr : RH - Vr + Do, Tng = fH - Math.PI > 0 ? fH - Do : fH, a6 = -Math.abs(Tng), Rr = Vr + (dY < a6 ? a6 : dY > 0 ? 0 : dY), xng = sl + A6 * Math.cos(Rr), jng = ll + s6 * Math.sin(Rr), Qng = sl + Fo * Math.cos(xn), Ong = ll + ko * Math.sin(xn), Ung = sl + jn * Math.cos(xn), Eng = ll + Qn * Math.sin(xn), o6 = l6 + Ko * Math.cos(Rr), c6 = n6 + Ko * Math.sin(Rr), d6 = l6 - Ko * Math.cos(Rr), r6 = n6 - Ko * Math.sin(Rr), h6 = d6 - sl, b6 = r6 - ll, u6 = o6 - sl, m6 = c6 - ll, Un = Math.min(Fo, ko), Z6 = h6 * Un / Fo, G6 = b6 * Un / ko, GY = u6 * Un / Fo, wY = m6 * Un / ko, fr = GY - Z6, zo = wY - G6, es = Math.sqrt(fr * fr + zo * zo), Hr = Z6 * wY - GY * G6, pY = Math.sqrt(Math.max(0, Un * Un * es * es - Hr * Hr)), BY = -1 * zo > 0 ? -1 : 1, w6 = (Hr * zo + BY * fr * pY) / (es * es), p6 = (Hr * zo - BY * fr * pY) / (es * es), B6 = (-Hr * fr + Math.abs(zo) * pY) / (es * es), W6 = (-Hr * fr - Math.abs(zo) * pY) / (es * es), y6 = Math.sqrt(Math.pow(GY - p6, 2) + Math.pow(wY - W6, 2)) - Math.sqrt(Math.pow(GY - w6, 2) + Math.pow(wY - B6, 2)), WY = sl + (y6 > 0 ? w6 : p6) * Fo / Un, yY = ll + (y6 > 0 ? B6 : W6) * ko / Un, YY = h6 * ri / jn, NY = b6 * ri / Qn, Y6 = u6 * ri / jn, N6 = m6 * ri / Qn, Xr = Y6 - YY, Sr = N6 - NY, As = Math.sqrt(Xr * Xr + Sr * Sr), Dr = YY * N6 - Y6 * NY, VY = Math.sqrt(Math.max(0, ri * ri * As * As - Dr * Dr)), V6 = (Dr * Sr + BY * Xr * VY) / (As * As), M6 = (Dr * Sr - BY * Xr * VY) / (As * As), R6 = (-Dr * Xr + Math.abs(Sr) * VY) / (As * As), f6 = (-Dr * Xr - Math.abs(Sr) * VY) / (As * As), H6 = Math.sqrt(Math.pow(YY - M6, 2) + Math.pow(NY - f6, 2)) - Math.sqrt(Math.pow(YY - V6, 2) + Math.pow(NY - R6, 2)), X6 = H6 > 0 ? V6 : M6, S6 = H6 > 0 ? R6 : f6, D6 = sl + X6 * jn / ri, K6 = ll + S6 * Qn / ri, HH = Math.atan2(S6 * Qn / ri, X6 * jn / ri), F6 = HH > 0 ? HH : HH + Do, XH = xn - F6, k6 = XH > 0 ? XH : XH + Do, Png = F6 + k6, _ng = -k6, MY = Math.sqrt(Math.pow(WY - D6, 2) + Math.pow(yY - K6, 2)) / 2 - Ko, qng = MY > 0 ? WY : o6, $ng = MY > 0 ? yY : c6, gag = MY > 0 ? D6 : d6, Iag = MY > 0 ? K6 : r6, SH = Math.atan2(yY - ll, WY - sl), DH = (SH > 0 ? SH : SH + Do) - xn, Cag = 180 * (xn + (DH > 0 ? DH - Do : DH)) / Math.PI, tag = 180 * xn / Math.PI, z6 = 180 * Png / Math.PI, iag = z6 + 180 * _ng / Math.PI;
- i = "M ".concat(Qng, ",").concat(Ong, " L ").concat(Ung, ",").concat(Eng, " ").concat(Vg(I / 2, g / 2, jn, Qn, z6, iag, !1).replace("M", "L"), " L ").concat(gag, ",").concat(Iag, " L ").concat(xng, ",").concat(jng, " L ").concat(qng, ",").concat($ng, " L ").concat(WY, ",").concat(yY, " ").concat(Vg(I / 2, g / 2, Fo, ko, Cag, tag, !1).replace("M", "L"), " z");
- }
- return i;
- }
- function FX(t, I) {
- if (!t || !I) return null;
- var g = U(t, [I, "p:transition"]);
- return g || ((g = U(t, [I, "mc:AlternateContent", "mc:Choice", "p:transition"])) ? g : g = U(t, [I, "mc:AlternateContent", "mc:Fallback", "p:transition"]));
- }
- function Mbg(t) {
- if (!t) return null;
- var I = { type: "none", duration: 1e3, direction: null }, g = t.attrs || {}, C = !1, i = /^p\d{2}:dur$/;
- for (var e in g) if (i.test(e) && !isNaN(parseInt(g[e], 10))) {
- I.duration = parseInt(g[e], 10), C = !0;
- break;
- }
- if (!C && g.spd) switch (g.spd) {
- case "slow":
- default:
- I.duration = 1e3;
- break;
- case "med":
- I.duration = 800;
- break;
- case "fast":
- I.duration = 500;
- }
- g.advClick === "0" && g.advTm && (I.autoNextAfter = parseInt(g.advTm, 10));
- var A = /^(p|p\d{2}):/;
- for (var s in t) if (s !== "attrs" && A.test(s)) {
- var l = t[s];
- if (I.type = s.substring(s.indexOf(":") + 1), l && l.attrs) {
- var n = l.attrs;
- n.dur && !isNaN(parseInt(n.dur, 10)) && (C || (I.duration = parseInt(n.dur, 10))), n.dir && (I.direction = n.dir);
- }
- break;
- }
- return I;
- }
- function Yq(t, I) {
- var g = Object.keys(t);
- if (Object.getOwnPropertySymbols) {
- var C = Object.getOwnPropertySymbols(t);
- I && (C = C.filter(function(i) {
- return Object.getOwnPropertyDescriptor(t, i).enumerable;
- })), g.push.apply(g, C);
- }
- return g;
- }
- function ti(t) {
- for (var I = 1; I < arguments.length; I++) {
- var g = arguments[I] != null ? arguments[I] : {};
- I % 2 ? Yq(Object(g), !0).forEach(function(C) {
- f9(t, C, g[C]);
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : Yq(Object(g)).forEach(function(C) {
- Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
- });
- }
- return t;
- }
- function wC(t, I) {
- var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
- if (!g) {
- if (Array.isArray(t) || (g = function(l, n) {
- if (l) {
- if (typeof l == "string") return Nq(l, n);
- var a = Object.prototype.toString.call(l).slice(8, -1);
- if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
- if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return Nq(l, n);
- }
- }(t)) || I) {
- g && (t = g);
- var C = 0, i = function() {
- };
- return { s: i, n: function() {
- return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
- }, e: function(l) {
- throw l;
- }, f: i };
- }
- throw new TypeError(`Invalid attempt to iterate non-iterable instance.
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
- }
- var e, A = !0, s = !1;
- return { s: function() {
- g = g.call(t);
- }, n: function() {
- var l = g.next();
- return A = l.done, l;
- }, e: function(l) {
- s = !0, e = l;
- }, f: function() {
- try {
- A || g.return == null || g.return();
- } finally {
- if (s) throw e;
- }
- } };
- }
- function Nq(t, I) {
- (I == null || I > t.length) && (I = t.length);
- for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
- return C;
- }
- function Ptg(t) {
- var I = U(t, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(t, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(t, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]);
- if (!I) return null;
- var g = U(I, ["attrs", "type"]);
- return g ? String(g) : null;
- }
- function _tg(t) {
- return t === "dt" || t === "sldNum" || t === "ftr" || t === "hdr";
- }
- function Rbg(t) {
- return U(t, ["p:nvSpPr", "p:cNvPr", "attrs", "name"]) || U(t, ["p:nvPicPr", "p:cNvPr", "attrs", "name"]) || U(t, ["p:nvGraphicFramePr", "p:cNvPr", "attrs", "name"]) || "";
- }
- function qtg(t) {
- if (!t) return !1;
- var I = String(t);
- return /(^|\b)(Footer Text|Header Text|Slide Number|Date)(\b|$)/i.test(I) || /页脚|页眉|页码|日期/.test(I);
- }
- function $tg(t) {
- return String(t || "").replace(/<[^>]+>/g, "").replace(/ /g, " ").trim();
- }
- function fbg(t) {
- var I = String(t || "").replace(/\s+/g, " ").trim();
- if (!I) return !1;
- var g = I.toLowerCase();
- return g === "click to add title" || g === "click to add text" || g === "click to add subtitle" || g === "click to add notes" || /edit\s+master/.test(g) || /edit\s+the\s+master/.test(g) || /edit\s+master\s+(title|text)/.test(g) || I === "此处添加标题" || I === "单击以添加标题" || I === "单击此处添加标题" || I === "此处添加文本" || I === "单击以添加文本" || I === "单击此处添加文本" || I === "单击以添加副标题" || I === "单击此处添加副标题" || I.includes("编辑母版");
- }
- function Hbg(t, I) {
- if (!t || t.type !== "text" || !Number.isFinite(I) || I <= 0 || !Number.isFinite(t.top) || !Number.isFinite(t.height)) return !1;
- var g = $tg(t.content);
- if (!g) return !1;
- var C = t.top > 0.78 * I, i = t.height < 0.2 * I;
- if (!C || !i) return !1;
- var e = /^[0-9]{1,3}$/.test(g), A = /^(\d{4}[\-/]\d{1,2}[\-/]\d{1,2})$/.test(g) || /(年\d{1,2}月\d{1,2}日)$/.test(g), s = /页码|日期/.test(g);
- return e || A || s;
- }
- function fD(t, I) {
- var g, C = [], i = wC(t || []);
- try {
- for (i.s(); !(g = i.n()).done; ) {
- var e = g.value;
- if (e && !qtg(e.name) && !(Hbg(e, I) || e.type === "text" && fbg($tg(e.content)))) if (Array.isArray(e.elements)) {
- var A = fD(e.elements, I);
- if (!A.length) continue;
- C.push(ti(ti({}, e), {}, { elements: A }));
- } else C.push(e);
- }
- } catch (s) {
- i.e(s);
- } finally {
- i.f();
- }
- return C;
- }
- function HD(t) {
- if (!Array.isArray(t)) return t;
- for (var I = 0; I < t.length; I++) {
- var g = t[I];
- g && _a(g) === "object" && (g.order = I, Array.isArray(g.elements) && HD(g.elements));
- }
- return t;
- }
- function Xbg(t, I) {
- var g = fD(t.elements, I), C = fD(t.layoutElements, I);
- return HD(g), HD(C), ti(ti({}, t), {}, { elements: g, layoutElements: C });
- }
- function Ul(t, I, g) {
- t && Array.isArray(t.trace) && (g === void 0 ? t.trace.push({ step: I }) : t.trace.push({ step: I, data: g }));
- }
- function Sbg(t) {
- return XD.apply(this, arguments);
- }
- function XD() {
- return XD = SC(bI.mark(function t(I) {
- var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p = arguments;
- return bI.wrap(function(Y) {
- for (; ; ) switch (Y.prev = Y.next) {
- case 0:
- return g = p.length > 1 && p[1] !== void 0 ? p[1] : {}, C = [], Y.next = 4, x0g.loadAsync(I);
- case 4:
- return i = Y.sent, Y.next = 7, Dbg(i);
- case 7:
- return e = Y.sent, Y.next = 10, Kbg(i);
- case 10:
- return A = Y.sent, s = A.width, l = A.height, n = A.defaultTextStyle, a = A.headerFooter, Y.next = 17, Fbg(i);
- case 17:
- return d = Y.sent, o = d.themeContent, c = d.themeColors, Y.next = 22, kbg(i);
- case 22:
- r = Y.sent, h = r.length ? r : e.slides, b = 0;
- case 25:
- if (!(b < h.length)) {
- Y.next = 35;
- break;
- }
- return u = h[b], m = b + 1, Y.next = 30, zbg(i, u, o, n, a, m, g);
- case 30:
- Z = Y.sent, C.push(Xbg(Z, l));
- case 32:
- b++, Y.next = 25;
- break;
- case 35:
- return Y.abrupt("return", { slides: C, themeColors: c, size: { width: s, height: l } });
- case 36:
- case "end":
- return Y.stop();
- }
- }, t);
- })), XD.apply(this, arguments);
- }
- function Dbg(t) {
- return gig.apply(this, arguments);
- }
- function gig() {
- return (gig = SC(bI.mark(function t(I) {
- var g, C, i, e, A, s, l, n;
- return bI.wrap(function(a) {
- for (; ; ) switch (a.prev = a.next) {
- case 0:
- return a.next = 2, yt(I, "[Content_Types].xml");
- case 2:
- g = a.sent, C = g.Types.Override, i = [], e = [], A = wC(C), a.prev = 7, A.s();
- case 9:
- if ((s = A.n()).done) {
- a.next = 20;
- break;
- }
- l = s.value, a.t0 = l.attrs.ContentType, a.next = a.t0 === "application/vnd.openxmlformats-officedocument.presentationml.slide+xml" ? 14 : a.t0 === "application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml" ? 16 : 18;
- break;
- case 14:
- return i.push(l.attrs.PartName.substr(1)), a.abrupt("break", 18);
- case 16:
- return e.push(l.attrs.PartName.substr(1)), a.abrupt("break", 18);
- case 18:
- a.next = 9;
- break;
- case 20:
- a.next = 25;
- break;
- case 22:
- a.prev = 22, a.t1 = a.catch(7), A.e(a.t1);
- case 25:
- return a.prev = 25, A.f(), a.finish(25);
- case 28:
- return n = function(d, o) {
- return +/(\d+)\.xml/.exec(d)[1] - +/(\d+)\.xml/.exec(o)[1];
- }, i = i.sort(n), e = e.sort(n), a.abrupt("return", { slides: i, slideLayouts: e });
- case 32:
- case "end":
- return a.stop();
- }
- }, t, null, [[7, 22, 25, 28]]);
- }))).apply(this, arguments);
- }
- function Kbg(t) {
- return SD.apply(this, arguments);
- }
- function SD() {
- return SD = SC(bI.mark(function t(I) {
- var g, C, i, e, A, s, l;
- return bI.wrap(function(n) {
- for (; ; ) switch (n.prev = n.next) {
- case 0:
- return n.next = 2, yt(I, "ppt/presentation.xml");
- case 2:
- return g = n.sent, C = g["p:presentation"]["p:sldSz"].attrs, i = g["p:presentation"]["p:defaultTextStyle"], e = function(a) {
- if (a != null) {
- var d = String(a).toLowerCase();
- return d === "1" || d === "true" || d === "on";
- }
- }, A = function(a) {
- return a === void 0 || a;
- }, s = U(g, ["p:presentation", "p:hf", "attrs"]), l = { dt: A(e(U(s, ["dt"]))), ftr: A(e(U(s, ["ftr"]))), hdr: A(e(U(s, ["hdr"]))), sldNum: A(e(U(s, ["sldNum"]))) }, n.abrupt("return", { width: parseInt(C.cx) * Gg, height: parseInt(C.cy) * Gg, defaultTextStyle: i, headerFooter: l });
- case 10:
- case "end":
- return n.stop();
- }
- }, t);
- })), SD.apply(this, arguments);
- }
- function Fbg(t) {
- return DD.apply(this, arguments);
- }
- function DD() {
- return DD = SC(bI.mark(function t(I) {
- var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m;
- return bI.wrap(function(Z) {
- for (; ; ) switch (Z.prev = Z.next) {
- case 0:
- return Z.next = 2, yt(I, "ppt/_rels/presentation.xml.rels");
- case 2:
- if (g = Z.sent, (C = g.Relationships.Relationship).constructor !== Array) {
- Z.next = 25;
- break;
- }
- e = wC(C), Z.prev = 6, e.s();
- case 8:
- if ((A = e.n()).done) {
- Z.next = 15;
- break;
- }
- if ((s = A.value).attrs.Type !== "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme") {
- Z.next = 13;
- break;
- }
- return i = s.attrs.Target, Z.abrupt("break", 15);
- case 13:
- Z.next = 8;
- break;
- case 15:
- Z.next = 20;
- break;
- case 17:
- Z.prev = 17, Z.t0 = Z.catch(6), e.e(Z.t0);
- case 20:
- return Z.prev = 20, e.f(), Z.finish(20);
- case 23:
- Z.next = 26;
- break;
- case 25:
- C.attrs.Type === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" && (i = C.attrs.Target);
- case 26:
- return Z.next = 28, yt(I, "ppt/" + i);
- case 28:
- if (l = Z.sent, n = [], !(a = U(l, ["a:theme", "a:themeElements", "a:clrScheme"]))) {
- Z.next = 46;
- break;
- }
- d = Object.keys(a), o = 0, c = d;
- case 34:
- if (!(o < c.length)) {
- Z.next = 46;
- break;
- }
- if ((r = c[o]).startsWith("a:")) {
- Z.next = 38;
- break;
- }
- return Z.abrupt("continue", 43);
- case 38:
- h = a[r], b = U(h, ["a:srgbClr", "attrs", "val"]), u = U(h, ["a:sysClr", "attrs", "lastClr"]), (m = b || u) && n.push("#" + m);
- case 43:
- o++, Z.next = 34;
- break;
- case 46:
- return Z.abrupt("return", { themeContent: l, themeColors: n });
- case 47:
- case "end":
- return Z.stop();
- }
- }, t, null, [[6, 17, 20, 23]]);
- })), DD.apply(this, arguments);
- }
- function kbg(t) {
- return KD.apply(this, arguments);
- }
- function KD() {
- return KD = SC(bI.mark(function t(I) {
- var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z;
- return bI.wrap(function(p) {
- for (; ; ) switch (p.prev = p.next) {
- case 0:
- return p.next = 2, yt(I, "ppt/presentation.xml");
- case 2:
- return g = p.sent, p.next = 5, yt(I, "ppt/_rels/presentation.xml.rels");
- case 5:
- if (C = p.sent, g && C) {
- p.next = 8;
- break;
- }
- return p.abrupt("return", []);
- case 8:
- i = U(g, ["p:presentation", "p:sldIdLst", "p:sldId"]), e = Array.isArray(i) ? i : i ? [i] : [], A = U(C, ["Relationships", "Relationship"]), s = Array.isArray(A) ? A : A ? [A] : [], l = /* @__PURE__ */ new Map(), n = wC(s), p.prev = 14, n.s();
- case 16:
- if ((a = n.n()).done) {
- p.next = 28;
- break;
- }
- if (d = a.value, U(d, ["attrs", "Type"]) === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide") {
- p.next = 21;
- break;
- }
- return p.abrupt("continue", 26);
- case 21:
- if (o = U(d, ["attrs", "Id"]), c = U(d, ["attrs", "Target"]), o && c) {
- p.next = 25;
- break;
- }
- return p.abrupt("continue", 26);
- case 25:
- l.set(String(o), String(c));
- case 26:
- p.next = 16;
- break;
- case 28:
- p.next = 33;
- break;
- case 30:
- p.prev = 30, p.t0 = p.catch(14), n.e(p.t0);
- case 33:
- return p.prev = 33, n.f(), p.finish(33);
- case 36:
- r = [], h = wC(e), p.prev = 38, h.s();
- case 40:
- if ((b = h.n()).done) {
- p.next = 51;
- break;
- }
- if (u = b.value, m = U(u, ["attrs", "r:id"])) {
- p.next = 45;
- break;
- }
- return p.abrupt("continue", 49);
- case 45:
- if (Z = l.get(String(m))) {
- p.next = 48;
- break;
- }
- return p.abrupt("continue", 49);
- case 48:
- Z.startsWith("ppt/") ? r.push(Z) : Z.startsWith("../") ? r.push(Z.replace("../", "ppt/")) : r.push("ppt/" + Z.replace(/^\//, ""));
- case 49:
- p.next = 40;
- break;
- case 51:
- p.next = 56;
- break;
- case 53:
- p.prev = 53, p.t1 = p.catch(38), h.e(p.t1);
- case 56:
- return p.prev = 56, h.f(), p.finish(56);
- case 59:
- return p.abrupt("return", r);
- case 60:
- case "end":
- return p.stop();
- }
- }, t, null, [[14, 30, 33, 36], [38, 53, 56, 59]]);
- })), KD.apply(this, arguments);
- }
- function zbg(t, I, g, C, i, e) {
- return FD.apply(this, arguments);
- }
- function FD() {
- return FD = SC(bI.mark(function t(I, g, C, i, e, A) {
- var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg, dg, Bg, Zg, Xg, Kg, kg, Wg, Ng, wg, fg, Jg, zg, cI, YI, Eg, aI, dI, _g, xI, SI, eI, NI, EI, oI, LI = arguments;
- return bI.wrap(function(pg) {
- for (; ; ) switch (pg.prev = pg.next) {
- case 0:
- return s = LI.length > 6 && LI[6] !== void 0 ? LI[6] : {}, l = g.replace("slides/slide", "slides/_rels/slide") + ".rels", pg.next = 4, yt(I, l);
- case 4:
- n = pg.sent, (a = n.Relationships.Relationship).constructor !== Array && (a = [a]), d = "", o = "", c = "", r = "", h = [], b = {}, u = {}, m = {}, Z = {}, p = {}, Y = wC(a), pg.prev = 18, Y.s();
- case 20:
- if ((R = Y.n()).done) {
- pg.next = 37;
- break;
- }
- X = R.value, pg.t0 = X.attrs.Type, pg.next = pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" ? 25 : pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" ? 28 : pg.t0 === "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing" ? 31 : (pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" || pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart" || pg.t0, 34);
- break;
- case 25:
- return o = X.attrs.Target.replace("../", "ppt/"), b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
- case 28:
- return d = X.attrs.Target.replace("../", "ppt/"), b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
- case 31:
- return h.push(X.attrs.Target.replace("../", "ppt/")), b[X.attrs.Id] = { type: "diagramDrawing", target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
- case 34:
- b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") };
- case 35:
- pg.next = 20;
- break;
- case 37:
- pg.next = 42;
- break;
- case 39:
- pg.prev = 39, pg.t1 = pg.catch(18), Y.e(pg.t1);
- case 42:
- return pg.prev = 42, Y.f(), pg.finish(42);
- case 45:
- return H = s && s.trace ? [] : null, (S = !!H) && H.push({ step: "slide/rels", data: { slideNo: A, sldFileName: g, slideRels: l, noteFilename: d, layoutFilename: o } }), pg.next = 50, yt(I, d);
- case 50:
- return z = pg.sent, v = Jbg(z), pg.next = 54, yt(I, o);
- case 54:
- return K = pg.sent, pg.next = 57, Vq(K);
- case 57:
- return V = pg.sent, N = o.replace("slideLayouts/slideLayout", "slideLayouts/_rels/slideLayout") + ".rels", pg.next = 61, yt(I, N);
- case 61:
- B = pg.sent, (a = B.Relationships.Relationship).constructor !== Array && (a = [a]), G = wC(a), pg.prev = 65, G.s();
- case 67:
- if ((w = G.n()).done) {
- pg.next = 77;
- break;
- }
- W = w.value, pg.t2 = W.attrs.Type, pg.next = pg.t2 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" ? 72 : 74;
- break;
- case 72:
- return c = W.attrs.Target.replace("../", "ppt/"), pg.abrupt("break", 75);
- case 74:
- u[W.attrs.Id] = { type: W.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: W.attrs.Target.replace("../", "ppt/") };
- case 75:
- pg.next = 67;
- break;
- case 77:
- pg.next = 82;
- break;
- case 79:
- pg.prev = 79, pg.t3 = pg.catch(65), G.e(pg.t3);
- case 82:
- return pg.prev = 82, G.f(), pg.finish(82);
- case 85:
- return S && H.push({ step: "slideLayout/rels", data: { slideLayout: o, slideLayoutRels: N, slideMaster: c } }), pg.next = 88, yt(I, c);
- case 88:
- return y = pg.sent, f = U(y, ["p:sldMaster", "p:txStyles"]), D = Vq(y), F = c.replace("slideMasters/slideMaster", "slideMasters/_rels/slideMaster") + ".rels", pg.next = 94, yt(I, F);
- case 94:
- T = pg.sent, (a = T.Relationships.Relationship).constructor !== Array && (a = [a]), Q = wC(a), pg.prev = 98, Q.s();
- case 100:
- if ((P = Q.n()).done) {
- pg.next = 110;
- break;
- }
- L = P.value, pg.t4 = L.attrs.Type, pg.next = pg.t4 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" ? 105 : 107;
- break;
- case 105:
- return r = L.attrs.Target.replace("../", "ppt/"), pg.abrupt("break", 108);
- case 107:
- m[L.attrs.Id] = { type: L.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: L.attrs.Target.replace("../", "ppt/") };
- case 108:
- pg.next = 100;
- break;
- case 110:
- pg.next = 115;
- break;
- case 112:
- pg.prev = 112, pg.t5 = pg.catch(98), Q.e(pg.t5);
- case 115:
- return pg.prev = 115, Q.f(), pg.finish(115);
- case 118:
- if (S && H.push({ step: "slideMaster/rels", data: { slideMaster: c, slideMasterRels: F, themeFilename: r } }), E = C, !r) {
- pg.next = 131;
- break;
- }
- return pg.next = 123, yt(I, r);
- case 123:
- return (J = pg.sent) && (E = J), k = r.split("/").pop(), j = r.replace(k, "_rels/" + k) + ".rels", pg.next = 129, yt(I, j);
- case 129:
- if ((q = pg.sent) && (a = q.Relationships.Relationship)) {
- a.constructor !== Array && (a = [a]), Cg = wC(a);
- try {
- for (Cg.s(); !(Ig = Cg.n()).done; ) x = Ig.value, Z[x.attrs.Id] = { type: x.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: x.attrs.Target.replace("../", "ppt/") };
- } catch (uI) {
- Cg.e(uI);
- } finally {
- Cg.f();
- }
- }
- case 131:
- if (Ag = {}, eg = {}, !h.length) {
- pg.next = 162;
- break;
- }
- O = wC(h), pg.prev = 135, O.s();
- case 137:
- if ((_ = O.n()).done) {
- pg.next = 154;
- break;
- }
- return gg = _.value, lg = gg.split("/").pop(), ng = gg.replace(lg, "_rels/" + lg) + ".rels", pg.next = 143, yt(I, gg);
- case 143:
- return (sg = pg.sent) && (og = JSON.stringify(sg).replace(/dsp:/g, "p:"), sg = JSON.parse(og)), Ag[gg] = sg, cg = {}, pg.next = 149, yt(I, ng);
- case 149:
- if (rg = pg.sent) {
- (a = rg.Relationships.Relationship).constructor !== Array && (a = [a]), dg = wC(a);
- try {
- for (dg.s(); !(Bg = dg.n()).done; ) Zg = Bg.value, cg[Zg.attrs.Id] = { type: Zg.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: Zg.attrs.Target.replace("../", "ppt/") };
- } catch (uI) {
- dg.e(uI);
- } finally {
- dg.f();
- }
- }
- eg[gg] = cg;
- case 152:
- pg.next = 137;
- break;
- case 154:
- pg.next = 159;
- break;
- case 156:
- pg.prev = 156, pg.t6 = pg.catch(135), O.e(pg.t6);
- case 159:
- return pg.prev = 159, O.f(), pg.finish(159);
- case 162:
- if (Xg = h.length ? Ag[h[0]] : null, h.length && (Kg = h[0], kg = eg[Kg])) for (Wg in kg) p[Wg] = kg[Wg];
- return pg.next = 166, yt(I, "ppt/tableStyles.xml");
- case 166:
- return Ng = pg.sent, pg.next = 169, yt(I, g);
- case 169:
- return wg = pg.sent, fg = wg["p:sld"]["p:cSld"]["p:spTree"], Jg = U(wg, ["p:sld", "attrs"]), zg = U(Jg, ["showPh"]), cI = { zip: I, slideLayoutContent: K, slideLayoutTables: V, slideMasterContent: y, slideMasterTables: D, slideContent: wg, tableStyles: Ng, slideResObj: b, slideMasterTextStyles: f, layoutResObj: u, masterResObj: m, themeContent: E, themeResObj: Z, digramFileContent: Xg, diagramResObj: p, diagramDrawingTargets: h, diagramDrawingContents: Ag, diagramResObjByTarget: eg, diagramDrawingCursor: 0, defaultTextStyle: i, headerFooter: e, slideNo: A, trace: H }, pg.next = 176, Lbg(cI);
- case 176:
- return YI = pg.sent, pg.next = 179, abg(cI);
- case 179:
- Eg = pg.sent, aI = [], pg.t7 = bI.keys(fg);
- case 182:
- if ((pg.t8 = pg.t7()).done) {
- pg.next = 213;
- break;
- }
- dI = pg.t8.value, fg[dI].constructor !== Array && (fg[dI] = [fg[dI]]), _g = wC(fg[dI]), pg.prev = 186, _g.s();
- case 188:
- if ((xI = _g.n()).done) {
- pg.next = 203;
- break;
- }
- if (SI = xI.value, zg !== "0") {
- pg.next = 194;
- break;
- }
- if (!(U(SI, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(SI, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(SI, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]))) {
- pg.next = 194;
- break;
- }
- return pg.abrupt("continue", 201);
- case 194:
- if (!_tg(Ptg(SI))) {
- pg.next = 197;
- break;
- }
- return pg.abrupt("continue", 201);
- case 197:
- return pg.next = 199, ql(dI, SI, fg, cI, "slide");
- case 199:
- (eI = pg.sent) && aI.push(eI);
- case 201:
- pg.next = 188;
- break;
- case 203:
- pg.next = 208;
- break;
- case 205:
- pg.prev = 205, pg.t9 = pg.catch(186), _g.e(pg.t9);
- case 208:
- return pg.prev = 208, _g.f(), pg.finish(208);
- case 211:
- pg.next = 182;
- break;
- case 213:
- return N0(aI), N0(YI), (NI = FX(wg, "p:sld")) || (NI = FX(K, "p:sldLayout")), NI || (NI = FX(y, "p:sldMaster")), EI = Mbg(NI), oI = { fill: Eg, elements: aI, layoutElements: YI, note: v, transition: EI }, S && H.length && (oI.trace = H), pg.abrupt("return", oI);
- case 222:
- case "end":
- return pg.stop();
- }
- }, t, null, [[18, 39, 42, 45], [65, 79, 82, 85], [98, 112, 115, 118], [135, 156, 159, 162], [186, 205, 208, 211]]);
- })), FD.apply(this, arguments);
- }
- function Jbg(t) {
- var I = "", g = U(t, ["p:notes", "p:cSld", "p:spTree", "p:sp"]);
- if (!g) return "";
- g.constructor !== Array && (g = [g]);
- var C, i = wC(g);
- try {
- for (i.s(); !(C = i.n()).done; ) {
- var e = U(C.value, ["p:txBody", "a:p", "a:r"]);
- if (e) {
- e.constructor !== Array && (e = [e]);
- var A, s = wC(e);
- try {
- for (s.s(); !(A = s.n()).done; ) {
- var l = U(A.value, ["a:t"]);
- l && typeof l == "string" && (I += l);
- }
- } catch (n) {
- s.e(n);
- } finally {
- s.f();
- }
- }
- }
- } catch (n) {
- i.e(n);
- } finally {
- i.f();
- }
- return I;
- }
- function Lbg(t) {
- return kD.apply(this, arguments);
- }
- function kD() {
- return kD = SC(bI.mark(function t(I) {
- var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg;
- return bI.wrap(function(dg) {
- for (; ; ) switch (dg.prev = dg.next) {
- case 0:
- if (g = [], C = I.slideLayoutContent, i = I.slideMasterContent, e = I.slideContent, A = U(C, ["p:sldLayout", "p:cSld", "p:spTree"]), s = U(i, ["p:sldMaster", "p:cSld", "p:spTree"]), l = /* @__PURE__ */ new Set(), n = U(e, ["p:sld", "p:cSld", "p:spTree"]), a = U(e, ["p:sld", "attrs"]), d = U(a, ["showMasterSp"]), o = U(a, ["showMasterPh"]), c = U(a, ["showPh"]), Ul(I, "layout/start", { slideNo: I && I.slideNo, slideShowPh: c, slideShowMasterSp: d, slideShowMasterPh: o }), r = function(Bg, Zg) {
- var Xg = Bg || "", Kg = Zg || "";
- (Xg || Kg) && (l.add("".concat(Xg, "|").concat(Kg)), Xg && l.add("".concat(Xg, "|")), Kg && l.add("|".concat(Kg)));
- }, h = function(Bg) {
- var Zg = U(Bg, ["p:txBody"]);
- if (!Zg) return !1;
- var Xg, Kg = U(Zg, ["a:p"]), kg = wC(Array.isArray(Kg) ? Kg : Kg ? [Kg] : []);
- try {
- for (kg.s(); !(Xg = kg.n()).done; ) {
- var Wg, Ng = Xg.value, wg = U(Ng, ["a:r"]), fg = wC(Array.isArray(wg) ? wg : wg ? [wg] : []);
- try {
- for (fg.s(); !(Wg = fg.n()).done; ) {
- var Jg = U(Wg.value, ["a:t"]);
- if (typeof Jg == "string" && Jg.trim() !== "") return !0;
- }
- } catch (aI) {
- fg.e(aI);
- } finally {
- fg.f();
- }
- var zg, cI = U(Ng, ["a:fld"]), YI = wC(Array.isArray(cI) ? cI : cI ? [cI] : []);
- try {
- for (YI.s(); !(zg = YI.n()).done; ) {
- var Eg = U(zg.value, ["a:t"]);
- if (typeof Eg == "string" && Eg.trim() !== "") return !0;
- }
- } catch (aI) {
- YI.e(aI);
- } finally {
- YI.f();
- }
- }
- } catch (aI) {
- kg.e(aI);
- } finally {
- kg.f();
- }
- return !1;
- }, b = function(Bg, Zg) {
- if (!Zg || !Zg.type) return !1;
- var Xg = String(Zg.type);
- if (!(/* @__PURE__ */ new Set(["ftr"])).has(Xg)) return !1;
- var Kg = U(I, ["slideContent", "p:sld", "p:hdrFtr", "attrs"]), kg = U(Kg, [Xg]), Wg = kg !== void 0 ? function(wg) {
- if (wg == null) return !1;
- var fg = String(wg).toLowerCase();
- return fg === "1" || fg === "true" || fg === "on";
- }(kg) : void 0, Ng = I && I.headerFooter && I.headerFooter[Xg] !== void 0 ? !!I.headerFooter[Xg] : void 0;
- return !!(Wg !== void 0 ? Wg : Ng === void 0 || Ng) && Xg === "ftr" && h(Bg);
- }, u = function(Bg) {
- return !!(U(Bg, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]));
- }, m = function(Bg) {
- var Zg = U(Bg, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]);
- if (!Zg) return null;
- var Xg = U(Zg, ["attrs", "type"]), Kg = U(Zg, ["attrs", "idx"]);
- return Xg || Kg ? { type: Xg, idx: Kg } : null;
- }, Z = function Bg(Zg, Xg) {
- if (Xg) {
- var Kg = m(Xg);
- if (Kg && r(Kg.type, Kg.idx), Zg !== "p:grpSp") {
- if (Zg === "mc:AlternateContent") {
- var kg = U(Xg, ["mc:Fallback"]), Wg = kg && (kg["p:grpSp"] || kg);
- if (Wg) if (Wg["p:grpSpPr"]) Bg("p:grpSp", Wg);
- else for (var Ng in Wg) {
- var wg = Wg[Ng];
- if (Array.isArray(wg)) {
- var fg, Jg = wC(wg);
- try {
- for (Jg.s(); !(fg = Jg.n()).done; )
- Bg(Ng, fg.value);
- } catch (aI) {
- Jg.e(aI);
- } finally {
- Jg.f();
- }
- } else Bg(Ng, wg);
- }
- }
- } else for (var zg in Xg) if (zg !== "p:nvGrpSpPr" && zg !== "p:grpSpPr") {
- var cI = Xg[zg];
- if (Array.isArray(cI)) {
- var YI, Eg = wC(cI);
- try {
- for (Eg.s(); !(YI = Eg.n()).done; )
- Bg(zg, YI.value);
- } catch (aI) {
- Eg.e(aI);
- } finally {
- Eg.f();
- }
- } else Bg(zg, cI);
- }
- }
- }, p = function(Bg) {
- if (Bg) for (var Zg in Bg) {
- var Xg = Bg[Zg];
- if (Array.isArray(Xg)) {
- var Kg, kg = wC(Xg);
- try {
- for (kg.s(); !(Kg = kg.n()).done; ) {
- var Wg = Kg.value;
- Z(Zg, Wg);
- }
- } catch (Ng) {
- kg.e(Ng);
- } finally {
- kg.f();
- }
- } else Z(Zg, Xg);
- }
- }, Y = function(Bg, Zg) {
- var Xg = Bg || "", Kg = Zg || "";
- return !!l.has("".concat(Xg, "|").concat(Kg)) || !(!Xg || !l.has("".concat(Xg, "|"))) || !(!Kg || !l.has("|".concat(Kg)));
- }, R = function Bg(Zg) {
- if (!Zg || Y(Zg.placeholderType, Zg.placeholderIdx)) return null;
- if (Array.isArray(Zg.elements)) {
- var Xg, Kg = [], kg = wC(Zg.elements);
- try {
- for (kg.s(); !(Xg = kg.n()).done; ) {
- var Wg = Bg(Xg.value);
- Wg && Kg.push(Wg);
- }
- } catch (Ng) {
- kg.e(Ng);
- } finally {
- kg.f();
- }
- return Kg.length ? ti(ti({}, Zg), {}, { elements: Kg }) : null;
- }
- return Zg;
- }, p(n), Ul(I, "layout/overrides/fromSlide", { size: l.size }), X = U(C, ["p:sldLayout", "attrs", "showMasterSp"]), H = U(C, ["p:sldLayout", "attrs", "showMasterPh"]), S = 0, z = 0, v = 0, K = 0, !A) {
- dg.next = 82;
- break;
- }
- dg.t0 = bI.keys(A);
- case 32:
- if ((dg.t1 = dg.t0()).done) {
- dg.next = 82;
- break;
- }
- if (V = dg.t1.value, A[V].constructor !== Array) {
- dg.next = 61;
- break;
- }
- N = 0;
- case 36:
- if (!(N < A[V].length)) {
- dg.next = 59;
- break;
- }
- if (B = A[V][N], c !== "0" || !u(B)) {
- dg.next = 41;
- break;
- }
- return z += 1, dg.abrupt("continue", 56);
- case 41:
- if (!(G = m(B))) {
- dg.next = 51;
- break;
- }
- if (w = G.type || "", W = G.idx || "", !(l.has("".concat(w, "|").concat(W)) || w && l.has("".concat(w, "|")) || W && l.has("|".concat(W)))) {
- dg.next = 48;
- break;
- }
- return v += 1, dg.abrupt("continue", 56);
- case 48:
- if (b(B, G)) {
- dg.next = 51;
- break;
- }
- return K += 1, dg.abrupt("continue", 56);
- case 51:
- return dg.next = 53, ql(V, B, A, I, "slideLayoutBg");
- case 53:
- y = dg.sent, (f = R(y)) && (g.push(f), S += 1);
- case 56:
- N++, dg.next = 36;
- break;
- case 59:
- dg.next = 80;
- break;
- case 61:
- if (D = A[V], c !== "0" || !u(D)) {
- dg.next = 65;
- break;
- }
- return z += 1, dg.abrupt("continue", 32);
- case 65:
- if (!(F = m(D))) {
- dg.next = 75;
- break;
- }
- if (T = F.type || "", Q = F.idx || "", !(l.has("".concat(T, "|").concat(Q)) || T && l.has("".concat(T, "|")) || Q && l.has("|".concat(Q)))) {
- dg.next = 72;
- break;
- }
- return v += 1, dg.abrupt("continue", 32);
- case 72:
- if (b(D, F)) {
- dg.next = 75;
- break;
- }
- return K += 1, dg.abrupt("continue", 32);
- case 75:
- return dg.next = 77, ql(V, D, A, I, "slideLayoutBg");
- case 77:
- P = dg.sent, (L = R(P)) && (g.push(L), S += 1);
- case 80:
- dg.next = 32;
- break;
- case 82:
- if (Ul(I, "layout/layoutElements", { showMasterSp: X, showMasterPh: H, kept: S, skipShowPh: z, skipOverridden: v, skipNotRenderable: K }), p(A), Ul(I, "layout/overrides/fromLayout", { size: l.size }), E = 0, J = 0, k = 0, j = 0, q = 0, !s || X === "0" || d === "0") {
- dg.next = 148;
- break;
- }
- dg.t2 = bI.keys(s);
- case 92:
- if ((dg.t3 = dg.t2()).done) {
- dg.next = 148;
- break;
- }
- if (Cg = dg.t3.value, s[Cg].constructor !== Array) {
- dg.next = 124;
- break;
- }
- Ig = 0;
- case 96:
- if (!(Ig < s[Cg].length)) {
- dg.next = 122;
- break;
- }
- if (x = s[Cg][Ig], c !== "0" || !u(x)) {
- dg.next = 101;
- break;
- }
- return J += 1, dg.abrupt("continue", 119);
- case 101:
- if (!(Ag = m(x))) {
- dg.next = 114;
- break;
- }
- if (H !== "0" && o !== "0") {
- dg.next = 106;
- break;
- }
- return k += 1, dg.abrupt("continue", 119);
- case 106:
- if (eg = Ag.type || "", O = Ag.idx || "", !(l.has("".concat(eg, "|").concat(O)) || eg && l.has("".concat(eg, "|")) || O && l.has("|".concat(O)))) {
- dg.next = 111;
- break;
- }
- return j += 1, dg.abrupt("continue", 119);
- case 111:
- if (b(x, Ag)) {
- dg.next = 114;
- break;
- }
- return q += 1, dg.abrupt("continue", 119);
- case 114:
- return dg.next = 116, ql(Cg, x, s, I, "slideMasterBg");
- case 116:
- _ = dg.sent, (gg = R(_)) && (g.push(gg), E += 1);
- case 119:
- Ig++, dg.next = 96;
- break;
- case 122:
- dg.next = 146;
- break;
- case 124:
- if (lg = s[Cg], c !== "0" || !u(lg)) {
- dg.next = 128;
- break;
- }
- return J += 1, dg.abrupt("continue", 92);
- case 128:
- if (!(ng = m(lg))) {
- dg.next = 141;
- break;
- }
- if (H !== "0" && o !== "0") {
- dg.next = 133;
- break;
- }
- return k += 1, dg.abrupt("continue", 92);
- case 133:
- if (sg = ng.type || "", og = ng.idx || "", !(l.has("".concat(sg, "|").concat(og)) || sg && l.has("".concat(sg, "|")) || og && l.has("|".concat(og)))) {
- dg.next = 138;
- break;
- }
- return j += 1, dg.abrupt("continue", 92);
- case 138:
- if (b(lg, ng)) {
- dg.next = 141;
- break;
- }
- return q += 1, dg.abrupt("continue", 92);
- case 141:
- return dg.next = 143, ql(Cg, lg, s, I, "slideMasterBg");
- case 143:
- cg = dg.sent, (rg = R(cg)) && (g.push(rg), E += 1);
- case 146:
- dg.next = 92;
- break;
- case 148:
- return Ul(I, "layout/masterElements", { kept: E, skipShowPh: J, skipShowMasterPh: k, skipOverridden: j, skipNotRenderable: q }), dg.abrupt("return", g);
- case 150:
- case "end":
- return dg.stop();
- }
- }, t);
- })), kD.apply(this, arguments);
- }
- function N0(t) {
- return t.sort(function(I, g) {
- var C = parseInt(I && I.order), i = parseInt(g && g.order);
- return (isNaN(C) ? 0 : C) - (isNaN(i) ? 0 : i);
- });
- }
- function Iig(t) {
- return U(t, ["p:grpSpPr", "a:xfrm"]) || U(t, ["p:grpSp", "p:grpSpPr", "a:xfrm"]);
- }
- function Cig(t, I, g) {
- if (!t) return t;
- var C, i, e = ti({}, t);
- return typeof e.left == "number" && (e.left = Lt(e.left * I)), typeof e.top == "number" && (e.top = Lt(e.top * g)), typeof e.width == "number" && (e.width = Lt(e.width * I)), typeof e.height == "number" && (e.height = Lt(e.height * g)), typeof e.borderWidth == "number" && (e.borderWidth = Lt(e.borderWidth * Math.max(I, g))), typeof e.path == "string" && (e.path = function(A, s, l) {
- if (!A || s === 1 && l === 1) return A;
- var n = String(A).match(/[a-zA-Z]|[-+]?(?:\d*\.\d+|\d+)(?:e[-+]?\d+)?/g);
- if (!n) return A;
- var a, d = { M: 2, L: 2, T: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, A: 7, Z: 0 }, o = [], c = null, r = 0, h = wC(n);
- try {
- for (h.s(); !(a = h.n()).done; ) {
- var b = a.value;
- if (/^[a-zA-Z]$/.test(b)) c = b, r = 0, o.push(b);
- else {
- var u = c ? c.toUpperCase() : "", m = d[u];
- if (m) {
- var Z = r % m, p = b;
- if (u !== "A" || Z !== 2 && Z !== 3 && Z !== 4) {
- var Y = parseFloat(b);
- if (!isNaN(Y)) {
- var R = Y;
- u === "H" ? R = Y * s : u === "V" ? R = Y * l : u === "A" ? Z === 0 ? R = Y * s : Z === 1 ? R = Y * l : Z === 5 ? R = Y * s : Z === 6 && (R = Y * l) : R = Z % 2 == 0 ? Y * s : Y * l, p = String(Lt(R));
- }
- } else p = b;
- o.push(p), r += 1;
- } else o.push(b);
- }
- }
- } catch (X) {
- h.e(X);
- } finally {
- h.f();
- }
- return o.join(" ");
- }(e.path, I, g)), e.content && (e.content = (C = e.content, (i = g) !== 1 && C ? C.replace(/(font-size:\s*)([\d.]+)pt/g, function(A, s, l) {
- var n = parseFloat(l) * i;
- return "".concat(s).concat(Lt(n), "pt");
- }) : C)), Array.isArray(e.elements) && (e.elements = e.elements.map(function(A) {
- return Cig(A, I, g);
- })), e;
- }
- function tig(t, I, g, C, i) {
- if (!Array.isArray(t) || !C && !i) return t;
- var e = Number(I), A = Number(g);
- if (!Number.isFinite(e) || !Number.isFinite(A)) return t;
- var s, l = wC(t);
- try {
- for (l.s(); !(s = l.n()).done; ) {
- var n = s.value;
- if (n && _a(n) === "object") {
- var a = typeof n.width == "number" ? n.width : 0, d = typeof n.height == "number" ? n.height : 0;
- C && typeof n.left == "number" && (n.left = Lt(e - n.left - a)), i && typeof n.top == "number" && (n.top = Lt(A - n.top - d));
- var o = typeof n.content == "string" && Ltg(n.content);
- n.type === "text" || o ? (n.isFlipH = !1, n.isFlipV = !1) : n.type === "group" && Array.isArray(n.elements) ? (tig(n.elements, n.width, n.height, C, i), n.isFlipH = !1, n.isFlipV = !1) : (C && (n.isFlipH = !n.isFlipH), i && (n.isFlipV = !n.isFlipV), (C ? 1 : 0) ^ (i ? 1 : 0) && typeof n.rotate == "number" && (n.rotate = Lt(-n.rotate)));
- }
- }
- } catch (c) {
- l.e(c);
- } finally {
- l.f();
- }
- return N0(t), t;
- }
- function uh(t, I) {
- var g, C = wC(t || []);
- try {
- for (C.s(); !(g = C.n()).done; ) {
- var i = g.value;
- if (i) {
- var e = U(i, ["attrs", I]);
- if (e != null) return e;
- }
- }
- } catch (A) {
- C.e(A);
- } finally {
- C.f();
- }
- }
- function Vq(t) {
- var I = t[Object.keys(t)[0]]["p:cSld"]["p:spTree"], g = {}, C = {}, i = {}, e = {}, A = function(l) {
- if (l) {
- for (var n in l) if (n !== "p:nvGrpSpPr" && n !== "p:grpSpPr") {
- var a = l[n];
- if (Array.isArray(a)) {
- var d, o = wC(a);
- try {
- for (o.s(); !(d = o.n()).done; ) {
- var c = d.value;
- s(n, c);
- }
- } catch (r) {
- o.e(r);
- } finally {
- o.f();
- }
- } else s(n, a);
- }
- }
- }, s = function l(n, a) {
- if (a) if (n !== "p:sp" && n !== "p:pic" && n !== "p:graphicFrame") if (n !== "p:grpSp") {
- if (n === "mc:AlternateContent") {
- var d = U(a, ["mc:Fallback"]), o = d && (d["p:grpSp"] || d);
- o && (o["p:grpSpPr"] ? l("p:grpSp", o) : A(o));
- }
- } else A(a);
- else (function(c) {
- var r = function(m) {
- return m && (m["p:nvSpPr"] || m["p:nvPicPr"] || m["p:nvGraphicFramePr"]) || null;
- }(c);
- if (r) {
- var h = U(r, ["p:cNvPr", "attrs", "id"]), b = U(r, ["p:nvPr", "p:ph", "attrs", "idx"]), u = U(r, ["p:nvPr", "p:ph", "attrs", "type"]);
- h && (g[h] = c), b && (C[b] = c), u && (i[u] = c), u && b && (e["".concat(u, "|").concat(b)] = c);
- }
- })(a);
- };
- return A(I), { idTable: g, idxTable: C, typeTable: i, typeIdxTable: e };
- }
- function ql(t, I, g, C, i) {
- return zD.apply(this, arguments);
- }
- function zD() {
- return zD = SC(bI.mark(function t(I, g, C, i, e) {
- var A, s, l, n, a = arguments;
- return bI.wrap(function(d) {
- for (; ; ) switch (d.prev = d.next) {
- case 0:
- if (A = a.length > 5 && a[5] !== void 0 ? a[5] : [], !_tg(Ptg(g))) {
- d.next = 4;
- break;
- }
- return d.abrupt("return", null);
- case 4:
- if (!qtg(Rbg(g))) {
- d.next = 7;
- break;
- }
- return d.abrupt("return", null);
- case 7:
- d.t0 = I, d.next = d.t0 === "p:sp" ? 10 : d.t0 === "p:cxnSp" ? 14 : d.t0 === "p:pic" ? 18 : d.t0 === "p:graphicFrame" ? 22 : d.t0 === "p:grpSp" ? 26 : d.t0 === "mc:AlternateContent" ? 30 : 42;
- break;
- case 10:
- return d.next = 12, Tbg(g, C, i, e, A);
- case 12:
- return s = d.sent, d.abrupt("break", 42);
- case 14:
- return d.next = 16, xbg(g, C, i, e, A);
- case 16:
- return s = d.sent, d.abrupt("break", 42);
- case 18:
- return d.next = 20, jbg(g, i, e, A);
- case 20:
- return s = d.sent, d.abrupt("break", 42);
- case 22:
- return d.next = 24, Qbg(g, i, e);
- case 24:
- return s = d.sent, d.abrupt("break", 42);
- case 26:
- return d.next = 28, LD(g, i, e, A);
- case 28:
- return s = d.sent, d.abrupt("break", 42);
- case 30:
- if (l = U(g, ["mc:Fallback"]), !(n = l && (l["p:grpSp"] || l)) || !Iig(n)) {
- d.next = 37;
- break;
- }
- return d.next = 35, LD(n, i, e, A);
- case 35:
- return s = d.sent, d.abrupt("break", 42);
- case 37:
- if (!U(g, ["mc:Choice"])) {
- d.next = 41;
- break;
- }
- return d.next = 40, vbg(g, i, e);
- case 40:
- s = d.sent;
- case 41:
- return d.abrupt("break", 42);
- case 42:
- return d.abrupt("return", s);
- case 43:
- case "end":
- return d.stop();
- }
- }, t);
- })), zD.apply(this, arguments);
- }
- function vbg(t, I, g) {
- return JD.apply(this, arguments);
- }
- function JD() {
- return JD = SC(bI.mark(function t(I, g, C) {
- var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z;
- return bI.wrap(function(p) {
- for (; ; ) switch (p.prev = p.next) {
- case 0:
- return i = U(I, ["mc:Choice"]), e = U(I, ["mc:Fallback"]), A = I.attrs.order, s = U(i, ["p:sp", "p:spPr", "a:xfrm"]), l = f0(s, void 0, void 0), n = l.top, a = l.left, d = H0(s, void 0, void 0), o = d.width, c = d.height, r = Etg(i)[0], h = Nbg(HC(r)), b = U(e, ["p:sp", "p:spPr", "a:blipFill"]), p.next = 11, rM(C, b, g);
- case 11:
- return u = p.sent, m = "", U(i, ["p:sp", "p:txBody", "a:p", "a:r"]) && (Z = U(i, ["p:sp"]), m = BV(Z["p:txBody"], Z, void 0, void 0, g)), p.abrupt("return", { type: "math", top: n, left: a, width: o, height: c, latex: h, picBase64: u, text: m, order: A });
- case 15:
- case "end":
- return p.stop();
- }
- }, t);
- })), JD.apply(this, arguments);
- }
- function LD(t, I, g) {
- return vD.apply(this, arguments);
- }
- function vD() {
- return vD = SC(bI.mark(function t(I, g, C) {
- var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og = arguments;
- return bI.wrap(function(cg) {
- for (; ; ) switch (cg.prev = cg.next) {
- case 0:
- if (i = og.length > 3 && og[3] !== void 0 ? og[3] : [], e = I.attrs.order, A = Iig(I)) {
- cg.next = 5;
- break;
- }
- return cg.abrupt("return", null);
- case 5:
- s = U(I, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "name"]) || "", l = U(I, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "id"]) || "", n = parseInt(A["a:off"].attrs.x) * Gg, a = parseInt(A["a:off"].attrs.y) * Gg, d = parseInt(A["a:ext"].attrs.cx) * Gg, o = parseInt(A["a:ext"].attrs.cy) * Gg, c = U(A, ["a:chOff", "attrs"]), r = U(A, ["a:chExt", "attrs"]), h = c && c.x !== void 0 ? parseInt(c.x) * Gg : 0, b = c && c.y !== void 0 ? parseInt(c.y) * Gg : 0, u = r && r.cx !== void 0 ? parseInt(r.cx) * Gg : d, m = r && r.cy !== void 0 ? parseInt(r.cy) * Gg : o, Z = U(A, ["attrs", "flipV"]) === "1", p = U(A, ["attrs", "flipH"]) === "1", (Y = U(A, ["attrs", "rot"]) || 0) && (Y = Y0(Y)), R = u && !isNaN(u) && d ? d / u : 1, X = m && !isNaN(m) && o ? o / m : 1, H = [].concat(R9(i), [I]), S = function(rg) {
- if (!rg) return "";
- var dg = U(rg, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "name"]), Bg = U(rg, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "id"]), Zg = U(rg, ["attrs", "order"]), Xg = [];
- return dg && Xg.push(String(dg)), Bg && Xg.push("#".concat(Bg)), Zg !== void 0 && Xg.push("@".concat(Zg)), Xg.join("");
- }, Ul(g, "group/start", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, hierarchy: H.map(S).filter(Boolean), x: n, y: a, cx: d, cy: o, chx: h, chy: b, chcx: u, chcy: m, ws: R, hs: X, isFlipV: Z, isFlipH: p, rotate: Y }), z = [], cg.t0 = bI.keys(I);
- case 28:
- if ((cg.t1 = cg.t0()).done) {
- cg.next = 58;
- break;
- }
- if (v = cg.t1.value, I[v].constructor !== Array) {
- cg.next = 52;
- break;
- }
- K = wC(I[v]), cg.prev = 32, K.s();
- case 34:
- if ((V = K.n()).done) {
- cg.next = 42;
- break;
- }
- return N = V.value, cg.next = 38, ql(v, N, I, g, C, H);
- case 38:
- (B = cg.sent) && z.push(B);
- case 40:
- cg.next = 34;
- break;
- case 42:
- cg.next = 47;
- break;
- case 44:
- cg.prev = 44, cg.t2 = cg.catch(32), K.e(cg.t2);
- case 47:
- return cg.prev = 47, K.f(), cg.finish(47);
- case 50:
- cg.next = 56;
- break;
- case 52:
- return cg.next = 54, ql(v, I[v], I, g, C, H);
- case 54:
- (G = cg.sent) && z.push(G);
- case 56:
- cg.next = 28;
- break;
- case 58:
- N0(z), w = 1 / 0, W = 1 / 0, y = -1 / 0, f = -1 / 0, D = 0, F = z;
- case 64:
- if (!(D < F.length)) {
- cg.next = 77;
- break;
- }
- if ((T = F[D]) && typeof T.left == "number" && typeof T.top == "number") {
- cg.next = 68;
- break;
- }
- return cg.abrupt("continue", 74);
- case 68:
- Q = T.left + (typeof T.width == "number" ? T.width : 0), P = T.top + (typeof T.height == "number" ? T.height : 0), w = Math.min(w, T.left), W = Math.min(W, T.top), y = Math.max(y, Q), f = Math.max(f, P);
- case 74:
- D++, cg.next = 64;
- break;
- case 77:
- return L = Number.isFinite(w) && Number.isFinite(W) && Number.isFinite(y) && Number.isFinite(f), E = !(Number.isFinite(d) && Number.isFinite(o) && d && o && Number.isFinite(u) && Number.isFinite(m) && u && m), J = L ? y - w : 0, k = L ? f - W : 0, j = Math.max(1, 2e-3 * Math.min(Number.isFinite(d) ? d : 0, Number.isFinite(o) ? o : 0)), q = L ? Math.abs(J - d) + Math.abs(k - o) + Math.abs(w - n) + Math.abs(W - a) : 1 / 0, Cg = L ? Math.abs(J - u) + Math.abs(k - m) + Math.abs(w - h) + Math.abs(W - b) : 1 / 0, Ig = !E && L && q + 2 * j < Cg, Ul(g, "group/bbox", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, children: z.length, hasBBox: L, bboxMinX: w, bboxMinY: W, bboxMaxX: y, bboxMaxY: f, bboxW: J, bboxH: k, eps: j, isLooseGroup: E, errToSlide: q, errToChild: Cg, isChildCoordAbsToSlide: Ig }), x = E ? L ? w : 0 : Ig ? n : h, Ag = E ? L ? W : 0 : Ig ? a : b, eg = E || Ig ? 1 : R, O = E || Ig ? 1 : X, _ = Lt(E && L ? w : n), gg = Lt(E && L ? W : a), lg = Lt(E && L ? y - w : d), ng = Lt(E && L ? f - W : o), Ul(g, "group/normalize", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, baseX: x, baseY: Ag, effWs: eg, effHs: O, outLeft: _, outTop: gg, outWidth: lg, outHeight: ng }), N0(sg = z.map(function(rg) {
- return rg && typeof rg.left == "number" && typeof rg.top == "number" ? Cig(ti(ti({}, rg), {}, { left: rg.left - x, top: rg.top - Ag }), eg, O) : rg;
- })), tig(sg, lg, ng, p, Z), Ul(g, "group/end", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, normalizedChildren: sg.length }), cg.abrupt("return", { type: "group", top: gg, left: _, width: lg, height: ng, rotate: Y, order: e, isFlipV: !1, isFlipH: !1, elements: sg });
- case 100:
- case "end":
- return cg.stop();
- }
- }, t, null, [[32, 44, 47, 50]]);
- })), vD.apply(this, arguments);
- }
- function Tbg(t, I, g, C) {
- return TD.apply(this, arguments);
- }
- function TD() {
- return TD = SC(bI.mark(function t(I, g, C, i) {
- var e, A, s, l, n, a, d, o, c, r, h = arguments;
- return bI.wrap(function(b) {
- for (; ; ) switch (b.prev = b.next) {
- case 0:
- return e = h.length > 4 && h[4] !== void 0 ? h[4] : [], A = U(I, ["p:nvSpPr", "p:cNvPr", "attrs", "name"]), s = U(I, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "idx"]), l = U(I, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]), n = U(I, ["attrs", "order"]), o = C.slideLayoutTables, c = C.slideMasterTables, l && s ? (r = "".concat(l, "|").concat(s), a = o && o.typeIdxTable && o.typeIdxTable[r] || o && o.idxTable && o.idxTable[s] || o && o.typeTable && o.typeTable[l], d = c && c.typeIdxTable && c.typeIdxTable[r] || c && c.idxTable && c.idxTable[s] || c && c.typeTable && c.typeTable[l]) : s ? (a = o && o.idxTable ? o.idxTable[s] : void 0, d = c && c.idxTable ? c.idxTable[s] : void 0) : l && (a = o && o.typeTable ? o.typeTable[l] : void 0, d = c && c.typeTable ? c.typeTable[l] : void 0), l || U(I, ["p:nvSpPr", "p:cNvSpPr", "attrs", "txBox"]) === "1" && (l = "text"), l || (l = U(a, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"])), l || (l = U(d, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"])), l || (l = i === "diagramBg" ? "diagram" : "obj"), b.next = 14, iig(I, g, a, d, A, l, n, C, i, e);
- case 14:
- return b.abrupt("return", b.sent);
- case 15:
- case "end":
- return b.stop();
- }
- }, t);
- })), TD.apply(this, arguments);
- }
- function xbg(t, I, g, C) {
- return xD.apply(this, arguments);
- }
- function xD() {
- return xD = SC(bI.mark(function t(I, g, C, i) {
- var e, A, s, l, n = arguments;
- return bI.wrap(function(a) {
- for (; ; ) switch (a.prev = a.next) {
- case 0:
- return e = n.length > 4 && n[4] !== void 0 ? n[4] : [], A = I["p:nvCxnSpPr"]["p:cNvPr"].attrs.name, s = I["p:nvCxnSpPr"]["p:nvPr"]["p:ph"] === void 0 ? void 0 : I["p:nvSpPr"]["p:nvPr"]["p:ph"].attrs.type, l = I.attrs.order, a.next = 6, iig(I, g, void 0, void 0, A, s, l, C, i, e);
- case 6:
- return a.abrupt("return", a.sent);
- case 7:
- case "end":
- return a.stop();
- }
- }, t);
- })), xD.apply(this, arguments);
- }
- function iig(t, I, g, C, i, e, A, s, l) {
- return jD.apply(this, arguments);
- }
- function jD() {
- return jD = SC(bI.mark(function t(I, g, C, i, e, A, s, l, n) {
- var a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg = arguments;
- return bI.wrap(function(O) {
- for (; ; ) switch (O.prev = O.next) {
- case 0:
- return a = eg.length > 9 && eg[9] !== void 0 ? eg[9] : [], d = U(I, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(I, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(I, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]), o = d && U(d, ["attrs", "type"]) || "", c = d && U(d, ["attrs", "idx"]) || "", h = U(I, r = ["p:spPr", "a:xfrm"]), b = U(C, r), u = U(i, r), m = U(I, ["p:spPr", "a:prstGeom", "attrs", "prst"]), Z = U(I, ["p:spPr", "a:custGeom"]), p = f0(h, b, u), Y = p.top, R = p.left, X = H0(h, b, u), H = X.width, S = X.height, v = uh(z = [h, b, u], "flipV") === "1", K = uh(z, "flipH") === "1", V = Y0(uh(z, "rot")), N = U(I, ["p:txXfrm"]), B = V, N && (G = U(N, ["attrs", "rot"])) && (B = V + Y0(G)), w = "", I["p:txBody"] && (w = BV(I["p:txBody"], I, C, A, l)), W = Fs(I, A, l, a), y = W.borderColor, f = W.borderWidth, D = W.borderType, F = W.strokeDasharray, O.next = 24, jtg(I, g, void 0, l, n, a);
- case 24:
- if (O.t0 = O.sent, O.t0) {
- O.next = 27;
- break;
- }
- O.t0 = "";
- case 27:
- if (T = O.t0, m === "arc" && (T = ""), Q = H, P = S, m === "line" && (L = Math.max(1, f || 0), Q || (Q = L), P || (P = L)), (J = U(I, ["p:spPr", "a:effectLst", "a:outerShdw"])) && (E = Qtg(J, l)), k = hbg(I, C, i), j = U(I, ["p:txBody", "a:bodyPr", "attrs", "vert"]) === "eaVert", q = bbg(I, C, i), Cg = { left: R, top: Y, width: Q, height: P, borderColor: y, borderWidth: f, borderType: D, borderStrokeDasharray: F, fill: T, content: w, isFlipV: v, isFlipH: K, rotate: V, vAlign: k, name: e, order: s, placeholderType: o, placeholderIdx: c }, E && (Cg.shadow = E), q && (Cg.autoFit = q), Ig = Cg.content && Ltg(Cg.content), !Z || A === "diagram") {
- O.next = 47;
- break;
- }
- return x = Wbg(Z, Q, P), Ig || (Cg.content = ""), O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", shapType: "custom", path: x }));
- case 47:
- if (Ag = "", m && (Ag = Vbg(m, Q, P, I)), !m || A !== "obj" && A && m === "rect") {
- O.next = 52;
- break;
- }
- return Ig || (Cg.content = ""), O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", shapType: m, path: Ag }));
- case 52:
- if (!m || Ig || !T && !f) {
- O.next = 54;
- break;
- }
- return O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", content: "", shapType: m, path: Ag }));
- case 54:
- return O.abrupt("return", ti(ti({}, Cg), {}, { type: "text", isVertical: j, isFlipV: !1, isFlipH: !1, rotate: B }));
- case 55:
- case "end":
- return O.stop();
- }
- }, t);
- })), jD.apply(this, arguments);
- }
- function jbg(t, I, g) {
- return QD.apply(this, arguments);
- }
- function QD() {
- return QD = SC(bI.mark(function t(I, g, C) {
- var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg = arguments;
- return bI.wrap(function(lg) {
- for (; ; ) switch (lg.prev = lg.next) {
- case 0:
- return i = gg.length > 3 && gg[3] !== void 0 ? gg[3] : [], e = C === "slideMasterBg" ? g.masterResObj : C === "slideLayoutBg" ? g.layoutResObj : g.slideResObj, A = I.attrs.order, s = U(I, ["p:nvPicPr", "p:nvPr", "p:ph"]), l = s && U(s, ["attrs", "type"]) || "", n = s && U(s, ["attrs", "idx"]) || "", a = I["p:blipFill"]["a:blip"].attrs["r:embed"], d = e[a].target, o = DX(d).toLowerCase(), c = g.zip, lg.next = 12, c.file(d).async("arraybuffer");
- case 12:
- if (r = lg.sent, h = I["p:spPr"]["a:xfrm"], b = U(I, ["p:nvPicPr", "p:nvPr", "p:ph", "attrs", "idx"]), u = b ? U(g.slideLayoutTables, ["idxTable", b, "p:spPr", "a:xfrm"]) : void 0, m = b ? U(g.slideMasterTables, ["idxTable", b, "p:spPr", "a:xfrm"]) : void 0, h || (h = u || m), Z = yD(o), p = f0(h, u, m), Y = p.top, R = p.left, X = H0(h, u, m), H = X.width, S = X.height, z = "data:".concat(Z, ";base64,").concat(Jtg(r)), K = uh(v = [h, u, m], "flipV") === "1", V = uh(v, "flipH") === "1", N = Y0(uh(v, "rot")), B = U(I, ["p:nvPicPr", "p:nvPr", "a:videoFile"]), F = !1, !B) {
- lg.next = 43;
- break;
- }
- if (G = B.attrs["r:link"], !lbg(w = e[G].target)) {
- lg.next = 36;
- break;
- }
- w = pV(w), F = !0, lg.next = 43;
- break;
- case 36:
- if ((W = DX(w).toLowerCase()) !== "mp4" && W !== "webm" && W !== "ogg") {
- lg.next = 43;
- break;
- }
- return lg.next = 40, c.file(w).async("arraybuffer");
- case 40:
- f = lg.sent, y = yD(W), D = URL.createObjectURL(new Blob([f], { type: y }));
- case 43:
- if (!(T = U(I, ["p:nvPicPr", "p:nvPr", "a:audioFile"]))) {
- lg.next = 53;
- break;
- }
- if (Q = T.attrs["r:link"], P = e[Q].target, (L = DX(P).toLowerCase()) !== "mp3" && L !== "wav" && L !== "ogg") {
- lg.next = 53;
- break;
- }
- return lg.next = 51, c.file(P).async("arraybuffer");
- case 51:
- E = lg.sent, J = URL.createObjectURL(new Blob([E]));
- case 53:
- if (!B || F) {
- lg.next = 55;
- break;
- }
- return lg.abrupt("return", { type: "video", top: Y, left: R, width: H, height: S, rotate: N, blob: D, order: A, placeholderType: l, placeholderIdx: n });
- case 55:
- if (!B || !F) {
- lg.next = 57;
- break;
- }
- return lg.abrupt("return", { type: "video", top: Y, left: R, width: H, height: S, rotate: N, src: w, order: A, placeholderType: l, placeholderIdx: n });
- case 57:
- if (!T) {
- lg.next = 59;
- break;
- }
- return lg.abrupt("return", { type: "audio", top: Y, left: R, width: H, height: S, rotate: N, blob: J, order: A, placeholderType: l, placeholderIdx: n });
- case 59:
- return (j = U(I, ["p:blipFill", "a:srcRect", "attrs"])) && (j.t || j.b || j.l || j.r) && (k = {}, j.t && (k.t = j.t / 1e3), j.b && (k.b = j.b / 1e3), j.l && (k.l = j.l / 1e3), j.r && (k.r = j.r / 1e3)), q = U(I, ["p:spPr", "a:prstGeom", "attrs", "prst"]) || "rect", Cg = Fs(I, void 0, g, i), Ig = Cg.borderColor, x = Cg.borderWidth, Ag = Cg.borderType, eg = Cg.strokeDasharray, O = nbg(I["p:blipFill"]), _ = { type: "image", top: Y, left: R, width: H, height: S, rotate: N, src: z, isFlipV: K, isFlipH: V, order: A, rect: k, geom: q, borderColor: Ig, borderWidth: x, borderType: Ag, borderStrokeDasharray: eg, placeholderType: l, placeholderIdx: n }, O && (_.filters = O), lg.abrupt("return", _);
- case 67:
- case "end":
- return lg.stop();
- }
- }, t);
- })), QD.apply(this, arguments);
- }
- function Qbg(t, I, g) {
- return OD.apply(this, arguments);
- }
- function OD() {
- return OD = SC(bI.mark(function t(I, g, C) {
- var i, e, A, s, l, n;
- return bI.wrap(function(a) {
- for (; ; ) switch (a.prev = a.next) {
- case 0:
- i = U(I, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]), e = i && U(i, ["attrs", "type"]) || "", A = i && U(i, ["attrs", "idx"]) || "", s = U(I, ["a:graphic", "a:graphicData", "attrs", "uri"]), a.t0 = s, a.next = a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/table" ? 7 : a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/chart" ? 11 : a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/diagram" ? 15 : a.t0 === "http://schemas.openxmlformats.org/presentationml/2006/ole" ? 19 : 26;
- break;
- case 7:
- return a.next = 9, Obg(I, g);
- case 9:
- return l = a.sent, a.abrupt("break", 26);
- case 11:
- return a.next = 13, Ubg(I, g);
- case 13:
- return l = a.sent, a.abrupt("break", 26);
- case 15:
- return a.next = 17, Ebg(I, g);
- case 17:
- return l = a.sent, a.abrupt("break", 26);
- case 19:
- if ((n = U(I, ["a:graphic", "a:graphicData", "mc:AlternateContent", "mc:Fallback", "p:oleObj"])) || (n = U(I, ["a:graphic", "a:graphicData", "p:oleObj"])), !n) {
- a.next = 25;
- break;
- }
- return a.next = 24, LD(n, g, C);
- case 24:
- l = a.sent;
- case 25:
- return a.abrupt("break", 26);
- case 26:
- return l && (e || A) && (l.placeholderType = e, l.placeholderIdx = A), a.abrupt("return", l);
- case 28:
- case "end":
- return a.stop();
- }
- }, t);
- })), OD.apply(this, arguments);
- }
- function Obg(t, I) {
- return UD.apply(this, arguments);
- }
- function UD() {
- return UD = SC(bI.mark(function t(I, g) {
- var C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg;
- return bI.wrap(function(og) {
- for (; ; ) switch (og.prev = og.next) {
- case 0:
- if (C = I.attrs.order, i = U(I, ["a:graphic", "a:graphicData", "a:tbl"]), e = U(I, ["p:xfrm"]), A = f0(e, void 0, void 0), s = A.top, l = A.left, n = H0(e, void 0, void 0), a = n.width, d = n.height, o = U(I, ["a:graphic", "a:graphicData", "a:tbl", "a:tblPr"]), (c = U(I, ["a:graphic", "a:graphicData", "a:tbl", "a:tblGrid", "a:gridCol"])).constructor !== Array && (c = [c]), r = [], c) {
- h = wC(c);
- try {
- for (h.s(); !(b = h.n()).done; ) u = b.value, m = U(u, ["attrs", "w"]) || 0, Z = parseInt(m) * Gg, r.push(Z);
- } catch (cg) {
- h.e(cg);
- } finally {
- h.f();
- }
- }
- if (p = o.attrs ? o.attrs.firstRow : void 0, Y = o.attrs ? o.attrs.firstCol : void 0, R = o.attrs ? o.attrs.lastRow : void 0, X = o.attrs ? o.attrs.lastCol : void 0, H = o.attrs ? o.attrs.bandRow : void 0, S = o.attrs ? o.attrs.bandCol : void 0, z = { isFrstRowAttr: p && p === "1" ? 1 : 0, isFrstColAttr: Y && Y === "1" ? 1 : 0, isLstRowAttr: R && R === "1" ? 1 : 0, isLstColAttr: X && X === "1" ? 1 : 0, isBandRowAttr: H && H === "1" ? 1 : 0, isBandColAttr: S && S === "1" ? 1 : 0 }, (K = o["a:tableStyleId"]) && (V = g.tableStyles["a:tblStyleLst"]["a:tblStyle"])) if (V.constructor === Array) for (N = 0; N < V.length; N++) V[N].attrs.styleId === K && (v = V[N]);
- else V.attrs.styleId === K && (v = V);
- v && (v.tblStylAttrObj = z), B = {}, G = U(v, ["a:wholeTbl", "a:tcStyle"]), (w = U(G, ["a:tcBdr"])) && (B = ybg(w, g)), W = "", (y = U(v, ["a:tblBg", "a:fillRef"])) && (W = eC(y, void 0, void 0, g)), y === void 0 && (y = U(v, ["a:wholeTbl", "a:tcStyle", "a:fill", "a:solidFill"]), W = eC(y, void 0, void 0, g)), (f = i["a:tr"]).constructor !== Array && (f = [f]), D = [], F = [], T = 0;
- case 33:
- if (!(T < f.length)) {
- og.next = 88;
- break;
- }
- if (Q = f[T], P = U(f[T], ["attrs", "h"]) || 0, L = parseInt(P) * Gg, F.push(L), E = Ybg(f, T, z, v, g), J = E.fillColor, k = E.fontColor, j = E.fontBold, q = Q["a:tc"], Cg = [], q.constructor !== Array) {
- og.next = 67;
- break;
- }
- Ig = 0;
- case 43:
- if (!(Ig < q.length)) {
- og.next = 65;
- break;
- }
- return x = q[Ig], Ag = void 0, Ig === 0 && z.isFrstColAttr === 1 ? (Ag = "a:firstCol", z.isLstRowAttr === 1 && T === f.length - 1 && U(v, ["a:seCell"]) ? Ag = "a:seCell" : z.isFrstRowAttr === 1 && T === 0 && U(v, ["a:neCell"]) && (Ag = "a:neCell")) : !(Ig > 0 && z.isBandColAttr === 1) || z.isFrstColAttr === 1 && T === 0 || z.isLstRowAttr === 1 && T === f.length - 1 || Ig === q.length - 1 || Ig % 2 != 0 && (U(v, ["a:band2V"]) === void 0 ? U(v, ["a:band1V"]) && (Ag = "a:band2V") : Ag = "a:band2V"), Ig === q.length - 1 && z.isLstColAttr === 1 && (Ag = "a:lastCol", z.isLstRowAttr === 1 && T === f.length - 1 && U(v, ["a:swCell"]) ? Ag = "a:swCell" : z.isFrstRowAttr === 1 && T === 0 && U(v, ["a:nwCell"]) && (Ag = "a:nwCell")), eg = BV(x["a:txBody"], x, void 0, void 0, g), og.next = 51, wq(x, v, Ag, g);
- case 51:
- O = og.sent, _ = { text: eg }, O.rowSpan && (_.rowSpan = O.rowSpan), O.colSpan && (_.colSpan = O.colSpan), O.vMerge && (_.vMerge = O.vMerge), O.hMerge && (_.hMerge = O.hMerge), (O.fontBold || j) && (_.fontBold = O.fontBold || j), (O.fontColor || k) && (_.fontColor = O.fontColor || k), (O.fillColor || J || W) && (_.fillColor = O.fillColor || J || W), O.borders && (_.borders = O.borders), Cg.push(_);
- case 62:
- Ig++, og.next = 43;
- break;
- case 65:
- og.next = 84;
- break;
- case 67:
- return gg = void 0, z.isFrstColAttr === 1 && z.isLstRowAttr !== 1 ? gg = "a:firstCol" : z.isBandColAttr === 1 && z.isLstRowAttr !== 1 && (U(v, ["a:band2V"]) || U(v, ["a:band1V"])) && (gg = "a:band2V"), z.isLstColAttr === 1 && z.isLstRowAttr !== 1 && (gg = "a:lastCol"), lg = BV(q["a:txBody"], q, void 0, void 0, g), og.next = 73, wq(q, v, gg, g);
- case 73:
- ng = og.sent, sg = { text: lg }, ng.rowSpan && (sg.rowSpan = ng.rowSpan), ng.colSpan && (sg.colSpan = ng.colSpan), ng.vMerge && (sg.vMerge = ng.vMerge), ng.hMerge && (sg.hMerge = ng.hMerge), (ng.fontBold || j) && (sg.fontBold = ng.fontBold || j), (ng.fontColor || k) && (sg.fontColor = ng.fontColor || k), (ng.fillColor || J || W) && (sg.fillColor = ng.fillColor || J || W), ng.borders && (sg.borders = ng.borders), Cg.push(sg);
- case 84:
- D.push(Cg);
- case 85:
- T++, og.next = 33;
- break;
- case 88:
- return og.abrupt("return", { type: "table", top: s, left: l, width: a, height: d, data: D, order: C, borders: B, rowHeights: F, colWidths: r });
- case 89:
- case "end":
- return og.stop();
- }
- }, t);
- })), UD.apply(this, arguments);
- }
- function Ubg(t, I) {
- return ED.apply(this, arguments);
- }
- function ED() {
- return ED = SC(bI.mark(function t(I, g) {
- var C, i, e, A, s, l, n, a, d, o, c, r, h, b;
- return bI.wrap(function(u) {
- for (; ; ) switch (u.prev = u.next) {
- case 0:
- if (C = I.attrs.order, i = U(I, ["p:xfrm"]), e = f0(i, void 0, void 0), A = e.top, s = e.left, l = H0(i, void 0, void 0), n = l.width, a = l.height, d = I["a:graphic"]["a:graphicData"]["c:chart"].attrs["r:id"], (o = U(g.slideResObj, [d, "target"])) || (o = U(g.layoutResObj, [d, "target"])), o || (o = U(g.masterResObj, [d, "target"])), o) {
- u.next = 10;
- break;
- }
- return u.abrupt("return", {});
- case 10:
- return u.next = 12, yt(g.zip, o);
- case 12:
- if (c = u.sent, r = U(c, ["c:chartSpace", "c:chart", "c:plotArea"]), h = dbg(r, g)) {
- u.next = 17;
- break;
- }
- return u.abrupt("return", {});
- case 17:
- return b = { type: "chart", top: A, left: s, width: n, height: a, data: h.data, colors: h.colors, chartType: h.type, order: C }, h.marker !== void 0 && (b.marker = h.marker), h.barDir !== void 0 && (b.barDir = h.barDir), h.holeSize !== void 0 && (b.holeSize = h.holeSize), h.grouping !== void 0 && (b.grouping = h.grouping), h.style !== void 0 && (b.style = h.style), u.abrupt("return", b);
- case 24:
- case "end":
- return u.stop();
- }
- }, t);
- })), ED.apply(this, arguments);
- }
- function Ebg(t, I) {
- return PD.apply(this, arguments);
- }
- function PD() {
- return PD = SC(bI.mark(function t(I, g) {
- var C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V;
- return bI.wrap(function(N) {
- for (; ; ) switch (N.prev = N.next) {
- case 0:
- if (C = I.attrs.order, i = U(I, ["p:xfrm"]), e = f0(i, void 0, void 0), A = e.left, s = e.top, l = H0(i, void 0, void 0), n = l.width, a = l.height, !(d = U(I, ["a:graphic", "a:graphicData", "dgm:relIds", "attrs"]) || U(I, ["a:graphic", "a:graphicData", "p:relIds", "attrs"]))) {
- N.next = 19;
- break;
- }
- c = 0, r = Object.keys(d);
- case 7:
- if (!(c < r.length)) {
- N.next = 19;
- break;
- }
- if ((h = r[c]).startsWith("r:")) {
- N.next = 11;
- break;
- }
- return N.abrupt("continue", 16);
- case 11:
- if (b = d[h], !(u = U(g, ["slideResObj", b, "target"])) || typeof u != "string" || !/\/diagrams\/drawing/i.test(u)) {
- N.next = 16;
- break;
- }
- return o = u, N.abrupt("break", 19);
- case 16:
- c++, N.next = 7;
- break;
- case 19:
- if (o || (m = g.diagramDrawingCursor || 0, o = g.diagramDrawingTargets && g.diagramDrawingTargets[m], g.diagramDrawingCursor = m + 1), Z = g.diagramResObj, p = g.digramFileContent, o && (g.diagramResObj = U(g, ["diagramResObjByTarget", o]) || Z, g.digramFileContent = U(g, ["diagramDrawingContents", o]) || p), Y = [], !(R = U(g.digramFileContent, ["p:drawing", "p:spTree"]))) {
- N.next = 60;
- break;
- }
- N.t0 = bI.keys(R);
- case 27:
- if ((N.t1 = N.t0()).done) {
- N.next = 60;
- break;
- }
- if ((X = N.t1.value) !== "p:nvGrpSpPr" && X !== "p:grpSpPr") {
- N.next = 31;
- break;
- }
- return N.abrupt("continue", 27);
- case 31:
- if (H = R[X], !Array.isArray(H)) {
- N.next = 54;
- break;
- }
- S = wC(H), N.prev = 34, S.s();
- case 36:
- if ((z = S.n()).done) {
- N.next = 44;
- break;
- }
- return v = z.value, N.next = 40, ql(X, v, R, g, "diagramBg");
- case 40:
- (K = N.sent) && Y.push(K);
- case 42:
- N.next = 36;
- break;
- case 44:
- N.next = 49;
- break;
- case 46:
- N.prev = 46, N.t2 = N.catch(34), S.e(N.t2);
- case 49:
- return N.prev = 49, S.f(), N.finish(49);
- case 52:
- N.next = 58;
- break;
- case 54:
- return N.next = 56, ql(X, H, R, g, "diagramBg");
- case 56:
- (V = N.sent) && Y.push(V);
- case 58:
- N.next = 27;
- break;
- case 60:
- return N0(Y), g.diagramResObj = Z, g.digramFileContent = p, N.abrupt("return", { type: "diagram", left: A, top: s, width: n, height: a, elements: Y, order: C });
- case 64:
- case "end":
- return N.stop();
- }
- }, t, null, [[34, 46, 49, 52]]);
- })), PD.apply(this, arguments);
- }
- async function Pbg(t, I) {
- const g = await Sbg(t), C = iG(Lrg, { pptxJson: g });
- return C.mount(I), {
- $el: I,
- $destroy() {
- C.unmount();
- }
- };
- }
- var kX = { exports: {} };
- /*! ExcelJS 19-10-2023 */
- var Mq;
- function _bg() {
- return Mq || (Mq = 1, function(t, I) {
- (function(g) {
- t.exports = g();
- })(function() {
- return function g(C, i, e) {
- function A(n, a) {
- if (!i[n]) {
- if (!C[n]) {
- var d = typeof Qa == "function" && Qa;
- if (!a && d) return d(n, !0);
- if (s) return s(n, !0);
- var o = new Error("Cannot find module '" + n + "'");
- throw o.code = "MODULE_NOT_FOUND", o;
- }
- var c = i[n] = { exports: {} };
- C[n][0].call(c.exports, function(r) {
- return A(C[n][1][r] || r);
- }, c, c.exports, g, C, i, e);
- }
- return i[n].exports;
- }
- for (var s = typeof Qa == "function" && Qa, l = 0; l < e.length; l++) A(e[l]);
- return A;
- }({ 1: [function(g, C, i) {
- const e = g("fs"), A = g("fast-csv"), s = g("dayjs/plugin/customParseFormat"), l = g("dayjs/plugin/utc"), n = g("dayjs").extend(s).extend(l), a = g("../utils/stream-buf"), { fs: { exists: d } } = g("../utils/utils"), o = { true: !0, false: !1, "#N/A": { error: "#N/A" }, "#REF!": { error: "#REF!" }, "#NAME?": { error: "#NAME?" }, "#DIV/0!": { error: "#DIV/0!" }, "#NULL!": { error: "#NULL!" }, "#VALUE!": { error: "#VALUE!" }, "#NUM!": { error: "#NUM!" } };
- C.exports = class {
- constructor(c) {
- this.workbook = c, this.worksheet = null;
- }
- async readFile(c, r) {
- if (r = r || {}, !await d(c)) throw new Error("File not found: " + c);
- const h = e.createReadStream(c), b = await this.read(h, r);
- return h.close(), b;
- }
- read(c, r) {
- return r = r || {}, new Promise((h, b) => {
- const u = this.workbook.addWorksheet(r.sheetName), m = r.dateFormats || ["YYYY-MM-DD[T]HH:mm:ssZ", "YYYY-MM-DD[T]HH:mm:ss", "MM-DD-YYYY", "YYYY-MM-DD"], Z = r.map || function(Y) {
- if (Y === "") return null;
- const R = Number(Y);
- if (!Number.isNaN(R) && R !== 1 / 0) return R;
- const X = m.reduce((S, z) => {
- if (S) return S;
- const v = n(Y, z, !0);
- return v.isValid() ? v : null;
- }, null);
- if (X) return new Date(X.valueOf());
- const H = o[Y];
- return H !== void 0 ? H : Y;
- }, p = A.parse(r.parserOptions).on("data", (Y) => {
- u.addRow(Y.map(Z));
- }).on("end", () => {
- p.emit("worksheet", u);
- });
- p.on("worksheet", h).on("error", b), c.pipe(p);
- });
- }
- createInputStream() {
- throw new Error("`CSV#createInputStream` is deprecated. You should use `CSV#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md");
- }
- write(c, r) {
- return new Promise((h, b) => {
- r = r || {};
- const u = this.workbook.getWorksheet(r.sheetName || r.sheetId), m = A.format(r.formatterOptions);
- c.on("finish", () => {
- h();
- }), m.on("error", b), m.pipe(c);
- const { dateFormat: Z, dateUTC: p } = r, Y = r.map || ((H) => {
- if (H) {
- if (H.text || H.hyperlink) return H.hyperlink || H.text || "";
- if (H.formula || H.result) return H.result || "";
- if (H instanceof Date) return Z ? p ? n.utc(H).format(Z) : n(H).format(Z) : p ? n.utc(H).format() : n(H).format();
- if (H.error) return H.error;
- if (typeof H == "object") return JSON.stringify(H);
- }
- return H;
- }), R = r.includeEmptyRows === void 0 || r.includeEmptyRows;
- let X = 1;
- u && u.eachRow((H, S) => {
- if (R) for (; X++ < S - 1; ) m.write([]);
- const { values: z } = H;
- z.shift(), m.write(z.map(Y)), X = S;
- }), m.end();
- });
- }
- writeFile(c, r) {
- const h = { encoding: (r = r || {}).encoding || "utf8" }, b = e.createWriteStream(c, h);
- return this.write(b, r);
- }
- async writeBuffer(c) {
- const r = new a();
- return await this.write(r, c), r.read();
- }
- };
- }, { "../utils/stream-buf": 24, "../utils/utils": 27, dayjs: 391, "dayjs/plugin/customParseFormat": 392, "dayjs/plugin/utc": 393, "fast-csv": 424, fs: 216 }], 2: [function(g, C, i) {
- const e = g("../utils/col-cache");
- class A {
- constructor(l, n) {
- let a = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
- if (this.worksheet = l, n) if (typeof n == "string") {
- const d = e.decodeAddress(n);
- this.nativeCol = d.col + a, this.nativeColOff = 0, this.nativeRow = d.row + a, this.nativeRowOff = 0;
- } else n.nativeCol !== void 0 ? (this.nativeCol = n.nativeCol || 0, this.nativeColOff = n.nativeColOff || 0, this.nativeRow = n.nativeRow || 0, this.nativeRowOff = n.nativeRowOff || 0) : n.col !== void 0 ? (this.col = n.col + a, this.row = n.row + a) : (this.nativeCol = 0, this.nativeColOff = 0, this.nativeRow = 0, this.nativeRowOff = 0);
- else this.nativeCol = 0, this.nativeColOff = 0, this.nativeRow = 0, this.nativeRowOff = 0;
- }
- static asInstance(l) {
- return l instanceof A || l == null ? l : new A(l);
- }
- get col() {
- return this.nativeCol + Math.min(this.colWidth - 1, this.nativeColOff) / this.colWidth;
- }
- set col(l) {
- this.nativeCol = Math.floor(l), this.nativeColOff = Math.floor((l - this.nativeCol) * this.colWidth);
- }
- get row() {
- return this.nativeRow + Math.min(this.rowHeight - 1, this.nativeRowOff) / this.rowHeight;
- }
- set row(l) {
- this.nativeRow = Math.floor(l), this.nativeRowOff = Math.floor((l - this.nativeRow) * this.rowHeight);
- }
- get colWidth() {
- return this.worksheet && this.worksheet.getColumn(this.nativeCol + 1) && this.worksheet.getColumn(this.nativeCol + 1).isCustomWidth ? Math.floor(1e4 * this.worksheet.getColumn(this.nativeCol + 1).width) : 64e4;
- }
- get rowHeight() {
- return this.worksheet && this.worksheet.getRow(this.nativeRow + 1) && this.worksheet.getRow(this.nativeRow + 1).height ? Math.floor(1e4 * this.worksheet.getRow(this.nativeRow + 1).height) : 18e4;
- }
- get model() {
- return { nativeCol: this.nativeCol, nativeColOff: this.nativeColOff, nativeRow: this.nativeRow, nativeRowOff: this.nativeRowOff };
- }
- set model(l) {
- this.nativeCol = l.nativeCol, this.nativeColOff = l.nativeColOff, this.nativeRow = l.nativeRow, this.nativeRowOff = l.nativeRowOff;
- }
- }
- C.exports = A;
- }, { "../utils/col-cache": 19 }], 3: [function(g, C, i) {
- const e = g("../utils/col-cache"), A = g("../utils/under-dash"), s = g("./enums"), { slideFormula: l } = g("../utils/shared-formula"), n = g("./note");
- class a {
- constructor(c, r, h) {
- if (!c || !r) throw new Error("A Cell needs a Row");
- this._row = c, this._column = r, e.validateAddress(h), this._address = h, this._value = d.create(a.Types.Null, this), this.style = this._mergeStyle(c.style, r.style, {}), this._mergeCount = 0;
- }
- get worksheet() {
- return this._row.worksheet;
- }
- get workbook() {
- return this._row.worksheet.workbook;
- }
- destroy() {
- delete this.style, delete this._value, delete this._row, delete this._column, delete this._address;
- }
- get numFmt() {
- return this.style.numFmt;
- }
- set numFmt(c) {
- this.style.numFmt = c;
- }
- get font() {
- return this.style.font;
- }
- set font(c) {
- this.style.font = c;
- }
- get alignment() {
- return this.style.alignment;
- }
- set alignment(c) {
- this.style.alignment = c;
- }
- get border() {
- return this.style.border;
- }
- set border(c) {
- this.style.border = c;
- }
- get fill() {
- return this.style.fill;
- }
- set fill(c) {
- this.style.fill = c;
- }
- get protection() {
- return this.style.protection;
- }
- set protection(c) {
- this.style.protection = c;
- }
- _mergeStyle(c, r, h) {
- const b = c && c.numFmt || r && r.numFmt;
- b && (h.numFmt = b);
- const u = c && c.font || r && r.font;
- u && (h.font = u);
- const m = c && c.alignment || r && r.alignment;
- m && (h.alignment = m);
- const Z = c && c.border || r && r.border;
- Z && (h.border = Z);
- const p = c && c.fill || r && r.fill;
- p && (h.fill = p);
- const Y = c && c.protection || r && r.protection;
- return Y && (h.protection = Y), h;
- }
- get address() {
- return this._address;
- }
- get row() {
- return this._row.number;
- }
- get col() {
- return this._column.number;
- }
- get $col$row() {
- return `$${this._column.letter}$${this.row}`;
- }
- get type() {
- return this._value.type;
- }
- get effectiveType() {
- return this._value.effectiveType;
- }
- toCsvString() {
- return this._value.toCsvString();
- }
- addMergeRef() {
- this._mergeCount++;
- }
- releaseMergeRef() {
- this._mergeCount--;
- }
- get isMerged() {
- return this._mergeCount > 0 || this.type === a.Types.Merge;
- }
- merge(c, r) {
- this._value.release(), this._value = d.create(a.Types.Merge, this, c), r || (this.style = c.style);
- }
- unmerge() {
- this.type === a.Types.Merge && (this._value.release(), this._value = d.create(a.Types.Null, this), this.style = this._mergeStyle(this._row.style, this._column.style, {}));
- }
- isMergedTo(c) {
- return this._value.type === a.Types.Merge && this._value.isMergedTo(c);
- }
- get master() {
- return this.type === a.Types.Merge ? this._value.master : this;
- }
- get isHyperlink() {
- return this._value.type === a.Types.Hyperlink;
- }
- get hyperlink() {
- return this._value.hyperlink;
- }
- get value() {
- return this._value.value;
- }
- set value(c) {
- this.type !== a.Types.Merge ? (this._value.release(), this._value = d.create(d.getType(c), this, c)) : this._value.master.value = c;
- }
- get note() {
- return this._comment && this._comment.note;
- }
- set note(c) {
- this._comment = new n(c);
- }
- get text() {
- return this._value.toString();
- }
- get html() {
- return A.escapeHtml(this.text);
- }
- toString() {
- return this.text;
- }
- _upgradeToHyperlink(c) {
- this.type === a.Types.String && (this._value = d.create(a.Types.Hyperlink, this, { text: this._value.value, hyperlink: c }));
- }
- get formula() {
- return this._value.formula;
- }
- get result() {
- return this._value.result;
- }
- get formulaType() {
- return this._value.formulaType;
- }
- get fullAddress() {
- const { worksheet: c } = this._row;
- return { sheetName: c.name, address: this.address, row: this.row, col: this.col };
- }
- get name() {
- return this.names[0];
- }
- set name(c) {
- this.names = [c];
- }
- get names() {
- return this.workbook.definedNames.getNamesEx(this.fullAddress);
- }
- set names(c) {
- const { definedNames: r } = this.workbook;
- r.removeAllNames(this.fullAddress), c.forEach((h) => {
- r.addEx(this.fullAddress, h);
- });
- }
- addName(c) {
- this.workbook.definedNames.addEx(this.fullAddress, c);
- }
- removeName(c) {
- this.workbook.definedNames.removeEx(this.fullAddress, c);
- }
- removeAllNames() {
- this.workbook.definedNames.removeAllNames(this.fullAddress);
- }
- get _dataValidations() {
- return this.worksheet.dataValidations;
- }
- get dataValidation() {
- return this._dataValidations.find(this.address);
- }
- set dataValidation(c) {
- this._dataValidations.add(this.address, c);
- }
- get model() {
- const { model: c } = this._value;
- return c.style = this.style, this._comment && (c.comment = this._comment.model), c;
- }
- set model(c) {
- if (this._value.release(), this._value = d.create(c.type, this), this._value.model = c, c.comment) switch (c.comment.type) {
- case "note":
- this._comment = n.fromModel(c.comment);
- }
- c.style ? this.style = c.style : this.style = {};
- }
- }
- a.Types = s.ValueType;
- const d = { getType: (o) => o == null ? a.Types.Null : o instanceof String || typeof o == "string" ? a.Types.String : typeof o == "number" ? a.Types.Number : typeof o == "boolean" ? a.Types.Boolean : o instanceof Date ? a.Types.Date : o.text && o.hyperlink ? a.Types.Hyperlink : o.formula || o.sharedFormula ? a.Types.Formula : o.richText ? a.Types.RichText : o.sharedString ? a.Types.SharedString : o.error ? a.Types.Error : a.Types.JSON, types: [{ t: a.Types.Null, f: class {
- constructor(o) {
- this.model = { address: o.address, type: a.Types.Null };
- }
- get value() {
- return null;
- }
- set value(o) {
- }
- get type() {
- return a.Types.Null;
- }
- get effectiveType() {
- return a.Types.Null;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return "";
- }
- release() {
- }
- toString() {
- return "";
- }
- } }, { t: a.Types.Number, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.Number, value: c };
- }
- get value() {
- return this.model.value;
- }
- set value(o) {
- this.model.value = o;
- }
- get type() {
- return a.Types.Number;
- }
- get effectiveType() {
- return a.Types.Number;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return this.model.value.toString();
- }
- release() {
- }
- toString() {
- return this.model.value.toString();
- }
- } }, { t: a.Types.String, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.String, value: c };
- }
- get value() {
- return this.model.value;
- }
- set value(o) {
- this.model.value = o;
- }
- get type() {
- return a.Types.String;
- }
- get effectiveType() {
- return a.Types.String;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return `"${this.model.value.replace(/"/g, '""')}"`;
- }
- release() {
- }
- toString() {
- return this.model.value;
- }
- } }, { t: a.Types.Date, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.Date, value: c };
- }
- get value() {
- return this.model.value;
- }
- set value(o) {
- this.model.value = o;
- }
- get type() {
- return a.Types.Date;
- }
- get effectiveType() {
- return a.Types.Date;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return this.model.value.toISOString();
- }
- release() {
- }
- toString() {
- return this.model.value.toString();
- }
- } }, { t: a.Types.Hyperlink, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.Hyperlink, text: c ? c.text : void 0, hyperlink: c ? c.hyperlink : void 0 }, c && c.tooltip && (this.model.tooltip = c.tooltip);
- }
- get value() {
- const o = { text: this.model.text, hyperlink: this.model.hyperlink };
- return this.model.tooltip && (o.tooltip = this.model.tooltip), o;
- }
- set value(o) {
- this.model = { text: o.text, hyperlink: o.hyperlink }, o.tooltip && (this.model.tooltip = o.tooltip);
- }
- get text() {
- return this.model.text;
- }
- set text(o) {
- this.model.text = o;
- }
- get hyperlink() {
- return this.model.hyperlink;
- }
- set hyperlink(o) {
- this.model.hyperlink = o;
- }
- get type() {
- return a.Types.Hyperlink;
- }
- get effectiveType() {
- return a.Types.Hyperlink;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return this.model.hyperlink;
- }
- release() {
- }
- toString() {
- return this.model.text;
- }
- } }, { t: a.Types.Formula, f: class {
- constructor(o, c) {
- this.cell = o, this.model = { address: o.address, type: a.Types.Formula, shareType: c ? c.shareType : void 0, ref: c ? c.ref : void 0, formula: c ? c.formula : void 0, sharedFormula: c ? c.sharedFormula : void 0, result: c ? c.result : void 0 };
- }
- _copyModel(o) {
- const c = {}, r = (h) => {
- const b = o[h];
- b && (c[h] = b);
- };
- return r("formula"), r("result"), r("ref"), r("shareType"), r("sharedFormula"), c;
- }
- get value() {
- return this._copyModel(this.model);
- }
- set value(o) {
- this.model = this._copyModel(o);
- }
- validate(o) {
- switch (d.getType(o)) {
- case a.Types.Null:
- case a.Types.String:
- case a.Types.Number:
- case a.Types.Date:
- break;
- case a.Types.Hyperlink:
- case a.Types.Formula:
- default:
- throw new Error("Cannot process that type of result value");
- }
- }
- get dependencies() {
- return { ranges: this.formula.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g), cells: this.formula.replace(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g, "").match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}/g) };
- }
- get formula() {
- return this.model.formula || this._getTranslatedFormula();
- }
- set formula(o) {
- this.model.formula = o;
- }
- get formulaType() {
- return this.model.formula ? s.FormulaType.Master : this.model.sharedFormula ? s.FormulaType.Shared : s.FormulaType.None;
- }
- get result() {
- return this.model.result;
- }
- set result(o) {
- this.model.result = o;
- }
- get type() {
- return a.Types.Formula;
- }
- get effectiveType() {
- const o = this.model.result;
- return o == null ? s.ValueType.Null : o instanceof String || typeof o == "string" ? s.ValueType.String : typeof o == "number" ? s.ValueType.Number : o instanceof Date ? s.ValueType.Date : o.text && o.hyperlink ? s.ValueType.Hyperlink : o.formula ? s.ValueType.Formula : s.ValueType.Null;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- _getTranslatedFormula() {
- if (!this._translatedFormula && this.model.sharedFormula) {
- const { worksheet: o } = this.cell, c = o.findCell(this.model.sharedFormula);
- this._translatedFormula = c && l(c.formula, c.address, this.model.address);
- }
- return this._translatedFormula;
- }
- toCsvString() {
- return "" + (this.model.result || "");
- }
- release() {
- }
- toString() {
- return this.model.result ? this.model.result.toString() : "";
- }
- } }, { t: a.Types.Merge, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.Merge, master: c ? c.address : void 0 }, this._master = c, c && c.addMergeRef();
- }
- get value() {
- return this._master.value;
- }
- set value(o) {
- o instanceof a ? (this._master && this._master.releaseMergeRef(), o.addMergeRef(), this._master = o) : this._master.value = o;
- }
- isMergedTo(o) {
- return o === this._master;
- }
- get master() {
- return this._master;
- }
- get type() {
- return a.Types.Merge;
- }
- get effectiveType() {
- return this._master.effectiveType;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return "";
- }
- release() {
- this._master.releaseMergeRef();
- }
- toString() {
- return this.value.toString();
- }
- } }, { t: a.Types.JSON, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.String, value: JSON.stringify(c), rawValue: c };
- }
- get value() {
- return this.model.rawValue;
- }
- set value(o) {
- this.model.rawValue = o, this.model.value = JSON.stringify(o);
- }
- get type() {
- return a.Types.String;
- }
- get effectiveType() {
- return a.Types.String;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return this.model.value;
- }
- release() {
- }
- toString() {
- return this.model.value;
- }
- } }, { t: a.Types.SharedString, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.SharedString, value: c };
- }
- get value() {
- return this.model.value;
- }
- set value(o) {
- this.model.value = o;
- }
- get type() {
- return a.Types.SharedString;
- }
- get effectiveType() {
- return a.Types.SharedString;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return this.model.value.toString();
- }
- release() {
- }
- toString() {
- return this.model.value.toString();
- }
- } }, { t: a.Types.RichText, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.String, value: c };
- }
- get value() {
- return this.model.value;
- }
- set value(o) {
- this.model.value = o;
- }
- toString() {
- return this.model.value.richText.map((o) => o.text).join("");
- }
- get type() {
- return a.Types.RichText;
- }
- get effectiveType() {
- return a.Types.RichText;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return `"${this.text.replace(/"/g, '""')}"`;
- }
- release() {
- }
- } }, { t: a.Types.Boolean, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.Boolean, value: c };
- }
- get value() {
- return this.model.value;
- }
- set value(o) {
- this.model.value = o;
- }
- get type() {
- return a.Types.Boolean;
- }
- get effectiveType() {
- return a.Types.Boolean;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return this.model.value ? 1 : 0;
- }
- release() {
- }
- toString() {
- return this.model.value.toString();
- }
- } }, { t: a.Types.Error, f: class {
- constructor(o, c) {
- this.model = { address: o.address, type: a.Types.Error, value: c };
- }
- get value() {
- return this.model.value;
- }
- set value(o) {
- this.model.value = o;
- }
- get type() {
- return a.Types.Error;
- }
- get effectiveType() {
- return a.Types.Error;
- }
- get address() {
- return this.model.address;
- }
- set address(o) {
- this.model.address = o;
- }
- toCsvString() {
- return this.toString();
- }
- release() {
- }
- toString() {
- return this.model.value.error.toString();
- }
- } }].reduce((o, c) => (o[c.t] = c.f, o), []), create(o, c, r) {
- const h = this.types[o];
- if (!h) throw new Error("Could not create Value of type " + o);
- return new h(c, r);
- } };
- C.exports = a;
- }, { "../utils/col-cache": 19, "../utils/shared-formula": 23, "../utils/under-dash": 26, "./enums": 7, "./note": 9 }], 4: [function(g, C, i) {
- const e = g("../utils/under-dash"), A = g("./enums"), s = g("../utils/col-cache");
- class l {
- constructor(a, d, o) {
- this._worksheet = a, this._number = d, o !== !1 && (this.defn = o);
- }
- get number() {
- return this._number;
- }
- get worksheet() {
- return this._worksheet;
- }
- get letter() {
- return s.n2l(this._number);
- }
- get isCustomWidth() {
- return this.width !== void 0 && this.width !== 9;
- }
- get defn() {
- return { header: this._header, key: this.key, width: this.width, style: this.style, hidden: this.hidden, outlineLevel: this.outlineLevel };
- }
- set defn(a) {
- a ? (this.key = a.key, this.width = a.width !== void 0 ? a.width : 9, this.outlineLevel = a.outlineLevel, a.style ? this.style = a.style : this.style = {}, this.header = a.header, this._hidden = !!a.hidden) : (delete this._header, delete this._key, delete this.width, this.style = {}, this.outlineLevel = 0);
- }
- get headers() {
- return this._header && this._header instanceof Array ? this._header : [this._header];
- }
- get header() {
- return this._header;
- }
- set header(a) {
- a !== void 0 ? (this._header = a, this.headers.forEach((d, o) => {
- this._worksheet.getCell(o + 1, this.number).value = d;
- })) : this._header = void 0;
- }
- get key() {
- return this._key;
- }
- set key(a) {
- (this._key && this._worksheet.getColumnKey(this._key)) === this && this._worksheet.deleteColumnKey(this._key), this._key = a, a && this._worksheet.setColumnKey(this._key, this);
- }
- get hidden() {
- return !!this._hidden;
- }
- set hidden(a) {
- this._hidden = a;
- }
- get outlineLevel() {
- return this._outlineLevel || 0;
- }
- set outlineLevel(a) {
- this._outlineLevel = a;
- }
- get collapsed() {
- return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelCol);
- }
- toString() {
- return JSON.stringify({ key: this.key, width: this.width, headers: this.headers.length ? this.headers : void 0 });
- }
- equivalentTo(a) {
- return this.width === a.width && this.hidden === a.hidden && this.outlineLevel === a.outlineLevel && e.isEqual(this.style, a.style);
- }
- get isDefault() {
- if (this.isCustomWidth || this.hidden || this.outlineLevel) return !1;
- const a = this.style;
- return !a || !(a.font || a.numFmt || a.alignment || a.border || a.fill || a.protection);
- }
- get headerCount() {
- return this.headers.length;
- }
- eachCell(a, d) {
- const o = this.number;
- d || (d = a, a = null), this._worksheet.eachRow(a, (c, r) => {
- d(c.getCell(o), r);
- });
- }
- get values() {
- const a = [];
- return this.eachCell((d, o) => {
- d && d.type !== A.ValueType.Null && (a[o] = d.value);
- }), a;
- }
- set values(a) {
- if (!a) return;
- const d = this.number;
- let o = 0;
- a.hasOwnProperty("0") && (o = 1), a.forEach((c, r) => {
- this._worksheet.getCell(r + o, d).value = c;
- });
- }
- _applyStyle(a, d) {
- return this.style[a] = d, this.eachCell((o) => {
- o[a] = d;
- }), d;
- }
- get numFmt() {
- return this.style.numFmt;
- }
- set numFmt(a) {
- this._applyStyle("numFmt", a);
- }
- get font() {
- return this.style.font;
- }
- set font(a) {
- this._applyStyle("font", a);
- }
- get alignment() {
- return this.style.alignment;
- }
- set alignment(a) {
- this._applyStyle("alignment", a);
- }
- get protection() {
- return this.style.protection;
- }
- set protection(a) {
- this._applyStyle("protection", a);
- }
- get border() {
- return this.style.border;
- }
- set border(a) {
- this._applyStyle("border", a);
- }
- get fill() {
- return this.style.fill;
- }
- set fill(a) {
- this._applyStyle("fill", a);
- }
- static toModel(a) {
- const d = [];
- let o = null;
- return a && a.forEach((c, r) => {
- c.isDefault ? o && (o = null) : o && c.equivalentTo(o) ? o.max = r + 1 : (o = { min: r + 1, max: r + 1, width: c.width !== void 0 ? c.width : 9, style: c.style, isCustomWidth: c.isCustomWidth, hidden: c.hidden, outlineLevel: c.outlineLevel, collapsed: c.collapsed }, d.push(o));
- }), d.length ? d : void 0;
- }
- static fromModel(a, d) {
- const o = [];
- let c = 1, r = 0;
- for (d = (d = d || []).sort(function(h, b) {
- return h.min - b.min;
- }); r < d.length; ) {
- const h = d[r++];
- for (; c < h.min; ) o.push(new l(a, c++));
- for (; c <= h.max; ) o.push(new l(a, c++, h));
- }
- return o.length ? o : null;
- }
- }
- C.exports = l;
- }, { "../utils/col-cache": 19, "../utils/under-dash": 26, "./enums": 7 }], 5: [function(g, C, i) {
- C.exports = class {
- constructor(e) {
- this.model = e || {};
- }
- add(e, A) {
- return this.model[e] = A;
- }
- find(e) {
- return this.model[e];
- }
- remove(e) {
- this.model[e] = void 0;
- }
- };
- }, {}], 6: [function(g, C, i) {
- const e = g("../utils/under-dash"), A = g("../utils/col-cache"), s = g("../utils/cell-matrix"), l = g("./range"), n = /[$](\w+)[$](\d+)(:[$](\w+)[$](\d+))?/;
- C.exports = class {
- constructor() {
- this.matrixMap = {};
- }
- getMatrix(a) {
- return this.matrixMap[a] || (this.matrixMap[a] = new s());
- }
- add(a, d) {
- const o = A.decodeEx(a);
- this.addEx(o, d);
- }
- addEx(a, d) {
- const o = this.getMatrix(d);
- if (a.top) for (let c = a.left; c <= a.right; c++) for (let r = a.top; r <= a.bottom; r++) {
- const h = { sheetName: a.sheetName, address: A.n2l(c) + r, row: r, col: c };
- o.addCellEx(h);
- }
- else o.addCellEx(a);
- }
- remove(a, d) {
- const o = A.decodeEx(a);
- this.removeEx(o, d);
- }
- removeEx(a, d) {
- this.getMatrix(d).removeCellEx(a);
- }
- removeAllNames(a) {
- e.each(this.matrixMap, (d) => {
- d.removeCellEx(a);
- });
- }
- forEach(a) {
- e.each(this.matrixMap, (d, o) => {
- d.forEach((c) => {
- a(o, c);
- });
- });
- }
- getNames(a) {
- return this.getNamesEx(A.decodeEx(a));
- }
- getNamesEx(a) {
- return e.map(this.matrixMap, (d, o) => d.findCellEx(a) && o).filter(Boolean);
- }
- _explore(a, d) {
- d.mark = !1;
- const { sheetName: o } = d, c = new l(d.row, d.col, d.row, d.col, o);
- let r, h;
- function b(m, Z) {
- const p = a.findCellAt(o, m, d.col);
- return !(!p || !p.mark) && (c[Z] = m, p.mark = !1, !0);
- }
- for (h = d.row - 1; b(h, "top"); h--) ;
- for (h = d.row + 1; b(h, "bottom"); h++) ;
- function u(m, Z) {
- const p = [];
- for (h = c.top; h <= c.bottom; h++) {
- const Y = a.findCellAt(o, h, m);
- if (!Y || !Y.mark) return !1;
- p.push(Y);
- }
- c[Z] = m;
- for (let Y = 0; Y < p.length; Y++) p[Y].mark = !1;
- return !0;
- }
- for (r = d.col - 1; u(r, "left"); r--) ;
- for (r = d.col + 1; u(r, "right"); r++) ;
- return c;
- }
- getRanges(a, d) {
- return (d = d || this.matrixMap[a]) ? (d.forEach((o) => {
- o.mark = !0;
- }), { name: a, ranges: d.map((o) => o.mark && this._explore(d, o)).filter(Boolean).map((o) => o.$shortRange) }) : { name: a, ranges: [] };
- }
- normaliseMatrix(a, d) {
- a.forEachInSheet(d, (o, c, r) => {
- o && (o.row === c && o.col === r || (o.row = c, o.col = r, o.address = A.n2l(r) + c));
- });
- }
- spliceRows(a, d, o, c) {
- e.each(this.matrixMap, (r) => {
- r.spliceRows(a, d, o, c), this.normaliseMatrix(r, a);
- });
- }
- spliceColumns(a, d, o, c) {
- e.each(this.matrixMap, (r) => {
- r.spliceColumns(a, d, o, c), this.normaliseMatrix(r, a);
- });
- }
- get model() {
- return e.map(this.matrixMap, (a, d) => this.getRanges(d, a)).filter((a) => a.ranges.length);
- }
- set model(a) {
- const d = this.matrixMap = {};
- a.forEach((o) => {
- const c = d[o.name] = new s();
- o.ranges.forEach((r) => {
- n.test(r.split("!").pop() || "") && c.addCell(r);
- });
- });
- }
- };
- }, { "../utils/cell-matrix": 18, "../utils/col-cache": 19, "../utils/under-dash": 26, "./range": 10 }], 7: [function(g, C, i) {
- C.exports = { ValueType: { Null: 0, Merge: 1, Number: 2, String: 3, Date: 4, Hyperlink: 5, Formula: 6, SharedString: 7, RichText: 8, Boolean: 9, Error: 10 }, FormulaType: { None: 0, Master: 1, Shared: 2 }, RelationshipType: { None: 0, OfficeDocument: 1, Worksheet: 2, CalcChain: 3, SharedStrings: 4, Styles: 5, Theme: 6, Hyperlink: 7 }, DocumentType: { Xlsx: 1 }, ReadingOrder: { LeftToRight: 1, RightToLeft: 2 }, ErrorValue: { NotApplicable: "#N/A", Ref: "#REF!", Name: "#NAME?", DivZero: "#DIV/0!", Null: "#NULL!", Value: "#VALUE!", Num: "#NUM!" } };
- }, {}], 8: [function(g, C, i) {
- const e = g("../utils/col-cache"), A = g("./anchor");
- C.exports = class {
- constructor(s, l) {
- this.worksheet = s, this.model = l;
- }
- get model() {
- switch (this.type) {
- case "background":
- return { type: this.type, imageId: this.imageId };
- case "image":
- return { type: this.type, imageId: this.imageId, hyperlinks: this.range.hyperlinks, range: { tl: this.range.tl.model, br: this.range.br && this.range.br.model, ext: this.range.ext, editAs: this.range.editAs } };
- default:
- throw new Error("Invalid Image Type");
- }
- }
- set model(s) {
- let { type: l, imageId: n, range: a, hyperlinks: d } = s;
- if (this.type = l, this.imageId = n, l === "image") if (typeof a == "string") {
- const o = e.decode(a);
- this.range = { tl: new A(this.worksheet, { col: o.left, row: o.top }, -1), br: new A(this.worksheet, { col: o.right, row: o.bottom }, 0), editAs: "oneCell" };
- } else this.range = { tl: new A(this.worksheet, a.tl, 0), br: a.br && new A(this.worksheet, a.br, 0), ext: a.ext, editAs: a.editAs, hyperlinks: d || a.hyperlinks };
- }
- };
- }, { "../utils/col-cache": 19, "./anchor": 2 }], 9: [function(g, C, i) {
- const e = g("../utils/under-dash");
- class A {
- constructor(l) {
- this.note = l;
- }
- get model() {
- let l = null;
- switch (typeof this.note) {
- case "string":
- l = { type: "note", note: { texts: [{ text: this.note }] } };
- break;
- default:
- l = { type: "note", note: this.note };
- }
- return e.deepMerge({}, A.DEFAULT_CONFIGS, l);
- }
- set model(l) {
- const { note: n } = l, { texts: a } = n;
- a.length === 1 && Object.keys(a[0]).length === 1 ? this.note = a[0].text : this.note = n;
- }
- static fromModel(l) {
- const n = new A();
- return n.model = l, n;
- }
- }
- A.DEFAULT_CONFIGS = { note: { margins: { insetmode: "auto", inset: [0.13, 0.13, 0.25, 0.25] }, protection: { locked: "True", lockText: "True" }, editAs: "absolute" } }, C.exports = A;
- }, { "../utils/under-dash": 26 }], 10: [function(g, C, i) {
- const e = g("../utils/col-cache");
- class A {
- constructor() {
- this.decode(arguments);
- }
- setTLBR(l, n, a, d, o) {
- if (arguments.length < 4) {
- const c = e.decodeAddress(l), r = e.decodeAddress(n);
- this.model = { top: Math.min(c.row, r.row), left: Math.min(c.col, r.col), bottom: Math.max(c.row, r.row), right: Math.max(c.col, r.col), sheetName: a }, this.setTLBR(c.row, c.col, r.row, r.col, o);
- } else this.model = { top: Math.min(l, a), left: Math.min(n, d), bottom: Math.max(l, a), right: Math.max(n, d), sheetName: o };
- }
- decode(l) {
- switch (l.length) {
- case 5:
- this.setTLBR(l[0], l[1], l[2], l[3], l[4]);
- break;
- case 4:
- this.setTLBR(l[0], l[1], l[2], l[3]);
- break;
- case 3:
- this.setTLBR(l[0], l[1], l[2]);
- break;
- case 2:
- this.setTLBR(l[0], l[1]);
- break;
- case 1: {
- const n = l[0];
- if (n instanceof A) this.model = { top: n.model.top, left: n.model.left, bottom: n.model.bottom, right: n.model.right, sheetName: n.sheetName };
- else if (n instanceof Array) this.decode(n);
- else if (n.top && n.left && n.bottom && n.right) this.model = { top: n.top, left: n.left, bottom: n.bottom, right: n.right, sheetName: n.sheetName };
- else {
- const a = e.decodeEx(n);
- a.top ? this.model = { top: a.top, left: a.left, bottom: a.bottom, right: a.right, sheetName: a.sheetName } : this.model = { top: a.row, left: a.col, bottom: a.row, right: a.col, sheetName: a.sheetName };
- }
- break;
- }
- case 0:
- this.model = { top: 0, left: 0, bottom: 0, right: 0 };
- break;
- default:
- throw new Error("Invalid number of arguments to _getDimensions() - " + l.length);
- }
- }
- get top() {
- return this.model.top || 1;
- }
- set top(l) {
- this.model.top = l;
- }
- get left() {
- return this.model.left || 1;
- }
- set left(l) {
- this.model.left = l;
- }
- get bottom() {
- return this.model.bottom || 1;
- }
- set bottom(l) {
- this.model.bottom = l;
- }
- get right() {
- return this.model.right || 1;
- }
- set right(l) {
- this.model.right = l;
- }
- get sheetName() {
- return this.model.sheetName;
- }
- set sheetName(l) {
- this.model.sheetName = l;
- }
- get _serialisedSheetName() {
- const { sheetName: l } = this.model;
- return l ? /^[a-zA-Z0-9]*$/.test(l) ? l + "!" : `'${l}'!` : "";
- }
- expand(l, n, a, d) {
- (!this.model.top || l < this.top) && (this.top = l), (!this.model.left || n < this.left) && (this.left = n), (!this.model.bottom || a > this.bottom) && (this.bottom = a), (!this.model.right || d > this.right) && (this.right = d);
- }
- expandRow(l) {
- if (l) {
- const { dimensions: n, number: a } = l;
- n && this.expand(a, n.min, a, n.max);
- }
- }
- expandToAddress(l) {
- const n = e.decodeEx(l);
- this.expand(n.row, n.col, n.row, n.col);
- }
- get tl() {
- return e.n2l(this.left) + this.top;
- }
- get $t$l() {
- return `$${e.n2l(this.left)}$${this.top}`;
- }
- get br() {
- return e.n2l(this.right) + this.bottom;
- }
- get $b$r() {
- return `$${e.n2l(this.right)}$${this.bottom}`;
- }
- get range() {
- return `${this._serialisedSheetName + this.tl}:${this.br}`;
- }
- get $range() {
- return `${this._serialisedSheetName + this.$t$l}:${this.$b$r}`;
- }
- get shortRange() {
- return this.count > 1 ? this.range : this._serialisedSheetName + this.tl;
- }
- get $shortRange() {
- return this.count > 1 ? this.$range : this._serialisedSheetName + this.$t$l;
- }
- get count() {
- return (1 + this.bottom - this.top) * (1 + this.right - this.left);
- }
- toString() {
- return this.range;
- }
- intersects(l) {
- return (!l.sheetName || !this.sheetName || l.sheetName === this.sheetName) && !(l.bottom < this.top) && !(l.top > this.bottom) && !(l.right < this.left) && !(l.left > this.right);
- }
- contains(l) {
- const n = e.decodeEx(l);
- return this.containsEx(n);
- }
- containsEx(l) {
- return (!l.sheetName || !this.sheetName || l.sheetName === this.sheetName) && l.row >= this.top && l.row <= this.bottom && l.col >= this.left && l.col <= this.right;
- }
- forEachAddress(l) {
- for (let n = this.left; n <= this.right; n++) for (let a = this.top; a <= this.bottom; a++) l(e.encodeAddress(a, n), a, n);
- }
- }
- C.exports = A;
- }, { "../utils/col-cache": 19 }], 11: [function(g, C, i) {
- const e = g("../utils/under-dash"), A = g("./enums"), s = g("../utils/col-cache"), l = g("./cell");
- C.exports = class {
- constructor(n, a) {
- this._worksheet = n, this._number = a, this._cells = [], this.style = {}, this.outlineLevel = 0;
- }
- get number() {
- return this._number;
- }
- get worksheet() {
- return this._worksheet;
- }
- commit() {
- this._worksheet._commitRow(this);
- }
- destroy() {
- delete this._worksheet, delete this._cells, delete this.style;
- }
- findCell(n) {
- return this._cells[n - 1];
- }
- getCellEx(n) {
- let a = this._cells[n.col - 1];
- if (!a) {
- const d = this._worksheet.getColumn(n.col);
- a = new l(this, d, n.address), this._cells[n.col - 1] = a;
- }
- return a;
- }
- getCell(n) {
- if (typeof n == "string") {
- const a = this._worksheet.getColumnKey(n);
- n = a ? a.number : s.l2n(n);
- }
- return this._cells[n - 1] || this.getCellEx({ address: s.encodeAddress(this._number, n), row: this._number, col: n });
- }
- splice(n, a) {
- const d = n + a;
- for (var o = arguments.length, c = new Array(o > 2 ? o - 2 : 0), r = 2; r < o; r++) c[r - 2] = arguments[r];
- const h = c.length - a, b = this._cells.length;
- let u, m, Z;
- if (h < 0) for (u = n + c.length; u <= b; u++) Z = this._cells[u - 1], m = this._cells[u - h - 1], m ? (Z = this.getCell(u), Z.value = m.value, Z.style = m.style, Z._comment = m._comment) : Z && (Z.value = null, Z.style = {}, Z._comment = void 0);
- else if (h > 0) for (u = b; u >= d; u--) m = this._cells[u - 1], m ? (Z = this.getCell(u + h), Z.value = m.value, Z.style = m.style, Z._comment = m._comment) : this._cells[u + h - 1] = void 0;
- for (u = 0; u < c.length; u++) Z = this.getCell(n + u), Z.value = c[u], Z.style = {}, Z._comment = void 0;
- }
- eachCell(n, a) {
- if (a || (a = n, n = null), n && n.includeEmpty) {
- const d = this._cells.length;
- for (let o = 1; o <= d; o++) a(this.getCell(o), o);
- } else this._cells.forEach((d, o) => {
- d && d.type !== A.ValueType.Null && a(d, o + 1);
- });
- }
- addPageBreak(n, a) {
- const d = this._worksheet, o = Math.max(0, n - 1) || 0, c = Math.max(0, a - 1) || 16838, r = { id: this._number, max: c, man: 1 };
- o && (r.min = o), d.rowBreaks.push(r);
- }
- get values() {
- const n = [];
- return this._cells.forEach((a) => {
- a && a.type !== A.ValueType.Null && (n[a.col] = a.value);
- }), n;
- }
- set values(n) {
- if (this._cells = [], n) if (n instanceof Array) {
- let a = 0;
- n.hasOwnProperty("0") && (a = 1), n.forEach((d, o) => {
- d !== void 0 && (this.getCellEx({ address: s.encodeAddress(this._number, o + a), row: this._number, col: o + a }).value = d);
- });
- } else this._worksheet.eachColumnKey((a, d) => {
- n[d] !== void 0 && (this.getCellEx({ address: s.encodeAddress(this._number, a.number), row: this._number, col: a.number }).value = n[d]);
- });
- }
- get hasValues() {
- return e.some(this._cells, (n) => n && n.type !== A.ValueType.Null);
- }
- get cellCount() {
- return this._cells.length;
- }
- get actualCellCount() {
- let n = 0;
- return this.eachCell(() => {
- n++;
- }), n;
- }
- get dimensions() {
- let n = 0, a = 0;
- return this._cells.forEach((d) => {
- d && d.type !== A.ValueType.Null && ((!n || n > d.col) && (n = d.col), a < d.col && (a = d.col));
- }), n > 0 ? { min: n, max: a } : null;
- }
- _applyStyle(n, a) {
- return this.style[n] = a, this._cells.forEach((d) => {
- d && (d[n] = a);
- }), a;
- }
- get numFmt() {
- return this.style.numFmt;
- }
- set numFmt(n) {
- this._applyStyle("numFmt", n);
- }
- get font() {
- return this.style.font;
- }
- set font(n) {
- this._applyStyle("font", n);
- }
- get alignment() {
- return this.style.alignment;
- }
- set alignment(n) {
- this._applyStyle("alignment", n);
- }
- get protection() {
- return this.style.protection;
- }
- set protection(n) {
- this._applyStyle("protection", n);
- }
- get border() {
- return this.style.border;
- }
- set border(n) {
- this._applyStyle("border", n);
- }
- get fill() {
- return this.style.fill;
- }
- set fill(n) {
- this._applyStyle("fill", n);
- }
- get hidden() {
- return !!this._hidden;
- }
- set hidden(n) {
- this._hidden = n;
- }
- get outlineLevel() {
- return this._outlineLevel || 0;
- }
- set outlineLevel(n) {
- this._outlineLevel = n;
- }
- get collapsed() {
- return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow);
- }
- get model() {
- const n = [];
- let a = 0, d = 0;
- return this._cells.forEach((o) => {
- if (o) {
- const c = o.model;
- c && ((!a || a > o.col) && (a = o.col), d < o.col && (d = o.col), n.push(c));
- }
- }), this.height || n.length ? { cells: n, number: this.number, min: a, max: d, height: this.height, style: this.style, hidden: this.hidden, outlineLevel: this.outlineLevel, collapsed: this.collapsed } : null;
- }
- set model(n) {
- if (n.number !== this._number) throw new Error("Invalid row number in model");
- let a;
- this._cells = [], n.cells.forEach((d) => {
- switch (d.type) {
- case l.Types.Merge:
- break;
- default: {
- let o;
- if (d.address) o = s.decodeAddress(d.address);
- else if (a) {
- const { row: c } = a, r = a.col + 1;
- o = { row: c, col: r, address: s.encodeAddress(c, r), $col$row: `$${s.n2l(r)}$${c}` };
- }
- a = o, this.getCellEx(o).model = d;
- break;
- }
- }
- }), n.height ? this.height = n.height : delete this.height, this.hidden = n.hidden, this.outlineLevel = n.outlineLevel || 0, this.style = n.style && JSON.parse(JSON.stringify(n.style)) || {};
- }
- };
- }, { "../utils/col-cache": 19, "../utils/under-dash": 26, "./cell": 3, "./enums": 7 }], 12: [function(g, C, i) {
- const e = g("../utils/col-cache");
- class A {
- constructor(l, n, a) {
- this.table = l, this.column = n, this.index = a;
- }
- _set(l, n) {
- this.table.cacheState(), this.column[l] = n;
- }
- get name() {
- return this.column.name;
- }
- set name(l) {
- this._set("name", l);
- }
- get filterButton() {
- return this.column.filterButton;
- }
- set filterButton(l) {
- this.column.filterButton = l;
- }
- get style() {
- return this.column.style;
- }
- set style(l) {
- this.column.style = l;
- }
- get totalsRowLabel() {
- return this.column.totalsRowLabel;
- }
- set totalsRowLabel(l) {
- this._set("totalsRowLabel", l);
- }
- get totalsRowFunction() {
- return this.column.totalsRowFunction;
- }
- set totalsRowFunction(l) {
- this._set("totalsRowFunction", l);
- }
- get totalsRowResult() {
- return this.column.totalsRowResult;
- }
- set totalsRowResult(l) {
- this._set("totalsRowResult", l);
- }
- get totalsRowFormula() {
- return this.column.totalsRowFormula;
- }
- set totalsRowFormula(l) {
- this._set("totalsRowFormula", l);
- }
- }
- C.exports = class {
- constructor(s, l) {
- this.worksheet = s, l && (this.table = l, this.validate(), this.store());
- }
- getFormula(s) {
- switch (s.totalsRowFunction) {
- case "none":
- return null;
- case "average":
- return `SUBTOTAL(101,${this.table.name}[${s.name}])`;
- case "countNums":
- return `SUBTOTAL(102,${this.table.name}[${s.name}])`;
- case "count":
- return `SUBTOTAL(103,${this.table.name}[${s.name}])`;
- case "max":
- return `SUBTOTAL(104,${this.table.name}[${s.name}])`;
- case "min":
- return `SUBTOTAL(105,${this.table.name}[${s.name}])`;
- case "stdDev":
- return `SUBTOTAL(106,${this.table.name}[${s.name}])`;
- case "var":
- return `SUBTOTAL(107,${this.table.name}[${s.name}])`;
- case "sum":
- return `SUBTOTAL(109,${this.table.name}[${s.name}])`;
- case "custom":
- return s.totalsRowFormula;
- default:
- throw new Error("Invalid Totals Row Function: " + s.totalsRowFunction);
- }
- }
- get width() {
- return this.table.columns.length;
- }
- get height() {
- return this.table.rows.length;
- }
- get filterHeight() {
- return this.height + (this.table.headerRow ? 1 : 0);
- }
- get tableHeight() {
- return this.filterHeight + (this.table.totalsRow ? 1 : 0);
- }
- validate() {
- const { table: s } = this, l = (h, b, u) => {
- h[b] === void 0 && (h[b] = u);
- };
- l(s, "headerRow", !0), l(s, "totalsRow", !1), l(s, "style", {}), l(s.style, "theme", "TableStyleMedium2"), l(s.style, "showFirstColumn", !1), l(s.style, "showLastColumn", !1), l(s.style, "showRowStripes", !1), l(s.style, "showColumnStripes", !1);
- const n = (h, b) => {
- if (!h) throw new Error(b);
- };
- n(s.ref, "Table must have ref"), n(s.columns, "Table must have column definitions"), n(s.rows, "Table must have row definitions"), s.tl = e.decodeAddress(s.ref);
- const { row: a, col: d } = s.tl;
- n(a > 0, "Table must be on valid row"), n(d > 0, "Table must be on valid col");
- const { width: o, filterHeight: c, tableHeight: r } = this;
- s.autoFilterRef = e.encode(a, d, a + c - 1, d + o - 1), s.tableRef = e.encode(a, d, a + r - 1, d + o - 1), s.columns.forEach((h, b) => {
- n(h.name, `Column ${b} must have a name`), b === 0 ? l(h, "totalsRowLabel", "Total") : (l(h, "totalsRowFunction", "none"), h.totalsRowFormula = this.getFormula(h));
- });
- }
- store() {
- const s = (c, r) => {
- r && Object.keys(r).forEach((h) => {
- c[h] = r[h];
- });
- }, { worksheet: l, table: n } = this, { row: a, col: d } = n.tl;
- let o = 0;
- if (n.headerRow) {
- const c = l.getRow(a + o++);
- n.columns.forEach((r, h) => {
- const { style: b, name: u } = r, m = c.getCell(d + h);
- m.value = u, s(m, b);
- });
- }
- if (n.rows.forEach((c) => {
- const r = l.getRow(a + o++);
- c.forEach((h, b) => {
- const u = r.getCell(d + b);
- u.value = h, s(u, n.columns[b].style);
- });
- }), n.totalsRow) {
- const c = l.getRow(a + o++);
- n.columns.forEach((r, h) => {
- const b = c.getCell(d + h);
- if (h === 0) b.value = r.totalsRowLabel;
- else {
- const u = this.getFormula(r);
- b.value = u ? { formula: r.totalsRowFormula, result: r.totalsRowResult } : null;
- }
- s(b, r.style);
- });
- }
- }
- load(s) {
- const { table: l } = this, { row: n, col: a } = l.tl;
- let d = 0;
- if (l.headerRow) {
- const o = s.getRow(n + d++);
- l.columns.forEach((c, r) => {
- o.getCell(a + r).value = c.name;
- });
- }
- if (l.rows.forEach((o) => {
- const c = s.getRow(n + d++);
- o.forEach((r, h) => {
- c.getCell(a + h).value = r;
- });
- }), l.totalsRow) {
- const o = s.getRow(n + d++);
- l.columns.forEach((c, r) => {
- const h = o.getCell(a + r);
- r === 0 ? h.value = c.totalsRowLabel : this.getFormula(c) && (h.value = { formula: c.totalsRowFormula, result: c.totalsRowResult });
- });
- }
- }
- get model() {
- return this.table;
- }
- set model(s) {
- this.table = s;
- }
- cacheState() {
- this._cache || (this._cache = { ref: this.ref, width: this.width, tableHeight: this.tableHeight });
- }
- commit() {
- if (!this._cache) return;
- this.validate();
- const s = e.decodeAddress(this._cache.ref);
- if (this.ref !== this._cache.ref) for (let l = 0; l < this._cache.tableHeight; l++) {
- const n = this.worksheet.getRow(s.row + l);
- for (let a = 0; a < this._cache.width; a++)
- n.getCell(s.col + a).value = null;
- }
- else {
- for (let l = this.tableHeight; l < this._cache.tableHeight; l++) {
- const n = this.worksheet.getRow(s.row + l);
- for (let a = 0; a < this._cache.width; a++)
- n.getCell(s.col + a).value = null;
- }
- for (let l = 0; l < this.tableHeight; l++) {
- const n = this.worksheet.getRow(s.row + l);
- for (let a = this.width; a < this._cache.width; a++)
- n.getCell(s.col + a).value = null;
- }
- }
- this.store();
- }
- addRow(s, l) {
- this.cacheState(), l === void 0 ? this.table.rows.push(s) : this.table.rows.splice(l, 0, s);
- }
- removeRows(s) {
- let l = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
- this.cacheState(), this.table.rows.splice(s, l);
- }
- getColumn(s) {
- const l = this.table.columns[s];
- return new A(this, l, s);
- }
- addColumn(s, l, n) {
- this.cacheState(), n === void 0 ? (this.table.columns.push(s), this.table.rows.forEach((a, d) => {
- a.push(l[d]);
- })) : (this.table.columns.splice(n, 0, s), this.table.rows.forEach((a, d) => {
- a.splice(n, 0, l[d]);
- }));
- }
- removeColumns(s) {
- let l = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
- this.cacheState(), this.table.columns.splice(s, l), this.table.rows.forEach((n) => {
- n.splice(s, l);
- });
- }
- _assign(s, l, n) {
- this.cacheState(), s[l] = n;
- }
- get ref() {
- return this.table.ref;
- }
- set ref(s) {
- this._assign(this.table, "ref", s);
- }
- get name() {
- return this.table.name;
- }
- set name(s) {
- this.table.name = s;
- }
- get displayName() {
- return this.table.displyName || this.table.name;
- }
- set displayNamename(s) {
- this.table.displayName = s;
- }
- get headerRow() {
- return this.table.headerRow;
- }
- set headerRow(s) {
- this._assign(this.table, "headerRow", s);
- }
- get totalsRow() {
- return this.table.totalsRow;
- }
- set totalsRow(s) {
- this._assign(this.table, "totalsRow", s);
- }
- get theme() {
- return this.table.style.name;
- }
- set theme(s) {
- this.table.style.name = s;
- }
- get showFirstColumn() {
- return this.table.style.showFirstColumn;
- }
- set showFirstColumn(s) {
- this.table.style.showFirstColumn = s;
- }
- get showLastColumn() {
- return this.table.style.showLastColumn;
- }
- set showLastColumn(s) {
- this.table.style.showLastColumn = s;
- }
- get showRowStripes() {
- return this.table.style.showRowStripes;
- }
- set showRowStripes(s) {
- this.table.style.showRowStripes = s;
- }
- get showColumnStripes() {
- return this.table.style.showColumnStripes;
- }
- set showColumnStripes(s) {
- this.table.style.showColumnStripes = s;
- }
- };
- }, { "../utils/col-cache": 19 }], 13: [function(g, C, i) {
- const e = g("./worksheet"), A = g("./defined-names"), s = g("../xlsx/xlsx"), l = g("../csv/csv");
- C.exports = class {
- constructor() {
- this.category = "", this.company = "", this.created = /* @__PURE__ */ new Date(), this.description = "", this.keywords = "", this.manager = "", this.modified = this.created, this.properties = {}, this.calcProperties = {}, this._worksheets = [], this.subject = "", this.title = "", this.views = [], this.media = [], this._definedNames = new A();
- }
- get xlsx() {
- return this._xlsx || (this._xlsx = new s(this)), this._xlsx;
- }
- get csv() {
- return this._csv || (this._csv = new l(this)), this._csv;
- }
- get nextId() {
- for (let n = 1; n < this._worksheets.length; n++) if (!this._worksheets[n]) return n;
- return this._worksheets.length || 1;
- }
- addWorksheet(n, a) {
- const d = this.nextId;
- a && (typeof a == "string" ? (console.trace('tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { argb: "rbg value" } }'), a = { properties: { tabColor: { argb: a } } }) : (a.argb || a.theme || a.indexed) && (console.trace("tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { ... } }"), a = { properties: { tabColor: a } }));
- const o = this._worksheets.reduce((h, b) => (b && b.orderNo) > h ? b.orderNo : h, 0), c = Object.assign({}, a, { id: d, name: n, orderNo: o + 1, workbook: this }), r = new e(c);
- return this._worksheets[d] = r, r;
- }
- removeWorksheetEx(n) {
- delete this._worksheets[n.id];
- }
- removeWorksheet(n) {
- const a = this.getWorksheet(n);
- a && a.destroy();
- }
- getWorksheet(n) {
- return n === void 0 ? this._worksheets.find(Boolean) : typeof n == "number" ? this._worksheets[n] : typeof n == "string" ? this._worksheets.find((a) => a && a.name === n) : void 0;
- }
- get worksheets() {
- return this._worksheets.slice(1).sort((n, a) => n.orderNo - a.orderNo).filter(Boolean);
- }
- eachSheet(n) {
- this.worksheets.forEach((a) => {
- n(a, a.id);
- });
- }
- get definedNames() {
- return this._definedNames;
- }
- clearThemes() {
- this._themes = void 0;
- }
- addImage(n) {
- const a = this.media.length;
- return this.media.push(Object.assign({}, n, { type: "image" })), a;
- }
- getImage(n) {
- return this.media[n];
- }
- get model() {
- return { creator: this.creator || "Unknown", lastModifiedBy: this.lastModifiedBy || "Unknown", lastPrinted: this.lastPrinted, created: this.created, modified: this.modified, properties: this.properties, worksheets: this.worksheets.map((n) => n.model), sheets: this.worksheets.map((n) => n.model).filter(Boolean), definedNames: this._definedNames.model, views: this.views, company: this.company, manager: this.manager, title: this.title, subject: this.subject, keywords: this.keywords, category: this.category, description: this.description, language: this.language, revision: this.revision, contentStatus: this.contentStatus, themes: this._themes, media: this.media, calcProperties: this.calcProperties };
- }
- set model(n) {
- this.creator = n.creator, this.lastModifiedBy = n.lastModifiedBy, this.lastPrinted = n.lastPrinted, this.created = n.created, this.modified = n.modified, this.company = n.company, this.manager = n.manager, this.title = n.title, this.subject = n.subject, this.keywords = n.keywords, this.category = n.category, this.description = n.description, this.language = n.language, this.revision = n.revision, this.contentStatus = n.contentStatus, this.properties = n.properties, this.calcProperties = n.calcProperties, this._worksheets = [], n.worksheets.forEach((a) => {
- const { id: d, name: o, state: c } = a, r = n.sheets && n.sheets.findIndex((h) => h.id === d);
- (this._worksheets[d] = new e({ id: d, name: o, orderNo: r, state: c, workbook: this })).model = a;
- }), this._definedNames.model = n.definedNames, this.views = n.views, this._themes = n.themes, this.media = n.media || [];
- }
- };
- }, { "../csv/csv": 1, "../xlsx/xlsx": 144, "./defined-names": 6, "./worksheet": 14 }], 14: [function(g, C, i) {
- const e = g("../utils/under-dash"), A = g("../utils/col-cache"), s = g("./range"), l = g("./row"), n = g("./column"), a = g("./enums"), d = g("./image"), o = g("./table"), c = g("./data-validations"), r = g("../utils/encryptor"), { copyStyle: h } = g("../utils/copy-style");
- C.exports = class {
- constructor(b) {
- b = b || {}, this._workbook = b.workbook, this.id = b.id, this.orderNo = b.orderNo, this.name = b.name, this.state = b.state || "visible", this._rows = [], this._columns = null, this._keys = {}, this._merges = {}, this.rowBreaks = [], this.properties = Object.assign({}, { defaultRowHeight: 15, dyDescent: 55, outlineLevelCol: 0, outlineLevelRow: 0 }, b.properties), this.pageSetup = Object.assign({}, { margins: { left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3 }, orientation: "portrait", horizontalDpi: 4294967295, verticalDpi: 4294967295, fitToPage: !(!b.pageSetup || !b.pageSetup.fitToWidth && !b.pageSetup.fitToHeight || b.pageSetup.scale), pageOrder: "downThenOver", blackAndWhite: !1, draft: !1, cellComments: "None", errors: "displayed", scale: 100, fitToWidth: 1, fitToHeight: 1, paperSize: void 0, showRowColHeaders: !1, showGridLines: !1, firstPageNumber: void 0, horizontalCentered: !1, verticalCentered: !1, rowBreaks: null, colBreaks: null }, b.pageSetup), this.headerFooter = Object.assign({}, { differentFirst: !1, differentOddEven: !1, oddHeader: null, oddFooter: null, evenHeader: null, evenFooter: null, firstHeader: null, firstFooter: null }, b.headerFooter), this.dataValidations = new c(), this.views = b.views || [], this.autoFilter = b.autoFilter || null, this._media = [], this.sheetProtection = null, this.tables = {}, this.conditionalFormattings = [];
- }
- get name() {
- return this._name;
- }
- set name(b) {
- if (b === void 0 && (b = "sheet" + this.id), this._name !== b) {
- if (typeof b != "string") throw new Error("The name has to be a string.");
- if (b === "") throw new Error("The name can't be empty.");
- if (b === "History") throw new Error('The name "History" is protected. Please use a different name.');
- if (/[*?:/\\[\]]/.test(b)) throw new Error(`Worksheet name ${b} cannot include any of the following characters: * ? : \\ / [ ]`);
- if (/(^')|('$)/.test(b)) throw new Error("The first or last character of worksheet name cannot be a single quotation mark: " + b);
- if (b && b.length > 31 && (console.warn(`Worksheet name ${b} exceeds 31 chars. This will be truncated`), b = b.substring(0, 31)), this._workbook._worksheets.find((u) => u && u.name.toLowerCase() === b.toLowerCase())) throw new Error("Worksheet name already exists: " + b);
- this._name = b;
- }
- }
- get workbook() {
- return this._workbook;
- }
- destroy() {
- this._workbook.removeWorksheetEx(this);
- }
- get dimensions() {
- const b = new s();
- return this._rows.forEach((u) => {
- if (u) {
- const m = u.dimensions;
- m && b.expand(u.number, m.min, u.number, m.max);
- }
- }), b;
- }
- get columns() {
- return this._columns;
- }
- set columns(b) {
- this._headerRowCount = b.reduce((Z, p) => {
- const Y = (p.header ? 1 : p.headers && p.headers.length) || 0;
- return Math.max(Z, Y);
- }, 0);
- let u = 1;
- const m = this._columns = [];
- b.forEach((Z) => {
- const p = new n(this, u++, !1);
- m.push(p), p.defn = Z;
- });
- }
- getColumnKey(b) {
- return this._keys[b];
- }
- setColumnKey(b, u) {
- this._keys[b] = u;
- }
- deleteColumnKey(b) {
- delete this._keys[b];
- }
- eachColumnKey(b) {
- e.each(this._keys, b);
- }
- getColumn(b) {
- if (typeof b == "string") {
- const u = this._keys[b];
- if (u) return u;
- b = A.l2n(b);
- }
- if (this._columns || (this._columns = []), b > this._columns.length) {
- let u = this._columns.length + 1;
- for (; u <= b; ) this._columns.push(new n(this, u++));
- }
- return this._columns[b - 1];
- }
- spliceColumns(b, u) {
- const m = this._rows.length;
- for (var Z = arguments.length, p = new Array(Z > 2 ? Z - 2 : 0), Y = 2; Y < Z; Y++) p[Y - 2] = arguments[Y];
- if (p.length > 0) for (let S = 0; S < m; S++) {
- const z = [b, u];
- p.forEach((K) => {
- z.push(K[S] || null);
- });
- const v = this.getRow(S + 1);
- v.splice.apply(v, z);
- }
- else this._rows.forEach((S) => {
- S && S.splice(b, u);
- });
- const R = p.length - u, X = b + u, H = this._columns.length;
- if (R < 0) for (let S = b + p.length; S <= H; S++) this.getColumn(S).defn = this.getColumn(S - R).defn;
- else if (R > 0) for (let S = H; S >= X; S--) this.getColumn(S + R).defn = this.getColumn(S).defn;
- for (let S = b; S < b + p.length; S++) this.getColumn(S).defn = null;
- this.workbook.definedNames.spliceColumns(this.name, b, u, p.length);
- }
- get lastColumn() {
- return this.getColumn(this.columnCount);
- }
- get columnCount() {
- let b = 0;
- return this.eachRow((u) => {
- b = Math.max(b, u.cellCount);
- }), b;
- }
- get actualColumnCount() {
- const b = [];
- let u = 0;
- return this.eachRow((m) => {
- m.eachCell((Z) => {
- let { col: p } = Z;
- b[p] || (b[p] = !0, u++);
- });
- }), u;
- }
- _commitRow() {
- }
- get _lastRowNumber() {
- const b = this._rows;
- let u = b.length;
- for (; u > 0 && b[u - 1] === void 0; ) u--;
- return u;
- }
- get _nextRow() {
- return this._lastRowNumber + 1;
- }
- get lastRow() {
- if (this._rows.length) return this._rows[this._rows.length - 1];
- }
- findRow(b) {
- return this._rows[b - 1];
- }
- findRows(b, u) {
- return this._rows.slice(b - 1, b - 1 + u);
- }
- get rowCount() {
- return this._lastRowNumber;
- }
- get actualRowCount() {
- let b = 0;
- return this.eachRow(() => {
- b++;
- }), b;
- }
- getRow(b) {
- let u = this._rows[b - 1];
- return u || (u = this._rows[b - 1] = new l(this, b)), u;
- }
- getRows(b, u) {
- if (u < 1) return;
- const m = [];
- for (let Z = b; Z < b + u; Z++) m.push(this.getRow(Z));
- return m;
- }
- addRow(b) {
- let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
- const m = this._nextRow, Z = this.getRow(m);
- return Z.values = b, this._setStyleOption(m, u[0] === "i" ? u : "n"), Z;
- }
- addRows(b) {
- let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
- const m = [];
- return b.forEach((Z) => {
- m.push(this.addRow(Z, u));
- }), m;
- }
- insertRow(b, u) {
- let m = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "n";
- return this.spliceRows(b, 0, u), this._setStyleOption(b, m), this.getRow(b);
- }
- insertRows(b, u) {
- let m = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "n";
- if (this.spliceRows(b, 0, ...u), m !== "n") for (let Z = 0; Z < u.length; Z++) m[0] === "o" && this.findRow(u.length + b + Z) !== void 0 ? this._copyStyle(u.length + b + Z, b + Z, m[1] === "+") : m[0] === "i" && this.findRow(b - 1) !== void 0 && this._copyStyle(b - 1, b + Z, m[1] === "+");
- return this.getRows(b, u.length);
- }
- _setStyleOption(b) {
- let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
- u[0] === "o" && this.findRow(b + 1) !== void 0 ? this._copyStyle(b + 1, b, u[1] === "+") : u[0] === "i" && this.findRow(b - 1) !== void 0 && this._copyStyle(b - 1, b, u[1] === "+");
- }
- _copyStyle(b, u) {
- let m = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
- const Z = this.getRow(b), p = this.getRow(u);
- p.style = h(Z.style), Z.eachCell({ includeEmpty: m }, (Y, R) => {
- p.getCell(R).style = h(Y.style);
- }), p.height = Z.height;
- }
- duplicateRow(b, u) {
- let m = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
- const Z = this._rows[b - 1], p = new Array(u).fill(Z.values);
- this.spliceRows(b + 1, m ? 0 : u, ...p);
- for (let Y = 0; Y < u; Y++) {
- const R = this._rows[b + Y];
- R.style = Z.style, R.height = Z.height, Z.eachCell({ includeEmpty: !0 }, (X, H) => {
- R.getCell(H).style = X.style;
- });
- }
- }
- spliceRows(b, u) {
- const m = b + u;
- for (var Z = arguments.length, p = new Array(Z > 2 ? Z - 2 : 0), Y = 2; Y < Z; Y++) p[Y - 2] = arguments[Y];
- const R = p.length, X = R - u, H = this._rows.length;
- let S, z;
- if (X < 0) for (b === H && (this._rows[H - 1] = void 0), S = m; S <= H; S++) if (z = this._rows[S - 1], z) {
- const v = this.getRow(S + X);
- v.values = z.values, v.style = z.style, v.height = z.height, z.eachCell({ includeEmpty: !0 }, (K, V) => {
- v.getCell(V).style = K.style;
- }), this._rows[S - 1] = void 0;
- } else this._rows[S + X - 1] = void 0;
- else if (X > 0) for (S = H; S >= m; S--) if (z = this._rows[S - 1], z) {
- const v = this.getRow(S + X);
- v.values = z.values, v.style = z.style, v.height = z.height, z.eachCell({ includeEmpty: !0 }, (K, V) => {
- if (v.getCell(V).style = K.style, K._value.constructor.name === "MergeValue") {
- const N = this.getRow(K._row._number + R).getCell(V), B = K._value._master, G = this.getRow(B._row._number + R).getCell(B._column._number);
- N.merge(G);
- }
- });
- } else this._rows[S + X - 1] = void 0;
- for (S = 0; S < R; S++) {
- const v = this.getRow(b + S);
- v.style = {}, v.values = p[S];
- }
- this.workbook.definedNames.spliceRows(this.name, b, u, R);
- }
- eachRow(b, u) {
- if (u || (u = b, b = void 0), b && b.includeEmpty) {
- const m = this._rows.length;
- for (let Z = 1; Z <= m; Z++) u(this.getRow(Z), Z);
- } else this._rows.forEach((m) => {
- m && m.hasValues && u(m, m.number);
- });
- }
- getSheetValues() {
- const b = [];
- return this._rows.forEach((u) => {
- u && (b[u.number] = u.values);
- }), b;
- }
- findCell(b, u) {
- const m = A.getAddress(b, u), Z = this._rows[m.row - 1];
- return Z ? Z.findCell(m.col) : void 0;
- }
- getCell(b, u) {
- const m = A.getAddress(b, u);
- return this.getRow(m.row).getCellEx(m);
- }
- mergeCells() {
- for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
- const Z = new s(u);
- this._mergeCellsInternal(Z);
- }
- mergeCellsWithoutStyle() {
- for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
- const Z = new s(u);
- this._mergeCellsInternal(Z, !0);
- }
- _mergeCellsInternal(b, u) {
- e.each(this._merges, (Z) => {
- if (Z.intersects(b)) throw new Error("Cannot merge already merged cells");
- });
- const m = this.getCell(b.top, b.left);
- for (let Z = b.top; Z <= b.bottom; Z++) for (let p = b.left; p <= b.right; p++) (Z > b.top || p > b.left) && this.getCell(Z, p).merge(m, u);
- this._merges[m.address] = b;
- }
- _unMergeMaster(b) {
- const u = this._merges[b.address];
- if (u) {
- for (let m = u.top; m <= u.bottom; m++) for (let Z = u.left; Z <= u.right; Z++) this.getCell(m, Z).unmerge();
- delete this._merges[b.address];
- }
- }
- get hasMerges() {
- return e.some(this._merges, Boolean);
- }
- unMergeCells() {
- for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
- const Z = new s(u);
- for (let p = Z.top; p <= Z.bottom; p++) for (let Y = Z.left; Y <= Z.right; Y++) {
- const R = this.findCell(p, Y);
- R && (R.type === a.ValueType.Merge ? this._unMergeMaster(R.master) : this._merges[R.address] && this._unMergeMaster(R));
- }
- }
- fillFormula(b, u, m) {
- let Z = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "shared";
- const p = A.decode(b), { top: Y, left: R, bottom: X, right: H } = p, S = H - R + 1, z = A.encodeAddress(Y, R), v = Z === "shared";
- let K;
- K = typeof m == "function" ? m : Array.isArray(m) ? Array.isArray(m[0]) ? (N, B) => m[N - Y][B - R] : (N, B) => m[(N - Y) * S + (B - R)] : () => {
- };
- let V = !0;
- for (let N = Y; N <= X; N++) for (let B = R; B <= H; B++) V ? (this.getCell(N, B).value = { shareType: Z, formula: u, ref: b, result: K(N, B) }, V = !1) : this.getCell(N, B).value = v ? { sharedFormula: z, result: K(N, B) } : K(N, B);
- }
- addImage(b, u) {
- const m = { type: "image", imageId: b, range: u };
- this._media.push(new d(this, m));
- }
- getImages() {
- return this._media.filter((b) => b.type === "image");
- }
- addBackgroundImage(b) {
- const u = { type: "background", imageId: b };
- this._media.push(new d(this, u));
- }
- getBackgroundImageId() {
- const b = this._media.find((u) => u.type === "background");
- return b && b.imageId;
- }
- protect(b, u) {
- return new Promise((m) => {
- this.sheetProtection = { sheet: !0 }, u && "spinCount" in u && (u.spinCount = Number.isFinite(u.spinCount) ? Math.round(Math.max(0, u.spinCount)) : 1e5), b && (this.sheetProtection.algorithmName = "SHA-512", this.sheetProtection.saltValue = r.randomBytes(16).toString("base64"), this.sheetProtection.spinCount = u && "spinCount" in u ? u.spinCount : 1e5, this.sheetProtection.hashValue = r.convertPasswordToHash(b, "SHA512", this.sheetProtection.saltValue, this.sheetProtection.spinCount)), u && (this.sheetProtection = Object.assign(this.sheetProtection, u), !b && "spinCount" in u && delete this.sheetProtection.spinCount), m();
- });
- }
- unprotect() {
- this.sheetProtection = null;
- }
- addTable(b) {
- const u = new o(this, b);
- return this.tables[b.name] = u, u;
- }
- getTable(b) {
- return this.tables[b];
- }
- removeTable(b) {
- delete this.tables[b];
- }
- getTables() {
- return Object.values(this.tables);
- }
- addConditionalFormatting(b) {
- this.conditionalFormattings.push(b);
- }
- removeConditionalFormatting(b) {
- typeof b == "number" ? this.conditionalFormattings.splice(b, 1) : this.conditionalFormattings = b instanceof Function ? this.conditionalFormattings.filter(b) : [];
- }
- get tabColor() {
- return console.trace("worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor"), this.properties.tabColor;
- }
- set tabColor(b) {
- console.trace("worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor"), this.properties.tabColor = b;
- }
- get model() {
- const b = { id: this.id, name: this.name, dataValidations: this.dataValidations.model, properties: this.properties, state: this.state, pageSetup: this.pageSetup, headerFooter: this.headerFooter, rowBreaks: this.rowBreaks, views: this.views, autoFilter: this.autoFilter, media: this._media.map((Z) => Z.model), sheetProtection: this.sheetProtection, tables: Object.values(this.tables).map((Z) => Z.model), conditionalFormattings: this.conditionalFormattings };
- b.cols = n.toModel(this.columns);
- const u = b.rows = [], m = b.dimensions = new s();
- return this._rows.forEach((Z) => {
- const p = Z && Z.model;
- p && (m.expand(p.number, p.min, p.number, p.max), u.push(p));
- }), b.merges = [], e.each(this._merges, (Z) => {
- b.merges.push(Z.range);
- }), b;
- }
- _parseRows(b) {
- this._rows = [], b.rows.forEach((u) => {
- const m = new l(this, u.number);
- this._rows[m.number - 1] = m, m.model = u;
- });
- }
- _parseMergeCells(b) {
- e.each(b.mergeCells, (u) => {
- this.mergeCellsWithoutStyle(u);
- });
- }
- set model(b) {
- this.name = b.name, this._columns = n.fromModel(this, b.cols), this._parseRows(b), this._parseMergeCells(b), this.dataValidations = new c(b.dataValidations), this.properties = b.properties, this.pageSetup = b.pageSetup, this.headerFooter = b.headerFooter, this.views = b.views, this.autoFilter = b.autoFilter, this._media = b.media.map((u) => new d(this, u)), this.sheetProtection = b.sheetProtection, this.tables = b.tables.reduce((u, m) => {
- const Z = new o();
- return Z.model = m, u[m.name] = Z, u;
- }, {}), this.conditionalFormattings = b.conditionalFormattings;
- }
- };
- }, { "../utils/col-cache": 19, "../utils/copy-style": 20, "../utils/encryptor": 21, "../utils/under-dash": 26, "./column": 4, "./data-validations": 5, "./enums": 7, "./image": 8, "./range": 10, "./row": 11, "./table": 12 }], 15: [function(g, C, i) {
- g("core-js/modules/es.promise"), g("core-js/modules/es.promise.finally"), g("core-js/modules/es.object.assign"), g("core-js/modules/es.object.keys"), g("core-js/modules/es.object.values"), g("core-js/modules/es.symbol"), g("core-js/modules/es.symbol.async-iterator"), g("core-js/modules/es.array.iterator"), g("core-js/modules/es.array.includes"), g("core-js/modules/es.array.find-index"), g("core-js/modules/es.array.find"), g("core-js/modules/es.string.from-code-point"), g("core-js/modules/es.string.includes"), g("core-js/modules/es.number.is-nan"), g("regenerator-runtime/runtime");
- const e = { Workbook: g("./doc/workbook") }, A = g("./doc/enums");
- Object.keys(A).forEach((s) => {
- e[s] = A[s];
- }), C.exports = e;
- }, { "./doc/enums": 7, "./doc/workbook": 13, "core-js/modules/es.array.find": 359, "core-js/modules/es.array.find-index": 358, "core-js/modules/es.array.includes": 360, "core-js/modules/es.array.iterator": 361, "core-js/modules/es.number.is-nan": 363, "core-js/modules/es.object.assign": 364, "core-js/modules/es.object.keys": 366, "core-js/modules/es.object.values": 367, "core-js/modules/es.promise": 372, "core-js/modules/es.promise.finally": 371, "core-js/modules/es.string.from-code-point": 376, "core-js/modules/es.string.includes": 377, "core-js/modules/es.symbol": 381, "core-js/modules/es.symbol.async-iterator": 378, "regenerator-runtime/runtime": 492 }], 16: [function(g, C, i) {
- const e = typeof TextDecoder > "u" ? null : new TextDecoder("utf-8");
- i.bufferToString = function(A) {
- return typeof A == "string" ? A : e ? e.decode(A) : A.toString();
- };
- }, {}], 17: [function(g, C, i) {
- const e = typeof TextEncoder > "u" ? null : new TextEncoder("utf-8"), { Buffer: A } = g("buffer");
- i.stringToBuffer = function(s) {
- return typeof s != "string" ? s : e ? A.from(e.encode(s).buffer) : A.from(s);
- };
- }, { buffer: 220 }], 18: [function(g, C, i) {
- const e = g("./under-dash"), A = g("./col-cache");
- C.exports = class {
- constructor(s) {
- this.template = s, this.sheets = {};
- }
- addCell(s) {
- this.addCellEx(A.decodeEx(s));
- }
- getCell(s) {
- return this.findCellEx(A.decodeEx(s), !0);
- }
- findCell(s) {
- return this.findCellEx(A.decodeEx(s), !1);
- }
- findCellAt(s, l, n) {
- const a = this.sheets[s], d = a && a[l];
- return d && d[n];
- }
- addCellEx(s) {
- if (s.top) for (let l = s.top; l <= s.bottom; l++) for (let n = s.left; n <= s.right; n++) this.getCellAt(s.sheetName, l, n);
- else this.findCellEx(s, !0);
- }
- getCellEx(s) {
- return this.findCellEx(s, !0);
- }
- findCellEx(s, l) {
- const n = this.findSheet(s, l), a = this.findSheetRow(n, s, l);
- return this.findRowCell(a, s, l);
- }
- getCellAt(s, l, n) {
- const a = this.sheets[s] || (this.sheets[s] = []), d = a[l] || (a[l] = []);
- return d[n] || (d[n] = { sheetName: s, address: A.n2l(n) + l, row: l, col: n });
- }
- removeCellEx(s) {
- const l = this.findSheet(s);
- if (!l) return;
- const n = this.findSheetRow(l, s);
- n && delete n[s.col];
- }
- forEachInSheet(s, l) {
- const n = this.sheets[s];
- n && n.forEach((a, d) => {
- a && a.forEach((o, c) => {
- o && l(o, d, c);
- });
- });
- }
- forEach(s) {
- e.each(this.sheets, (l, n) => {
- this.forEachInSheet(n, s);
- });
- }
- map(s) {
- const l = [];
- return this.forEach((n) => {
- l.push(s(n));
- }), l;
- }
- findSheet(s, l) {
- const n = s.sheetName;
- return this.sheets[n] ? this.sheets[n] : l ? this.sheets[n] = [] : void 0;
- }
- findSheetRow(s, l, n) {
- const { row: a } = l;
- return s && s[a] ? s[a] : n ? s[a] = [] : void 0;
- }
- findRowCell(s, l, n) {
- const { col: a } = l;
- return s && s[a] ? s[a] : n ? s[a] = this.template ? Object.assign(l, JSON.parse(JSON.stringify(this.template))) : l : void 0;
- }
- spliceRows(s, l, n, a) {
- const d = this.sheets[s];
- if (d) {
- const o = [];
- for (let c = 0; c < a; c++) o.push([]);
- d.splice(l, n, ...o);
- }
- }
- spliceColumns(s, l, n, a) {
- const d = this.sheets[s];
- if (d) {
- const o = [];
- for (let c = 0; c < a; c++) o.push(null);
- e.each(d, (c) => {
- c.splice(l, n, ...o);
- });
- }
- }
- };
- }, { "./col-cache": 19, "./under-dash": 26 }], 19: [function(g, C, i) {
- const e = /^[A-Z]+\d+$/, A = { _dictionary: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], _l2nFill: 0, _l2n: {}, _n2l: [], _level: (s) => s <= 26 ? 1 : s <= 676 ? 2 : 3, _fill(s) {
- let l, n, a, d, o, c = 1;
- if (s >= 4) throw new Error("Out of bounds. Excel supports columns from 1 to 16384");
- if (this._l2nFill < 1 && s >= 1) {
- for (; c <= 26; ) l = this._dictionary[c - 1], this._n2l[c] = l, this._l2n[l] = c, c++;
- this._l2nFill = 1;
- }
- if (this._l2nFill < 2 && s >= 2) {
- for (c = 27; c <= 702; ) n = c - 27, a = n % 26, d = Math.floor(n / 26), l = this._dictionary[d] + this._dictionary[a], this._n2l[c] = l, this._l2n[l] = c, c++;
- this._l2nFill = 2;
- }
- if (this._l2nFill < 3 && s >= 3) {
- for (c = 703; c <= 16384; ) n = c - 703, a = n % 26, d = Math.floor(n / 26) % 26, o = Math.floor(n / 676), l = this._dictionary[o] + this._dictionary[d] + this._dictionary[a], this._n2l[c] = l, this._l2n[l] = c, c++;
- this._l2nFill = 3;
- }
- }, l2n(s) {
- if (this._l2n[s] || this._fill(s.length), !this._l2n[s]) throw new Error("Out of bounds. Invalid column letter: " + s);
- return this._l2n[s];
- }, n2l(s) {
- if (s < 1 || s > 16384) throw new Error(s + " is out of bounds. Excel supports columns from 1 to 16384");
- return this._n2l[s] || this._fill(this._level(s)), this._n2l[s];
- }, _hash: {}, validateAddress(s) {
- if (!e.test(s)) throw new Error("Invalid Address: " + s);
- return !0;
- }, decodeAddress(s) {
- const l = s.length < 5 && this._hash[s];
- if (l) return l;
- let n = !1, a = "", d = 0, o = !1, c = "", r = 0;
- for (let b, u = 0; u < s.length; u++) if (b = s.charCodeAt(u), !o && b >= 65 && b <= 90) n = !0, a += s[u], d = 26 * d + b - 64;
- else if (b >= 48 && b <= 57) o = !0, c += s[u], r = 10 * r + b - 48;
- else if (o && n && b !== 36) break;
- if (n) {
- if (d > 16384) throw new Error("Out of bounds. Invalid column letter: " + a);
- } else d = void 0;
- o || (r = void 0);
- const h = { address: s = a + c, col: d, row: r, $col$row: `$${a}$${c}` };
- return d <= 100 && r <= 100 && (this._hash[s] = h, this._hash[h.$col$row] = h), h;
- }, getAddress(s, l) {
- if (l) {
- const n = this.n2l(l) + s;
- return this.decodeAddress(n);
- }
- return this.decodeAddress(s);
- }, decode(s) {
- const l = s.split(":");
- if (l.length === 2) {
- const n = this.decodeAddress(l[0]), a = this.decodeAddress(l[1]), d = { top: Math.min(n.row, a.row), left: Math.min(n.col, a.col), bottom: Math.max(n.row, a.row), right: Math.max(n.col, a.col) };
- return d.tl = this.n2l(d.left) + d.top, d.br = this.n2l(d.right) + d.bottom, d.dimensions = `${d.tl}:${d.br}`, d;
- }
- return this.decodeAddress(s);
- }, decodeEx(s) {
- const l = s.match(/(?:(?:(?:'((?:[^']|'')*)')|([^'^ !]*))!)?(.*)/), n = l[1] || l[2], a = l[3], d = a.split(":");
- if (d.length > 1) {
- let c = this.decodeAddress(d[0]), r = this.decodeAddress(d[1]);
- const h = Math.min(c.row, r.row), b = Math.min(c.col, r.col), u = Math.max(c.row, r.row), m = Math.max(c.col, r.col);
- return c = this.n2l(b) + h, r = this.n2l(m) + u, { top: h, left: b, bottom: u, right: m, sheetName: n, tl: { address: c, col: b, row: h, $col$row: `$${this.n2l(b)}$${h}`, sheetName: n }, br: { address: r, col: m, row: u, $col$row: `$${this.n2l(m)}$${u}`, sheetName: n }, dimensions: `${c}:${r}` };
- }
- if (a.startsWith("#")) return n ? { sheetName: n, error: a } : { error: a };
- const o = this.decodeAddress(a);
- return n ? { sheetName: n, ...o } : o;
- }, encodeAddress: (s, l) => A.n2l(l) + s, encode() {
- switch (arguments.length) {
- case 2:
- return A.encodeAddress(arguments[0], arguments[1]);
- case 4:
- return `${A.encodeAddress(arguments[0], arguments[1])}:${A.encodeAddress(arguments[2], arguments[3])}`;
- default:
- throw new Error("Can only encode with 2 or 4 arguments");
- }
- }, inRange(s, l) {
- const [n, a, , d, o] = s, [c, r] = l;
- return c >= n && c <= d && r >= a && r <= o;
- } };
- C.exports = A;
- }, {}], 20: [function(g, C, i) {
- const e = (s, l) => ({ ...s, ...l.reduce((n, a) => (s[a] && (n[a] = { ...s[a] }), n), {}) }), A = function(s, l, n) {
- let a = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [];
- s[n] && (l[n] = e(s[n], a));
- };
- i.copyStyle = (s) => {
- if (!s) return s;
- if (l = s, Object.keys(l).length === 0) return {};
- var l;
- const n = { ...s };
- return A(s, n, "font", ["color"]), A(s, n, "alignment"), A(s, n, "protection"), s.border && (A(s, n, "border"), A(s.border, n.border, "top", ["color"]), A(s.border, n.border, "left", ["color"]), A(s.border, n.border, "bottom", ["color"]), A(s.border, n.border, "right", ["color"]), A(s.border, n.border, "diagonal", ["color"])), s.fill && (A(s, n, "fill", ["fgColor", "bgColor", "center"]), s.fill.stops && (n.fill.stops = s.fill.stops.map((a) => e(a, ["color"])))), n;
- };
- }, {}], 21: [function(g, C, i) {
- (function(e) {
- (function() {
- const A = g("crypto"), s = { hash(l) {
- const n = A.createHash(l);
- for (var a = arguments.length, d = new Array(a > 1 ? a - 1 : 0), o = 1; o < a; o++) d[o - 1] = arguments[o];
- return n.update(e.concat(d)), n.digest();
- }, convertPasswordToHash(l, n, a, d) {
- if (n = n.toLowerCase(), A.getHashes().indexOf(n) < 0) throw new Error(`Hash algorithm '${n}' not supported!`);
- const o = e.from(l, "utf16le");
- let c = this.hash(n, e.from(a, "base64"), o);
- for (let r = 0; r < d; r++) {
- const h = e.alloc(4);
- h.writeUInt32LE(r, 0), c = this.hash(n, c, h);
- }
- return c.toString("base64");
- }, randomBytes: (l) => A.randomBytes(l) };
- C.exports = s;
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { buffer: 220, crypto: 390 }], 22: [function(g, C, i) {
- const { SaxesParser: e } = g("saxes"), { PassThrough: A } = g("readable-stream"), { bufferToString: s } = g("./browser-buffer-decode");
- C.exports = async function* (l) {
- l.pipe && !l[Symbol.asyncIterator] && (l = l.pipe(new A()));
- const n = new e();
- let a;
- n.on("error", (o) => {
- a = o;
- });
- let d = [];
- n.on("opentag", (o) => d.push({ eventType: "opentag", value: o })), n.on("text", (o) => d.push({ eventType: "text", value: o })), n.on("closetag", (o) => d.push({ eventType: "closetag", value: o }));
- for await (const o of l) {
- if (n.write(s(o)), a) throw a;
- yield d, d = [];
- }
- };
- }, { "./browser-buffer-decode": 16, "readable-stream": 491, saxes: 496 }], 23: [function(g, C, i) {
- const e = g("./col-cache"), A = /(([a-z_\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi, s = /^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i;
- C.exports = { slideFormula: function(l, n, a) {
- const d = e.decode(n), o = e.decode(a);
- return l.replace(A, (c, r, h, b, u) => {
- if (u) return c;
- const m = s.exec(b);
- if (m) {
- const Z = m[1], p = m[2].toUpperCase(), Y = m[3], R = m[4];
- if (p.length > 3 || p.length === 3 && p > "XFD") return c;
- let X = e.l2n(p), H = parseInt(R, 10);
- return Z || (X += o.col - d.col), Y || (H += o.row - d.row), (r || "") + (Z || "") + e.n2l(X) + (Y || "") + H;
- }
- return c;
- });
- } };
- }, { "./col-cache": 19 }], 24: [function(g, C, i) {
- (function(e, A) {
- (function() {
- const s = g("readable-stream"), l = g("./utils"), n = g("./string-buf");
- class a {
- constructor(b, u) {
- this._data = b, this._encoding = u;
- }
- get length() {
- return this.toBuffer().length;
- }
- copy(b, u, m, Z) {
- return this.toBuffer().copy(b, u, m, Z);
- }
- toBuffer() {
- return this._buffer || (this._buffer = A.from(this._data, this._encoding)), this._buffer;
- }
- }
- class d {
- constructor(b) {
- this._data = b;
- }
- get length() {
- return this._data.length;
- }
- copy(b, u, m, Z) {
- return this._data._buf.copy(b, u, m, Z);
- }
- toBuffer() {
- return this._data.toBuffer();
- }
- }
- class o {
- constructor(b) {
- this._data = b;
- }
- get length() {
- return this._data.length;
- }
- copy(b, u, m, Z) {
- this._data.copy(b, u, m, Z);
- }
- toBuffer() {
- return this._data;
- }
- }
- class c {
- constructor(b) {
- this.size = b, this.buffer = A.alloc(b), this.iRead = 0, this.iWrite = 0;
- }
- toBuffer() {
- if (this.iRead === 0 && this.iWrite === this.size) return this.buffer;
- const b = A.alloc(this.iWrite - this.iRead);
- return this.buffer.copy(b, 0, this.iRead, this.iWrite), b;
- }
- get length() {
- return this.iWrite - this.iRead;
- }
- get eod() {
- return this.iRead === this.iWrite;
- }
- get full() {
- return this.iWrite === this.size;
- }
- read(b) {
- let u;
- return b === 0 ? null : b === void 0 || b >= this.length ? (u = this.toBuffer(), this.iRead = this.iWrite, u) : (u = A.alloc(b), this.buffer.copy(u, 0, this.iRead, b), this.iRead += b, u);
- }
- write(b, u, m) {
- const Z = Math.min(m, this.size - this.iWrite);
- return b.copy(this.buffer, this.iWrite, u, u + Z), this.iWrite += Z, Z;
- }
- }
- const r = function(h) {
- h = h || {}, this.bufSize = h.bufSize || 1048576, this.buffers = [], this.batch = h.batch || !1, this.corked = !1, this.inPos = 0, this.outPos = 0, this.pipes = [], this.paused = !1, this.encoding = null;
- };
- l.inherits(r, s.Duplex, { toBuffer() {
- switch (this.buffers.length) {
- case 0:
- return null;
- case 1:
- return this.buffers[0].toBuffer();
- default:
- return A.concat(this.buffers.map((h) => h.toBuffer()));
- }
- }, _getWritableBuffer() {
- if (this.buffers.length) {
- const b = this.buffers[this.buffers.length - 1];
- if (!b.full) return b;
- }
- const h = new c(this.bufSize);
- return this.buffers.push(h), h;
- }, async _pipe(h) {
- await Promise.all(this.pipes.map(function(b) {
- return new Promise((u) => {
- b.write(h.toBuffer(), () => {
- u();
- });
- });
- }));
- }, _writeToBuffers(h) {
- let b = 0;
- const u = h.length;
- for (; b < u; )
- b += this._getWritableBuffer().write(h, b, u - b);
- }, async write(h, b, u) {
- let m;
- if (b instanceof Function && (u = b, b = "utf8"), u = u || l.nop, h instanceof n) m = new d(h);
- else if (h instanceof A) m = new o(h);
- else {
- if (!(typeof h == "string" || h instanceof String || h instanceof ArrayBuffer)) throw new Error("Chunk must be one of type String, Buffer or StringBuf.");
- m = new a(h, b);
- }
- if (this.pipes.length) if (this.batch) for (this._writeToBuffers(m); !this.corked && this.buffers.length > 1; ) this._pipe(this.buffers.shift());
- else this.corked ? (this._writeToBuffers(m), e.nextTick(u)) : (await this._pipe(m), u());
- else this.paused || this.emit("data", m.toBuffer()), this._writeToBuffers(m), this.emit("readable");
- return !0;
- }, cork() {
- this.corked = !0;
- }, _flush() {
- if (this.pipes.length) for (; this.buffers.length; ) this._pipe(this.buffers.shift());
- }, uncork() {
- this.corked = !1, this._flush();
- }, end(h, b, u) {
- const m = (Z) => {
- Z ? u(Z) : (this._flush(), this.pipes.forEach((p) => {
- p.end();
- }), this.emit("finish"));
- };
- h ? this.write(h, b, m) : m();
- }, read(h) {
- let b;
- if (h) {
- for (b = []; h && this.buffers.length && !this.buffers[0].eod; ) {
- const u = this.buffers[0], m = u.read(h);
- h -= m.length, b.push(m), u.eod && u.full && this.buffers.shift();
- }
- return A.concat(b);
- }
- return b = this.buffers.map((u) => u.toBuffer()).filter(Boolean), this.buffers = [], A.concat(b);
- }, setEncoding(h) {
- this.encoding = h;
- }, pause() {
- this.paused = !0;
- }, resume() {
- this.paused = !1;
- }, isPaused() {
- return !!this.paused;
- }, pipe(h) {
- this.pipes.push(h), !this.paused && this.buffers.length && this.end();
- }, unpipe(h) {
- this.pipes = this.pipes.filter((b) => b !== h);
- }, unshift() {
- throw new Error("Not Implemented");
- }, wrap() {
- throw new Error("Not Implemented");
- } }), C.exports = r;
- }).call(this);
- }).call(this, g("_process"), g("buffer").Buffer);
- }, { "./string-buf": 25, "./utils": 27, _process: 467, buffer: 220, "readable-stream": 491 }], 25: [function(g, C, i) {
- (function(e) {
- (function() {
- C.exports = class {
- constructor(A) {
- this._buf = e.alloc(A && A.size || 16384), this._encoding = A && A.encoding || "utf8", this._inPos = 0, this._buffer = void 0;
- }
- get length() {
- return this._inPos;
- }
- get capacity() {
- return this._buf.length;
- }
- get buffer() {
- return this._buf;
- }
- toBuffer() {
- return this._buffer || (this._buffer = e.alloc(this.length), this._buf.copy(this._buffer, 0, 0, this.length)), this._buffer;
- }
- reset(A) {
- A = A || 0, this._buffer = void 0, this._inPos = A;
- }
- _grow(A) {
- let s = 2 * this._buf.length;
- for (; s < A; ) s *= 2;
- const l = e.alloc(s);
- this._buf.copy(l, 0), this._buf = l;
- }
- addText(A) {
- this._buffer = void 0;
- let s = this._inPos + this._buf.write(A, this._inPos, this._encoding);
- for (; s >= this._buf.length - 4; ) this._grow(this._inPos + A.length), s = this._inPos + this._buf.write(A, this._inPos, this._encoding);
- this._inPos = s;
- }
- addStringBuf(A) {
- A.length && (this._buffer = void 0, this.length + A.length > this.capacity && this._grow(this.length + A.length), A._buf.copy(this._buf, this._inPos, 0, A.length), this._inPos += A.length);
- }
- };
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { buffer: 220 }], 26: [function(g, C, i) {
- const { toString: e } = Object.prototype, A = /["&<>]/, s = { each: function(l, n) {
- l && (Array.isArray(l) ? l.forEach(n) : Object.keys(l).forEach((a) => {
- n(l[a], a);
- }));
- }, some: function(l, n) {
- return !!l && (Array.isArray(l) ? l.some(n) : Object.keys(l).some((a) => n(l[a], a)));
- }, every: function(l, n) {
- return !l || (Array.isArray(l) ? l.every(n) : Object.keys(l).every((a) => n(l[a], a)));
- }, map: function(l, n) {
- return l ? Array.isArray(l) ? l.map(n) : Object.keys(l).map((a) => n(l[a], a)) : [];
- }, keyBy: (l, n) => l.reduce((a, d) => (a[d[n]] = d, a), {}), isEqual: function(l, n) {
- const a = typeof l, d = typeof n, o = Array.isArray(l), c = Array.isArray(n);
- let r;
- if (a !== d) return !1;
- switch (typeof l) {
- case "object":
- if (o || c) return !(!o || !c) && l.length === n.length && l.every((h, b) => {
- const u = n[b];
- return s.isEqual(h, u);
- });
- if (l === null || n === null) return l === n;
- if (r = Object.keys(l), Object.keys(n).length !== r.length) return !1;
- for (const h of r) if (!n.hasOwnProperty(h)) return !1;
- return s.every(l, (h, b) => {
- const u = n[b];
- return s.isEqual(h, u);
- });
- default:
- return l === n;
- }
- }, escapeHtml(l) {
- const n = A.exec(l);
- if (!n) return l;
- let a = "", d = "", o = 0, c = n.index;
- for (; c < l.length; c++) {
- switch (l.charAt(c)) {
- case '"':
- d = """;
- break;
- case "&":
- d = "&";
- break;
- case "'":
- d = "'";
- break;
- case "<":
- d = "<";
- break;
- case ">":
- d = ">";
- break;
- default:
- continue;
- }
- o !== c && (a += l.substring(o, c)), o = c + 1, a += d;
- }
- return o !== c ? a + l.substring(o, c) : a;
- }, strcmp: (l, n) => l < n ? -1 : l > n ? 1 : 0, isUndefined: (l) => e.call(l) === "[object Undefined]", isObject: (l) => e.call(l) === "[object Object]", deepMerge() {
- const l = arguments[0] || {}, { length: n } = arguments;
- let a, d, o;
- function c(r, h) {
- a = l[h], o = Array.isArray(r), s.isObject(r) || o ? (o ? (o = !1, d = a && Array.isArray(a) ? a : []) : d = a && s.isObject(a) ? a : {}, l[h] = s.deepMerge(d, r)) : s.isUndefined(r) || (l[h] = r);
- }
- for (let r = 0; r < n; r++) s.each(arguments[r], c);
- return l;
- } };
- C.exports = s;
- }, {}], 27: [function(g, C, i) {
- (function(e, A) {
- (function() {
- const s = g("fs"), l = /[<>&'"\x7F\x00-\x08\x0B-\x0C\x0E-\x1F]/, n = { nop() {
- }, promiseImmediate: (a) => new Promise((d) => {
- e.setImmediate ? A(() => {
- d(a);
- }) : setTimeout(() => {
- d(a);
- }, 1);
- }), inherits: function(a, d, o, c) {
- a.super_ = d, c || (c = o, o = null), o && Object.keys(o).forEach((h) => {
- Object.defineProperty(a, h, Object.getOwnPropertyDescriptor(o, h));
- });
- const r = { constructor: { value: a, enumerable: !1, writable: !1, configurable: !0 } };
- c && Object.keys(c).forEach((h) => {
- r[h] = Object.getOwnPropertyDescriptor(c, h);
- }), a.prototype = Object.create(d.prototype, r);
- }, dateToExcel: (a, d) => 25569 + a.getTime() / 864e5 - (d ? 1462 : 0), excelToDate(a, d) {
- const o = Math.round(24 * (a - 25569 + (d ? 1462 : 0)) * 3600 * 1e3);
- return new Date(o);
- }, parsePath(a) {
- const d = a.lastIndexOf("/");
- return { path: a.substring(0, d), name: a.substring(d + 1) };
- }, getRelsPath(a) {
- const d = n.parsePath(a);
- return `${d.path}/_rels/${d.name}.rels`;
- }, xmlEncode(a) {
- const d = l.exec(a);
- if (!d) return a;
- let o = "", c = "", r = 0, h = d.index;
- for (; h < a.length; h++) {
- const b = a.charCodeAt(h);
- switch (b) {
- case 34:
- c = """;
- break;
- case 38:
- c = "&";
- break;
- case 39:
- c = "'";
- break;
- case 60:
- c = "<";
- break;
- case 62:
- c = ">";
- break;
- case 127:
- c = "";
- break;
- default:
- if (b <= 31 && (b <= 8 || b >= 11 && b !== 13)) {
- c = "";
- break;
- }
- continue;
- }
- r !== h && (o += a.substring(r, h)), r = h + 1, c && (o += c);
- }
- return r !== h ? o + a.substring(r, h) : o;
- }, xmlDecode: (a) => a.replace(/&([a-z]*);/g, (d) => {
- switch (d) {
- case "<":
- return "<";
- case ">":
- return ">";
- case "&":
- return "&";
- case "'":
- return "'";
- case """:
- return '"';
- default:
- return d;
- }
- }), validInt(a) {
- const d = parseInt(a, 10);
- return Number.isNaN(d) ? 0 : d;
- }, isDateFmt(a) {
- return a ? (a = (a = a.replace(/\[[^\]]*]/g, "")).replace(/"[^"]*"/g, "")).match(/[ymdhMsb]+/) !== null : !1;
- }, fs: { exists: (a) => new Promise((d) => {
- s.access(a, s.constants.F_OK, (o) => {
- d(!o);
- });
- }) }, toIsoDateString: (a) => a.toIsoString().subsstr(0, 10), parseBoolean: (a) => a === !0 || a === "true" || a === 1 || a === "1" };
- C.exports = n;
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {}, g("timers").setImmediate);
- }, { fs: 216, timers: 523 }], 28: [function(g, C, i) {
- const e = g("./under-dash"), A = g("./utils");
- function s(a, d, o) {
- a.push(` ${d}="${A.xmlEncode(o.toString())}"`);
- }
- function l(a, d) {
- if (d) {
- const o = [];
- e.each(d, (c, r) => {
- c !== void 0 && s(o, r, c);
- }), a.push(o.join(""));
- }
- }
- class n {
- constructor() {
- this._xml = [], this._stack = [], this._rollbacks = [];
- }
- get tos() {
- return this._stack.length ? this._stack[this._stack.length - 1] : void 0;
- }
- get cursor() {
- return this._xml.length;
- }
- openXml(d) {
- const o = this._xml;
- o.push("<?xml"), l(o, d), o.push(`?>
- `);
- }
- openNode(d, o) {
- const c = this.tos, r = this._xml;
- c && this.open && r.push(">"), this._stack.push(d), r.push("<"), r.push(d), l(r, o), this.leaf = !0, this.open = !0;
- }
- addAttribute(d, o) {
- if (!this.open) throw new Error("Cannot write attributes to node if it is not open");
- o !== void 0 && s(this._xml, d, o);
- }
- addAttributes(d) {
- if (!this.open) throw new Error("Cannot write attributes to node if it is not open");
- l(this._xml, d);
- }
- writeText(d) {
- const o = this._xml;
- this.open && (o.push(">"), this.open = !1), this.leaf = !1, o.push(A.xmlEncode(d.toString()));
- }
- writeXml(d) {
- this.open && (this._xml.push(">"), this.open = !1), this.leaf = !1, this._xml.push(d);
- }
- closeNode() {
- const d = this._stack.pop(), o = this._xml;
- this.leaf ? o.push("/>") : (o.push("</"), o.push(d), o.push(">")), this.open = !1, this.leaf = !1;
- }
- leafNode(d, o, c) {
- this.openNode(d, o), c !== void 0 && this.writeText(c), this.closeNode();
- }
- closeAll() {
- for (; this._stack.length; ) this.closeNode();
- }
- addRollback() {
- return this._rollbacks.push({ xml: this._xml.length, stack: this._stack.length, leaf: this.leaf, open: this.open }), this.cursor;
- }
- commit() {
- this._rollbacks.pop();
- }
- rollback() {
- const d = this._rollbacks.pop();
- this._xml.length > d.xml && this._xml.splice(d.xml, this._xml.length - d.xml), this._stack.length > d.stack && this._stack.splice(d.stack, this._stack.length - d.stack), this.leaf = d.leaf, this.open = d.open;
- }
- get xml() {
- return this.closeAll(), this._xml.join("");
- }
- }
- n.StdDocAttributes = { version: "1.0", encoding: "UTF-8", standalone: "yes" }, C.exports = n;
- }, { "./under-dash": 26, "./utils": 27 }], 29: [function(g, C, i) {
- (function(e) {
- (function() {
- const A = g("events"), s = g("jszip"), l = g("./stream-buf"), { stringToBuffer: n } = g("./browser-buffer-encode");
- class a extends A.EventEmitter {
- constructor(o) {
- super(), this.options = Object.assign({ type: "nodebuffer", compression: "DEFLATE" }, o), this.zip = new s(), this.stream = new l();
- }
- append(o, c) {
- c.hasOwnProperty("base64") && c.base64 ? this.zip.file(c.name, o, { base64: !0 }) : (e.browser && typeof o == "string" && (o = n(o)), this.zip.file(c.name, o));
- }
- async finalize() {
- const o = await this.zip.generateAsync(this.options);
- this.stream.end(o), this.emit("finish");
- }
- read(o) {
- return this.stream.read(o);
- }
- setEncoding(o) {
- return this.stream.setEncoding(o);
- }
- pause() {
- return this.stream.pause();
- }
- resume() {
- return this.stream.resume();
- }
- isPaused() {
- return this.stream.isPaused();
- }
- pipe(o, c) {
- return this.stream.pipe(o, c);
- }
- unpipe(o) {
- return this.stream.unpipe(o);
- }
- unshift(o) {
- return this.stream.unshift(o);
- }
- wrap(o) {
- return this.stream.wrap(o);
- }
- }
- C.exports = { ZipWriter: a };
- }).call(this);
- }).call(this, g("_process"));
- }, { "./browser-buffer-encode": 17, "./stream-buf": 24, _process: 467, events: 422, jszip: 441 }], 30: [function(g, C, i) {
- C.exports = { 0: { f: "General" }, 1: { f: "0" }, 2: { f: "0.00" }, 3: { f: "#,##0" }, 4: { f: "#,##0.00" }, 9: { f: "0%" }, 10: { f: "0.00%" }, 11: { f: "0.00E+00" }, 12: { f: "# ?/?" }, 13: { f: "# ??/??" }, 14: { f: "mm-dd-yy" }, 15: { f: "d-mmm-yy" }, 16: { f: "d-mmm" }, 17: { f: "mmm-yy" }, 18: { f: "h:mm AM/PM" }, 19: { f: "h:mm:ss AM/PM" }, 20: { f: "h:mm" }, 21: { f: "h:mm:ss" }, 22: { f: 'm/d/yy "h":mm' }, 27: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 28: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 29: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 30: { "zh-tw": "m/d/yy ", "zh-cn": "m-d-yy", "ja-jp": "m/d/yy", "ko-kr": "mm-dd-yy" }, 31: { "zh-tw": 'yyyy"年"m"月"d"日"', "zh-cn": 'yyyy"年"m"月"d"日"', "ja-jp": 'yyyy"年"m"月"d"日"', "ko-kr": 'yyyy"년" mm"월" dd"일"' }, 32: { "zh-tw": 'hh"時"mm"分"', "zh-cn": 'h"时"mm"分"', "ja-jp": 'h"時"mm"分"', "ko-kr": 'h"시" mm"분"' }, 33: { "zh-tw": 'hh"時"mm"分"ss"秒"', "zh-cn": 'h"时"mm"分"ss"秒"', "ja-jp": 'h"時"mm"分"ss"秒"', "ko-kr": 'h"시" mm"분" ss"초"' }, 34: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": '上午/下午 h"时"mm"分"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 35: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": '上午/下午 h"时"mm"分"ss"秒"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 36: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 37: { f: "#,##0 ;(#,##0)" }, 38: { f: "#,##0 ;[Red](#,##0)" }, 39: { f: "#,##0.00 ;(#,##0.00)" }, 40: { f: "#,##0.00 ;[Red](#,##0.00)" }, 45: { f: "mm:ss" }, 46: { f: "[h]:mm:ss" }, 47: { f: "mmss.0" }, 48: { f: "##0.0E+0" }, 49: { f: "@" }, 50: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 51: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 52: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": 'yyyy"年"m"月"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 53: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": 'm"月"d"日"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 54: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 55: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": '上午/下午 h"时"mm"分"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 56: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": '上午/下午 h"时"mm"分"ss"秒"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 57: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 58: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 59: { "th-th": "t0" }, 60: { "th-th": "t0.00" }, 61: { "th-th": "t#,##0" }, 62: { "th-th": "t#,##0.00" }, 67: { "th-th": "t0%" }, 68: { "th-th": "t0.00%" }, 69: { "th-th": "t# ?/?" }, 70: { "th-th": "t# ??/??" }, 81: { "th-th": "d/m/bb" } };
- }, {}], 31: [function(g, C, i) {
- C.exports = { OfficeDocument: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", Worksheet: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", CalcChain: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain", SharedStrings: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", Styles: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", Theme: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", Hyperlink: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", Image: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", CoreProperties: "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", ExtenderProperties: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", Comments: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", VmlDrawing: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", Table: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" };
- }, {}], 32: [function(g, C, i) {
- const e = g("../../utils/parse-sax"), A = g("../../utils/xml-stream");
- class s {
- prepare() {
- }
- render() {
- }
- parseOpen(n) {
- }
- parseText(n) {
- }
- parseClose(n) {
- }
- reconcile(n, a) {
- }
- reset() {
- this.model = null, this.map && Object.values(this.map).forEach((n) => {
- n instanceof s ? n.reset() : n.xform && n.xform.reset();
- });
- }
- mergeModel(n) {
- this.model = Object.assign(this.model || {}, n);
- }
- async parse(n) {
- for await (const a of n) for (const { eventType: d, value: o } of a) if (d === "opentag") this.parseOpen(o);
- else if (d === "text") this.parseText(o);
- else if (d === "closetag" && !this.parseClose(o.name)) return this.model;
- return this.model;
- }
- async parseStream(n) {
- return this.parse(e(n));
- }
- get xml() {
- return this.toXml(this.model);
- }
- toXml(n) {
- const a = new A();
- return this.render(a, n), a.xml;
- }
- static toAttribute(n, a) {
- let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
- if (n === void 0) {
- if (d) return a;
- } else if (d || n !== a) return n.toString();
- }
- static toStringAttribute(n, a) {
- let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
- return s.toAttribute(n, a, d);
- }
- static toStringValue(n, a) {
- return n === void 0 ? a : n;
- }
- static toBoolAttribute(n, a) {
- let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
- if (n === void 0) {
- if (d) return a;
- } else if (d || n !== a) return n ? "1" : "0";
- }
- static toBoolValue(n, a) {
- return n === void 0 ? a : n === "1";
- }
- static toIntAttribute(n, a) {
- let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
- return s.toAttribute(n, a, d);
- }
- static toIntValue(n, a) {
- return n === void 0 ? a : parseInt(n, 10);
- }
- static toFloatAttribute(n, a) {
- let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
- return s.toAttribute(n, a, d);
- }
- static toFloatValue(n, a) {
- return n === void 0 ? a : parseFloat(n);
- }
- }
- C.exports = s;
- }, { "../../utils/parse-sax": 22, "../../utils/xml-stream": 28 }], 33: [function(g, C, i) {
- const e = g("../base-xform"), A = g("../../../utils/col-cache");
- function s(n) {
- try {
- return A.decodeEx(n), !0;
- } catch {
- return !1;
- }
- }
- function l(n) {
- const a = [];
- let d = !1, o = "";
- return n.split(",").forEach((c) => {
- if (!c) return;
- const r = (c.match(/'/g) || []).length;
- if (!r) return void (d ? o += c + "," : s(c) && a.push(c));
- const h = r % 2 == 0;
- !d && h && s(c) ? a.push(c) : d && !h ? (d = !1, s(o + c) && a.push(o + c), o = "") : (d = !0, o += c + ",");
- }), a;
- }
- C.exports = class extends e {
- render(n, a) {
- n.openNode("definedName", { name: a.name, localSheetId: a.localSheetId }), n.writeText(a.ranges.join(",")), n.closeNode();
- }
- parseOpen(n) {
- switch (n.name) {
- case "definedName":
- return this._parsedName = n.attributes.name, this._parsedLocalSheetId = n.attributes.localSheetId, this._parsedText = [], !0;
- default:
- return !1;
- }
- }
- parseText(n) {
- this._parsedText.push(n);
- }
- parseClose() {
- return this.model = { name: this._parsedName, ranges: l(this._parsedText.join("")) }, this._parsedLocalSheetId !== void 0 && (this.model.localSheetId = parseInt(this._parsedLocalSheetId, 10)), !1;
- }
- };
- }, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 34: [function(g, C, i) {
- const e = g("../../../utils/utils"), A = g("../base-xform");
- C.exports = class extends A {
- render(s, l) {
- s.leafNode("sheet", { sheetId: l.id, name: l.name, state: l.state, "r:id": l.rId });
- }
- parseOpen(s) {
- return s.name === "sheet" && (this.model = { name: e.xmlDecode(s.attributes.name), id: parseInt(s.attributes.sheetId, 10), state: s.attributes.state, rId: s.attributes["r:id"] }, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../../utils/utils": 27, "../base-xform": 32 }], 35: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- render(A, s) {
- A.leafNode("calcPr", { calcId: 171027, fullCalcOnLoad: s.fullCalcOnLoad ? 1 : void 0 });
- }
- parseOpen(A) {
- return A.name === "calcPr" && (this.model = {}, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 36: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- render(A, s) {
- A.leafNode("workbookPr", { date1904: s.date1904 ? 1 : void 0, defaultThemeVersion: 164011, filterPrivacy: 1 });
- }
- parseOpen(A) {
- return A.name === "workbookPr" && (this.model = { date1904: A.attributes.date1904 === "1" }, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 37: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- render(A, s) {
- const l = { xWindow: s.x || 0, yWindow: s.y || 0, windowWidth: s.width || 12e3, windowHeight: s.height || 24e3, firstSheet: s.firstSheet, activeTab: s.activeTab };
- s.visibility && s.visibility !== "visible" && (l.visibility = s.visibility), A.leafNode("workbookView", l);
- }
- parseOpen(A) {
- if (A.name === "workbookView") {
- const s = this.model = {}, l = function(a, d, o) {
- const c = d !== void 0 ? s[a] = d : o;
- c !== void 0 && (s[a] = c);
- }, n = function(a, d, o) {
- const c = d !== void 0 ? s[a] = parseInt(d, 10) : o;
- c !== void 0 && (s[a] = c);
- };
- return n("x", A.attributes.xWindow, 0), n("y", A.attributes.yWindow, 0), n("width", A.attributes.windowWidth, 25e3), n("height", A.attributes.windowHeight, 1e4), l("visibility", A.attributes.visibility, "visible"), n("activeTab", A.attributes.activeTab, void 0), n("firstSheet", A.attributes.firstSheet, void 0), !0;
- }
- return !1;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 38: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../../../utils/col-cache"), s = g("../../../utils/xml-stream"), l = g("../base-xform"), n = g("../static-xform"), a = g("../list-xform"), d = g("./defined-name-xform"), o = g("./sheet-xform"), c = g("./workbook-view-xform"), r = g("./workbook-properties-xform"), h = g("./workbook-calc-properties-xform");
- class b extends l {
- constructor() {
- super(), this.map = { fileVersion: b.STATIC_XFORMS.fileVersion, workbookPr: new r(), bookViews: new a({ tag: "bookViews", count: !1, childXform: new c() }), sheets: new a({ tag: "sheets", count: !1, childXform: new o() }), definedNames: new a({ tag: "definedNames", count: !1, childXform: new d() }), calcPr: new h() };
- }
- prepare(m) {
- m.sheets = m.worksheets;
- const Z = [];
- let p = 0;
- m.sheets.forEach((Y) => {
- if (Y.pageSetup && Y.pageSetup.printArea && Y.pageSetup.printArea.split("&&").forEach((R) => {
- const X = R.split(":"), H = { name: "_xlnm.Print_Area", ranges: [`'${Y.name}'!$${X[0]}:$${X[1]}`], localSheetId: p };
- Z.push(H);
- }), Y.pageSetup && (Y.pageSetup.printTitlesRow || Y.pageSetup.printTitlesColumn)) {
- const R = [];
- if (Y.pageSetup.printTitlesColumn) {
- const H = Y.pageSetup.printTitlesColumn.split(":");
- R.push(`'${Y.name}'!$${H[0]}:$${H[1]}`);
- }
- if (Y.pageSetup.printTitlesRow) {
- const H = Y.pageSetup.printTitlesRow.split(":");
- R.push(`'${Y.name}'!$${H[0]}:$${H[1]}`);
- }
- const X = { name: "_xlnm.Print_Titles", ranges: R, localSheetId: p };
- Z.push(X);
- }
- p++;
- }), Z.length && (m.definedNames = m.definedNames.concat(Z)), (m.media || []).forEach((Y, R) => {
- Y.name = Y.type + (R + 1);
- });
- }
- render(m, Z) {
- m.openXml(s.StdDocAttributes), m.openNode("workbook", b.WORKBOOK_ATTRIBUTES), this.map.fileVersion.render(m), this.map.workbookPr.render(m, Z.properties), this.map.bookViews.render(m, Z.views), this.map.sheets.render(m, Z.sheets), this.map.definedNames.render(m, Z.definedNames), this.map.calcPr.render(m, Z.calcProperties), m.closeNode();
- }
- parseOpen(m) {
- if (this.parser) return this.parser.parseOpen(m), !0;
- switch (m.name) {
- case "workbook":
- return !0;
- default:
- return this.parser = this.map[m.name], this.parser && this.parser.parseOpen(m), !0;
- }
- }
- parseText(m) {
- this.parser && this.parser.parseText(m);
- }
- parseClose(m) {
- if (this.parser) return this.parser.parseClose(m) || (this.parser = void 0), !0;
- switch (m) {
- case "workbook":
- return this.model = { sheets: this.map.sheets.model, properties: this.map.workbookPr.model || {}, views: this.map.bookViews.model, calcProperties: {} }, this.map.definedNames.model && (this.model.definedNames = this.map.definedNames.model), !1;
- default:
- return !0;
- }
- }
- reconcile(m) {
- const Z = (m.workbookRels || []).reduce((H, S) => (H[S.Id] = S, H), {}), p = [];
- let Y, R = 0;
- (m.sheets || []).forEach((H) => {
- const S = Z[H.rId];
- S && (Y = m.worksheetHash["xl/" + S.Target.replace(/^(\s|\/xl\/)+/, "")], Y && (Y.name = H.name, Y.id = H.id, Y.state = H.state, p[R++] = Y));
- });
- const X = [];
- e.each(m.definedNames, (H) => {
- if (H.name === "_xlnm.Print_Area") {
- if (Y = p[H.localSheetId], Y) {
- Y.pageSetup || (Y.pageSetup = {});
- const S = A.decodeEx(H.ranges[0]);
- Y.pageSetup.printArea = Y.pageSetup.printArea ? `${Y.pageSetup.printArea}&&${S.dimensions}` : S.dimensions;
- }
- } else if (H.name === "_xlnm.Print_Titles") {
- if (Y = p[H.localSheetId], Y) {
- Y.pageSetup || (Y.pageSetup = {});
- const S = H.ranges.join(","), z = /\$/g, v = /\$\d+:\$\d+/, K = S.match(v);
- if (K && K.length) {
- const B = K[0];
- Y.pageSetup.printTitlesRow = B.replace(z, "");
- }
- const V = /\$[A-Z]+:\$[A-Z]+/, N = S.match(V);
- if (N && N.length) {
- const B = N[0];
- Y.pageSetup.printTitlesColumn = B.replace(z, "");
- }
- }
- } else X.push(H);
- }), m.definedNames = X, m.media.forEach((H, S) => {
- H.index = S;
- });
- }
- }
- b.WORKBOOK_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x15", "xmlns:x15": "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" }, b.STATIC_XFORMS = { fileVersion: new n({ tag: "fileVersion", $: { appName: "xl", lastEdited: 5, lowestEdited: 5, rupBuild: 9303 } }) }, C.exports = b;
- }, { "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "../static-xform": 120, "./defined-name-xform": 33, "./sheet-xform": 34, "./workbook-calc-properties-xform": 35, "./workbook-properties-xform": 36, "./workbook-view-xform": 37 }], 39: [function(g, C, i) {
- const e = g("../strings/rich-text-xform"), A = g("../../../utils/utils"), s = g("../base-xform"), l = C.exports = function(n) {
- this.model = n;
- };
- A.inherits(l, s, { get tag() {
- return "r";
- }, get richTextXform() {
- return this._richTextXform || (this._richTextXform = new e()), this._richTextXform;
- }, render(n, a) {
- a = a || this.model, n.openNode("comment", { ref: a.ref, authorId: 0 }), n.openNode("text"), a && a.note && a.note.texts && a.note.texts.forEach((d) => {
- this.richTextXform.render(n, d);
- }), n.closeNode(), n.closeNode();
- }, parseOpen(n) {
- if (this.parser) return this.parser.parseOpen(n), !0;
- switch (n.name) {
- case "comment":
- return this.model = { type: "note", note: { texts: [] }, ...n.attributes }, !0;
- case "r":
- return this.parser = this.richTextXform, this.parser.parseOpen(n), !0;
- default:
- return !1;
- }
- }, parseText(n) {
- this.parser && this.parser.parseText(n);
- }, parseClose(n) {
- switch (n) {
- case "comment":
- return !1;
- case "r":
- return this.model.note.texts.push(this.parser.model), this.parser = void 0, !0;
- default:
- return this.parser && this.parser.parseClose(n), !0;
- }
- } });
- }, { "../../../utils/utils": 27, "../base-xform": 32, "../strings/rich-text-xform": 122 }], 40: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../../../utils/utils"), s = g("../base-xform"), l = g("./comment-xform"), n = C.exports = function() {
- this.map = { comment: new l() };
- };
- A.inherits(n, s, { COMMENTS_ATTRIBUTES: { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main" } }, { render(a, d) {
- d = d || this.model, a.openXml(e.StdDocAttributes), a.openNode("comments", n.COMMENTS_ATTRIBUTES), a.openNode("authors"), a.leafNode("author", null, "Author"), a.closeNode(), a.openNode("commentList"), d.comments.forEach((o) => {
- this.map.comment.render(a, o);
- }), a.closeNode(), a.closeNode();
- }, parseOpen(a) {
- if (this.parser) return this.parser.parseOpen(a), !0;
- switch (a.name) {
- case "commentList":
- return this.model = { comments: [] }, !0;
- case "comment":
- return this.parser = this.map.comment, this.parser.parseOpen(a), !0;
- default:
- return !1;
- }
- }, parseText(a) {
- this.parser && this.parser.parseText(a);
- }, parseClose(a) {
- switch (a) {
- case "commentList":
- return !1;
- case "comment":
- return this.model.comments.push(this.parser.model), this.parser = void 0, !0;
- default:
- return this.parser && this.parser.parseClose(a), !0;
- }
- } });
- }, { "../../../utils/utils": 27, "../../../utils/xml-stream": 28, "../base-xform": 32, "./comment-xform": 39 }], 41: [function(g, C, i) {
- const e = g("../../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this._model = A;
- }
- get tag() {
- return this._model && this._model.tag;
- }
- render(A, s, l) {
- (s === l[2] || this.tag === "x:SizeWithCells" && s === l[1]) && A.leafNode(this.tag);
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.model = {}, this.model[this.tag] = !0, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../base-xform": 32 }], 42: [function(g, C, i) {
- const e = g("../../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this._model = A;
- }
- get tag() {
- return this._model && this._model.tag;
- }
- render(A, s) {
- A.leafNode(this.tag, null, s);
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.text = "", !0;
- default:
- return !1;
- }
- }
- parseText(A) {
- this.text = A;
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../base-xform": 32 }], 43: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "x:Anchor";
- }
- getAnchorRect(A) {
- const s = Math.floor(A.left), l = Math.floor(68 * (A.left - s)), n = Math.floor(A.top), a = Math.floor(18 * (A.top - n)), d = Math.floor(A.right), o = Math.floor(68 * (A.right - d)), c = Math.floor(A.bottom);
- return [s, l, n, a, d, o, c, Math.floor(18 * (A.bottom - c))];
- }
- getDefaultRect(A) {
- const s = A.col, l = Math.max(A.row - 2, 0);
- return [s, 6, l, 14, s + 2, 2, l + 4, 16];
- }
- render(A, s) {
- const l = s.anchor ? this.getAnchorRect(s.anchor) : this.getDefaultRect(s.refAddress);
- A.leafNode("x:Anchor", null, l.join(", "));
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.text = "", !0;
- default:
- return !1;
- }
- }
- parseText(A) {
- this.text = A;
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 44: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./vml-anchor-xform"), s = g("./style/vml-protection-xform"), l = g("./style/vml-position-xform"), n = ["twoCells", "oneCells", "absolute"];
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "x:Anchor": new A(), "x:Locked": new s({ tag: "x:Locked" }), "x:LockText": new s({ tag: "x:LockText" }), "x:SizeWithCells": new l({ tag: "x:SizeWithCells" }), "x:MoveWithCells": new l({ tag: "x:MoveWithCells" }) };
- }
- get tag() {
- return "x:ClientData";
- }
- render(a, d) {
- const { protection: o, editAs: c } = d.note;
- a.openNode(this.tag, { ObjectType: "Note" }), this.map["x:MoveWithCells"].render(a, c, n), this.map["x:SizeWithCells"].render(a, c, n), this.map["x:Anchor"].render(a, d), this.map["x:Locked"].render(a, o.locked), a.leafNode("x:AutoFill", null, "False"), this.map["x:LockText"].render(a, o.lockText), a.leafNode("x:Row", null, d.refAddress.row - 1), a.leafNode("x:Column", null, d.refAddress.col - 1), a.closeNode();
- }
- parseOpen(a) {
- switch (a.name) {
- case this.tag:
- this.reset(), this.model = { anchor: [], protection: {}, editAs: "" };
- break;
- default:
- this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
- }
- return !0;
- }
- parseText(a) {
- this.parser && this.parser.parseText(a);
- }
- parseClose(a) {
- if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
- switch (a) {
- case this.tag:
- return this.normalizeModel(), !1;
- default:
- return !0;
- }
- }
- normalizeModel() {
- const a = Object.assign({}, this.map["x:MoveWithCells"].model, this.map["x:SizeWithCells"].model), d = Object.keys(a).length;
- this.model.editAs = n[d], this.model.anchor = this.map["x:Anchor"].text, this.model.protection.locked = this.map["x:Locked"].text, this.model.protection.lockText = this.map["x:LockText"].text;
- }
- };
- }, { "../base-xform": 32, "./style/vml-position-xform": 41, "./style/vml-protection-xform": 42, "./vml-anchor-xform": 43 }], 45: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./vml-shape-xform");
- class l extends A {
- constructor() {
- super(), this.map = { "v:shape": new s() };
- }
- get tag() {
- return "xml";
- }
- render(a, d) {
- a.openXml(e.StdDocAttributes), a.openNode(this.tag, l.DRAWING_ATTRIBUTES), a.openNode("o:shapelayout", { "v:ext": "edit" }), a.leafNode("o:idmap", { "v:ext": "edit", data: 1 }), a.closeNode(), a.openNode("v:shapetype", { id: "_x0000_t202", coordsize: "21600,21600", "o:spt": 202, path: "m,l,21600r21600,l21600,xe" }), a.leafNode("v:stroke", { joinstyle: "miter" }), a.leafNode("v:path", { gradientshapeok: "t", "o:connecttype": "rect" }), a.closeNode(), d.comments.forEach((o, c) => {
- this.map["v:shape"].render(a, o, c);
- }), a.closeNode();
- }
- parseOpen(a) {
- if (this.parser) return this.parser.parseOpen(a), !0;
- switch (a.name) {
- case this.tag:
- this.reset(), this.model = { comments: [] };
- break;
- default:
- this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
- }
- return !0;
- }
- parseText(a) {
- this.parser && this.parser.parseText(a);
- }
- parseClose(a) {
- if (this.parser) return this.parser.parseClose(a) || (this.model.comments.push(this.parser.model), this.parser = void 0), !0;
- switch (a) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- reconcile(a, d) {
- a.anchors.forEach((o) => {
- o.br ? this.map["xdr:twoCellAnchor"].reconcile(o, d) : this.map["xdr:oneCellAnchor"].reconcile(o, d);
- });
- }
- }
- l.DRAWING_ATTRIBUTES = { "xmlns:v": "urn:schemas-microsoft-com:vml", "xmlns:o": "urn:schemas-microsoft-com:office:office", "xmlns:x": "urn:schemas-microsoft-com:office:excel" }, C.exports = l;
- }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./vml-shape-xform": 46 }], 46: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./vml-textbox-xform"), s = g("./vml-client-data-xform");
- class l extends e {
- constructor() {
- super(), this.map = { "v:textbox": new A(), "x:ClientData": new s() };
- }
- get tag() {
- return "v:shape";
- }
- render(a, d, o) {
- a.openNode("v:shape", l.V_SHAPE_ATTRIBUTES(d, o)), a.leafNode("v:fill", { color2: "infoBackground [80]" }), a.leafNode("v:shadow", { color: "none [81]", obscured: "t" }), a.leafNode("v:path", { "o:connecttype": "none" }), this.map["v:textbox"].render(a, d), this.map["x:ClientData"].render(a, d), a.closeNode();
- }
- parseOpen(a) {
- if (this.parser) return this.parser.parseOpen(a), !0;
- switch (a.name) {
- case this.tag:
- this.reset(), this.model = { margins: { insetmode: a.attributes["o:insetmode"] }, anchor: "", editAs: "", protection: {} };
- break;
- default:
- this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
- }
- return !0;
- }
- parseText(a) {
- this.parser && this.parser.parseText(a);
- }
- parseClose(a) {
- if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
- switch (a) {
- case this.tag:
- return this.model.margins.inset = this.map["v:textbox"].model && this.map["v:textbox"].model.inset, this.model.protection = this.map["x:ClientData"].model && this.map["x:ClientData"].model.protection, this.model.anchor = this.map["x:ClientData"].model && this.map["x:ClientData"].model.anchor, this.model.editAs = this.map["x:ClientData"].model && this.map["x:ClientData"].model.editAs, !1;
- default:
- return !0;
- }
- }
- }
- l.V_SHAPE_ATTRIBUTES = (n, a) => ({ id: "_x0000_s" + (1025 + a), type: "#_x0000_t202", style: "position:absolute; margin-left:105.3pt;margin-top:10.5pt;width:97.8pt;height:59.1pt;z-index:1;visibility:hidden", fillcolor: "infoBackground [80]", strokecolor: "none [81]", "o:insetmode": n.note.margins && n.note.margins.insetmode }), C.exports = l;
- }, { "../base-xform": 32, "./vml-client-data-xform": 44, "./vml-textbox-xform": 47 }], 47: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "v:textbox";
- }
- conversionUnit(A, s, l) {
- return `${parseFloat(A) * s.toFixed(2)}${l}`;
- }
- reverseConversionUnit(A) {
- return (A || "").split(",").map((s) => Number(parseFloat(this.conversionUnit(parseFloat(s), 0.1, "")).toFixed(2)));
- }
- render(A, s) {
- const l = { style: "mso-direction-alt:auto" };
- if (s && s.note) {
- let { inset: n } = s.note && s.note.margins;
- Array.isArray(n) && (n = n.map((a) => this.conversionUnit(a, 10, "mm")).join(",")), n && (l.inset = n);
- }
- A.openNode("v:textbox", l), A.leafNode("div", { style: "text-align:left" }), A.closeNode();
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.model = { inset: this.reverseConversionUnit(A.attributes.inset) }, !0;
- default:
- return !0;
- }
- }
- parseText() {
- }
- parseClose(A) {
- switch (A) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32 }], 48: [function(g, C, i) {
- const e = g("./base-xform");
- C.exports = class extends e {
- createNewModel(A) {
- return {};
- }
- parseOpen(A) {
- return this.parser = this.parser || this.map[A.name], this.parser ? (this.parser.parseOpen(A), !0) : A.name === this.tag && (this.model = this.createNewModel(A), !0);
- }
- parseText(A) {
- this.parser && this.parser.parseText(A);
- }
- onParserClose(A, s) {
- this.model[A] = s.model;
- }
- parseClose(A) {
- return this.parser ? (this.parser.parseClose(A) || (this.onParserClose(A, this.parser), this.parser = void 0), !0) : A !== this.tag;
- }
- };
- }, { "./base-xform": 32 }], 49: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- render(A, s) {
- A.openNode("HeadingPairs"), A.openNode("vt:vector", { size: 2, baseType: "variant" }), A.openNode("vt:variant"), A.leafNode("vt:lpstr", void 0, "Worksheets"), A.closeNode(), A.openNode("vt:variant"), A.leafNode("vt:i4", void 0, s.length), A.closeNode(), A.closeNode(), A.closeNode();
- }
- parseOpen(A) {
- return A.name === "HeadingPairs";
- }
- parseText() {
- }
- parseClose(A) {
- return A !== "HeadingPairs";
- }
- };
- }, { "../base-xform": 32 }], 50: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- render(A, s) {
- A.openNode("TitlesOfParts"), A.openNode("vt:vector", { size: s.length, baseType: "lpstr" }), s.forEach((l) => {
- A.leafNode("vt:lpstr", void 0, l.name);
- }), A.closeNode(), A.closeNode();
- }
- parseOpen(A) {
- return A.name === "TitlesOfParts";
- }
- parseText() {
- }
- parseClose(A) {
- return A !== "TitlesOfParts";
- }
- };
- }, { "../base-xform": 32 }], 51: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../simple/string-xform"), l = g("./app-heading-pairs-xform"), n = g("./app-titles-of-parts-xform");
- class a extends A {
- constructor() {
- super(), this.map = { Company: new s({ tag: "Company" }), Manager: new s({ tag: "Manager" }), HeadingPairs: new l(), TitleOfParts: new n() };
- }
- render(o, c) {
- o.openXml(e.StdDocAttributes), o.openNode("Properties", a.PROPERTY_ATTRIBUTES), o.leafNode("Application", void 0, "Microsoft Excel"), o.leafNode("DocSecurity", void 0, "0"), o.leafNode("ScaleCrop", void 0, "false"), this.map.HeadingPairs.render(o, c.worksheets), this.map.TitleOfParts.render(o, c.worksheets), this.map.Company.render(o, c.company || ""), this.map.Manager.render(o, c.manager), o.leafNode("LinksUpToDate", void 0, "false"), o.leafNode("SharedDoc", void 0, "false"), o.leafNode("HyperlinksChanged", void 0, "false"), o.leafNode("AppVersion", void 0, "16.0300"), o.closeNode();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case "Properties":
- return !0;
- default:
- return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
- }
- }
- parseText(o) {
- this.parser && this.parser.parseText(o);
- }
- parseClose(o) {
- if (this.parser) return this.parser.parseClose(o) || (this.parser = void 0), !0;
- switch (o) {
- case "Properties":
- return this.model = { worksheets: this.map.TitleOfParts.model, company: this.map.Company.model, manager: this.map.Manager.model }, !1;
- default:
- return !0;
- }
- }
- }
- a.DateFormat = function(d) {
- return d.toISOString().replace(/[.]\d{3,6}/, "");
- }, a.DateAttrs = { "xsi:type": "dcterms:W3CDTF" }, a.PROPERTY_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties", "xmlns:vt": "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" }, C.exports = a;
- }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../simple/string-xform": 119, "./app-heading-pairs-xform": 49, "./app-titles-of-parts-xform": 50 }], 52: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../base-xform");
- class s extends A {
- render(n, a) {
- n.openXml(e.StdDocAttributes), n.openNode("Types", s.PROPERTY_ATTRIBUTES);
- const d = {};
- (a.media || []).forEach((o) => {
- if (o.type === "image") {
- const c = o.extension;
- d[c] || (d[c] = !0, n.leafNode("Default", { Extension: c, ContentType: "image/" + c }));
- }
- }), n.leafNode("Default", { Extension: "rels", ContentType: "application/vnd.openxmlformats-package.relationships+xml" }), n.leafNode("Default", { Extension: "xml", ContentType: "application/xml" }), n.leafNode("Override", { PartName: "/xl/workbook.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" }), a.worksheets.forEach((o) => {
- const c = `/xl/worksheets/sheet${o.id}.xml`;
- n.leafNode("Override", { PartName: c, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" });
- }), n.leafNode("Override", { PartName: "/xl/theme/theme1.xml", ContentType: "application/vnd.openxmlformats-officedocument.theme+xml" }), n.leafNode("Override", { PartName: "/xl/styles.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" }), a.sharedStrings && a.sharedStrings.count && n.leafNode("Override", { PartName: "/xl/sharedStrings.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" }), a.tables && a.tables.forEach((o) => {
- n.leafNode("Override", { PartName: "/xl/tables/" + o.target, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml" });
- }), a.drawings && a.drawings.forEach((o) => {
- n.leafNode("Override", { PartName: `/xl/drawings/${o.name}.xml`, ContentType: "application/vnd.openxmlformats-officedocument.drawing+xml" });
- }), a.commentRefs && (n.leafNode("Default", { Extension: "vml", ContentType: "application/vnd.openxmlformats-officedocument.vmlDrawing" }), a.commentRefs.forEach((o) => {
- let { commentName: c } = o;
- n.leafNode("Override", { PartName: `/xl/${c}.xml`, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" });
- })), n.leafNode("Override", { PartName: "/docProps/core.xml", ContentType: "application/vnd.openxmlformats-package.core-properties+xml" }), n.leafNode("Override", { PartName: "/docProps/app.xml", ContentType: "application/vnd.openxmlformats-officedocument.extended-properties+xml" }), n.closeNode();
- }
- parseOpen() {
- return !1;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- }
- s.PROPERTY_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/package/2006/content-types" }, C.exports = s;
- }, { "../../../utils/xml-stream": 28, "../base-xform": 32 }], 53: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../simple/date-xform"), l = g("../simple/string-xform"), n = g("../simple/integer-xform");
- class a extends A {
- constructor() {
- super(), this.map = { "dc:creator": new l({ tag: "dc:creator" }), "dc:title": new l({ tag: "dc:title" }), "dc:subject": new l({ tag: "dc:subject" }), "dc:description": new l({ tag: "dc:description" }), "dc:identifier": new l({ tag: "dc:identifier" }), "dc:language": new l({ tag: "dc:language" }), "cp:keywords": new l({ tag: "cp:keywords" }), "cp:category": new l({ tag: "cp:category" }), "cp:lastModifiedBy": new l({ tag: "cp:lastModifiedBy" }), "cp:lastPrinted": new s({ tag: "cp:lastPrinted", format: a.DateFormat }), "cp:revision": new n({ tag: "cp:revision" }), "cp:version": new l({ tag: "cp:version" }), "cp:contentStatus": new l({ tag: "cp:contentStatus" }), "cp:contentType": new l({ tag: "cp:contentType" }), "dcterms:created": new s({ tag: "dcterms:created", attrs: a.DateAttrs, format: a.DateFormat }), "dcterms:modified": new s({ tag: "dcterms:modified", attrs: a.DateAttrs, format: a.DateFormat }) };
- }
- render(o, c) {
- o.openXml(e.StdDocAttributes), o.openNode("cp:coreProperties", a.CORE_PROPERTY_ATTRIBUTES), this.map["dc:creator"].render(o, c.creator), this.map["dc:title"].render(o, c.title), this.map["dc:subject"].render(o, c.subject), this.map["dc:description"].render(o, c.description), this.map["dc:identifier"].render(o, c.identifier), this.map["dc:language"].render(o, c.language), this.map["cp:keywords"].render(o, c.keywords), this.map["cp:category"].render(o, c.category), this.map["cp:lastModifiedBy"].render(o, c.lastModifiedBy), this.map["cp:lastPrinted"].render(o, c.lastPrinted), this.map["cp:revision"].render(o, c.revision), this.map["cp:version"].render(o, c.version), this.map["cp:contentStatus"].render(o, c.contentStatus), this.map["cp:contentType"].render(o, c.contentType), this.map["dcterms:created"].render(o, c.created), this.map["dcterms:modified"].render(o, c.modified), o.closeNode();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case "cp:coreProperties":
- case "coreProperties":
- return !0;
- default:
- if (this.parser = this.map[o.name], this.parser) return this.parser.parseOpen(o), !0;
- throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(o));
- }
- }
- parseText(o) {
- this.parser && this.parser.parseText(o);
- }
- parseClose(o) {
- if (this.parser) return this.parser.parseClose(o) || (this.parser = void 0), !0;
- switch (o) {
- case "cp:coreProperties":
- case "coreProperties":
- return this.model = { creator: this.map["dc:creator"].model, title: this.map["dc:title"].model, subject: this.map["dc:subject"].model, description: this.map["dc:description"].model, identifier: this.map["dc:identifier"].model, language: this.map["dc:language"].model, keywords: this.map["cp:keywords"].model, category: this.map["cp:category"].model, lastModifiedBy: this.map["cp:lastModifiedBy"].model, lastPrinted: this.map["cp:lastPrinted"].model, revision: this.map["cp:revision"].model, contentStatus: this.map["cp:contentStatus"].model, contentType: this.map["cp:contentType"].model, created: this.map["dcterms:created"].model, modified: this.map["dcterms:modified"].model }, !1;
- default:
- throw new Error("Unexpected xml node in parseClose: " + o);
- }
- }
- }
- a.DateFormat = function(d) {
- return d.toISOString().replace(/[.]\d{3}/, "");
- }, a.DateAttrs = { "xsi:type": "dcterms:W3CDTF" }, a.CORE_PROPERTY_ATTRIBUTES = { "xmlns:cp": "http://schemas.openxmlformats.org/package/2006/metadata/core-properties", "xmlns:dc": "http://purl.org/dc/elements/1.1/", "xmlns:dcterms": "http://purl.org/dc/terms/", "xmlns:dcmitype": "http://purl.org/dc/dcmitype/", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance" }, C.exports = a;
- }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../simple/date-xform": 117, "../simple/integer-xform": 118, "../simple/string-xform": 119 }], 54: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- render(A, s) {
- A.leafNode("Relationship", s);
- }
- parseOpen(A) {
- switch (A.name) {
- case "Relationship":
- return this.model = A.attributes, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 55: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./relationship-xform");
- class l extends A {
- constructor() {
- super(), this.map = { Relationship: new s() };
- }
- render(a, d) {
- d = d || this._values, a.openXml(e.StdDocAttributes), a.openNode("Relationships", l.RELATIONSHIPS_ATTRIBUTES), d.forEach((o) => {
- this.map.Relationship.render(a, o);
- }), a.closeNode();
- }
- parseOpen(a) {
- if (this.parser) return this.parser.parseOpen(a), !0;
- switch (a.name) {
- case "Relationships":
- return this.model = [], !0;
- default:
- if (this.parser = this.map[a.name], this.parser) return this.parser.parseOpen(a), !0;
- throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(a));
- }
- }
- parseText(a) {
- this.parser && this.parser.parseText(a);
- }
- parseClose(a) {
- if (this.parser) return this.parser.parseClose(a) || (this.model.push(this.parser.model), this.parser = void 0), !0;
- switch (a) {
- case "Relationships":
- return !1;
- default:
- throw new Error("Unexpected xml node in parseClose: " + a);
- }
- }
- }
- l.RELATIONSHIPS_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/package/2006/relationships" }, C.exports = l;
- }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./relationship-xform": 54 }], 56: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- parseOpen(A) {
- if (this.parser) return this.parser.parseOpen(A), !0;
- switch (A.name) {
- case this.tag:
- this.reset(), this.model = { range: { editAs: A.attributes.editAs || "oneCell" } };
- break;
- default:
- this.parser = this.map[A.name], this.parser && this.parser.parseOpen(A);
- }
- return !0;
- }
- parseText(A) {
- this.parser && this.parser.parseText(A);
- }
- reconcilePicture(A, s) {
- if (A && A.rId) {
- const l = s.rels[A.rId].Target.match(/.*\/media\/(.+[.][a-zA-Z]{3,4})/);
- if (l) {
- const n = l[1], a = s.mediaIndex[n];
- return s.media[a];
- }
- }
- }
- };
- }, { "../base-xform": 32 }], 57: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./blip-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "a:blip": new A() };
- }
- get tag() {
- return "xdr:blipFill";
- }
- render(s, l) {
- s.openNode(this.tag), this.map["a:blip"].render(s, l), s.openNode("a:stretch"), s.leafNode("a:fillRect"), s.closeNode(), s.closeNode();
- }
- parseOpen(s) {
- if (this.parser) return this.parser.parseOpen(s), !0;
- switch (s.name) {
- case this.tag:
- this.reset();
- break;
- default:
- this.parser = this.map[s.name], this.parser && this.parser.parseOpen(s);
- }
- return !0;
- }
- parseText() {
- }
- parseClose(s) {
- if (this.parser) return this.parser.parseClose(s) || (this.parser = void 0), !0;
- switch (s) {
- case this.tag:
- return this.model = this.map["a:blip"].model, !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "./blip-xform": 58 }], 58: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "a:blip";
- }
- render(A, s) {
- A.leafNode(this.tag, { "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r:embed": s.rId, cstate: "print" });
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.model = { rId: A.attributes["r:embed"] }, !0;
- default:
- return !0;
- }
- }
- parseText() {
- }
- parseClose(A) {
- switch (A) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32 }], 59: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "xdr:cNvPicPr";
- }
- render(A) {
- A.openNode(this.tag), A.leafNode("a:picLocks", { noChangeAspect: "1" }), A.closeNode();
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- default:
- return !0;
- }
- }
- parseText() {
- }
- parseClose(A) {
- switch (A) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32 }], 60: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./hlink-click-xform"), s = g("./ext-lst-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "a:hlinkClick": new A(), "a:extLst": new s() };
- }
- get tag() {
- return "xdr:cNvPr";
- }
- render(l, n) {
- l.openNode(this.tag, { id: n.index, name: "Picture " + n.index }), this.map["a:hlinkClick"].render(l, n), this.map["a:extLst"].render(l, n), l.closeNode();
- }
- parseOpen(l) {
- if (this.parser) return this.parser.parseOpen(l), !0;
- switch (l.name) {
- case this.tag:
- this.reset();
- break;
- default:
- this.parser = this.map[l.name], this.parser && this.parser.parseOpen(l);
- }
- return !0;
- }
- parseText() {
- }
- parseClose(l) {
- if (this.parser) return this.parser.parseClose(l) || (this.parser = void 0), !0;
- switch (l) {
- case this.tag:
- return this.model = this.map["a:hlinkClick"].model, !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "./ext-lst-xform": 63, "./hlink-click-xform": 65 }], 61: [function(g, C, i) {
- const e = g("../base-xform"), A = g("../simple/integer-xform");
- C.exports = class extends e {
- constructor(s) {
- super(), this.tag = s.tag, this.map = { "xdr:col": new A({ tag: "xdr:col", zero: !0 }), "xdr:colOff": new A({ tag: "xdr:colOff", zero: !0 }), "xdr:row": new A({ tag: "xdr:row", zero: !0 }), "xdr:rowOff": new A({ tag: "xdr:rowOff", zero: !0 }) };
- }
- render(s, l) {
- s.openNode(this.tag), this.map["xdr:col"].render(s, l.nativeCol), this.map["xdr:colOff"].render(s, l.nativeColOff), this.map["xdr:row"].render(s, l.nativeRow), this.map["xdr:rowOff"].render(s, l.nativeRowOff), s.closeNode();
- }
- parseOpen(s) {
- if (this.parser) return this.parser.parseOpen(s), !0;
- switch (s.name) {
- case this.tag:
- this.reset();
- break;
- default:
- this.parser = this.map[s.name], this.parser && this.parser.parseOpen(s);
- }
- return !0;
- }
- parseText(s) {
- this.parser && this.parser.parseText(s);
- }
- parseClose(s) {
- if (this.parser) return this.parser.parseClose(s) || (this.parser = void 0), !0;
- switch (s) {
- case this.tag:
- return this.model = { nativeCol: this.map["xdr:col"].model, nativeColOff: this.map["xdr:colOff"].model, nativeRow: this.map["xdr:row"].model, nativeRowOff: this.map["xdr:rowOff"].model }, !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "../simple/integer-xform": 118 }], 62: [function(g, C, i) {
- const e = g("../../../utils/col-cache"), A = g("../../../utils/xml-stream"), s = g("../base-xform"), l = g("./two-cell-anchor-xform"), n = g("./one-cell-anchor-xform");
- class a extends s {
- constructor() {
- super(), this.map = { "xdr:twoCellAnchor": new l(), "xdr:oneCellAnchor": new n() };
- }
- prepare(o) {
- o.anchors.forEach((c, r) => {
- c.anchorType = function(h) {
- return (typeof h.range == "string" ? e.decode(h.range) : h.range).br ? "xdr:twoCellAnchor" : "xdr:oneCellAnchor";
- }(c), this.map[c.anchorType].prepare(c, { index: r });
- });
- }
- get tag() {
- return "xdr:wsDr";
- }
- render(o, c) {
- o.openXml(A.StdDocAttributes), o.openNode(this.tag, a.DRAWING_ATTRIBUTES), c.anchors.forEach((r) => {
- this.map[r.anchorType].render(o, r);
- }), o.closeNode();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case this.tag:
- this.reset(), this.model = { anchors: [] };
- break;
- default:
- this.parser = this.map[o.name], this.parser && this.parser.parseOpen(o);
- }
- return !0;
- }
- parseText(o) {
- this.parser && this.parser.parseText(o);
- }
- parseClose(o) {
- if (this.parser) return this.parser.parseClose(o) || (this.model.anchors.push(this.parser.model), this.parser = void 0), !0;
- switch (o) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- reconcile(o, c) {
- o.anchors.forEach((r) => {
- r.br ? this.map["xdr:twoCellAnchor"].reconcile(r, c) : this.map["xdr:oneCellAnchor"].reconcile(r, c);
- });
- }
- }
- a.DRAWING_ATTRIBUTES = { "xmlns:xdr": "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", "xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main" }, C.exports = a;
- }, { "../../../utils/col-cache": 19, "../../../utils/xml-stream": 28, "../base-xform": 32, "./one-cell-anchor-xform": 67, "./two-cell-anchor-xform": 70 }], 63: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "a:extLst";
- }
- render(A) {
- A.openNode(this.tag), A.openNode("a:ext", { uri: "{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}" }), A.leafNode("a16:creationId", { "xmlns:a16": "http://schemas.microsoft.com/office/drawing/2014/main", id: "{00000000-0008-0000-0000-000002000000}" }), A.closeNode(), A.closeNode();
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- default:
- return !0;
- }
- }
- parseText() {
- }
- parseClose(A) {
- switch (A) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32 }], 64: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this.tag = A.tag, this.map = {};
- }
- render(A, s) {
- A.openNode(this.tag);
- const l = Math.floor(9525 * s.width), n = Math.floor(9525 * s.height);
- A.addAttribute("cx", l), A.addAttribute("cy", n), A.closeNode();
- }
- parseOpen(A) {
- return A.name === this.tag && (this.model = { width: parseInt(A.attributes.cx || "0", 10) / 9525, height: parseInt(A.attributes.cy || "0", 10) / 9525 }, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 65: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "a:hlinkClick";
- }
- render(A, s) {
- s.hyperlinks && s.hyperlinks.rId && A.leafNode(this.tag, { "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r:id": s.hyperlinks.rId, tooltip: s.hyperlinks.tooltip });
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.model = { hyperlinks: { rId: A.attributes["r:id"], tooltip: A.attributes.tooltip } }, !0;
- default:
- return !0;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 66: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./c-nv-pr-xform"), s = g("./c-nv-pic-pr-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "xdr:cNvPr": new A(), "xdr:cNvPicPr": new s() };
- }
- get tag() {
- return "xdr:nvPicPr";
- }
- render(l, n) {
- l.openNode(this.tag), this.map["xdr:cNvPr"].render(l, n), this.map["xdr:cNvPicPr"].render(l, n), l.closeNode();
- }
- parseOpen(l) {
- if (this.parser) return this.parser.parseOpen(l), !0;
- switch (l.name) {
- case this.tag:
- this.reset();
- break;
- default:
- this.parser = this.map[l.name], this.parser && this.parser.parseOpen(l);
- }
- return !0;
- }
- parseText() {
- }
- parseClose(l) {
- if (this.parser) return this.parser.parseClose(l) || (this.parser = void 0), !0;
- switch (l) {
- case this.tag:
- return this.model = this.map["xdr:cNvPr"].model, !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "./c-nv-pic-pr-xform": 59, "./c-nv-pr-xform": 60 }], 67: [function(g, C, i) {
- const e = g("./base-cell-anchor-xform"), A = g("../static-xform"), s = g("./cell-position-xform"), l = g("./ext-xform"), n = g("./pic-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "xdr:from": new s({ tag: "xdr:from" }), "xdr:ext": new l({ tag: "xdr:ext" }), "xdr:pic": new n(), "xdr:clientData": new A({ tag: "xdr:clientData" }) };
- }
- get tag() {
- return "xdr:oneCellAnchor";
- }
- prepare(a, d) {
- this.map["xdr:pic"].prepare(a.picture, d);
- }
- render(a, d) {
- a.openNode(this.tag, { editAs: d.range.editAs || "oneCell" }), this.map["xdr:from"].render(a, d.range.tl), this.map["xdr:ext"].render(a, d.range.ext), this.map["xdr:pic"].render(a, d.picture), this.map["xdr:clientData"].render(a, {}), a.closeNode();
- }
- parseClose(a) {
- if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
- switch (a) {
- case this.tag:
- return this.model.range.tl = this.map["xdr:from"].model, this.model.range.ext = this.map["xdr:ext"].model, this.model.picture = this.map["xdr:pic"].model, !1;
- default:
- return !0;
- }
- }
- reconcile(a, d) {
- a.medium = this.reconcilePicture(a.picture, d);
- }
- };
- }, { "../static-xform": 120, "./base-cell-anchor-xform": 56, "./cell-position-xform": 61, "./ext-xform": 64, "./pic-xform": 68 }], 68: [function(g, C, i) {
- const e = g("../base-xform"), A = g("../static-xform"), s = g("./blip-fill-xform"), l = g("./nv-pic-pr-xform"), n = g("./sp-pr");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "xdr:nvPicPr": new l(), "xdr:blipFill": new s(), "xdr:spPr": new A(n) };
- }
- get tag() {
- return "xdr:pic";
- }
- prepare(a, d) {
- a.index = d.index + 1;
- }
- render(a, d) {
- a.openNode(this.tag), this.map["xdr:nvPicPr"].render(a, d), this.map["xdr:blipFill"].render(a, d), this.map["xdr:spPr"].render(a, d), a.closeNode();
- }
- parseOpen(a) {
- if (this.parser) return this.parser.parseOpen(a), !0;
- switch (a.name) {
- case this.tag:
- this.reset();
- break;
- default:
- this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
- }
- return !0;
- }
- parseText() {
- }
- parseClose(a) {
- if (this.parser) return this.parser.parseClose(a) || (this.mergeModel(this.parser.model), this.parser = void 0), !0;
- switch (a) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "../static-xform": 120, "./blip-fill-xform": 57, "./nv-pic-pr-xform": 66, "./sp-pr": 69 }], 69: [function(g, C, i) {
- C.exports = { tag: "xdr:spPr", c: [{ tag: "a:xfrm", c: [{ tag: "a:off", $: { x: "0", y: "0" } }, { tag: "a:ext", $: { cx: "0", cy: "0" } }] }, { tag: "a:prstGeom", $: { prst: "rect" }, c: [{ tag: "a:avLst" }] }] };
- }, {}], 70: [function(g, C, i) {
- const e = g("./base-cell-anchor-xform"), A = g("../static-xform"), s = g("./cell-position-xform"), l = g("./pic-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "xdr:from": new s({ tag: "xdr:from" }), "xdr:to": new s({ tag: "xdr:to" }), "xdr:pic": new l(), "xdr:clientData": new A({ tag: "xdr:clientData" }) };
- }
- get tag() {
- return "xdr:twoCellAnchor";
- }
- prepare(n, a) {
- this.map["xdr:pic"].prepare(n.picture, a);
- }
- render(n, a) {
- n.openNode(this.tag, { editAs: a.range.editAs || "oneCell" }), this.map["xdr:from"].render(n, a.range.tl), this.map["xdr:to"].render(n, a.range.br), this.map["xdr:pic"].render(n, a.picture), this.map["xdr:clientData"].render(n, {}), n.closeNode();
- }
- parseClose(n) {
- if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
- switch (n) {
- case this.tag:
- return this.model.range.tl = this.map["xdr:from"].model, this.model.range.br = this.map["xdr:to"].model, this.model.picture = this.map["xdr:pic"].model, !1;
- default:
- return !0;
- }
- }
- reconcile(n, a) {
- n.medium = this.reconcilePicture(n.picture, a);
- }
- };
- }, { "../static-xform": 120, "./base-cell-anchor-xform": 56, "./cell-position-xform": 61, "./pic-xform": 68 }], 71: [function(g, C, i) {
- const e = g("./base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this.tag = A.tag, this.always = !!A.always, this.count = A.count, this.empty = A.empty, this.$count = A.$count || "count", this.$ = A.$, this.childXform = A.childXform, this.maxItems = A.maxItems;
- }
- prepare(A, s) {
- const { childXform: l } = this;
- A && A.forEach((n, a) => {
- s.index = a, l.prepare(n, s);
- });
- }
- render(A, s) {
- if (this.always || s && s.length) {
- A.openNode(this.tag, this.$), this.count && A.addAttribute(this.$count, s && s.length || 0);
- const { childXform: l } = this;
- (s || []).forEach((n, a) => {
- l.render(A, n, a);
- }), A.closeNode();
- } else this.empty && A.leafNode(this.tag);
- }
- parseOpen(A) {
- if (this.parser) return this.parser.parseOpen(A), !0;
- switch (A.name) {
- case this.tag:
- return this.model = [], !0;
- default:
- return !!this.childXform.parseOpen(A) && (this.parser = this.childXform, !0);
- }
- }
- parseText(A) {
- this.parser && this.parser.parseText(A);
- }
- parseClose(A) {
- if (this.parser) {
- if (!this.parser.parseClose(A) && (this.model.push(this.parser.model), this.parser = void 0, this.maxItems && this.model.length > this.maxItems)) throw new Error(`Max ${this.childXform.tag} count (${this.maxItems}) exceeded`);
- return !0;
- }
- return !1;
- }
- reconcile(A, s) {
- if (A) {
- const { childXform: l } = this;
- A.forEach((n) => {
- l.reconcile(n, s);
- });
- }
- }
- };
- }, { "./base-xform": 32 }], 72: [function(g, C, i) {
- const e = g("../../../utils/col-cache"), A = g("../base-xform");
- C.exports = class extends A {
- get tag() {
- return "autoFilter";
- }
- render(s, l) {
- if (l) if (typeof l == "string") s.leafNode("autoFilter", { ref: l });
- else {
- const n = function(o) {
- return typeof o == "string" ? o : e.getAddress(o.row, o.column).address;
- }, a = n(l.from), d = n(l.to);
- a && d && s.leafNode("autoFilter", { ref: `${a}:${d}` });
- }
- }
- parseOpen(s) {
- s.name === "autoFilter" && (this.model = s.attributes.ref);
- }
- };
- }, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 73: [function(g, C, i) {
- const e = g("../../../utils/utils"), A = g("../base-xform"), s = g("../../../doc/range"), l = g("../../../doc/enums"), n = g("../strings/rich-text-xform");
- function a(d) {
- if (d == null) return l.ValueType.Null;
- if (d instanceof String || typeof d == "string") return l.ValueType.String;
- if (typeof d == "number") return l.ValueType.Number;
- if (typeof d == "boolean") return l.ValueType.Boolean;
- if (d instanceof Date) return l.ValueType.Date;
- if (d.text && d.hyperlink) return l.ValueType.Hyperlink;
- if (d.formula) return l.ValueType.Formula;
- if (d.error) return l.ValueType.Error;
- throw new Error("I could not understand type of value");
- }
- C.exports = class extends A {
- constructor() {
- super(), this.richTextXForm = new n();
- }
- get tag() {
- return "c";
- }
- prepare(d, o) {
- const c = o.styles.addStyleModel(d.style || {}, function(r) {
- switch (r.type) {
- case l.ValueType.Formula:
- return a(r.result);
- default:
- return r.type;
- }
- }(d));
- switch (c && (d.styleId = c), d.comment && o.comments.push({ ...d.comment, ref: d.address }), d.type) {
- case l.ValueType.String:
- case l.ValueType.RichText:
- o.sharedStrings && (d.ssId = o.sharedStrings.add(d.value));
- break;
- case l.ValueType.Date:
- o.date1904 && (d.date1904 = !0);
- break;
- case l.ValueType.Hyperlink:
- o.sharedStrings && d.text !== void 0 && d.text !== null && (d.ssId = o.sharedStrings.add(d.text)), o.hyperlinks.push({ address: d.address, target: d.hyperlink, tooltip: d.tooltip });
- break;
- case l.ValueType.Merge:
- o.merges.add(d);
- break;
- case l.ValueType.Formula:
- if (o.date1904 && (d.date1904 = !0), d.shareType === "shared" && (d.si = o.siFormulae++), d.formula) o.formulae[d.address] = d;
- else if (d.sharedFormula) {
- const r = o.formulae[d.sharedFormula];
- if (!r) throw new Error("Shared Formula master must exist above and or left of clone for cell " + d.address);
- r.si === void 0 ? (r.shareType = "shared", r.si = o.siFormulae++, r.range = new s(r.address, d.address)) : r.range && r.range.expandToAddress(d.address), d.si = r.si;
- }
- }
- }
- renderFormula(d, o) {
- let c = null;
- switch (o.shareType) {
- case "shared":
- c = { t: "shared", ref: o.ref || o.range.range, si: o.si };
- break;
- case "array":
- c = { t: "array", ref: o.ref };
- break;
- default:
- o.si !== void 0 && (c = { t: "shared", si: o.si });
- }
- switch (a(o.result)) {
- case l.ValueType.Null:
- d.leafNode("f", c, o.formula);
- break;
- case l.ValueType.String:
- d.addAttribute("t", "str"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result);
- break;
- case l.ValueType.Number:
- d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result);
- break;
- case l.ValueType.Boolean:
- d.addAttribute("t", "b"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result ? 1 : 0);
- break;
- case l.ValueType.Error:
- d.addAttribute("t", "e"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result.error);
- break;
- case l.ValueType.Date:
- d.leafNode("f", c, o.formula), d.leafNode("v", null, e.dateToExcel(o.result, o.date1904));
- break;
- default:
- throw new Error("I could not understand type of value");
- }
- }
- render(d, o) {
- if (o.type !== l.ValueType.Null || o.styleId) {
- switch (d.openNode("c"), d.addAttribute("r", o.address), o.styleId && d.addAttribute("s", o.styleId), o.type) {
- case l.ValueType.Null:
- break;
- case l.ValueType.Number:
- d.leafNode("v", null, o.value);
- break;
- case l.ValueType.Boolean:
- d.addAttribute("t", "b"), d.leafNode("v", null, o.value ? "1" : "0");
- break;
- case l.ValueType.Error:
- d.addAttribute("t", "e"), d.leafNode("v", null, o.value.error);
- break;
- case l.ValueType.String:
- case l.ValueType.RichText:
- o.ssId !== void 0 ? (d.addAttribute("t", "s"), d.leafNode("v", null, o.ssId)) : o.value && o.value.richText ? (d.addAttribute("t", "inlineStr"), d.openNode("is"), o.value.richText.forEach((c) => {
- this.richTextXForm.render(d, c);
- }), d.closeNode("is")) : (d.addAttribute("t", "str"), d.leafNode("v", null, o.value));
- break;
- case l.ValueType.Date:
- d.leafNode("v", null, e.dateToExcel(o.value, o.date1904));
- break;
- case l.ValueType.Hyperlink:
- o.ssId !== void 0 ? (d.addAttribute("t", "s"), d.leafNode("v", null, o.ssId)) : (d.addAttribute("t", "str"), d.leafNode("v", null, o.text));
- break;
- case l.ValueType.Formula:
- this.renderFormula(d, o);
- break;
- case l.ValueType.Merge:
- }
- d.closeNode();
- }
- }
- parseOpen(d) {
- if (this.parser) return this.parser.parseOpen(d), !0;
- switch (d.name) {
- case "c":
- return this.model = { address: d.attributes.r }, this.t = d.attributes.t, d.attributes.s && (this.model.styleId = parseInt(d.attributes.s, 10)), !0;
- case "f":
- return this.currentNode = "f", this.model.si = d.attributes.si, this.model.shareType = d.attributes.t, this.model.ref = d.attributes.ref, !0;
- case "v":
- return this.currentNode = "v", !0;
- case "t":
- return this.currentNode = "t", !0;
- case "r":
- return this.parser = this.richTextXForm, this.parser.parseOpen(d), !0;
- default:
- return !1;
- }
- }
- parseText(d) {
- if (this.parser) this.parser.parseText(d);
- else switch (this.currentNode) {
- case "f":
- this.model.formula = this.model.formula ? this.model.formula + d : d;
- break;
- case "v":
- case "t":
- this.model.value && this.model.value.richText ? this.model.value.richText.text = this.model.value.richText.text ? this.model.value.richText.text + d : d : this.model.value = this.model.value ? this.model.value + d : d;
- }
- }
- parseClose(d) {
- switch (d) {
- case "c": {
- const { model: o } = this;
- if (o.formula || o.shareType) o.type = l.ValueType.Formula, o.value && (this.t === "str" ? o.result = e.xmlDecode(o.value) : this.t === "b" ? o.result = parseInt(o.value, 10) !== 0 : this.t === "e" ? o.result = { error: o.value } : o.result = parseFloat(o.value), o.value = void 0);
- else if (o.value !== void 0) switch (this.t) {
- case "s":
- o.type = l.ValueType.String, o.value = parseInt(o.value, 10);
- break;
- case "str":
- o.type = l.ValueType.String, o.value = e.xmlDecode(o.value);
- break;
- case "inlineStr":
- o.type = l.ValueType.String;
- break;
- case "b":
- o.type = l.ValueType.Boolean, o.value = parseInt(o.value, 10) !== 0;
- break;
- case "e":
- o.type = l.ValueType.Error, o.value = { error: o.value };
- break;
- default:
- o.type = l.ValueType.Number, o.value = parseFloat(o.value);
- }
- else o.styleId ? o.type = l.ValueType.Null : o.type = l.ValueType.Merge;
- return !1;
- }
- case "f":
- case "v":
- case "is":
- return this.currentNode = void 0, !0;
- case "t":
- return this.parser ? (this.parser.parseClose(d), !0) : (this.currentNode = void 0, !0);
- case "r":
- return this.model.value = this.model.value || {}, this.model.value.richText = this.model.value.richText || [], this.model.value.richText.push(this.parser.model), this.parser = void 0, this.currentNode = void 0, !0;
- default:
- return !!this.parser && (this.parser.parseClose(d), !0);
- }
- }
- reconcile(d, o) {
- const c = d.styleId && o.styles && o.styles.getStyleModel(d.styleId);
- switch (c && (d.style = c), d.styleId !== void 0 && (d.styleId = void 0), d.type) {
- case l.ValueType.String:
- typeof d.value == "number" && o.sharedStrings && (d.value = o.sharedStrings.getString(d.value)), d.value.richText && (d.type = l.ValueType.RichText);
- break;
- case l.ValueType.Number:
- c && e.isDateFmt(c.numFmt) && (d.type = l.ValueType.Date, d.value = e.excelToDate(d.value, o.date1904));
- break;
- case l.ValueType.Formula:
- d.result !== void 0 && c && e.isDateFmt(c.numFmt) && (d.result = e.excelToDate(d.result, o.date1904)), d.shareType === "shared" && (d.ref ? o.formulae[d.si] = d.address : (d.sharedFormula = o.formulae[d.si], delete d.shareType), delete d.si);
- }
- const r = o.hyperlinkMap[d.address];
- r && (d.type === l.ValueType.Formula ? (d.text = d.result, d.result = void 0) : (d.text = d.value, d.value = void 0), d.type = l.ValueType.Hyperlink, d.hyperlink = r);
- const h = o.commentsMap && o.commentsMap[d.address];
- h && (d.comment = h);
- }
- };
- }, { "../../../doc/enums": 7, "../../../doc/range": 10, "../../../utils/utils": 27, "../base-xform": 32, "../strings/rich-text-xform": 122 }], 74: [function(g, C, i) {
- const e = g("../../base-xform");
- C.exports = class extends e {
- get tag() {
- return "x14:cfIcon";
- }
- render(A, s) {
- A.leafNode(this.tag, { iconSet: s.iconSet, iconId: s.iconId });
- }
- parseOpen(A) {
- let { attributes: s } = A;
- this.model = { iconSet: s.iconSet, iconId: e.toIntValue(s.iconId) };
- }
- parseClose(A) {
- return A !== this.tag;
- }
- };
- }, { "../../base-xform": 32 }], 75: [function(g, C, i) {
- const { v4: e } = g("uuid"), A = g("../../base-xform"), s = g("../../composite-xform"), l = g("./databar-ext-xform"), n = g("./icon-set-ext-xform"), a = { "3Triangles": !0, "3Stars": !0, "5Boxes": !0 };
- class d extends s {
- constructor() {
- super(), this.map = { "x14:dataBar": this.databarXform = new l(), "x14:iconSet": this.iconSetXform = new n() };
- }
- get tag() {
- return "x14:cfRule";
- }
- static isExt(c) {
- return c.type === "dataBar" ? l.isExt(c) : !(c.type !== "iconSet" || !c.custom && !a[c.iconSet]);
- }
- prepare(c) {
- d.isExt(c) && (c.x14Id = `{${e()}}`.toUpperCase());
- }
- render(c, r) {
- if (d.isExt(r)) switch (r.type) {
- case "dataBar":
- this.renderDataBar(c, r);
- break;
- case "iconSet":
- this.renderIconSet(c, r);
- }
- }
- renderDataBar(c, r) {
- c.openNode(this.tag, { type: "dataBar", id: r.x14Id }), this.databarXform.render(c, r), c.closeNode();
- }
- renderIconSet(c, r) {
- c.openNode(this.tag, { type: "iconSet", priority: r.priority, id: r.x14Id || `{${e()}}` }), this.iconSetXform.render(c, r), c.closeNode();
- }
- createNewModel(c) {
- let { attributes: r } = c;
- return { type: r.type, x14Id: r.id, priority: A.toIntValue(r.priority) };
- }
- onParserClose(c, r) {
- Object.assign(this.model, r.model);
- }
- }
- C.exports = d;
- }, { "../../base-xform": 32, "../../composite-xform": 48, "./databar-ext-xform": 79, "./icon-set-ext-xform": 81, uuid: 528 }], 76: [function(g, C, i) {
- const e = g("../../composite-xform"), A = g("./f-ext-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "xm:f": this.fExtXform = new A() };
- }
- get tag() {
- return "x14:cfvo";
- }
- render(s, l) {
- s.openNode(this.tag, { type: l.type }), l.value !== void 0 && this.fExtXform.render(s, l.value), s.closeNode();
- }
- createNewModel(s) {
- return { type: s.attributes.type };
- }
- onParserClose(s, l) {
- switch (s) {
- case "xm:f":
- this.model.value = l.model ? parseFloat(l.model) : 0;
- }
- }
- };
- }, { "../../composite-xform": 48, "./f-ext-xform": 80 }], 77: [function(g, C, i) {
- const e = g("../../composite-xform"), A = g("./sqref-ext-xform"), s = g("./cf-rule-ext-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "xm:sqref": this.sqRef = new A(), "x14:cfRule": this.cfRule = new s() };
- }
- get tag() {
- return "x14:conditionalFormatting";
- }
- prepare(l, n) {
- l.rules.forEach((a) => {
- this.cfRule.prepare(a, n);
- });
- }
- render(l, n) {
- n.rules.some(s.isExt) && (l.openNode(this.tag, { "xmlns:xm": "http://schemas.microsoft.com/office/excel/2006/main" }), n.rules.filter(s.isExt).forEach((a) => this.cfRule.render(l, a)), this.sqRef.render(l, n.ref), l.closeNode());
- }
- createNewModel() {
- return { rules: [] };
- }
- onParserClose(l, n) {
- switch (l) {
- case "xm:sqref":
- this.model.ref = n.model;
- break;
- case "x14:cfRule":
- this.model.rules.push(n.model);
- }
- }
- };
- }, { "../../composite-xform": 48, "./cf-rule-ext-xform": 75, "./sqref-ext-xform": 82 }], 78: [function(g, C, i) {
- const e = g("../../composite-xform"), A = g("./cf-rule-ext-xform"), s = g("./conditional-formatting-ext-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { "x14:conditionalFormatting": this.cfXform = new s() };
- }
- get tag() {
- return "x14:conditionalFormattings";
- }
- hasContent(l) {
- return l.hasExtContent === void 0 && (l.hasExtContent = l.some((n) => n.rules.some(A.isExt))), l.hasExtContent;
- }
- prepare(l, n) {
- l.forEach((a) => {
- this.cfXform.prepare(a, n);
- });
- }
- render(l, n) {
- this.hasContent(n) && (l.openNode(this.tag), n.forEach((a) => this.cfXform.render(l, a)), l.closeNode());
- }
- createNewModel() {
- return [];
- }
- onParserClose(l, n) {
- this.model.push(n.model);
- }
- };
- }, { "../../composite-xform": 48, "./cf-rule-ext-xform": 75, "./conditional-formatting-ext-xform": 77 }], 79: [function(g, C, i) {
- const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("../../style/color-xform"), l = g("./cfvo-ext-xform");
- C.exports = class extends A {
- constructor() {
- super(), this.map = { "x14:cfvo": this.cfvoXform = new l(), "x14:borderColor": this.borderColorXform = new s("x14:borderColor"), "x14:negativeBorderColor": this.negativeBorderColorXform = new s("x14:negativeBorderColor"), "x14:negativeFillColor": this.negativeFillColorXform = new s("x14:negativeFillColor"), "x14:axisColor": this.axisColorXform = new s("x14:axisColor") };
- }
- static isExt(n) {
- return !n.gradient;
- }
- get tag() {
- return "x14:dataBar";
- }
- render(n, a) {
- n.openNode(this.tag, { minLength: e.toIntAttribute(a.minLength, 0, !0), maxLength: e.toIntAttribute(a.maxLength, 100, !0), border: e.toBoolAttribute(a.border, !1), gradient: e.toBoolAttribute(a.gradient, !0), negativeBarColorSameAsPositive: e.toBoolAttribute(a.negativeBarColorSameAsPositive, !0), negativeBarBorderColorSameAsPositive: e.toBoolAttribute(a.negativeBarBorderColorSameAsPositive, !0), axisPosition: e.toAttribute(a.axisPosition, "auto"), direction: e.toAttribute(a.direction, "leftToRight") }), a.cfvo.forEach((d) => {
- this.cfvoXform.render(n, d);
- }), this.borderColorXform.render(n, a.borderColor), this.negativeBorderColorXform.render(n, a.negativeBorderColor), this.negativeFillColorXform.render(n, a.negativeFillColor), this.axisColorXform.render(n, a.axisColor), n.closeNode();
- }
- createNewModel(n) {
- let { attributes: a } = n;
- return { cfvo: [], minLength: e.toIntValue(a.minLength, 0), maxLength: e.toIntValue(a.maxLength, 100), border: e.toBoolValue(a.border, !1), gradient: e.toBoolValue(a.gradient, !0), negativeBarColorSameAsPositive: e.toBoolValue(a.negativeBarColorSameAsPositive, !0), negativeBarBorderColorSameAsPositive: e.toBoolValue(a.negativeBarBorderColorSameAsPositive, !0), axisPosition: e.toStringValue(a.axisPosition, "auto"), direction: e.toStringValue(a.direction, "leftToRight") };
- }
- onParserClose(n, a) {
- const [, d] = n.split(":");
- switch (d) {
- case "cfvo":
- this.model.cfvo.push(a.model);
- break;
- default:
- this.model[d] = a.model;
- }
- }
- };
- }, { "../../base-xform": 32, "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-ext-xform": 76 }], 80: [function(g, C, i) {
- const e = g("../../base-xform");
- C.exports = class extends e {
- get tag() {
- return "xm:f";
- }
- render(A, s) {
- A.leafNode(this.tag, null, s);
- }
- parseOpen() {
- this.model = "";
- }
- parseText(A) {
- this.model += A;
- }
- parseClose(A) {
- return A !== this.tag;
- }
- };
- }, { "../../base-xform": 32 }], 81: [function(g, C, i) {
- const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("./cfvo-ext-xform"), l = g("./cf-icon-ext-xform");
- C.exports = class extends A {
- constructor() {
- super(), this.map = { "x14:cfvo": this.cfvoXform = new s(), "x14:cfIcon": this.cfIconXform = new l() };
- }
- get tag() {
- return "x14:iconSet";
- }
- render(n, a) {
- n.openNode(this.tag, { iconSet: e.toStringAttribute(a.iconSet), reverse: e.toBoolAttribute(a.reverse, !1), showValue: e.toBoolAttribute(a.showValue, !0), custom: e.toBoolAttribute(a.icons, !1) }), a.cfvo.forEach((d) => {
- this.cfvoXform.render(n, d);
- }), a.icons && a.icons.forEach((d, o) => {
- d.iconId = o, this.cfIconXform.render(n, d);
- }), n.closeNode();
- }
- createNewModel(n) {
- let { attributes: a } = n;
- return { cfvo: [], iconSet: e.toStringValue(a.iconSet, "3TrafficLights"), reverse: e.toBoolValue(a.reverse, !1), showValue: e.toBoolValue(a.showValue, !0) };
- }
- onParserClose(n, a) {
- const [, d] = n.split(":");
- switch (d) {
- case "cfvo":
- this.model.cfvo.push(a.model);
- break;
- case "cfIcon":
- this.model.icons || (this.model.icons = []), this.model.icons.push(a.model);
- break;
- default:
- this.model[d] = a.model;
- }
- }
- };
- }, { "../../base-xform": 32, "../../composite-xform": 48, "./cf-icon-ext-xform": 74, "./cfvo-ext-xform": 76 }], 82: [function(g, C, i) {
- const e = g("../../base-xform");
- C.exports = class extends e {
- get tag() {
- return "xm:sqref";
- }
- render(A, s) {
- A.leafNode(this.tag, null, s);
- }
- parseOpen() {
- this.model = "";
- }
- parseText(A) {
- this.model += A;
- }
- parseClose(A) {
- return A !== this.tag;
- }
- };
- }, { "../../base-xform": 32 }], 83: [function(g, C, i) {
- const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("../../../../doc/range"), l = g("./databar-xform"), n = g("./ext-lst-ref-xform"), a = g("./formula-xform"), d = g("./color-scale-xform"), o = g("./icon-set-xform"), c = { "3Triangles": !0, "3Stars": !0, "5Boxes": !0 }, r = (b) => {
- const { type: u, operator: m } = b;
- switch (u) {
- case "containsText":
- case "containsBlanks":
- case "notContainsBlanks":
- case "containsErrors":
- case "notContainsErrors":
- return { type: "containsText", operator: u };
- default:
- return { type: u, operator: m };
- }
- };
- class h extends A {
- constructor() {
- super(), this.map = { dataBar: this.databarXform = new l(), extLst: this.extLstRefXform = new n(), formula: this.formulaXform = new a(), colorScale: this.colorScaleXform = new d(), iconSet: this.iconSetXform = new o() };
- }
- get tag() {
- return "cfRule";
- }
- static isPrimitive(u) {
- return u.type !== "iconSet" || !u.custom && !c[u.iconSet];
- }
- render(u, m) {
- switch (m.type) {
- case "expression":
- this.renderExpression(u, m);
- break;
- case "cellIs":
- this.renderCellIs(u, m);
- break;
- case "top10":
- this.renderTop10(u, m);
- break;
- case "aboveAverage":
- this.renderAboveAverage(u, m);
- break;
- case "dataBar":
- this.renderDataBar(u, m);
- break;
- case "colorScale":
- this.renderColorScale(u, m);
- break;
- case "iconSet":
- this.renderIconSet(u, m);
- break;
- case "containsText":
- this.renderText(u, m);
- break;
- case "timePeriod":
- this.renderTimePeriod(u, m);
- }
- }
- renderExpression(u, m) {
- u.openNode(this.tag, { type: "expression", dxfId: m.dxfId, priority: m.priority }), this.formulaXform.render(u, m.formulae[0]), u.closeNode();
- }
- renderCellIs(u, m) {
- u.openNode(this.tag, { type: "cellIs", dxfId: m.dxfId, priority: m.priority, operator: m.operator }), m.formulae.forEach((Z) => {
- this.formulaXform.render(u, Z);
- }), u.closeNode();
- }
- renderTop10(u, m) {
- u.leafNode(this.tag, { type: "top10", dxfId: m.dxfId, priority: m.priority, percent: e.toBoolAttribute(m.percent, !1), bottom: e.toBoolAttribute(m.bottom, !1), rank: e.toIntValue(m.rank, 10, !0) });
- }
- renderAboveAverage(u, m) {
- u.leafNode(this.tag, { type: "aboveAverage", dxfId: m.dxfId, priority: m.priority, aboveAverage: e.toBoolAttribute(m.aboveAverage, !0) });
- }
- renderDataBar(u, m) {
- u.openNode(this.tag, { type: "dataBar", priority: m.priority }), this.databarXform.render(u, m), this.extLstRefXform.render(u, m), u.closeNode();
- }
- renderColorScale(u, m) {
- u.openNode(this.tag, { type: "colorScale", priority: m.priority }), this.colorScaleXform.render(u, m), u.closeNode();
- }
- renderIconSet(u, m) {
- h.isPrimitive(m) && (u.openNode(this.tag, { type: "iconSet", priority: m.priority }), this.iconSetXform.render(u, m), u.closeNode());
- }
- renderText(u, m) {
- u.openNode(this.tag, { type: m.operator, dxfId: m.dxfId, priority: m.priority, operator: e.toStringAttribute(m.operator, "containsText") });
- const Z = ((p) => {
- if (p.formulae && p.formulae[0]) return p.formulae[0];
- const Y = new s(p.ref), { tl: R } = Y;
- switch (p.operator) {
- case "containsText":
- return `NOT(ISERROR(SEARCH("${p.text}",${R})))`;
- case "containsBlanks":
- return `LEN(TRIM(${R}))=0`;
- case "notContainsBlanks":
- return `LEN(TRIM(${R}))>0`;
- case "containsErrors":
- return `ISERROR(${R})`;
- case "notContainsErrors":
- return `NOT(ISERROR(${R}))`;
- default:
- return;
- }
- })(m);
- Z && this.formulaXform.render(u, Z), u.closeNode();
- }
- renderTimePeriod(u, m) {
- u.openNode(this.tag, { type: "timePeriod", dxfId: m.dxfId, priority: m.priority, timePeriod: m.timePeriod });
- const Z = ((p) => {
- if (p.formulae && p.formulae[0]) return p.formulae[0];
- const Y = new s(p.ref), { tl: R } = Y;
- switch (p.timePeriod) {
- case "thisWeek":
- return `AND(TODAY()-ROUNDDOWN(${R},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(${R},0)-TODAY()<=7-WEEKDAY(TODAY()))`;
- case "lastWeek":
- return `AND(TODAY()-ROUNDDOWN(${R},0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(${R},0)<(WEEKDAY(TODAY())+7))`;
- case "nextWeek":
- return `AND(ROUNDDOWN(${R},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(${R},0)-TODAY()<(15-WEEKDAY(TODAY())))`;
- case "yesterday":
- return `FLOOR(${R},1)=TODAY()-1`;
- case "today":
- return `FLOOR(${R},1)=TODAY()`;
- case "tomorrow":
- return `FLOOR(${R},1)=TODAY()+1`;
- case "last7Days":
- return `AND(TODAY()-FLOOR(${R},1)<=6,FLOOR(${R},1)<=TODAY())`;
- case "lastMonth":
- return `AND(MONTH(${R})=MONTH(EDATE(TODAY(),0-1)),YEAR(${R})=YEAR(EDATE(TODAY(),0-1)))`;
- case "thisMonth":
- return `AND(MONTH(${R})=MONTH(TODAY()),YEAR(${R})=YEAR(TODAY()))`;
- case "nextMonth":
- return `AND(MONTH(${R})=MONTH(EDATE(TODAY(),0+1)),YEAR(${R})=YEAR(EDATE(TODAY(),0+1)))`;
- default:
- return;
- }
- })(m);
- Z && this.formulaXform.render(u, Z), u.closeNode();
- }
- createNewModel(u) {
- let { attributes: m } = u;
- return { ...r(m), dxfId: e.toIntValue(m.dxfId), priority: e.toIntValue(m.priority), timePeriod: m.timePeriod, percent: e.toBoolValue(m.percent), bottom: e.toBoolValue(m.bottom), rank: e.toIntValue(m.rank), aboveAverage: e.toBoolValue(m.aboveAverage) };
- }
- onParserClose(u, m) {
- switch (u) {
- case "dataBar":
- case "extLst":
- case "colorScale":
- case "iconSet":
- Object.assign(this.model, m.model);
- break;
- case "formula":
- this.model.formulae = this.model.formulae || [], this.model.formulae.push(m.model);
- }
- }
- }
- C.exports = h;
- }, { "../../../../doc/range": 10, "../../base-xform": 32, "../../composite-xform": 48, "./color-scale-xform": 85, "./databar-xform": 88, "./ext-lst-ref-xform": 89, "./formula-xform": 90, "./icon-set-xform": 91 }], 84: [function(g, C, i) {
- const e = g("../../base-xform");
- C.exports = class extends e {
- get tag() {
- return "cfvo";
- }
- render(A, s) {
- A.leafNode(this.tag, { type: s.type, val: s.value });
- }
- parseOpen(A) {
- this.model = { type: A.attributes.type, value: e.toFloatValue(A.attributes.val) };
- }
- parseClose(A) {
- return A !== this.tag;
- }
- };
- }, { "../../base-xform": 32 }], 85: [function(g, C, i) {
- const e = g("../../composite-xform"), A = g("../../style/color-xform"), s = g("./cfvo-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { cfvo: this.cfvoXform = new s(), color: this.colorXform = new A() };
- }
- get tag() {
- return "colorScale";
- }
- render(l, n) {
- l.openNode(this.tag), n.cfvo.forEach((a) => {
- this.cfvoXform.render(l, a);
- }), n.color.forEach((a) => {
- this.colorXform.render(l, a);
- }), l.closeNode();
- }
- createNewModel(l) {
- return { cfvo: [], color: [] };
- }
- onParserClose(l, n) {
- this.model[l].push(n.model);
- }
- };
- }, { "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-xform": 84 }], 86: [function(g, C, i) {
- const e = g("../../composite-xform"), A = g("./cf-rule-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { cfRule: new A() };
- }
- get tag() {
- return "conditionalFormatting";
- }
- render(s, l) {
- l.rules.some(A.isPrimitive) && (s.openNode(this.tag, { sqref: l.ref }), l.rules.forEach((n) => {
- A.isPrimitive(n) && (n.ref = l.ref, this.map.cfRule.render(s, n));
- }), s.closeNode());
- }
- createNewModel(s) {
- let { attributes: l } = s;
- return { ref: l.sqref, rules: [] };
- }
- onParserClose(s, l) {
- this.model.rules.push(l.model);
- }
- };
- }, { "../../composite-xform": 48, "./cf-rule-xform": 83 }], 87: [function(g, C, i) {
- const e = g("../../base-xform"), A = g("./conditional-formatting-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.cfXform = new A();
- }
- get tag() {
- return "conditionalFormatting";
- }
- reset() {
- this.model = [];
- }
- prepare(s, l) {
- let n = s.reduce((a, d) => Math.max(a, ...d.rules.map((o) => o.priority || 0)), 1);
- s.forEach((a) => {
- a.rules.forEach((d) => {
- d.priority || (d.priority = n++), d.style && (d.dxfId = l.styles.addDxfStyle(d.style));
- });
- });
- }
- render(s, l) {
- l.forEach((n) => {
- this.cfXform.render(s, n);
- });
- }
- parseOpen(s) {
- if (this.parser) return this.parser.parseOpen(s), !0;
- switch (s.name) {
- case "conditionalFormatting":
- return this.parser = this.cfXform, this.parser.parseOpen(s), !0;
- default:
- return !1;
- }
- }
- parseText(s) {
- this.parser && this.parser.parseText(s);
- }
- parseClose(s) {
- return !!this.parser && (!!this.parser.parseClose(s) || (this.model.push(this.parser.model), this.parser = void 0, !1));
- }
- reconcile(s, l) {
- s.forEach((n) => {
- n.rules.forEach((a) => {
- a.dxfId !== void 0 && (a.style = l.styles.getDxfStyle(a.dxfId), delete a.dxfId);
- });
- });
- }
- };
- }, { "../../base-xform": 32, "./conditional-formatting-xform": 86 }], 88: [function(g, C, i) {
- const e = g("../../composite-xform"), A = g("../../style/color-xform"), s = g("./cfvo-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { cfvo: this.cfvoXform = new s(), color: this.colorXform = new A() };
- }
- get tag() {
- return "dataBar";
- }
- render(l, n) {
- l.openNode(this.tag), n.cfvo.forEach((a) => {
- this.cfvoXform.render(l, a);
- }), this.colorXform.render(l, n.color), l.closeNode();
- }
- createNewModel() {
- return { cfvo: [] };
- }
- onParserClose(l, n) {
- switch (l) {
- case "cfvo":
- this.model.cfvo.push(n.model);
- break;
- case "color":
- this.model.color = n.model;
- }
- }
- };
- }, { "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-xform": 84 }], 89: [function(g, C, i) {
- const e = g("../../base-xform"), A = g("../../composite-xform");
- class s extends e {
- get tag() {
- return "x14:id";
- }
- render(a, d) {
- a.leafNode(this.tag, null, d);
- }
- parseOpen() {
- this.model = "";
- }
- parseText(a) {
- this.model += a;
- }
- parseClose(a) {
- return a !== this.tag;
- }
- }
- class l extends A {
- constructor() {
- super(), this.map = { "x14:id": this.idXform = new s() };
- }
- get tag() {
- return "ext";
- }
- render(a, d) {
- a.openNode(this.tag, { uri: "{B025F937-C7B1-47D3-B67F-A62EFF666E3E}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }), this.idXform.render(a, d.x14Id), a.closeNode();
- }
- createNewModel() {
- return {};
- }
- onParserClose(a, d) {
- this.model.x14Id = d.model;
- }
- }
- C.exports = class extends A {
- constructor() {
- super(), this.map = { ext: new l() };
- }
- get tag() {
- return "extLst";
- }
- render(n, a) {
- n.openNode(this.tag), this.map.ext.render(n, a), n.closeNode();
- }
- createNewModel() {
- return {};
- }
- onParserClose(n, a) {
- Object.assign(this.model, a.model);
- }
- };
- }, { "../../base-xform": 32, "../../composite-xform": 48 }], 90: [function(g, C, i) {
- const e = g("../../base-xform");
- C.exports = class extends e {
- get tag() {
- return "formula";
- }
- render(A, s) {
- A.leafNode(this.tag, null, s);
- }
- parseOpen() {
- this.model = "";
- }
- parseText(A) {
- this.model += A;
- }
- parseClose(A) {
- return A !== this.tag;
- }
- };
- }, { "../../base-xform": 32 }], 91: [function(g, C, i) {
- const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("./cfvo-xform");
- C.exports = class extends A {
- constructor() {
- super(), this.map = { cfvo: this.cfvoXform = new s() };
- }
- get tag() {
- return "iconSet";
- }
- render(l, n) {
- l.openNode(this.tag, { iconSet: e.toStringAttribute(n.iconSet, "3TrafficLights"), reverse: e.toBoolAttribute(n.reverse, !1), showValue: e.toBoolAttribute(n.showValue, !0) }), n.cfvo.forEach((a) => {
- this.cfvoXform.render(l, a);
- }), l.closeNode();
- }
- createNewModel(l) {
- let { attributes: n } = l;
- return { iconSet: e.toStringValue(n.iconSet, "3TrafficLights"), reverse: e.toBoolValue(n.reverse), showValue: e.toBoolValue(n.showValue), cfvo: [] };
- }
- onParserClose(l, n) {
- this.model[l].push(n.model);
- }
- };
- }, { "../../base-xform": 32, "../../composite-xform": 48, "./cfvo-xform": 84 }], 92: [function(g, C, i) {
- const e = g("../../../utils/utils"), A = g("../base-xform");
- C.exports = class extends A {
- get tag() {
- return "col";
- }
- prepare(s, l) {
- const n = l.styles.addStyleModel(s.style || {});
- n && (s.styleId = n);
- }
- render(s, l) {
- s.openNode("col"), s.addAttribute("min", l.min), s.addAttribute("max", l.max), l.width && s.addAttribute("width", l.width), l.styleId && s.addAttribute("style", l.styleId), l.hidden && s.addAttribute("hidden", "1"), l.bestFit && s.addAttribute("bestFit", "1"), l.outlineLevel && s.addAttribute("outlineLevel", l.outlineLevel), l.collapsed && s.addAttribute("collapsed", "1"), s.addAttribute("customWidth", "1"), s.closeNode();
- }
- parseOpen(s) {
- if (s.name === "col") {
- const l = this.model = { min: parseInt(s.attributes.min || "0", 10), max: parseInt(s.attributes.max || "0", 10), width: s.attributes.width === void 0 ? void 0 : parseFloat(s.attributes.width || "0") };
- return s.attributes.style && (l.styleId = parseInt(s.attributes.style, 10)), e.parseBoolean(s.attributes.hidden) && (l.hidden = !0), e.parseBoolean(s.attributes.bestFit) && (l.bestFit = !0), s.attributes.outlineLevel && (l.outlineLevel = parseInt(s.attributes.outlineLevel, 10)), e.parseBoolean(s.attributes.collapsed) && (l.collapsed = !0), !0;
- }
- return !1;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- reconcile(s, l) {
- s.styleId && (s.style = l.styles.getStyleModel(s.styleId));
- }
- };
- }, { "../../../utils/utils": 27, "../base-xform": 32 }], 93: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../../../utils/utils"), s = g("../../../utils/col-cache"), l = g("../base-xform"), n = g("../../../doc/range");
- function a(o, c, r, h) {
- const b = c[r];
- b !== void 0 ? o[r] = b : h !== void 0 && (o[r] = h);
- }
- function d(o, c, r, h) {
- const b = c[r];
- b !== void 0 && (o[r] = A.parseBoolean(b));
- }
- C.exports = class extends l {
- get tag() {
- return "dataValidations";
- }
- render(o, c) {
- const r = function(h) {
- const b = e.map(h, (Z, p) => ({ address: p, dataValidation: Z, marked: !1 })).sort((Z, p) => e.strcmp(Z.address, p.address)), u = e.keyBy(b, "address"), m = (Z, p, Y) => {
- for (let R = 0; R < p; R++) {
- const X = s.encodeAddress(Z.row + R, Y);
- if (!h[X] || !e.isEqual(h[Z.address], h[X])) return !1;
- }
- return !0;
- };
- return b.map((Z) => {
- if (!Z.marked) {
- const p = s.decodeEx(Z.address);
- if (p.dimensions) return u[p.dimensions].marked = !0, { ...Z.dataValidation, sqref: Z.address };
- let Y = 1, R = s.encodeAddress(p.row + Y, p.col);
- for (; h[R] && e.isEqual(Z.dataValidation, h[R]); ) Y++, R = s.encodeAddress(p.row + Y, p.col);
- let X = 1;
- for (; m(p, Y, p.col + X); ) X++;
- for (let H = 0; H < Y; H++) for (let S = 0; S < X; S++) R = s.encodeAddress(p.row + H, p.col + S), u[R].marked = !0;
- if (Y > 1 || X > 1) {
- const H = p.row + (Y - 1), S = p.col + (X - 1);
- return { ...Z.dataValidation, sqref: `${Z.address}:${s.encodeAddress(H, S)}` };
- }
- return { ...Z.dataValidation, sqref: Z.address };
- }
- return null;
- }).filter(Boolean);
- }(c);
- r.length && (o.openNode("dataValidations", { count: r.length }), r.forEach((h) => {
- o.openNode("dataValidation"), h.type !== "any" && (o.addAttribute("type", h.type), h.operator && h.type !== "list" && h.operator !== "between" && o.addAttribute("operator", h.operator), h.allowBlank && o.addAttribute("allowBlank", "1")), h.showInputMessage && o.addAttribute("showInputMessage", "1"), h.promptTitle && o.addAttribute("promptTitle", h.promptTitle), h.prompt && o.addAttribute("prompt", h.prompt), h.showErrorMessage && o.addAttribute("showErrorMessage", "1"), h.errorStyle && o.addAttribute("errorStyle", h.errorStyle), h.errorTitle && o.addAttribute("errorTitle", h.errorTitle), h.error && o.addAttribute("error", h.error), o.addAttribute("sqref", h.sqref), (h.formulae || []).forEach((b, u) => {
- o.openNode("formula" + (u + 1)), h.type === "date" ? o.writeText(A.dateToExcel(new Date(b))) : o.writeText(b), o.closeNode();
- }), o.closeNode();
- }), o.closeNode());
- }
- parseOpen(o) {
- switch (o.name) {
- case "dataValidations":
- return this.model = {}, !0;
- case "dataValidation": {
- this._address = o.attributes.sqref;
- const c = { type: o.attributes.type || "any", formulae: [] };
- switch (o.attributes.type && d(c, o.attributes, "allowBlank"), d(c, o.attributes, "showInputMessage"), d(c, o.attributes, "showErrorMessage"), c.type) {
- case "any":
- case "list":
- case "custom":
- break;
- default:
- a(c, o.attributes, "operator", "between");
- }
- return a(c, o.attributes, "promptTitle"), a(c, o.attributes, "prompt"), a(c, o.attributes, "errorStyle"), a(c, o.attributes, "errorTitle"), a(c, o.attributes, "error"), this._dataValidation = c, !0;
- }
- case "formula1":
- case "formula2":
- return this._formula = [], !0;
- default:
- return !1;
- }
- }
- parseText(o) {
- this._formula && this._formula.push(o);
- }
- parseClose(o) {
- switch (o) {
- case "dataValidations":
- return !1;
- case "dataValidation":
- return this._dataValidation.formulae && this._dataValidation.formulae.length || (delete this._dataValidation.formulae, delete this._dataValidation.operator), (this._address.split(/\s+/g) || []).forEach((c) => {
- c.includes(":") ? new n(c).forEachAddress((r) => {
- this.model[r] = this._dataValidation;
- }) : this.model[c] = this._dataValidation;
- }), !0;
- case "formula1":
- case "formula2": {
- let c = this._formula.join("");
- switch (this._dataValidation.type) {
- case "whole":
- case "textLength":
- c = parseInt(c, 10);
- break;
- case "decimal":
- c = parseFloat(c);
- break;
- case "date":
- c = A.excelToDate(parseFloat(c));
- }
- return this._dataValidation.formulae.push(c), this._formula = void 0, !0;
- }
- default:
- return !0;
- }
- }
- };
- }, { "../../../doc/range": 10, "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/utils": 27, "../base-xform": 32 }], 94: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "dimension";
- }
- render(A, s) {
- s && A.leafNode("dimension", { ref: s });
- }
- parseOpen(A) {
- return A.name === "dimension" && (this.model = A.attributes.ref, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 95: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "drawing";
- }
- render(A, s) {
- s && A.leafNode(this.tag, { "r:id": s.rId });
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.model = { rId: A.attributes["r:id"] }, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 96: [function(g, C, i) {
- const e = g("../composite-xform"), A = g("./cf-ext/conditional-formattings-ext-xform");
- class s extends e {
- constructor() {
- super(), this.map = { "x14:conditionalFormattings": this.conditionalFormattings = new A() };
- }
- get tag() {
- return "ext";
- }
- hasContent(n) {
- return this.conditionalFormattings.hasContent(n.conditionalFormattings);
- }
- prepare(n, a) {
- this.conditionalFormattings.prepare(n.conditionalFormattings, a);
- }
- render(n, a) {
- n.openNode("ext", { uri: "{78C0D931-6437-407d-A8EE-F0AAD7539E65}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }), this.conditionalFormattings.render(n, a.conditionalFormattings), n.closeNode();
- }
- createNewModel() {
- return {};
- }
- onParserClose(n, a) {
- this.model[n] = a.model;
- }
- }
- C.exports = class extends e {
- constructor() {
- super(), this.map = { ext: this.ext = new s() };
- }
- get tag() {
- return "extLst";
- }
- prepare(l, n) {
- this.ext.prepare(l, n);
- }
- hasContent(l) {
- return this.ext.hasContent(l);
- }
- render(l, n) {
- this.hasContent(n) && (l.openNode("extLst"), this.ext.render(l, n), l.closeNode());
- }
- createNewModel() {
- return {};
- }
- onParserClose(l, n) {
- Object.assign(this.model, n.model);
- }
- };
- }, { "../composite-xform": 48, "./cf-ext/conditional-formattings-ext-xform": 78 }], 97: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "headerFooter";
- }
- render(A, s) {
- if (s) {
- A.addRollback();
- let l = !1;
- A.openNode("headerFooter"), s.differentFirst && (A.addAttribute("differentFirst", "1"), l = !0), s.differentOddEven && (A.addAttribute("differentOddEven", "1"), l = !0), s.oddHeader && typeof s.oddHeader == "string" && (A.leafNode("oddHeader", null, s.oddHeader), l = !0), s.oddFooter && typeof s.oddFooter == "string" && (A.leafNode("oddFooter", null, s.oddFooter), l = !0), s.evenHeader && typeof s.evenHeader == "string" && (A.leafNode("evenHeader", null, s.evenHeader), l = !0), s.evenFooter && typeof s.evenFooter == "string" && (A.leafNode("evenFooter", null, s.evenFooter), l = !0), s.firstHeader && typeof s.firstHeader == "string" && (A.leafNode("firstHeader", null, s.firstHeader), l = !0), s.firstFooter && typeof s.firstFooter == "string" && (A.leafNode("firstFooter", null, s.firstFooter), l = !0), l ? (A.closeNode(), A.commit()) : A.rollback();
- }
- }
- parseOpen(A) {
- switch (A.name) {
- case "headerFooter":
- return this.model = {}, A.attributes.differentFirst && (this.model.differentFirst = parseInt(A.attributes.differentFirst, 0) === 1), A.attributes.differentOddEven && (this.model.differentOddEven = parseInt(A.attributes.differentOddEven, 0) === 1), !0;
- case "oddHeader":
- return this.currentNode = "oddHeader", !0;
- case "oddFooter":
- return this.currentNode = "oddFooter", !0;
- case "evenHeader":
- return this.currentNode = "evenHeader", !0;
- case "evenFooter":
- return this.currentNode = "evenFooter", !0;
- case "firstHeader":
- return this.currentNode = "firstHeader", !0;
- case "firstFooter":
- return this.currentNode = "firstFooter", !0;
- default:
- return !1;
- }
- }
- parseText(A) {
- switch (this.currentNode) {
- case "oddHeader":
- this.model.oddHeader = A;
- break;
- case "oddFooter":
- this.model.oddFooter = A;
- break;
- case "evenHeader":
- this.model.evenHeader = A;
- break;
- case "evenFooter":
- this.model.evenFooter = A;
- break;
- case "firstHeader":
- this.model.firstHeader = A;
- break;
- case "firstFooter":
- this.model.firstFooter = A;
- }
- }
- parseClose() {
- switch (this.currentNode) {
- case "oddHeader":
- case "oddFooter":
- case "evenHeader":
- case "evenFooter":
- case "firstHeader":
- case "firstFooter":
- return this.currentNode = void 0, !0;
- default:
- return !1;
- }
- }
- };
- }, { "../base-xform": 32 }], 98: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "hyperlink";
- }
- render(A, s) {
- this.isInternalLink(s) ? A.leafNode("hyperlink", { ref: s.address, "r:id": s.rId, tooltip: s.tooltip, location: s.target }) : A.leafNode("hyperlink", { ref: s.address, "r:id": s.rId, tooltip: s.tooltip });
- }
- parseOpen(A) {
- return A.name === "hyperlink" && (this.model = { address: A.attributes.ref, rId: A.attributes["r:id"], tooltip: A.attributes.tooltip }, A.attributes.location && (this.model.target = A.attributes.location), !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- isInternalLink(A) {
- return A.target && /^[^!]+![a-zA-Z]+[\d]+$/.test(A.target);
- }
- };
- }, { "../base-xform": 32 }], 99: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "mergeCell";
- }
- render(A, s) {
- A.leafNode("mergeCell", { ref: s });
- }
- parseOpen(A) {
- return A.name === "mergeCell" && (this.model = A.attributes.ref, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 100: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../../../doc/range"), s = g("../../../utils/col-cache"), l = g("../../../doc/enums");
- C.exports = class {
- constructor() {
- this.merges = {};
- }
- add(n) {
- if (this.merges[n.master]) this.merges[n.master].expandToAddress(n.address);
- else {
- const a = `${n.master}:${n.address}`;
- this.merges[n.master] = new A(a);
- }
- }
- get mergeCells() {
- return e.map(this.merges, (n) => n.range);
- }
- reconcile(n, a) {
- e.each(n, (d) => {
- const o = s.decode(d);
- for (let c = o.top; c <= o.bottom; c++) {
- const r = a[c - 1];
- for (let h = o.left; h <= o.right; h++) {
- const b = r.cells[h - 1];
- b ? b.type === l.ValueType.Merge && (b.master = o.tl) : r.cells[h] = { type: l.ValueType.Null, address: s.encodeAddress(c, h) };
- }
- }
- });
- }
- getMasterAddress(n) {
- const a = this.hash[n];
- return a && a.tl;
- }
- };
- }, { "../../../doc/enums": 7, "../../../doc/range": 10, "../../../utils/col-cache": 19, "../../../utils/under-dash": 26 }], 101: [function(g, C, i) {
- const e = g("../base-xform"), A = (s) => s !== void 0;
- C.exports = class extends e {
- get tag() {
- return "outlinePr";
- }
- render(s, l) {
- return !(!l || !A(l.summaryBelow) && !A(l.summaryRight)) && (s.leafNode(this.tag, { summaryBelow: A(l.summaryBelow) ? Number(l.summaryBelow) : void 0, summaryRight: A(l.summaryRight) ? Number(l.summaryRight) : void 0 }), !0);
- }
- parseOpen(s) {
- return s.name === this.tag && (this.model = { summaryBelow: A(s.attributes.summaryBelow) ? !!Number(s.attributes.summaryBelow) : void 0, summaryRight: A(s.attributes.summaryRight) ? !!Number(s.attributes.summaryRight) : void 0 }, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 102: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "brk";
- }
- render(A, s) {
- A.leafNode("brk", s);
- }
- parseOpen(A) {
- return A.name === "brk" && (this.model = A.attributes.ref, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 103: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../base-xform");
- C.exports = class extends A {
- get tag() {
- return "pageMargins";
- }
- render(s, l) {
- if (l) {
- const n = { left: l.left, right: l.right, top: l.top, bottom: l.bottom, header: l.header, footer: l.footer };
- e.some(n, (a) => a !== void 0) && s.leafNode(this.tag, n);
- }
- }
- parseOpen(s) {
- switch (s.name) {
- case this.tag:
- return this.model = { left: parseFloat(s.attributes.left || 0.7), right: parseFloat(s.attributes.right || 0.7), top: parseFloat(s.attributes.top || 0.75), bottom: parseFloat(s.attributes.bottom || 0.75), header: parseFloat(s.attributes.header || 0.3), footer: parseFloat(s.attributes.footer || 0.3) }, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 104: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "pageSetUpPr";
- }
- render(A, s) {
- return !(!s || !s.fitToPage) && (A.leafNode(this.tag, { fitToPage: s.fitToPage ? "1" : void 0 }), !0);
- }
- parseOpen(A) {
- return A.name === this.tag && (this.model = { fitToPage: A.attributes.fitToPage === "1" }, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 105: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../base-xform");
- function s(d) {
- return d ? "1" : void 0;
- }
- function l(d) {
- switch (d) {
- case "overThenDown":
- return d;
- default:
- return;
- }
- }
- function n(d) {
- switch (d) {
- case "atEnd":
- case "asDisplyed":
- return d;
- default:
- return;
- }
- }
- function a(d) {
- switch (d) {
- case "dash":
- case "blank":
- case "NA":
- return d;
- default:
- return;
- }
- }
- C.exports = class extends A {
- get tag() {
- return "pageSetup";
- }
- render(d, o) {
- if (o) {
- const c = { paperSize: o.paperSize, orientation: o.orientation, horizontalDpi: o.horizontalDpi, verticalDpi: o.verticalDpi, pageOrder: l(o.pageOrder), blackAndWhite: s(o.blackAndWhite), draft: s(o.draft), cellComments: n(o.cellComments), errors: a(o.errors), scale: o.scale, fitToWidth: o.fitToWidth, fitToHeight: o.fitToHeight, firstPageNumber: o.firstPageNumber, useFirstPageNumber: s(o.firstPageNumber), usePrinterDefaults: s(o.usePrinterDefaults), copies: o.copies };
- e.some(c, (r) => r !== void 0) && d.leafNode(this.tag, c);
- }
- }
- parseOpen(d) {
- switch (d.name) {
- case this.tag:
- return this.model = { paperSize: (o = d.attributes.paperSize, o !== void 0 ? parseInt(o, 10) : void 0), orientation: d.attributes.orientation || "portrait", horizontalDpi: parseInt(d.attributes.horizontalDpi || "4294967295", 10), verticalDpi: parseInt(d.attributes.verticalDpi || "4294967295", 10), pageOrder: d.attributes.pageOrder || "downThenOver", blackAndWhite: d.attributes.blackAndWhite === "1", draft: d.attributes.draft === "1", cellComments: d.attributes.cellComments || "None", errors: d.attributes.errors || "displayed", scale: parseInt(d.attributes.scale || "100", 10), fitToWidth: parseInt(d.attributes.fitToWidth || "1", 10), fitToHeight: parseInt(d.attributes.fitToHeight || "1", 10), firstPageNumber: parseInt(d.attributes.firstPageNumber || "1", 10), useFirstPageNumber: d.attributes.useFirstPageNumber === "1", usePrinterDefaults: d.attributes.usePrinterDefaults === "1", copies: parseInt(d.attributes.copies || "1", 10) }, !0;
- default:
- return !1;
- }
- var o;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 106: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "picture";
- }
- render(A, s) {
- s && A.leafNode(this.tag, { "r:id": s.rId });
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.model = { rId: A.attributes["r:id"] }, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 107: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../base-xform");
- function s(l) {
- return l ? "1" : void 0;
- }
- C.exports = class extends A {
- get tag() {
- return "printOptions";
- }
- render(l, n) {
- if (n) {
- const a = { headings: s(n.showRowColHeaders), gridLines: s(n.showGridLines), horizontalCentered: s(n.horizontalCentered), verticalCentered: s(n.verticalCentered) };
- e.some(a, (d) => d !== void 0) && l.leafNode(this.tag, a);
- }
- }
- parseOpen(l) {
- switch (l.name) {
- case this.tag:
- return this.model = { showRowColHeaders: l.attributes.headings === "1", showGridLines: l.attributes.gridLines === "1", horizontalCentered: l.attributes.horizontalCentered === "1", verticalCentered: l.attributes.verticalCentered === "1" }, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 108: [function(g, C, i) {
- const e = g("./page-breaks-xform"), A = g("../list-xform");
- C.exports = class extends A {
- constructor() {
- super({ tag: "rowBreaks", count: !0, childXform: new e() });
- }
- render(s, l) {
- if (l && l.length) {
- s.openNode(this.tag, this.$), this.count && (s.addAttribute(this.$count, l.length), s.addAttribute("manualBreakCount", l.length));
- const { childXform: n } = this;
- l.forEach((a) => {
- n.render(s, a);
- }), s.closeNode();
- } else this.empty && s.leafNode(this.tag);
- }
- };
- }, { "../list-xform": 71, "./page-breaks-xform": 102 }], 109: [function(g, C, i) {
- const e = g("../base-xform"), A = g("../../../utils/utils"), s = g("./cell-xform");
- C.exports = class extends e {
- constructor(l) {
- super(), this.maxItems = l && l.maxItems, this.map = { c: new s() };
- }
- get tag() {
- return "row";
- }
- prepare(l, n) {
- const a = n.styles.addStyleModel(l.style);
- a && (l.styleId = a);
- const d = this.map.c;
- l.cells.forEach((o) => {
- d.prepare(o, n);
- });
- }
- render(l, n, a) {
- l.openNode("row"), l.addAttribute("r", n.number), n.height && (l.addAttribute("ht", n.height), l.addAttribute("customHeight", "1")), n.hidden && l.addAttribute("hidden", "1"), n.min > 0 && n.max > 0 && n.min <= n.max && l.addAttribute("spans", `${n.min}:${n.max}`), n.styleId && (l.addAttribute("s", n.styleId), l.addAttribute("customFormat", "1")), l.addAttribute("x14ac:dyDescent", "0.25"), n.outlineLevel && l.addAttribute("outlineLevel", n.outlineLevel), n.collapsed && l.addAttribute("collapsed", "1");
- const d = this.map.c;
- n.cells.forEach((o) => {
- d.render(l, o, a);
- }), l.closeNode();
- }
- parseOpen(l) {
- if (this.parser) return this.parser.parseOpen(l), !0;
- if (l.name === "row") {
- this.numRowsSeen += 1;
- const n = l.attributes.spans ? l.attributes.spans.split(":").map((d) => parseInt(d, 10)) : [void 0, void 0], a = this.model = { number: parseInt(l.attributes.r, 10), min: n[0], max: n[1], cells: [] };
- return l.attributes.s && (a.styleId = parseInt(l.attributes.s, 10)), A.parseBoolean(l.attributes.hidden) && (a.hidden = !0), A.parseBoolean(l.attributes.bestFit) && (a.bestFit = !0), l.attributes.ht && (a.height = parseFloat(l.attributes.ht)), l.attributes.outlineLevel && (a.outlineLevel = parseInt(l.attributes.outlineLevel, 10)), A.parseBoolean(l.attributes.collapsed) && (a.collapsed = !0), !0;
- }
- return this.parser = this.map[l.name], !!this.parser && (this.parser.parseOpen(l), !0);
- }
- parseText(l) {
- this.parser && this.parser.parseText(l);
- }
- parseClose(l) {
- if (this.parser) {
- if (!this.parser.parseClose(l)) {
- if (this.model.cells.push(this.parser.model), this.maxItems && this.model.cells.length > this.maxItems) throw new Error(`Max column count (${this.maxItems}) exceeded`);
- this.parser = void 0;
- }
- return !0;
- }
- return !1;
- }
- reconcile(l, n) {
- l.style = l.styleId ? n.styles.getStyleModel(l.styleId) : {}, l.styleId !== void 0 && (l.styleId = void 0);
- const a = this.map.c;
- l.cells.forEach((d) => {
- a.reconcile(d, n);
- });
- }
- };
- }, { "../../../utils/utils": 27, "../base-xform": 32, "./cell-xform": 73 }], 110: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../base-xform");
- C.exports = class extends A {
- get tag() {
- return "sheetFormatPr";
- }
- render(s, l) {
- if (l) {
- const n = { defaultRowHeight: l.defaultRowHeight, outlineLevelRow: l.outlineLevelRow, outlineLevelCol: l.outlineLevelCol, "x14ac:dyDescent": l.dyDescent };
- l.defaultColWidth && (n.defaultColWidth = l.defaultColWidth), l.defaultRowHeight && l.defaultRowHeight === 15 || (n.customHeight = "1"), e.some(n, (a) => a !== void 0) && s.leafNode("sheetFormatPr", n);
- }
- }
- parseOpen(s) {
- return s.name === "sheetFormatPr" && (this.model = { defaultRowHeight: parseFloat(s.attributes.defaultRowHeight || "0"), dyDescent: parseFloat(s.attributes["x14ac:dyDescent"] || "0"), outlineLevelRow: parseInt(s.attributes.outlineLevelRow || "0", 10), outlineLevelCol: parseInt(s.attributes.outlineLevelCol || "0", 10) }, s.attributes.defaultColWidth && (this.model.defaultColWidth = parseFloat(s.attributes.defaultColWidth)), !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 111: [function(g, C, i) {
- const e = g("../base-xform"), A = g("../style/color-xform"), s = g("./page-setup-properties-xform"), l = g("./outline-properties-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { tabColor: new A("tabColor"), pageSetUpPr: new s(), outlinePr: new l() };
- }
- get tag() {
- return "sheetPr";
- }
- render(n, a) {
- if (a) {
- n.addRollback(), n.openNode("sheetPr");
- let d = !1;
- d = this.map.tabColor.render(n, a.tabColor) || d, d = this.map.pageSetUpPr.render(n, a.pageSetup) || d, d = this.map.outlinePr.render(n, a.outlineProperties) || d, d ? (n.closeNode(), n.commit()) : n.rollback();
- }
- }
- parseOpen(n) {
- return this.parser ? (this.parser.parseOpen(n), !0) : n.name === this.tag ? (this.reset(), !0) : !!this.map[n.name] && (this.parser = this.map[n.name], this.parser.parseOpen(n), !0);
- }
- parseText(n) {
- return !!this.parser && (this.parser.parseText(n), !0);
- }
- parseClose(n) {
- return this.parser ? (this.parser.parseClose(n) || (this.parser = void 0), !0) : (this.map.tabColor.model || this.map.pageSetUpPr.model || this.map.outlinePr.model ? (this.model = {}, this.map.tabColor.model && (this.model.tabColor = this.map.tabColor.model), this.map.pageSetUpPr.model && (this.model.pageSetup = this.map.pageSetUpPr.model), this.map.outlinePr.model && (this.model.outlineProperties = this.map.outlinePr.model)) : this.model = null, !1);
- }
- };
- }, { "../base-xform": 32, "../style/color-xform": 128, "./outline-properties-xform": 101, "./page-setup-properties-xform": 104 }], 112: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../base-xform");
- function s(n, a) {
- return n ? a : void 0;
- }
- function l(n, a) {
- return n === a || void 0;
- }
- C.exports = class extends A {
- get tag() {
- return "sheetProtection";
- }
- render(n, a) {
- if (a) {
- const d = { sheet: s(a.sheet, "1"), selectLockedCells: a.selectLockedCells === !1 ? "1" : void 0, selectUnlockedCells: a.selectUnlockedCells === !1 ? "1" : void 0, formatCells: s(a.formatCells, "0"), formatColumns: s(a.formatColumns, "0"), formatRows: s(a.formatRows, "0"), insertColumns: s(a.insertColumns, "0"), insertRows: s(a.insertRows, "0"), insertHyperlinks: s(a.insertHyperlinks, "0"), deleteColumns: s(a.deleteColumns, "0"), deleteRows: s(a.deleteRows, "0"), sort: s(a.sort, "0"), autoFilter: s(a.autoFilter, "0"), pivotTables: s(a.pivotTables, "0") };
- a.sheet && (d.algorithmName = a.algorithmName, d.hashValue = a.hashValue, d.saltValue = a.saltValue, d.spinCount = a.spinCount, d.objects = s(a.objects === !1, "1"), d.scenarios = s(a.scenarios === !1, "1")), e.some(d, (o) => o !== void 0) && n.leafNode(this.tag, d);
- }
- }
- parseOpen(n) {
- switch (n.name) {
- case this.tag:
- return this.model = { sheet: l(n.attributes.sheet, "1"), objects: n.attributes.objects !== "1" && void 0, scenarios: n.attributes.scenarios !== "1" && void 0, selectLockedCells: n.attributes.selectLockedCells !== "1" && void 0, selectUnlockedCells: n.attributes.selectUnlockedCells !== "1" && void 0, formatCells: l(n.attributes.formatCells, "0"), formatColumns: l(n.attributes.formatColumns, "0"), formatRows: l(n.attributes.formatRows, "0"), insertColumns: l(n.attributes.insertColumns, "0"), insertRows: l(n.attributes.insertRows, "0"), insertHyperlinks: l(n.attributes.insertHyperlinks, "0"), deleteColumns: l(n.attributes.deleteColumns, "0"), deleteRows: l(n.attributes.deleteRows, "0"), sort: l(n.attributes.sort, "0"), autoFilter: l(n.attributes.autoFilter, "0"), pivotTables: l(n.attributes.pivotTables, "0") }, n.attributes.algorithmName && (this.model.algorithmName = n.attributes.algorithmName, this.model.hashValue = n.attributes.hashValue, this.model.saltValue = n.attributes.saltValue, this.model.spinCount = parseInt(n.attributes.spinCount, 10)), !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 113: [function(g, C, i) {
- const e = g("../../../utils/col-cache"), A = g("../base-xform"), s = { frozen: "frozen", frozenSplit: "frozen", split: "split" };
- C.exports = class extends A {
- get tag() {
- return "sheetView";
- }
- prepare(l) {
- switch (l.state) {
- case "frozen":
- case "split":
- break;
- default:
- l.state = "normal";
- }
- }
- render(l, n) {
- l.openNode("sheetView", { workbookViewId: n.workbookViewId || 0 });
- const a = function(h, b, u) {
- u && l.addAttribute(h, b);
- };
- let d, o, c, r;
- switch (a("rightToLeft", "1", n.rightToLeft === !0), a("tabSelected", "1", n.tabSelected), a("showRuler", "0", n.showRuler === !1), a("showRowColHeaders", "0", n.showRowColHeaders === !1), a("showGridLines", "0", n.showGridLines === !1), a("zoomScale", n.zoomScale, n.zoomScale), a("zoomScaleNormal", n.zoomScaleNormal, n.zoomScaleNormal), a("view", n.style, n.style), n.state) {
- case "frozen":
- o = n.xSplit || 0, c = n.ySplit || 0, d = n.topLeftCell || e.getAddress(c + 1, o + 1).address, r = (n.xSplit && n.ySplit ? "bottomRight" : n.xSplit && "topRight") || "bottomLeft", l.leafNode("pane", { xSplit: n.xSplit || void 0, ySplit: n.ySplit || void 0, topLeftCell: d, activePane: r, state: "frozen" }), l.leafNode("selection", { pane: r, activeCell: n.activeCell, sqref: n.activeCell });
- break;
- case "split":
- n.activePane === "topLeft" && (n.activePane = void 0), l.leafNode("pane", { xSplit: n.xSplit || void 0, ySplit: n.ySplit || void 0, topLeftCell: n.topLeftCell, activePane: n.activePane }), l.leafNode("selection", { pane: n.activePane, activeCell: n.activeCell, sqref: n.activeCell });
- break;
- case "normal":
- n.activeCell && l.leafNode("selection", { activeCell: n.activeCell, sqref: n.activeCell });
- }
- l.closeNode();
- }
- parseOpen(l) {
- switch (l.name) {
- case "sheetView":
- return this.sheetView = { workbookViewId: parseInt(l.attributes.workbookViewId, 10), rightToLeft: l.attributes.rightToLeft === "1", tabSelected: l.attributes.tabSelected === "1", showRuler: l.attributes.showRuler !== "0", showRowColHeaders: l.attributes.showRowColHeaders !== "0", showGridLines: l.attributes.showGridLines !== "0", zoomScale: parseInt(l.attributes.zoomScale || "100", 10), zoomScaleNormal: parseInt(l.attributes.zoomScaleNormal || "100", 10), style: l.attributes.view }, this.pane = void 0, this.selections = {}, !0;
- case "pane":
- return this.pane = { xSplit: parseInt(l.attributes.xSplit || "0", 10), ySplit: parseInt(l.attributes.ySplit || "0", 10), topLeftCell: l.attributes.topLeftCell, activePane: l.attributes.activePane || "topLeft", state: l.attributes.state }, !0;
- case "selection": {
- const n = l.attributes.pane || "topLeft";
- return this.selections[n] = { pane: n, activeCell: l.attributes.activeCell }, !0;
- }
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose(l) {
- let n, a;
- switch (l) {
- case "sheetView":
- return this.sheetView && this.pane ? (n = this.model = { workbookViewId: this.sheetView.workbookViewId, rightToLeft: this.sheetView.rightToLeft, state: s[this.pane.state] || "split", xSplit: this.pane.xSplit, ySplit: this.pane.ySplit, topLeftCell: this.pane.topLeftCell, showRuler: this.sheetView.showRuler, showRowColHeaders: this.sheetView.showRowColHeaders, showGridLines: this.sheetView.showGridLines, zoomScale: this.sheetView.zoomScale, zoomScaleNormal: this.sheetView.zoomScaleNormal }, this.model.state === "split" && (n.activePane = this.pane.activePane), a = this.selections[this.pane.activePane], a && a.activeCell && (n.activeCell = a.activeCell), this.sheetView.style && (n.style = this.sheetView.style)) : (n = this.model = { workbookViewId: this.sheetView.workbookViewId, rightToLeft: this.sheetView.rightToLeft, state: "normal", showRuler: this.sheetView.showRuler, showRowColHeaders: this.sheetView.showRowColHeaders, showGridLines: this.sheetView.showGridLines, zoomScale: this.sheetView.zoomScale, zoomScaleNormal: this.sheetView.zoomScaleNormal }, a = this.selections.topLeft, a && a.activeCell && (n.activeCell = a.activeCell), this.sheetView.style && (n.style = this.sheetView.style)), !1;
- default:
- return !0;
- }
- }
- reconcile() {
- }
- };
- }, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 114: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "tablePart";
- }
- render(A, s) {
- s && A.leafNode(this.tag, { "r:id": s.rId });
- }
- parseOpen(A) {
- switch (A.name) {
- case this.tag:
- return this.model = { rId: A.attributes["r:id"] }, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 115: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../../../utils/col-cache"), s = g("../../../utils/xml-stream"), l = g("../../rel-type"), n = g("./merges"), a = g("../base-xform"), d = g("../list-xform"), o = g("./row-xform"), c = g("./col-xform"), r = g("./dimension-xform"), h = g("./hyperlink-xform"), b = g("./merge-cell-xform"), u = g("./data-validations-xform"), m = g("./sheet-properties-xform"), Z = g("./sheet-format-properties-xform"), p = g("./sheet-view-xform"), Y = g("./sheet-protection-xform"), R = g("./page-margins-xform"), X = g("./page-setup-xform"), H = g("./print-options-xform"), S = g("./auto-filter-xform"), z = g("./picture-xform"), v = g("./drawing-xform"), K = g("./table-part-xform"), V = g("./row-breaks-xform"), N = g("./header-footer-xform"), B = g("./cf/conditional-formattings-xform"), G = g("./ext-lst-xform"), w = (y, f) => {
- if (!f || !f.length) return y;
- if (!y || !y.length) return f;
- const D = {}, F = {};
- return y.forEach((T) => {
- D[T.ref] = T, T.rules.forEach((Q) => {
- const { x14Id: P } = Q;
- P && (F[P] = Q);
- });
- }), f.forEach((T) => {
- T.rules.forEach((Q) => {
- const P = F[Q.x14Id];
- P ? ((L, E) => {
- Object.keys(E).forEach((J) => {
- const k = L[J], j = E[J];
- k === void 0 && j !== void 0 && (L[J] = j);
- });
- })(P, Q) : D[T.ref] ? D[T.ref].rules.push(Q) : y.push({ ref: T.ref, rules: [Q] });
- });
- }), y;
- };
- class W extends a {
- constructor(f) {
- super();
- const { maxRows: D, maxCols: F, ignoreNodes: T } = f || {};
- this.ignoreNodes = T || [], this.map = { sheetPr: new m(), dimension: new r(), sheetViews: new d({ tag: "sheetViews", count: !1, childXform: new p() }), sheetFormatPr: new Z(), cols: new d({ tag: "cols", count: !1, childXform: new c() }), sheetData: new d({ tag: "sheetData", count: !1, empty: !0, childXform: new o({ maxItems: F }), maxItems: D }), autoFilter: new S(), mergeCells: new d({ tag: "mergeCells", count: !0, childXform: new b() }), rowBreaks: new V(), hyperlinks: new d({ tag: "hyperlinks", count: !1, childXform: new h() }), pageMargins: new R(), dataValidations: new u(), pageSetup: new X(), headerFooter: new N(), printOptions: new H(), picture: new z(), drawing: new v(), sheetProtection: new Y(), tableParts: new d({ tag: "tableParts", count: !0, childXform: new K() }), conditionalFormatting: new B(), extLst: new G() };
- }
- prepare(f, D) {
- D.merges = new n(), f.hyperlinks = D.hyperlinks = [], f.comments = D.comments = [], D.formulae = {}, D.siFormulae = 0, this.map.cols.prepare(f.cols, D), this.map.sheetData.prepare(f.rows, D), this.map.conditionalFormatting.prepare(f.conditionalFormattings, D), f.mergeCells = D.merges.mergeCells;
- const F = f.rels = [];
- function T(L) {
- return "rId" + (L.length + 1);
- }
- if (f.hyperlinks.forEach((L) => {
- const E = T(F);
- L.rId = E, F.push({ Id: E, Type: l.Hyperlink, Target: L.target, TargetMode: "External" });
- }), f.comments.length > 0) {
- const L = { Id: T(F), Type: l.Comments, Target: `../comments${f.id}.xml` };
- F.push(L);
- const E = { Id: T(F), Type: l.VmlDrawing, Target: `../drawings/vmlDrawing${f.id}.vml` };
- F.push(E), f.comments.forEach((J) => {
- J.refAddress = A.decodeAddress(J.ref);
- }), D.commentRefs.push({ commentName: "comments" + f.id, vmlDrawing: "vmlDrawing" + f.id });
- }
- const Q = [];
- let P;
- f.media.forEach((L) => {
- if (L.type === "background") {
- const E = T(F);
- P = D.media[L.imageId], F.push({ Id: E, Type: l.Image, Target: `../media/${P.name}.${P.extension}` }), f.background = { rId: E }, f.image = D.media[L.imageId];
- } else if (L.type === "image") {
- let { drawing: E } = f;
- P = D.media[L.imageId], E || (E = f.drawing = { rId: T(F), name: "drawing" + ++D.drawingsCount, anchors: [], rels: [] }, D.drawings.push(E), F.push({ Id: E.rId, Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing", Target: `../drawings/${E.name}.xml` }));
- let J = this.preImageId === L.imageId ? Q[L.imageId] : Q[E.rels.length];
- J || (J = T(E.rels), Q[E.rels.length] = J, E.rels.push({ Id: J, Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", Target: `../media/${P.name}.${P.extension}` }));
- const k = { picture: { rId: J }, range: L.range };
- if (L.hyperlinks && L.hyperlinks.hyperlink) {
- const j = T(E.rels);
- Q[E.rels.length] = j, k.picture.hyperlinks = { tooltip: L.hyperlinks.tooltip, rId: j }, E.rels.push({ Id: j, Type: l.Hyperlink, Target: L.hyperlinks.hyperlink, TargetMode: "External" });
- }
- this.preImageId = L.imageId, E.anchors.push(k);
- }
- }), f.tables.forEach((L) => {
- const E = T(F);
- L.rId = E, F.push({ Id: E, Type: l.Table, Target: "../tables/" + L.target }), L.columns.forEach((J) => {
- const { style: k } = J;
- k && (J.dxfId = D.styles.addDxfStyle(k));
- });
- }), this.map.extLst.prepare(f, D);
- }
- render(f, D) {
- f.openXml(s.StdDocAttributes), f.openNode("worksheet", W.WORKSHEET_ATTRIBUTES);
- const F = D.properties ? { defaultRowHeight: D.properties.defaultRowHeight, dyDescent: D.properties.dyDescent, outlineLevelCol: D.properties.outlineLevelCol, outlineLevelRow: D.properties.outlineLevelRow } : void 0;
- D.properties && D.properties.defaultColWidth && (F.defaultColWidth = D.properties.defaultColWidth);
- const T = { outlineProperties: D.properties && D.properties.outlineProperties, tabColor: D.properties && D.properties.tabColor, pageSetup: D.pageSetup && D.pageSetup.fitToPage ? { fitToPage: D.pageSetup.fitToPage } : void 0 }, Q = D.pageSetup && D.pageSetup.margins, P = { showRowColHeaders: D.pageSetup && D.pageSetup.showRowColHeaders, showGridLines: D.pageSetup && D.pageSetup.showGridLines, horizontalCentered: D.pageSetup && D.pageSetup.horizontalCentered, verticalCentered: D.pageSetup && D.pageSetup.verticalCentered }, L = D.sheetProtection;
- this.map.sheetPr.render(f, T), this.map.dimension.render(f, D.dimensions), this.map.sheetViews.render(f, D.views), this.map.sheetFormatPr.render(f, F), this.map.cols.render(f, D.cols), this.map.sheetData.render(f, D.rows), this.map.sheetProtection.render(f, L), this.map.autoFilter.render(f, D.autoFilter), this.map.mergeCells.render(f, D.mergeCells), this.map.conditionalFormatting.render(f, D.conditionalFormattings), this.map.dataValidations.render(f, D.dataValidations), this.map.hyperlinks.render(f, D.hyperlinks), this.map.printOptions.render(f, P), this.map.pageMargins.render(f, Q), this.map.pageSetup.render(f, D.pageSetup), this.map.headerFooter.render(f, D.headerFooter), this.map.rowBreaks.render(f, D.rowBreaks), this.map.drawing.render(f, D.drawing), this.map.picture.render(f, D.background), this.map.tableParts.render(f, D.tables), this.map.extLst.render(f, D), D.rels && D.rels.forEach((E) => {
- E.Type === l.VmlDrawing && f.leafNode("legacyDrawing", { "r:id": E.Id });
- }), f.closeNode();
- }
- parseOpen(f) {
- return this.parser ? (this.parser.parseOpen(f), !0) : f.name === "worksheet" ? (e.each(this.map, (D) => {
- D.reset();
- }), !0) : (this.map[f.name] && !this.ignoreNodes.includes(f.name) && (this.parser = this.map[f.name], this.parser.parseOpen(f)), !0);
- }
- parseText(f) {
- this.parser && this.parser.parseText(f);
- }
- parseClose(f) {
- if (this.parser) return this.parser.parseClose(f) || (this.parser = void 0), !0;
- switch (f) {
- case "worksheet": {
- const D = this.map.sheetFormatPr.model || {};
- this.map.sheetPr.model && this.map.sheetPr.model.tabColor && (D.tabColor = this.map.sheetPr.model.tabColor), this.map.sheetPr.model && this.map.sheetPr.model.outlineProperties && (D.outlineProperties = this.map.sheetPr.model.outlineProperties);
- const F = { fitToPage: this.map.sheetPr.model && this.map.sheetPr.model.pageSetup && this.map.sheetPr.model.pageSetup.fitToPage || !1, margins: this.map.pageMargins.model }, T = Object.assign(F, this.map.pageSetup.model, this.map.printOptions.model), Q = w(this.map.conditionalFormatting.model, this.map.extLst.model && this.map.extLst.model["x14:conditionalFormattings"]);
- return this.model = { dimensions: this.map.dimension.model, cols: this.map.cols.model, rows: this.map.sheetData.model, mergeCells: this.map.mergeCells.model, hyperlinks: this.map.hyperlinks.model, dataValidations: this.map.dataValidations.model, properties: D, views: this.map.sheetViews.model, pageSetup: T, headerFooter: this.map.headerFooter.model, background: this.map.picture.model, drawing: this.map.drawing.model, tables: this.map.tableParts.model, conditionalFormattings: Q }, this.map.autoFilter.model && (this.model.autoFilter = this.map.autoFilter.model), this.map.sheetProtection.model && (this.model.sheetProtection = this.map.sheetProtection.model), !1;
- }
- default:
- return !0;
- }
- }
- reconcile(f, D) {
- const F = (f.relationships || []).reduce((Q, P) => {
- if (Q[P.Id] = P, P.Type === l.Comments && (f.comments = D.comments[P.Target].comments), P.Type === l.VmlDrawing && f.comments && f.comments.length) {
- const L = D.vmlDrawings[P.Target].comments;
- f.comments.forEach((E, J) => {
- E.note = Object.assign({}, E.note, L[J]);
- });
- }
- return Q;
- }, {});
- if (D.commentsMap = (f.comments || []).reduce((Q, P) => (P.ref && (Q[P.ref] = P), Q), {}), D.hyperlinkMap = (f.hyperlinks || []).reduce((Q, P) => (P.rId && (Q[P.address] = F[P.rId].Target), Q), {}), D.formulae = {}, f.rows = f.rows && f.rows.filter(Boolean) || [], f.rows.forEach((Q) => {
- Q.cells = Q.cells && Q.cells.filter(Boolean) || [];
- }), this.map.cols.reconcile(f.cols, D), this.map.sheetData.reconcile(f.rows, D), this.map.conditionalFormatting.reconcile(f.conditionalFormattings, D), f.media = [], f.drawing) {
- const Q = F[f.drawing.rId].Target.match(/\/drawings\/([a-zA-Z0-9]+)[.][a-zA-Z]{3,4}$/);
- if (Q) {
- const P = Q[1];
- D.drawings[P].anchors.forEach((L) => {
- if (L.medium) {
- const E = { type: "image", imageId: L.medium.index, range: L.range, hyperlinks: L.picture.hyperlinks };
- f.media.push(E);
- }
- });
- }
- }
- const T = f.background && F[f.background.rId];
- if (T) {
- const Q = T.Target.split("/media/")[1], P = D.mediaIndex && D.mediaIndex[Q];
- P !== void 0 && f.media.push({ type: "background", imageId: P });
- }
- f.tables = (f.tables || []).map((Q) => {
- const P = F[Q.rId];
- return D.tables[P.Target];
- }), delete f.relationships, delete f.hyperlinks, delete f.comments;
- }
- }
- W.WORKSHEET_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x14ac", "xmlns:x14ac": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" }, C.exports = W;
- }, { "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/xml-stream": 28, "../../rel-type": 31, "../base-xform": 32, "../list-xform": 71, "./auto-filter-xform": 72, "./cf/conditional-formattings-xform": 87, "./col-xform": 92, "./data-validations-xform": 93, "./dimension-xform": 94, "./drawing-xform": 95, "./ext-lst-xform": 96, "./header-footer-xform": 97, "./hyperlink-xform": 98, "./merge-cell-xform": 99, "./merges": 100, "./page-margins-xform": 103, "./page-setup-xform": 105, "./picture-xform": 106, "./print-options-xform": 107, "./row-breaks-xform": 108, "./row-xform": 109, "./sheet-format-properties-xform": 110, "./sheet-properties-xform": 111, "./sheet-protection-xform": 112, "./sheet-view-xform": 113, "./table-part-xform": 114 }], 116: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this.tag = A.tag, this.attr = A.attr;
- }
- render(A, s) {
- s && (A.openNode(this.tag), A.closeNode());
- }
- parseOpen(A) {
- A.name === this.tag && (this.model = !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 117: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs, this._format = A.format || function(s) {
- try {
- return Number.isNaN(s.getTime()) ? "" : s.toISOString();
- } catch {
- return "";
- }
- }, this._parse = A.parse || function(s) {
- return new Date(s);
- };
- }
- render(A, s) {
- s && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, this._format(s)) : A.writeText(this._format(s)), A.closeNode());
- }
- parseOpen(A) {
- A.name === this.tag && (this.attr ? this.model = this._parse(A.attributes[this.attr]) : this.text = []);
- }
- parseText(A) {
- this.attr || this.text.push(A);
- }
- parseClose() {
- return this.attr || (this.model = this._parse(this.text.join(""))), !1;
- }
- };
- }, { "../base-xform": 32 }], 118: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs, this.zero = A.zero;
- }
- render(A, s) {
- (s || this.zero) && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, s) : A.writeText(s), A.closeNode());
- }
- parseOpen(A) {
- return A.name === this.tag && (this.attr ? this.model = parseInt(A.attributes[this.attr], 10) : this.text = [], !0);
- }
- parseText(A) {
- this.attr || this.text.push(A);
- }
- parseClose() {
- return this.attr || (this.model = parseInt(this.text.join("") || 0, 10)), !1;
- }
- };
- }, { "../base-xform": 32 }], 119: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs;
- }
- render(A, s) {
- s !== void 0 && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, s) : A.writeText(s), A.closeNode());
- }
- parseOpen(A) {
- A.name === this.tag && (this.attr ? this.model = A.attributes[this.attr] : this.text = []);
- }
- parseText(A) {
- this.attr || this.text.push(A);
- }
- parseClose() {
- return this.attr || (this.model = this.text.join("")), !1;
- }
- };
- }, { "../base-xform": 32 }], 120: [function(g, C, i) {
- const e = g("./base-xform"), A = g("../../utils/xml-stream");
- C.exports = class extends e {
- constructor(s) {
- super(), this._model = s;
- }
- render(s) {
- if (!this._xml) {
- const l = new A();
- (function n(a, d) {
- a.openNode(d.tag, d.$), d.c && d.c.forEach((o) => {
- n(a, o);
- }), d.t && a.writeText(d.t), a.closeNode();
- })(l, this._model), this._xml = l.xml;
- }
- s.writeXml(this._xml);
- }
- parseOpen() {
- return !0;
- }
- parseText() {
- }
- parseClose(s) {
- switch (s) {
- case this._model.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../../utils/xml-stream": 28, "./base-xform": 32 }], 121: [function(g, C, i) {
- const e = g("./text-xform"), A = g("./rich-text-xform"), s = g("../base-xform");
- C.exports = class extends s {
- constructor() {
- super(), this.map = { r: new A(), t: new e() };
- }
- get tag() {
- return "rPh";
- }
- render(l, n) {
- if (l.openNode(this.tag, { sb: n.sb || 0, eb: n.eb || 0 }), n && n.hasOwnProperty("richText") && n.richText) {
- const { r: a } = this.map;
- n.richText.forEach((d) => {
- a.render(l, d);
- });
- } else n && this.map.t.render(l, n.text);
- l.closeNode();
- }
- parseOpen(l) {
- const { name: n } = l;
- return this.parser ? (this.parser.parseOpen(l), !0) : n === this.tag ? (this.model = { sb: parseInt(l.attributes.sb, 10), eb: parseInt(l.attributes.eb, 10) }, !0) : (this.parser = this.map[n], !!this.parser && (this.parser.parseOpen(l), !0));
- }
- parseText(l) {
- this.parser && this.parser.parseText(l);
- }
- parseClose(l) {
- if (this.parser) {
- if (!this.parser.parseClose(l)) {
- switch (l) {
- case "r": {
- let n = this.model.richText;
- n || (n = this.model.richText = []), n.push(this.parser.model);
- break;
- }
- case "t":
- this.model.text = this.parser.model;
- }
- this.parser = void 0;
- }
- return !0;
- }
- switch (l) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "./rich-text-xform": 122, "./text-xform": 125 }], 122: [function(g, C, i) {
- const e = g("./text-xform"), A = g("../style/font-xform"), s = g("../base-xform");
- class l extends s {
- constructor(a) {
- super(), this.model = a;
- }
- get tag() {
- return "r";
- }
- get textXform() {
- return this._textXform || (this._textXform = new e());
- }
- get fontXform() {
- return this._fontXform || (this._fontXform = new A(l.FONT_OPTIONS));
- }
- render(a, d) {
- d = d || this.model, a.openNode("r"), d.font && this.fontXform.render(a, d.font), this.textXform.render(a, d.text), a.closeNode();
- }
- parseOpen(a) {
- if (this.parser) return this.parser.parseOpen(a), !0;
- switch (a.name) {
- case "r":
- return this.model = {}, !0;
- case "t":
- return this.parser = this.textXform, this.parser.parseOpen(a), !0;
- case "rPr":
- return this.parser = this.fontXform, this.parser.parseOpen(a), !0;
- default:
- return !1;
- }
- }
- parseText(a) {
- this.parser && this.parser.parseText(a);
- }
- parseClose(a) {
- switch (a) {
- case "r":
- return !1;
- case "t":
- return this.model.text = this.parser.model, this.parser = void 0, !0;
- case "rPr":
- return this.model.font = this.parser.model, this.parser = void 0, !0;
- default:
- return this.parser && this.parser.parseClose(a), !0;
- }
- }
- }
- l.FONT_OPTIONS = { tagName: "rPr", fontNameTag: "rFont" }, C.exports = l;
- }, { "../base-xform": 32, "../style/font-xform": 131, "./text-xform": 125 }], 123: [function(g, C, i) {
- const e = g("./text-xform"), A = g("./rich-text-xform"), s = g("./phonetic-text-xform"), l = g("../base-xform");
- C.exports = class extends l {
- constructor(n) {
- super(), this.model = n, this.map = { r: new A(), t: new e(), rPh: new s() };
- }
- get tag() {
- return "si";
- }
- render(n, a) {
- n.openNode(this.tag), a && a.hasOwnProperty("richText") && a.richText ? a.richText.length ? a.richText.forEach((d) => {
- this.map.r.render(n, d);
- }) : this.map.t.render(n, "") : a != null && this.map.t.render(n, a), n.closeNode();
- }
- parseOpen(n) {
- const { name: a } = n;
- return this.parser ? (this.parser.parseOpen(n), !0) : a === this.tag ? (this.model = {}, !0) : (this.parser = this.map[a], !!this.parser && (this.parser.parseOpen(n), !0));
- }
- parseText(n) {
- this.parser && this.parser.parseText(n);
- }
- parseClose(n) {
- if (this.parser) {
- if (!this.parser.parseClose(n)) {
- switch (n) {
- case "r": {
- let a = this.model.richText;
- a || (a = this.model.richText = []), a.push(this.parser.model);
- break;
- }
- case "t":
- this.model = this.parser.model;
- }
- this.parser = void 0;
- }
- return !0;
- }
- switch (n) {
- case this.tag:
- return !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "./phonetic-text-xform": 121, "./rich-text-xform": 122, "./text-xform": 125 }], 124: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./shared-string-xform");
- C.exports = class extends A {
- constructor(l) {
- super(), this.model = l || { values: [], count: 0 }, this.hash = /* @__PURE__ */ Object.create(null), this.rich = /* @__PURE__ */ Object.create(null);
- }
- get sharedStringXform() {
- return this._sharedStringXform || (this._sharedStringXform = new s());
- }
- get values() {
- return this.model.values;
- }
- get uniqueCount() {
- return this.model.values.length;
- }
- get count() {
- return this.model.count;
- }
- getString(l) {
- return this.model.values[l];
- }
- add(l) {
- return l.richText ? this.addRichText(l) : this.addText(l);
- }
- addText(l) {
- let n = this.hash[l];
- return n === void 0 && (n = this.hash[l] = this.model.values.length, this.model.values.push(l)), this.model.count++, n;
- }
- addRichText(l) {
- const n = this.sharedStringXform.toXml(l);
- let a = this.rich[n];
- return a === void 0 && (a = this.rich[n] = this.model.values.length, this.model.values.push(l)), this.model.count++, a;
- }
- render(l, n) {
- n = n || this._values, l.openXml(e.StdDocAttributes), l.openNode("sst", { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", count: n.count, uniqueCount: n.values.length });
- const a = this.sharedStringXform;
- n.values.forEach((d) => {
- a.render(l, d);
- }), l.closeNode();
- }
- parseOpen(l) {
- if (this.parser) return this.parser.parseOpen(l), !0;
- switch (l.name) {
- case "sst":
- return !0;
- case "si":
- return this.parser = this.sharedStringXform, this.parser.parseOpen(l), !0;
- default:
- throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(l));
- }
- }
- parseText(l) {
- this.parser && this.parser.parseText(l);
- }
- parseClose(l) {
- if (this.parser) return this.parser.parseClose(l) || (this.model.values.push(this.parser.model), this.model.count++, this.parser = void 0), !0;
- switch (l) {
- case "sst":
- return !1;
- default:
- throw new Error("Unexpected xml node in parseClose: " + l);
- }
- }
- };
- }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./shared-string-xform": 123 }], 125: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "t";
- }
- render(A, s) {
- A.openNode("t"), /^\s|\n|\s$/.test(s) && A.addAttribute("xml:space", "preserve"), A.writeText(s), A.closeNode();
- }
- get model() {
- return this._text.join("").replace(/_x([0-9A-F]{4})_/g, (A, s) => String.fromCharCode(parseInt(s, 16)));
- }
- parseOpen(A) {
- switch (A.name) {
- case "t":
- return this._text = [], !0;
- default:
- return !1;
- }
- }
- parseText(A) {
- this._text.push(A);
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 126: [function(g, C, i) {
- const e = g("../../../doc/enums"), A = g("../../../utils/utils"), s = g("../base-xform"), l = { horizontalValues: ["left", "center", "right", "fill", "centerContinuous", "distributed", "justify"].reduce((a, d) => (a[d] = !0, a), {}), horizontal(a) {
- return this.horizontalValues[a] ? a : void 0;
- }, verticalValues: ["top", "middle", "bottom", "distributed", "justify"].reduce((a, d) => (a[d] = !0, a), {}), vertical(a) {
- return a === "middle" ? "center" : this.verticalValues[a] ? a : void 0;
- }, wrapText: (a) => !!a || void 0, shrinkToFit: (a) => !!a || void 0, textRotation(a) {
- switch (a) {
- case "vertical":
- return a;
- default:
- return (a = A.validInt(a)) >= -90 && a <= 90 ? a : void 0;
- }
- }, indent: (a) => (a = A.validInt(a), Math.max(0, a)), readingOrder(a) {
- switch (a) {
- case "ltr":
- return e.ReadingOrder.LeftToRight;
- case "rtl":
- return e.ReadingOrder.RightToLeft;
- default:
- return;
- }
- } }, n = { toXml(a) {
- if (a = l.textRotation(a)) {
- if (a === "vertical") return 255;
- const d = Math.round(a);
- if (d >= 0 && d <= 90) return d;
- if (d < 0 && d >= -90) return 90 - d;
- }
- }, toModel(a) {
- const d = A.validInt(a);
- if (d !== void 0) {
- if (d === 255) return "vertical";
- if (d >= 0 && d <= 90) return d;
- if (d > 90 && d <= 180) return 90 - d;
- }
- } };
- C.exports = class extends s {
- get tag() {
- return "alignment";
- }
- render(a, d) {
- a.addRollback(), a.openNode("alignment");
- let o = !1;
- function c(r, h) {
- h && (a.addAttribute(r, h), o = !0);
- }
- c("horizontal", l.horizontal(d.horizontal)), c("vertical", l.vertical(d.vertical)), c("wrapText", !!l.wrapText(d.wrapText) && "1"), c("shrinkToFit", !!l.shrinkToFit(d.shrinkToFit) && "1"), c("indent", l.indent(d.indent)), c("textRotation", n.toXml(d.textRotation)), c("readingOrder", l.readingOrder(d.readingOrder)), a.closeNode(), o ? a.commit() : a.rollback();
- }
- parseOpen(a) {
- const d = {};
- let o = !1;
- function c(r, h, b) {
- r && (d[h] = b, o = !0);
- }
- c(a.attributes.horizontal, "horizontal", a.attributes.horizontal), c(a.attributes.vertical, "vertical", a.attributes.vertical === "center" ? "middle" : a.attributes.vertical), c(a.attributes.wrapText, "wrapText", A.parseBoolean(a.attributes.wrapText)), c(a.attributes.shrinkToFit, "shrinkToFit", A.parseBoolean(a.attributes.shrinkToFit)), c(a.attributes.indent, "indent", parseInt(a.attributes.indent, 10)), c(a.attributes.textRotation, "textRotation", n.toModel(a.attributes.textRotation)), c(a.attributes.readingOrder, "readingOrder", a.attributes.readingOrder === "2" ? "rtl" : "ltr"), this.model = o ? d : null;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../../../doc/enums": 7, "../../../utils/utils": 27, "../base-xform": 32 }], 127: [function(g, C, i) {
- const e = g("../base-xform"), A = g("../../../utils/utils"), s = g("./color-xform");
- class l extends e {
- constructor(a) {
- super(), this.name = a, this.map = { color: new s() };
- }
- get tag() {
- return this.name;
- }
- render(a, d, o) {
- const c = d && d.color || o || this.defaultColor;
- a.openNode(this.name), d && d.style && (a.addAttribute("style", d.style), c && this.map.color.render(a, c)), a.closeNode();
- }
- parseOpen(a) {
- if (this.parser) return this.parser.parseOpen(a), !0;
- switch (a.name) {
- case this.name: {
- const { style: d } = a.attributes;
- return this.model = d ? { style: d } : void 0, !0;
- }
- case "color":
- return this.parser = this.map.color, this.parser.parseOpen(a), !0;
- default:
- return !1;
- }
- }
- parseText(a) {
- this.parser && this.parser.parseText(a);
- }
- parseClose(a) {
- return this.parser ? (this.parser.parseClose(a) || (this.parser = void 0), !0) : (a === this.name && this.map.color.model && (this.model || (this.model = {}), this.model.color = this.map.color.model), !1);
- }
- validStyle(a) {
- return l.validStyleValues[a];
- }
- }
- l.validStyleValues = ["thin", "dashed", "dotted", "dashDot", "hair", "dashDotDot", "slantDashDot", "mediumDashed", "mediumDashDotDot", "mediumDashDot", "medium", "double", "thick"].reduce((n, a) => (n[a] = !0, n), {}), C.exports = class extends e {
- constructor() {
- super(), this.map = { top: new l("top"), left: new l("left"), bottom: new l("bottom"), right: new l("right"), diagonal: new l("diagonal") };
- }
- render(n, a) {
- const { color: d } = a;
- function o(c, r) {
- c && !c.color && a.color && (c = { ...c, color: a.color }), r.render(n, c, d);
- }
- n.openNode("border"), a.diagonal && a.diagonal.style && (a.diagonal.up && n.addAttribute("diagonalUp", "1"), a.diagonal.down && n.addAttribute("diagonalDown", "1")), o(a.left, this.map.left), o(a.right, this.map.right), o(a.top, this.map.top), o(a.bottom, this.map.bottom), o(a.diagonal, this.map.diagonal), n.closeNode();
- }
- parseOpen(n) {
- if (this.parser) return this.parser.parseOpen(n), !0;
- switch (n.name) {
- case "border":
- return this.reset(), this.diagonalUp = A.parseBoolean(n.attributes.diagonalUp), this.diagonalDown = A.parseBoolean(n.attributes.diagonalDown), !0;
- default:
- return this.parser = this.map[n.name], !!this.parser && (this.parser.parseOpen(n), !0);
- }
- }
- parseText(n) {
- this.parser && this.parser.parseText(n);
- }
- parseClose(n) {
- if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
- if (n === "border") {
- const a = this.model = {}, d = function(o, c, r) {
- c && (r && Object.assign(c, r), a[o] = c);
- };
- d("left", this.map.left.model), d("right", this.map.right.model), d("top", this.map.top.model), d("bottom", this.map.bottom.model), d("diagonal", this.map.diagonal.model, { up: this.diagonalUp, down: this.diagonalDown });
- }
- return !1;
- }
- };
- }, { "../../../utils/utils": 27, "../base-xform": 32, "./color-xform": 128 }], 128: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- constructor(A) {
- super(), this.name = A || "color";
- }
- get tag() {
- return this.name;
- }
- render(A, s) {
- return !!s && (A.openNode(this.name), s.argb ? A.addAttribute("rgb", s.argb) : s.theme !== void 0 ? (A.addAttribute("theme", s.theme), s.tint !== void 0 && A.addAttribute("tint", s.tint)) : s.indexed !== void 0 ? A.addAttribute("indexed", s.indexed) : A.addAttribute("auto", "1"), A.closeNode(), !0);
- }
- parseOpen(A) {
- return A.name === this.name && (A.attributes.rgb ? this.model = { argb: A.attributes.rgb } : A.attributes.theme ? (this.model = { theme: parseInt(A.attributes.theme, 10) }, A.attributes.tint && (this.model.tint = parseFloat(A.attributes.tint))) : A.attributes.indexed ? this.model = { indexed: parseInt(A.attributes.indexed, 10) } : this.model = void 0, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 129: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./alignment-xform"), s = g("./border-xform"), l = g("./fill-xform"), n = g("./font-xform"), a = g("./numfmt-xform"), d = g("./protection-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { alignment: new A(), border: new s(), fill: new l(), font: new n(), numFmt: new a(), protection: new d() };
- }
- get tag() {
- return "dxf";
- }
- render(o, c) {
- if (o.openNode(this.tag), c.font && this.map.font.render(o, c.font), c.numFmt && c.numFmtId) {
- const r = { id: c.numFmtId, formatCode: c.numFmt };
- this.map.numFmt.render(o, r);
- }
- c.fill && this.map.fill.render(o, c.fill), c.alignment && this.map.alignment.render(o, c.alignment), c.border && this.map.border.render(o, c.border), c.protection && this.map.protection.render(o, c.protection), o.closeNode();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case this.tag:
- return this.reset(), !0;
- default:
- return this.parser = this.map[o.name], this.parser && this.parser.parseOpen(o), !0;
- }
- }
- parseText(o) {
- this.parser && this.parser.parseText(o);
- }
- parseClose(o) {
- return this.parser ? (this.parser.parseClose(o) || (this.parser = void 0), !0) : o !== this.tag || (this.model = { alignment: this.map.alignment.model, border: this.map.border.model, fill: this.map.fill.model, font: this.map.font.model, numFmt: this.map.numFmt.model, protection: this.map.protection.model }, !1);
- }
- };
- }, { "../base-xform": 32, "./alignment-xform": 126, "./border-xform": 127, "./fill-xform": 130, "./font-xform": 131, "./numfmt-xform": 132, "./protection-xform": 133 }], 130: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./color-xform");
- class s extends e {
- constructor() {
- super(), this.map = { color: new A() };
- }
- get tag() {
- return "stop";
- }
- render(o, c) {
- o.openNode("stop"), o.addAttribute("position", c.position), this.map.color.render(o, c.color), o.closeNode();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case "stop":
- return this.model = { position: parseFloat(o.attributes.position) }, !0;
- case "color":
- return this.parser = this.map.color, this.parser.parseOpen(o), !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose(o) {
- return !!this.parser && (this.parser.parseClose(o) || (this.model.color = this.parser.model, this.parser = void 0), !0);
- }
- }
- class l extends e {
- constructor() {
- super(), this.map = { fgColor: new A("fgColor"), bgColor: new A("bgColor") };
- }
- get name() {
- return "pattern";
- }
- get tag() {
- return "patternFill";
- }
- render(o, c) {
- o.openNode("patternFill"), o.addAttribute("patternType", c.pattern), c.fgColor && this.map.fgColor.render(o, c.fgColor), c.bgColor && this.map.bgColor.render(o, c.bgColor), o.closeNode();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case "patternFill":
- return this.model = { type: "pattern", pattern: o.attributes.patternType }, !0;
- default:
- return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
- }
- }
- parseText(o) {
- this.parser && this.parser.parseText(o);
- }
- parseClose(o) {
- return !!this.parser && (this.parser.parseClose(o) || (this.parser.model && (this.model[o] = this.parser.model), this.parser = void 0), !0);
- }
- }
- class n extends e {
- constructor() {
- super(), this.map = { stop: new s() };
- }
- get name() {
- return "gradient";
- }
- get tag() {
- return "gradientFill";
- }
- render(o, c) {
- switch (o.openNode("gradientFill"), c.gradient) {
- case "angle":
- o.addAttribute("degree", c.degree);
- break;
- case "path":
- o.addAttribute("type", "path"), c.center.left && (o.addAttribute("left", c.center.left), c.center.right === void 0 && o.addAttribute("right", c.center.left)), c.center.right && o.addAttribute("right", c.center.right), c.center.top && (o.addAttribute("top", c.center.top), c.center.bottom === void 0 && o.addAttribute("bottom", c.center.top)), c.center.bottom && o.addAttribute("bottom", c.center.bottom);
- }
- const r = this.map.stop;
- c.stops.forEach((h) => {
- r.render(o, h);
- }), o.closeNode();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case "gradientFill": {
- const c = this.model = { stops: [] };
- return o.attributes.degree ? (c.gradient = "angle", c.degree = parseInt(o.attributes.degree, 10)) : o.attributes.type === "path" && (c.gradient = "path", c.center = { left: o.attributes.left ? parseFloat(o.attributes.left) : 0, top: o.attributes.top ? parseFloat(o.attributes.top) : 0 }, o.attributes.right !== o.attributes.left && (c.center.right = o.attributes.right ? parseFloat(o.attributes.right) : 0), o.attributes.bottom !== o.attributes.top && (c.center.bottom = o.attributes.bottom ? parseFloat(o.attributes.bottom) : 0)), !0;
- }
- case "stop":
- return this.parser = this.map.stop, this.parser.parseOpen(o), !0;
- default:
- return !1;
- }
- }
- parseText(o) {
- this.parser && this.parser.parseText(o);
- }
- parseClose(o) {
- return !!this.parser && (this.parser.parseClose(o) || (this.model.stops.push(this.parser.model), this.parser = void 0), !0);
- }
- }
- class a extends e {
- constructor() {
- super(), this.map = { patternFill: new l(), gradientFill: new n() };
- }
- get tag() {
- return "fill";
- }
- render(o, c) {
- switch (o.addRollback(), o.openNode("fill"), c.type) {
- case "pattern":
- this.map.patternFill.render(o, c);
- break;
- case "gradient":
- this.map.gradientFill.render(o, c);
- break;
- default:
- return void o.rollback();
- }
- o.closeNode(), o.commit();
- }
- parseOpen(o) {
- if (this.parser) return this.parser.parseOpen(o), !0;
- switch (o.name) {
- case "fill":
- return this.model = {}, !0;
- default:
- return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
- }
- }
- parseText(o) {
- this.parser && this.parser.parseText(o);
- }
- parseClose(o) {
- return !!this.parser && (this.parser.parseClose(o) || (this.model = this.parser.model, this.model.type = this.parser.name, this.parser = void 0), !0);
- }
- validStyle(o) {
- return a.validPatternValues[o];
- }
- }
- a.validPatternValues = ["none", "solid", "darkVertical", "darkGray", "mediumGray", "lightGray", "gray125", "gray0625", "darkHorizontal", "darkVertical", "darkDown", "darkUp", "darkGrid", "darkTrellis", "lightHorizontal", "lightVertical", "lightDown", "lightUp", "lightGrid", "lightTrellis", "lightGrid"].reduce((d, o) => (d[o] = !0, d), {}), a.StopXform = s, a.PatternFillXform = l, a.GradientFillXform = n, C.exports = a;
- }, { "../base-xform": 32, "./color-xform": 128 }], 131: [function(g, C, i) {
- const e = g("./color-xform"), A = g("../simple/boolean-xform"), s = g("../simple/integer-xform"), l = g("../simple/string-xform"), n = g("./underline-xform"), a = g("../../../utils/under-dash"), d = g("../base-xform");
- class o extends d {
- constructor(r) {
- super(), this.options = r || o.OPTIONS, this.map = { b: { prop: "bold", xform: new A({ tag: "b", attr: "val" }) }, i: { prop: "italic", xform: new A({ tag: "i", attr: "val" }) }, u: { prop: "underline", xform: new n() }, charset: { prop: "charset", xform: new s({ tag: "charset", attr: "val" }) }, color: { prop: "color", xform: new e() }, condense: { prop: "condense", xform: new A({ tag: "condense", attr: "val" }) }, extend: { prop: "extend", xform: new A({ tag: "extend", attr: "val" }) }, family: { prop: "family", xform: new s({ tag: "family", attr: "val" }) }, outline: { prop: "outline", xform: new A({ tag: "outline", attr: "val" }) }, vertAlign: { prop: "vertAlign", xform: new l({ tag: "vertAlign", attr: "val" }) }, scheme: { prop: "scheme", xform: new l({ tag: "scheme", attr: "val" }) }, shadow: { prop: "shadow", xform: new A({ tag: "shadow", attr: "val" }) }, strike: { prop: "strike", xform: new A({ tag: "strike", attr: "val" }) }, sz: { prop: "size", xform: new s({ tag: "sz", attr: "val" }) } }, this.map[this.options.fontNameTag] = { prop: "name", xform: new l({ tag: this.options.fontNameTag, attr: "val" }) };
- }
- get tag() {
- return this.options.tagName;
- }
- render(r, h) {
- const { map: b } = this;
- r.openNode(this.options.tagName), a.each(this.map, (u, m) => {
- b[m].xform.render(r, h[u.prop]);
- }), r.closeNode();
- }
- parseOpen(r) {
- if (this.parser) return this.parser.parseOpen(r), !0;
- if (this.map[r.name]) return this.parser = this.map[r.name].xform, this.parser.parseOpen(r);
- switch (r.name) {
- case this.options.tagName:
- return this.model = {}, !0;
- default:
- return !1;
- }
- }
- parseText(r) {
- this.parser && this.parser.parseText(r);
- }
- parseClose(r) {
- if (this.parser && !this.parser.parseClose(r)) {
- const h = this.map[r];
- return this.parser.model && (this.model[h.prop] = this.parser.model), this.parser = void 0, !0;
- }
- switch (r) {
- case this.options.tagName:
- return !1;
- default:
- return !0;
- }
- }
- }
- o.OPTIONS = { tagName: "font", fontNameTag: "name" }, C.exports = o;
- }, { "../../../utils/under-dash": 26, "../base-xform": 32, "../simple/boolean-xform": 116, "../simple/integer-xform": 118, "../simple/string-xform": 119, "./color-xform": 128, "./underline-xform": 136 }], 132: [function(g, C, i) {
- const e = g("../../../utils/under-dash"), A = g("../../defaultnumformats"), s = g("../base-xform"), l = function() {
- const a = {};
- return e.each(A, (d, o) => {
- d.f && (a[d.f] = parseInt(o, 10));
- }), a;
- }();
- class n extends s {
- constructor(d, o) {
- super(), this.id = d, this.formatCode = o;
- }
- get tag() {
- return "numFmt";
- }
- render(d, o) {
- d.leafNode("numFmt", { numFmtId: o.id, formatCode: o.formatCode });
- }
- parseOpen(d) {
- switch (d.name) {
- case "numFmt":
- return this.model = { id: parseInt(d.attributes.numFmtId, 10), formatCode: d.attributes.formatCode.replace(/[\\](.)/g, "$1") }, !0;
- default:
- return !1;
- }
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- }
- n.getDefaultFmtId = function(a) {
- return l[a];
- }, n.getDefaultFmtCode = function(a) {
- return A[a] && A[a].f;
- }, C.exports = n;
- }, { "../../../utils/under-dash": 26, "../../defaultnumformats": 30, "../base-xform": 32 }], 133: [function(g, C, i) {
- const e = g("../base-xform"), A = { boolean: (s, l) => s === void 0 ? l : s };
- C.exports = class extends e {
- get tag() {
- return "protection";
- }
- render(s, l) {
- s.addRollback(), s.openNode("protection");
- let n = !1;
- function a(d, o) {
- o !== void 0 && (s.addAttribute(d, o), n = !0);
- }
- a("locked", A.boolean(l.locked, !0) ? void 0 : "0"), a("hidden", A.boolean(l.hidden, !1) ? "1" : void 0), s.closeNode(), n ? s.commit() : s.rollback();
- }
- parseOpen(s) {
- const l = { locked: s.attributes.locked !== "0", hidden: s.attributes.hidden === "1" }, n = !l.locked || l.hidden;
- this.model = n ? l : null;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 134: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./alignment-xform"), s = g("./protection-xform");
- C.exports = class extends e {
- constructor(l) {
- super(), this.xfId = !(!l || !l.xfId), this.map = { alignment: new A(), protection: new s() };
- }
- get tag() {
- return "xf";
- }
- render(l, n) {
- l.openNode("xf", { numFmtId: n.numFmtId || 0, fontId: n.fontId || 0, fillId: n.fillId || 0, borderId: n.borderId || 0 }), this.xfId && l.addAttribute("xfId", n.xfId || 0), n.numFmtId && l.addAttribute("applyNumberFormat", "1"), n.fontId && l.addAttribute("applyFont", "1"), n.fillId && l.addAttribute("applyFill", "1"), n.borderId && l.addAttribute("applyBorder", "1"), n.alignment && l.addAttribute("applyAlignment", "1"), n.protection && l.addAttribute("applyProtection", "1"), n.alignment && this.map.alignment.render(l, n.alignment), n.protection && this.map.protection.render(l, n.protection), l.closeNode();
- }
- parseOpen(l) {
- if (this.parser) return this.parser.parseOpen(l), !0;
- switch (l.name) {
- case "xf":
- return this.model = { numFmtId: parseInt(l.attributes.numFmtId, 10), fontId: parseInt(l.attributes.fontId, 10), fillId: parseInt(l.attributes.fillId, 10), borderId: parseInt(l.attributes.borderId, 10) }, this.xfId && (this.model.xfId = parseInt(l.attributes.xfId, 10)), !0;
- case "alignment":
- return this.parser = this.map.alignment, this.parser.parseOpen(l), !0;
- case "protection":
- return this.parser = this.map.protection, this.parser.parseOpen(l), !0;
- default:
- return !1;
- }
- }
- parseText(l) {
- this.parser && this.parser.parseText(l);
- }
- parseClose(l) {
- return this.parser ? (this.parser.parseClose(l) || (this.map.protection === this.parser ? this.model.protection = this.parser.model : this.model.alignment = this.parser.model, this.parser = void 0), !0) : l !== "xf";
- }
- };
- }, { "../base-xform": 32, "./alignment-xform": 126, "./protection-xform": 133 }], 135: [function(g, C, i) {
- const e = g("../../../doc/enums"), A = g("../../../utils/xml-stream"), s = g("../base-xform"), l = g("../static-xform"), n = g("../list-xform"), a = g("./font-xform"), d = g("./fill-xform"), o = g("./border-xform"), c = g("./numfmt-xform"), r = g("./style-xform"), h = g("./dxf-xform");
- class b extends s {
- constructor(m) {
- super(), this.map = { numFmts: new n({ tag: "numFmts", count: !0, childXform: new c() }), fonts: new n({ tag: "fonts", count: !0, childXform: new a(), $: { "x14ac:knownFonts": 1 } }), fills: new n({ tag: "fills", count: !0, childXform: new d() }), borders: new n({ tag: "borders", count: !0, childXform: new o() }), cellStyleXfs: new n({ tag: "cellStyleXfs", count: !0, childXform: new r() }), cellXfs: new n({ tag: "cellXfs", count: !0, childXform: new r({ xfId: !0 }) }), dxfs: new n({ tag: "dxfs", always: !0, count: !0, childXform: new h() }), numFmt: new c(), font: new a(), fill: new d(), border: new o(), style: new r({ xfId: !0 }), cellStyles: b.STATIC_XFORMS.cellStyles, tableStyles: b.STATIC_XFORMS.tableStyles, extLst: b.STATIC_XFORMS.extLst }, m && this.init();
- }
- initIndex() {
- this.index = { style: {}, numFmt: {}, numFmtNextId: 164, font: {}, border: {}, fill: {} };
- }
- init() {
- this.model = { styles: [], numFmts: [], fonts: [], borders: [], fills: [], dxfs: [] }, this.initIndex(), this._addBorder({}), this._addStyle({ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }), this._addFill({ type: "pattern", pattern: "none" }), this._addFill({ type: "pattern", pattern: "gray125" }), this.weakMap = /* @__PURE__ */ new WeakMap();
- }
- render(m, Z) {
- Z = Z || this.model, m.openXml(A.StdDocAttributes), m.openNode("styleSheet", b.STYLESHEET_ATTRIBUTES), this.index ? (Z.numFmts && Z.numFmts.length && (m.openNode("numFmts", { count: Z.numFmts.length }), Z.numFmts.forEach((p) => {
- m.writeXml(p);
- }), m.closeNode()), Z.fonts.length || this._addFont({ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }), m.openNode("fonts", { count: Z.fonts.length, "x14ac:knownFonts": 1 }), Z.fonts.forEach((p) => {
- m.writeXml(p);
- }), m.closeNode(), m.openNode("fills", { count: Z.fills.length }), Z.fills.forEach((p) => {
- m.writeXml(p);
- }), m.closeNode(), m.openNode("borders", { count: Z.borders.length }), Z.borders.forEach((p) => {
- m.writeXml(p);
- }), m.closeNode(), this.map.cellStyleXfs.render(m, [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }]), m.openNode("cellXfs", { count: Z.styles.length }), Z.styles.forEach((p) => {
- m.writeXml(p);
- }), m.closeNode()) : (this.map.numFmts.render(m, Z.numFmts), this.map.fonts.render(m, Z.fonts), this.map.fills.render(m, Z.fills), this.map.borders.render(m, Z.borders), this.map.cellStyleXfs.render(m, [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }]), this.map.cellXfs.render(m, Z.styles)), b.STATIC_XFORMS.cellStyles.render(m), this.map.dxfs.render(m, Z.dxfs), b.STATIC_XFORMS.tableStyles.render(m), b.STATIC_XFORMS.extLst.render(m), m.closeNode();
- }
- parseOpen(m) {
- if (this.parser) return this.parser.parseOpen(m), !0;
- switch (m.name) {
- case "styleSheet":
- return this.initIndex(), !0;
- default:
- return this.parser = this.map[m.name], this.parser && this.parser.parseOpen(m), !0;
- }
- }
- parseText(m) {
- this.parser && this.parser.parseText(m);
- }
- parseClose(m) {
- if (this.parser) return this.parser.parseClose(m) || (this.parser = void 0), !0;
- switch (m) {
- case "styleSheet": {
- this.model = {};
- const Z = (p, Y) => {
- Y.model && Y.model.length && (this.model[p] = Y.model);
- };
- if (Z("numFmts", this.map.numFmts), Z("fonts", this.map.fonts), Z("fills", this.map.fills), Z("borders", this.map.borders), Z("styles", this.map.cellXfs), Z("dxfs", this.map.dxfs), this.index = { model: [], numFmt: [] }, this.model.numFmts) {
- const p = this.index.numFmt;
- this.model.numFmts.forEach((Y) => {
- p[Y.id] = Y.formatCode;
- });
- }
- return !1;
- }
- default:
- return !0;
- }
- }
- addStyleModel(m, Z) {
- if (!m) return 0;
- if (this.model.fonts.length || this._addFont({ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }), this.weakMap && this.weakMap.has(m)) return this.weakMap.get(m);
- const p = {};
- if (Z = Z || e.ValueType.Number, m.numFmt) p.numFmtId = this._addNumFmtStr(m.numFmt);
- else switch (Z) {
- case e.ValueType.Number:
- p.numFmtId = this._addNumFmtStr("General");
- break;
- case e.ValueType.Date:
- p.numFmtId = this._addNumFmtStr("mm-dd-yy");
- }
- m.font && (p.fontId = this._addFont(m.font)), m.border && (p.borderId = this._addBorder(m.border)), m.fill && (p.fillId = this._addFill(m.fill)), m.alignment && (p.alignment = m.alignment), m.protection && (p.protection = m.protection);
- const Y = this._addStyle(p);
- return this.weakMap && this.weakMap.set(m, Y), Y;
- }
- getStyleModel(m) {
- const Z = this.model.styles[m];
- if (!Z) return null;
- let p = this.index.model[m];
- if (p) return p;
- if (p = this.index.model[m] = {}, Z.numFmtId) {
- const R = this.index.numFmt[Z.numFmtId] || c.getDefaultFmtCode(Z.numFmtId);
- R && (p.numFmt = R);
- }
- function Y(R, X, H) {
- if (H || H === 0) {
- const S = X[H];
- S && (p[R] = S);
- }
- }
- return Y("font", this.model.fonts, Z.fontId), Y("border", this.model.borders, Z.borderId), Y("fill", this.model.fills, Z.fillId), Z.alignment && (p.alignment = Z.alignment), Z.protection && (p.protection = Z.protection), p;
- }
- addDxfStyle(m) {
- return m.numFmt && (m.numFmtId = this._addNumFmtStr(m.numFmt)), this.model.dxfs.push(m), this.model.dxfs.length - 1;
- }
- getDxfStyle(m) {
- return this.model.dxfs[m];
- }
- _addStyle(m) {
- const Z = this.map.style.toXml(m);
- let p = this.index.style[Z];
- return p === void 0 && (p = this.index.style[Z] = this.model.styles.length, this.model.styles.push(Z)), p;
- }
- _addNumFmtStr(m) {
- let Z = c.getDefaultFmtId(m);
- if (Z !== void 0 || (Z = this.index.numFmt[m], Z !== void 0)) return Z;
- Z = this.index.numFmt[m] = 164 + this.model.numFmts.length;
- const p = this.map.numFmt.toXml({ id: Z, formatCode: m });
- return this.model.numFmts.push(p), Z;
- }
- _addFont(m) {
- const Z = this.map.font.toXml(m);
- let p = this.index.font[Z];
- return p === void 0 && (p = this.index.font[Z] = this.model.fonts.length, this.model.fonts.push(Z)), p;
- }
- _addBorder(m) {
- const Z = this.map.border.toXml(m);
- let p = this.index.border[Z];
- return p === void 0 && (p = this.index.border[Z] = this.model.borders.length, this.model.borders.push(Z)), p;
- }
- _addFill(m) {
- const Z = this.map.fill.toXml(m);
- let p = this.index.fill[Z];
- return p === void 0 && (p = this.index.fill[Z] = this.model.fills.length, this.model.fills.push(Z)), p;
- }
- }
- b.STYLESHEET_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x14ac x16r2", "xmlns:x14ac": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac", "xmlns:x16r2": "http://schemas.microsoft.com/office/spreadsheetml/2015/02/main" }, b.STATIC_XFORMS = { cellStyles: new l({ tag: "cellStyles", $: { count: 1 }, c: [{ tag: "cellStyle", $: { name: "Normal", xfId: 0, builtinId: 0 } }] }), dxfs: new l({ tag: "dxfs", $: { count: 0 } }), tableStyles: new l({ tag: "tableStyles", $: { count: 0, defaultTableStyle: "TableStyleMedium2", defaultPivotStyle: "PivotStyleLight16" } }), extLst: new l({ tag: "extLst", c: [{ tag: "ext", $: { uri: "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }, c: [{ tag: "x14:slicerStyles", $: { defaultSlicerStyle: "SlicerStyleLight1" } }] }, { tag: "ext", $: { uri: "{9260A510-F301-46a8-8635-F512D64BE5F5}", "xmlns:x15": "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" }, c: [{ tag: "x15:timelineStyles", $: { defaultTimelineStyle: "TimeSlicerStyleLight1" } }] }] }) }, b.Mock = class extends b {
- constructor() {
- super(), this.model = { styles: [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }], numFmts: [], fonts: [{ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }], borders: [{}], fills: [{ type: "pattern", pattern: "none" }, { type: "pattern", pattern: "gray125" }] };
- }
- parseStream(u) {
- return u.autodrain(), Promise.resolve();
- }
- addStyleModel(u, m) {
- switch (m) {
- case e.ValueType.Date:
- return this.dateStyleId;
- default:
- return 0;
- }
- }
- get dateStyleId() {
- if (!this._dateStyleId) {
- const u = { numFmtId: c.getDefaultFmtId("mm-dd-yy") };
- this._dateStyleId = this.model.styles.length, this.model.styles.push(u);
- }
- return this._dateStyleId;
- }
- getStyleModel() {
- return {};
- }
- }, C.exports = b;
- }, { "../../../doc/enums": 7, "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "../static-xform": 120, "./border-xform": 127, "./dxf-xform": 129, "./fill-xform": 130, "./font-xform": 131, "./numfmt-xform": 132, "./style-xform": 134 }], 136: [function(g, C, i) {
- const e = g("../base-xform");
- class A extends e {
- constructor(l) {
- super(), this.model = l;
- }
- get tag() {
- return "u";
- }
- render(l, n) {
- if ((n = n || this.model) === !0) l.leafNode("u");
- else {
- const a = A.Attributes[n];
- a && l.leafNode("u", a);
- }
- }
- parseOpen(l) {
- l.name === "u" && (this.model = l.attributes.val || !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- }
- A.Attributes = { single: {}, double: { val: "double" }, singleAccounting: { val: "singleAccounting" }, doubleAccounting: { val: "doubleAccounting" } }, C.exports = A;
- }, { "../base-xform": 32 }], 137: [function(g, C, i) {
- const e = g("../base-xform"), A = g("./filter-column-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { filterColumn: new A() };
- }
- get tag() {
- return "autoFilter";
- }
- prepare(s) {
- s.columns.forEach((l, n) => {
- this.map.filterColumn.prepare(l, { index: n });
- });
- }
- render(s, l) {
- return s.openNode(this.tag, { ref: l.autoFilterRef }), l.columns.forEach((n) => {
- this.map.filterColumn.render(s, n);
- }), s.closeNode(), !0;
- }
- parseOpen(s) {
- if (this.parser) return this.parser.parseOpen(s), !0;
- switch (s.name) {
- case this.tag:
- return this.model = { autoFilterRef: s.attributes.ref, columns: [] }, !0;
- default:
- if (this.parser = this.map[s.name], this.parser) return this.parseOpen(s), !0;
- throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(s));
- }
- }
- parseText(s) {
- this.parser && this.parser.parseText(s);
- }
- parseClose(s) {
- if (this.parser) return this.parser.parseClose(s) || (this.model.columns.push(this.parser.model), this.parser = void 0), !0;
- switch (s) {
- case this.tag:
- return !1;
- default:
- throw new Error("Unexpected xml node in parseClose: " + s);
- }
- }
- };
- }, { "../base-xform": 32, "./filter-column-xform": 139 }], 138: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "customFilter";
- }
- render(A, s) {
- A.leafNode(this.tag, { val: s.val, operator: s.operator });
- }
- parseOpen(A) {
- return A.name === this.tag && (this.model = { val: A.attributes.val, operator: A.attributes.operator }, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 139: [function(g, C, i) {
- const e = g("../base-xform"), A = g("../list-xform"), s = g("./custom-filter-xform"), l = g("./filter-xform");
- C.exports = class extends e {
- constructor() {
- super(), this.map = { customFilters: new A({ tag: "customFilters", count: !1, empty: !0, childXform: new s() }), filters: new A({ tag: "filters", count: !1, empty: !0, childXform: new l() }) };
- }
- get tag() {
- return "filterColumn";
- }
- prepare(n, a) {
- n.colId = a.index.toString();
- }
- render(n, a) {
- return a.customFilters ? (n.openNode(this.tag, { colId: a.colId, hiddenButton: a.filterButton ? "0" : "1" }), this.map.customFilters.render(n, a.customFilters), n.closeNode(), !0) : (n.leafNode(this.tag, { colId: a.colId, hiddenButton: a.filterButton ? "0" : "1" }), !0);
- }
- parseOpen(n) {
- if (this.parser) return this.parser.parseOpen(n), !0;
- const { attributes: a } = n;
- switch (n.name) {
- case this.tag:
- return this.model = { filterButton: a.hiddenButton === "0" }, !0;
- default:
- if (this.parser = this.map[n.name], this.parser) return this.parseOpen(n), !0;
- throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(n));
- }
- }
- parseText() {
- }
- parseClose(n) {
- if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
- switch (n) {
- case this.tag:
- return this.model.customFilters = this.map.customFilters.model, !1;
- default:
- return !0;
- }
- }
- };
- }, { "../base-xform": 32, "../list-xform": 71, "./custom-filter-xform": 138, "./filter-xform": 140 }], 140: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "filter";
- }
- render(A, s) {
- A.leafNode(this.tag, { val: s.val });
- }
- parseOpen(A) {
- return A.name === this.tag && (this.model = { val: A.attributes.val }, !0);
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 141: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "tableColumn";
- }
- prepare(A, s) {
- A.id = s.index + 1;
- }
- render(A, s) {
- return A.leafNode(this.tag, { id: s.id.toString(), name: s.name, totalsRowLabel: s.totalsRowLabel, totalsRowFunction: s.totalsRowFunction, dxfId: s.dxfId }), !0;
- }
- parseOpen(A) {
- if (A.name === this.tag) {
- const { attributes: s } = A;
- return this.model = { name: s.name, totalsRowLabel: s.totalsRowLabel, totalsRowFunction: s.totalsRowFunction, dxfId: s.dxfId }, !0;
- }
- return !1;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 142: [function(g, C, i) {
- const e = g("../base-xform");
- C.exports = class extends e {
- get tag() {
- return "tableStyleInfo";
- }
- render(A, s) {
- return A.leafNode(this.tag, { name: s.theme ? s.theme : void 0, showFirstColumn: s.showFirstColumn ? "1" : "0", showLastColumn: s.showLastColumn ? "1" : "0", showRowStripes: s.showRowStripes ? "1" : "0", showColumnStripes: s.showColumnStripes ? "1" : "0" }), !0;
- }
- parseOpen(A) {
- if (A.name === this.tag) {
- const { attributes: s } = A;
- return this.model = { theme: s.name ? s.name : null, showFirstColumn: s.showFirstColumn === "1", showLastColumn: s.showLastColumn === "1", showRowStripes: s.showRowStripes === "1", showColumnStripes: s.showColumnStripes === "1" }, !0;
- }
- return !1;
- }
- parseText() {
- }
- parseClose() {
- return !1;
- }
- };
- }, { "../base-xform": 32 }], 143: [function(g, C, i) {
- const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../list-xform"), l = g("./auto-filter-xform"), n = g("./table-column-xform"), a = g("./table-style-info-xform");
- class d extends A {
- constructor() {
- super(), this.map = { autoFilter: new l(), tableColumns: new s({ tag: "tableColumns", count: !0, empty: !0, childXform: new n() }), tableStyleInfo: new a() };
- }
- prepare(c, r) {
- this.map.autoFilter.prepare(c), this.map.tableColumns.prepare(c.columns, r);
- }
- get tag() {
- return "table";
- }
- render(c, r) {
- c.openXml(e.StdDocAttributes), c.openNode(this.tag, { ...d.TABLE_ATTRIBUTES, id: r.id, name: r.name, displayName: r.displayName || r.name, ref: r.tableRef, totalsRowCount: r.totalsRow ? "1" : void 0, totalsRowShown: r.totalsRow ? void 0 : "1", headerRowCount: r.headerRow ? "1" : "0" }), this.map.autoFilter.render(c, r), this.map.tableColumns.render(c, r.columns), this.map.tableStyleInfo.render(c, r.style), c.closeNode();
- }
- parseOpen(c) {
- if (this.parser) return this.parser.parseOpen(c), !0;
- const { name: r, attributes: h } = c;
- switch (r) {
- case this.tag:
- this.reset(), this.model = { name: h.name, displayName: h.displayName || h.name, tableRef: h.ref, totalsRow: h.totalsRowCount === "1", headerRow: h.headerRowCount === "1" };
- break;
- default:
- this.parser = this.map[c.name], this.parser && this.parser.parseOpen(c);
- }
- return !0;
- }
- parseText(c) {
- this.parser && this.parser.parseText(c);
- }
- parseClose(c) {
- if (this.parser) return this.parser.parseClose(c) || (this.parser = void 0), !0;
- switch (c) {
- case this.tag:
- return this.model.columns = this.map.tableColumns.model, this.map.autoFilter.model && (this.model.autoFilterRef = this.map.autoFilter.model.autoFilterRef, this.map.autoFilter.model.columns.forEach((r, h) => {
- this.model.columns[h].filterButton = r.filterButton;
- })), this.model.style = this.map.tableStyleInfo.model, !1;
- default:
- return !0;
- }
- }
- reconcile(c, r) {
- c.columns.forEach((h) => {
- h.dxfId !== void 0 && (h.style = r.styles.getDxfStyle(h.dxfId));
- });
- }
- }
- d.TABLE_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "xr xr3", "xmlns:xr": "http://schemas.microsoft.com/office/spreadsheetml/2014/revision", "xmlns:xr3": "http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" }, C.exports = d;
- }, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "./auto-filter-xform": 137, "./table-column-xform": 141, "./table-style-info-xform": 142 }], 144: [function(g, C, i) {
- (function(e, A) {
- (function() {
- const s = g("fs"), l = g("jszip"), { PassThrough: n } = g("readable-stream"), a = g("../utils/zip-stream"), d = g("../utils/stream-buf"), o = g("../utils/utils"), c = g("../utils/xml-stream"), { bufferToString: r } = g("../utils/browser-buffer-decode"), h = g("./xform/style/styles-xform"), b = g("./xform/core/core-xform"), u = g("./xform/strings/shared-strings-xform"), m = g("./xform/core/relationships-xform"), Z = g("./xform/core/content-types-xform"), p = g("./xform/core/app-xform"), Y = g("./xform/book/workbook-xform"), R = g("./xform/sheet/worksheet-xform"), X = g("./xform/drawing/drawing-xform"), H = g("./xform/table/table-xform"), S = g("./xform/comment/comments-xform"), z = g("./xform/comment/vml-notes-xform"), v = g("./xml/theme1");
- class K {
- constructor(N) {
- this.workbook = N;
- }
- async readFile(N, B) {
- if (!await o.fs.exists(N)) throw new Error("File not found: " + N);
- const G = s.createReadStream(N);
- try {
- const w = await this.read(G, B);
- return G.close(), w;
- } catch (w) {
- throw G.close(), w;
- }
- }
- parseRels(N) {
- return new m().parseStream(N);
- }
- parseWorkbook(N) {
- return new Y().parseStream(N);
- }
- parseSharedStrings(N) {
- return new u().parseStream(N);
- }
- reconcile(N, B) {
- const G = new Y(), w = new R(B), W = new X(), y = new H();
- G.reconcile(N);
- const f = { media: N.media, mediaIndex: N.mediaIndex };
- Object.keys(N.drawings).forEach((T) => {
- const Q = N.drawings[T], P = N.drawingRels[T];
- P && (f.rels = P.reduce((L, E) => (L[E.Id] = E, L), {}), (Q.anchors || []).forEach((L) => {
- const E = L.picture && L.picture.hyperlinks;
- E && f.rels[E.rId] && (E.hyperlink = f.rels[E.rId].Target, delete E.rId);
- }), W.reconcile(Q, f));
- });
- const D = { styles: N.styles };
- Object.values(N.tables).forEach((T) => {
- y.reconcile(T, D);
- });
- const F = { styles: N.styles, sharedStrings: N.sharedStrings, media: N.media, mediaIndex: N.mediaIndex, date1904: N.properties && N.properties.date1904, drawings: N.drawings, comments: N.comments, tables: N.tables, vmlDrawings: N.vmlDrawings };
- N.worksheets.forEach((T) => {
- T.relationships = N.worksheetRels[T.sheetNo], w.reconcile(T, F);
- }), delete N.worksheetHash, delete N.worksheetRels, delete N.globalRels, delete N.sharedStrings, delete N.workbookRels, delete N.sheetDefs, delete N.styles, delete N.mediaIndex, delete N.drawings, delete N.drawingRels, delete N.vmlDrawings;
- }
- async _processWorksheetEntry(N, B, G, w, W) {
- const y = new R(w), f = await y.parseStream(N);
- f.sheetNo = G, B.worksheetHash[W] = f, B.worksheets.push(f);
- }
- async _processCommentEntry(N, B, G) {
- const w = new S(), W = await w.parseStream(N);
- B.comments[`../${G}.xml`] = W;
- }
- async _processTableEntry(N, B, G) {
- const w = new H(), W = await w.parseStream(N);
- B.tables[`../tables/${G}.xml`] = W;
- }
- async _processWorksheetRelsEntry(N, B, G) {
- const w = new m(), W = await w.parseStream(N);
- B.worksheetRels[G] = W;
- }
- async _processMediaEntry(N, B, G) {
- const w = G.lastIndexOf(".");
- if (w >= 1) {
- const W = G.substr(w + 1), y = G.substr(0, w);
- await new Promise((f, D) => {
- const F = new d();
- F.on("finish", () => {
- B.mediaIndex[G] = B.media.length, B.mediaIndex[y] = B.media.length;
- const T = { type: "image", name: y, extension: W, buffer: F.toBuffer() };
- B.media.push(T), f();
- }), N.on("error", (T) => {
- D(T);
- }), N.pipe(F);
- });
- }
- }
- async _processDrawingEntry(N, B, G) {
- const w = new X(), W = await w.parseStream(N);
- B.drawings[G] = W;
- }
- async _processDrawingRelsEntry(N, B, G) {
- const w = new m(), W = await w.parseStream(N);
- B.drawingRels[G] = W;
- }
- async _processVmlDrawingEntry(N, B, G) {
- const w = new z(), W = await w.parseStream(N);
- B.vmlDrawings[`../drawings/${G}.vml`] = W;
- }
- async _processThemeEntry(N, B, G) {
- await new Promise((w, W) => {
- const y = new d();
- N.on("error", W), y.on("error", W), y.on("finish", () => {
- B.themes[G] = y.read().toString(), w();
- }), N.pipe(y);
- });
- }
- createInputStream() {
- throw new Error("`XLSX#createInputStream` is deprecated. You should use `XLSX#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md");
- }
- async read(N, B) {
- !N[Symbol.asyncIterator] && N.pipe && (N = N.pipe(new n()));
- const G = [];
- for await (const w of N) G.push(w);
- return this.load(A.concat(G), B);
- }
- async load(N, B) {
- let G;
- G = B && B.base64 ? A.from(N.toString(), "base64") : N;
- const w = { worksheets: [], worksheetHash: {}, worksheetRels: [], themes: {}, media: [], mediaIndex: {}, drawings: {}, drawingRels: {}, comments: {}, tables: {}, vmlDrawings: {} }, W = await l.loadAsync(G);
- for (const y of Object.values(W.files)) if (!y.dir) {
- let f, D = y.name;
- if (D[0] === "/" && (D = D.substr(1)), D.match(/xl\/media\//) || D.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/)) f = new n(), f.write(await y.async("nodebuffer"));
- else {
- let F;
- f = new n({ writableObjectMode: !0, readableObjectMode: !0 }), F = e.browser ? r(await y.async("nodebuffer")) : await y.async("string");
- const T = 16384;
- for (let Q = 0; Q < F.length; Q += T) f.write(F.substring(Q, Q + T));
- }
- switch (f.end(), D) {
- case "_rels/.rels":
- w.globalRels = await this.parseRels(f);
- break;
- case "xl/workbook.xml": {
- const F = await this.parseWorkbook(f);
- w.sheets = F.sheets, w.definedNames = F.definedNames, w.views = F.views, w.properties = F.properties, w.calcProperties = F.calcProperties;
- break;
- }
- case "xl/_rels/workbook.xml.rels":
- w.workbookRels = await this.parseRels(f);
- break;
- case "xl/sharedStrings.xml":
- w.sharedStrings = new u(), await w.sharedStrings.parseStream(f);
- break;
- case "xl/styles.xml":
- w.styles = new h(), await w.styles.parseStream(f);
- break;
- case "docProps/app.xml": {
- const F = new p(), T = await F.parseStream(f);
- w.company = T.company, w.manager = T.manager;
- break;
- }
- case "docProps/core.xml": {
- const F = new b(), T = await F.parseStream(f);
- Object.assign(w, T);
- break;
- }
- default: {
- let F = D.match(/xl\/worksheets\/sheet(\d+)[.]xml/);
- if (F) {
- await this._processWorksheetEntry(f, w, F[1], B, D);
- break;
- }
- if (F = D.match(/xl\/worksheets\/_rels\/sheet(\d+)[.]xml.rels/), F) {
- await this._processWorksheetRelsEntry(f, w, F[1]);
- break;
- }
- if (F = D.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/), F) {
- await this._processThemeEntry(f, w, F[1]);
- break;
- }
- if (F = D.match(/xl\/media\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/), F) {
- await this._processMediaEntry(f, w, F[1]);
- break;
- }
- if (F = D.match(/xl\/drawings\/([a-zA-Z0-9]+)[.]xml/), F) {
- await this._processDrawingEntry(f, w, F[1]);
- break;
- }
- if (F = D.match(/xl\/(comments\d+)[.]xml/), F) {
- await this._processCommentEntry(f, w, F[1]);
- break;
- }
- if (F = D.match(/xl\/tables\/(table\d+)[.]xml/), F) {
- await this._processTableEntry(f, w, F[1]);
- break;
- }
- if (F = D.match(/xl\/drawings\/_rels\/([a-zA-Z0-9]+)[.]xml[.]rels/), F) {
- await this._processDrawingRelsEntry(f, w, F[1]);
- break;
- }
- if (F = D.match(/xl\/drawings\/(vmlDrawing\d+)[.]vml/), F) {
- await this._processVmlDrawingEntry(f, w, F[1]);
- break;
- }
- }
- }
- }
- return this.reconcile(w, B), this.workbook.model = w, this.workbook;
- }
- async addMedia(N, B) {
- await Promise.all(B.media.map(async (G) => {
- if (G.type === "image") {
- const w = `xl/media/${G.name}.${G.extension}`;
- if (G.filename) {
- const W = await function(y, f) {
- return new Promise((D, F) => {
- s.readFile(y, f, (T, Q) => {
- T ? F(T) : D(Q);
- });
- });
- }(G.filename);
- return N.append(W, { name: w });
- }
- if (G.buffer) return N.append(G.buffer, { name: w });
- if (G.base64) {
- const W = G.base64, y = W.substring(W.indexOf(",") + 1);
- return N.append(y, { name: w, base64: !0 });
- }
- }
- throw new Error("Unsupported media");
- }));
- }
- addDrawings(N, B) {
- const G = new X(), w = new m();
- B.worksheets.forEach((W) => {
- const { drawing: y } = W;
- if (y) {
- G.prepare(y, {});
- let f = G.toXml(y);
- N.append(f, { name: `xl/drawings/${y.name}.xml` }), f = w.toXml(y.rels), N.append(f, { name: `xl/drawings/_rels/${y.name}.xml.rels` });
- }
- });
- }
- addTables(N, B) {
- const G = new H();
- B.worksheets.forEach((w) => {
- const { tables: W } = w;
- W.forEach((y) => {
- G.prepare(y, {});
- const f = G.toXml(y);
- N.append(f, { name: "xl/tables/" + y.target });
- });
- });
- }
- async addContentTypes(N, B) {
- const G = new Z().toXml(B);
- N.append(G, { name: "[Content_Types].xml" });
- }
- async addApp(N, B) {
- const G = new p().toXml(B);
- N.append(G, { name: "docProps/app.xml" });
- }
- async addCore(N, B) {
- const G = new b();
- N.append(G.toXml(B), { name: "docProps/core.xml" });
- }
- async addThemes(N, B) {
- const G = B.themes || { theme1: v };
- Object.keys(G).forEach((w) => {
- const W = G[w], y = `xl/theme/${w}.xml`;
- N.append(W, { name: y });
- });
- }
- async addOfficeRels(N) {
- const B = new m().toXml([{ Id: "rId1", Type: K.RelType.OfficeDocument, Target: "xl/workbook.xml" }, { Id: "rId2", Type: K.RelType.CoreProperties, Target: "docProps/core.xml" }, { Id: "rId3", Type: K.RelType.ExtenderProperties, Target: "docProps/app.xml" }]);
- N.append(B, { name: "_rels/.rels" });
- }
- async addWorkbookRels(N, B) {
- let G = 1;
- const w = [{ Id: "rId" + G++, Type: K.RelType.Styles, Target: "styles.xml" }, { Id: "rId" + G++, Type: K.RelType.Theme, Target: "theme/theme1.xml" }];
- B.sharedStrings.count && w.push({ Id: "rId" + G++, Type: K.RelType.SharedStrings, Target: "sharedStrings.xml" }), B.worksheets.forEach((y) => {
- y.rId = "rId" + G++, w.push({ Id: y.rId, Type: K.RelType.Worksheet, Target: `worksheets/sheet${y.id}.xml` });
- });
- const W = new m().toXml(w);
- N.append(W, { name: "xl/_rels/workbook.xml.rels" });
- }
- async addSharedStrings(N, B) {
- B.sharedStrings && B.sharedStrings.count && N.append(B.sharedStrings.xml, { name: "xl/sharedStrings.xml" });
- }
- async addStyles(N, B) {
- const { xml: G } = B.styles;
- G && N.append(G, { name: "xl/styles.xml" });
- }
- async addWorkbook(N, B) {
- const G = new Y();
- N.append(G.toXml(B), { name: "xl/workbook.xml" });
- }
- async addWorksheets(N, B) {
- const G = new R(), w = new m(), W = new S(), y = new z();
- B.worksheets.forEach((f) => {
- let D = new c();
- G.render(D, f), N.append(D.xml, { name: `xl/worksheets/sheet${f.id}.xml` }), f.rels && f.rels.length && (D = new c(), w.render(D, f.rels), N.append(D.xml, { name: `xl/worksheets/_rels/sheet${f.id}.xml.rels` })), f.comments.length > 0 && (D = new c(), W.render(D, f), N.append(D.xml, { name: `xl/comments${f.id}.xml` }), D = new c(), y.render(D, f), N.append(D.xml, { name: `xl/drawings/vmlDrawing${f.id}.vml` }));
- });
- }
- _finalize(N) {
- return new Promise((B, G) => {
- N.on("finish", () => {
- B(this);
- }), N.on("error", G), N.finalize();
- });
- }
- prepareModel(N, B) {
- N.creator = N.creator || "ExcelJS", N.lastModifiedBy = N.lastModifiedBy || "ExcelJS", N.created = N.created || /* @__PURE__ */ new Date(), N.modified = N.modified || /* @__PURE__ */ new Date(), N.useSharedStrings = B.useSharedStrings === void 0 || B.useSharedStrings, N.useStyles = B.useStyles === void 0 || B.useStyles, N.sharedStrings = new u(), N.styles = N.useStyles ? new h(!0) : new h.Mock();
- const G = new Y(), w = new R();
- G.prepare(N);
- const W = { sharedStrings: N.sharedStrings, styles: N.styles, date1904: N.properties.date1904, drawingsCount: 0, media: N.media };
- W.drawings = N.drawings = [], W.commentRefs = N.commentRefs = [];
- let y = 0;
- N.tables = [], N.worksheets.forEach((f) => {
- f.tables.forEach((D) => {
- y++, D.target = `table${y}.xml`, D.id = y, N.tables.push(D);
- }), w.prepare(f, W);
- });
- }
- async write(N, B) {
- B = B || {};
- const { model: G } = this.workbook, w = new a.ZipWriter(B.zip);
- return w.pipe(N), this.prepareModel(G, B), await this.addContentTypes(w, G), await this.addOfficeRels(w, G), await this.addWorkbookRels(w, G), await this.addWorksheets(w, G), await this.addSharedStrings(w, G), await this.addDrawings(w, G), await this.addTables(w, G), await Promise.all([this.addThemes(w, G), this.addStyles(w, G)]), await this.addMedia(w, G), await Promise.all([this.addApp(w, G), this.addCore(w, G)]), await this.addWorkbook(w, G), this._finalize(w);
- }
- writeFile(N, B) {
- const G = s.createWriteStream(N);
- return new Promise((w, W) => {
- G.on("finish", () => {
- w();
- }), G.on("error", (y) => {
- W(y);
- }), this.write(G, B).then(() => {
- G.end();
- }).catch((y) => {
- W(y);
- });
- });
- }
- async writeBuffer(N) {
- const B = new d();
- return await this.write(B, N), B.read();
- }
- }
- K.RelType = g("./rel-type"), C.exports = K;
- }).call(this);
- }).call(this, g("_process"), g("buffer").Buffer);
- }, { "../utils/browser-buffer-decode": 16, "../utils/stream-buf": 24, "../utils/utils": 27, "../utils/xml-stream": 28, "../utils/zip-stream": 29, "./rel-type": 31, "./xform/book/workbook-xform": 38, "./xform/comment/comments-xform": 40, "./xform/comment/vml-notes-xform": 45, "./xform/core/app-xform": 51, "./xform/core/content-types-xform": 52, "./xform/core/core-xform": 53, "./xform/core/relationships-xform": 55, "./xform/drawing/drawing-xform": 62, "./xform/sheet/worksheet-xform": 115, "./xform/strings/shared-strings-xform": 124, "./xform/style/styles-xform": 135, "./xform/table/table-xform": 143, "./xml/theme1": 145, _process: 467, buffer: 220, fs: 216, jszip: 441, "readable-stream": 491 }], 145: [function(g, C, i) {
- C.exports = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"> <a:themeElements> <a:clrScheme name="Office"> <a:dk1> <a:sysClr val="windowText" lastClr="000000"/> </a:dk1> <a:lt1> <a:sysClr val="window" lastClr="FFFFFF"/> </a:lt1> <a:dk2> <a:srgbClr val="1F497D"/> </a:dk2> <a:lt2> <a:srgbClr val="EEECE1"/> </a:lt2> <a:accent1> <a:srgbClr val="4F81BD"/> </a:accent1> <a:accent2> <a:srgbClr val="C0504D"/> </a:accent2> <a:accent3> <a:srgbClr val="9BBB59"/> </a:accent3> <a:accent4> <a:srgbClr val="8064A2"/> </a:accent4> <a:accent5> <a:srgbClr val="4BACC6"/> </a:accent5> <a:accent6> <a:srgbClr val="F79646"/> </a:accent6> <a:hlink> <a:srgbClr val="0000FF"/> </a:hlink> <a:folHlink> <a:srgbClr val="800080"/> </a:folHlink> </a:clrScheme> <a:fontScheme name="Office"> <a:majorFont> <a:latin typeface="Cambria"/> <a:ea typeface=""/> <a:cs typeface=""/> <a:font script="Jpan" typeface="MS Pゴシック"/> <a:font script="Hang" typeface="맑은 고딕"/> <a:font script="Hans" typeface="宋体"/> <a:font script="Hant" typeface="新細明體"/> <a:font script="Arab" typeface="Times New Roman"/> <a:font script="Hebr" typeface="Times New Roman"/> <a:font script="Thai" typeface="Tahoma"/> <a:font script="Ethi" typeface="Nyala"/> <a:font script="Beng" typeface="Vrinda"/> <a:font script="Gujr" typeface="Shruti"/> <a:font script="Khmr" typeface="MoolBoran"/> <a:font script="Knda" typeface="Tunga"/> <a:font script="Guru" typeface="Raavi"/> <a:font script="Cans" typeface="Euphemia"/> <a:font script="Cher" typeface="Plantagenet Cherokee"/> <a:font script="Yiii" typeface="Microsoft Yi Baiti"/> <a:font script="Tibt" typeface="Microsoft Himalaya"/> <a:font script="Thaa" typeface="MV Boli"/> <a:font script="Deva" typeface="Mangal"/> <a:font script="Telu" typeface="Gautami"/> <a:font script="Taml" typeface="Latha"/> <a:font script="Syrc" typeface="Estrangelo Edessa"/> <a:font script="Orya" typeface="Kalinga"/> <a:font script="Mlym" typeface="Kartika"/> <a:font script="Laoo" typeface="DokChampa"/> <a:font script="Sinh" typeface="Iskoola Pota"/> <a:font script="Mong" typeface="Mongolian Baiti"/> <a:font script="Viet" typeface="Times New Roman"/> <a:font script="Uigh" typeface="Microsoft Uighur"/> <a:font script="Geor" typeface="Sylfaen"/> </a:majorFont> <a:minorFont> <a:latin typeface="Calibri"/> <a:ea typeface=""/> <a:cs typeface=""/> <a:font script="Jpan" typeface="MS Pゴシック"/> <a:font script="Hang" typeface="맑은 고딕"/> <a:font script="Hans" typeface="宋体"/> <a:font script="Hant" typeface="新細明體"/> <a:font script="Arab" typeface="Arial"/> <a:font script="Hebr" typeface="Arial"/> <a:font script="Thai" typeface="Tahoma"/> <a:font script="Ethi" typeface="Nyala"/> <a:font script="Beng" typeface="Vrinda"/> <a:font script="Gujr" typeface="Shruti"/> <a:font script="Khmr" typeface="DaunPenh"/> <a:font script="Knda" typeface="Tunga"/> <a:font script="Guru" typeface="Raavi"/> <a:font script="Cans" typeface="Euphemia"/> <a:font script="Cher" typeface="Plantagenet Cherokee"/> <a:font script="Yiii" typeface="Microsoft Yi Baiti"/> <a:font script="Tibt" typeface="Microsoft Himalaya"/> <a:font script="Thaa" typeface="MV Boli"/> <a:font script="Deva" typeface="Mangal"/> <a:font script="Telu" typeface="Gautami"/> <a:font script="Taml" typeface="Latha"/> <a:font script="Syrc" typeface="Estrangelo Edessa"/> <a:font script="Orya" typeface="Kalinga"/> <a:font script="Mlym" typeface="Kartika"/> <a:font script="Laoo" typeface="DokChampa"/> <a:font script="Sinh" typeface="Iskoola Pota"/> <a:font script="Mong" typeface="Mongolian Baiti"/> <a:font script="Viet" typeface="Arial"/> <a:font script="Uigh" typeface="Microsoft Uighur"/> <a:font script="Geor" typeface="Sylfaen"/> </a:minorFont> </a:fontScheme> <a:fmtScheme name="Office"> <a:fillStyleLst> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="50000"/> <a:satMod val="300000"/> </a:schemeClr> </a:gs> <a:gs pos="35000"> <a:schemeClr val="phClr"> <a:tint val="37000"/> <a:satMod val="300000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:tint val="15000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang="16200000" scaled="1"/> </a:gradFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="100000"/> <a:shade val="100000"/> <a:satMod val="130000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:tint val="50000"/> <a:shade val="100000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:lin ang="16200000" scaled="0"/> </a:gradFill> </a:fillStyleLst> <a:lnStyleLst> <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="phClr"> <a:shade val="95000"/> <a:satMod val="105000"/> </a:schemeClr> </a:solidFill> <a:prstDash val="solid"/> </a:ln> <a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:prstDash val="solid"/> </a:ln> <a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:prstDash val="solid"/> </a:ln> </a:lnStyleLst> <a:effectStyleLst> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"> <a:srgbClr val="000000"> <a:alpha val="38000"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"> <a:srgbClr val="000000"> <a:alpha val="35000"/> </a:srgbClr> </a:outerShdw> </a:effectLst> </a:effectStyle> <a:effectStyle> <a:effectLst> <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"> <a:srgbClr val="000000"> <a:alpha val="35000"/> </a:srgbClr> </a:outerShdw> </a:effectLst> <a:scene3d> <a:camera prst="orthographicFront"> <a:rot lat="0" lon="0" rev="0"/> </a:camera> <a:lightRig rig="threePt" dir="t"> <a:rot lat="0" lon="0" rev="1200000"/> </a:lightRig> </a:scene3d> <a:sp3d> <a:bevelT w="63500" h="25400"/> </a:sp3d> </a:effectStyle> </a:effectStyleLst> <a:bgFillStyleLst> <a:solidFill> <a:schemeClr val="phClr"/> </a:solidFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="40000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> <a:gs pos="40000"> <a:schemeClr val="phClr"> <a:tint val="45000"/> <a:shade val="99000"/> <a:satMod val="350000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:shade val="20000"/> <a:satMod val="255000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path="circle"> <a:fillToRect l="50000" t="-80000" r="50000" b="180000"/> </a:path> </a:gradFill> <a:gradFill rotWithShape="1"> <a:gsLst> <a:gs pos="0"> <a:schemeClr val="phClr"> <a:tint val="80000"/> <a:satMod val="300000"/> </a:schemeClr> </a:gs> <a:gs pos="100000"> <a:schemeClr val="phClr"> <a:shade val="30000"/> <a:satMod val="200000"/> </a:schemeClr> </a:gs> </a:gsLst> <a:path path="circle"> <a:fillToRect l="50000" t="50000" r="50000" b="50000"/> </a:path> </a:gradFill> </a:bgFillStyleLst> </a:fmtScheme> </a:themeElements> <a:objectDefaults> <a:spDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx="1"> <a:schemeClr val="accent1"/> </a:lnRef> <a:fillRef idx="3"> <a:schemeClr val="accent1"/> </a:fillRef> <a:effectRef idx="2"> <a:schemeClr val="accent1"/> </a:effectRef> <a:fontRef idx="minor"> <a:schemeClr val="lt1"/> </a:fontRef> </a:style> </a:spDef> <a:lnDef> <a:spPr/> <a:bodyPr/> <a:lstStyle/> <a:style> <a:lnRef idx="2"> <a:schemeClr val="accent1"/> </a:lnRef> <a:fillRef idx="0"> <a:schemeClr val="accent1"/> </a:fillRef> <a:effectRef idx="1"> <a:schemeClr val="accent1"/> </a:effectRef> <a:fontRef idx="minor"> <a:schemeClr val="tx1"/> </a:fontRef> </a:style> </a:lnDef> </a:objectDefaults> <a:extraClrSchemeLst/> </a:theme>`;
- }, {}], 146: [function(g, C, i) {
- (function(e) {
- (function() {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvFormatterStream = void 0;
- const A = g("stream"), s = g("./formatter");
- class l extends A.Transform {
- constructor(a) {
- super({ writableObjectMode: a.objectMode }), this.hasWrittenBOM = !1, this.formatterOptions = a, this.rowFormatter = new s.RowFormatter(a), this.hasWrittenBOM = !a.writeBOM;
- }
- transform(a) {
- return this.rowFormatter.rowTransform = a, this;
- }
- _transform(a, d, o) {
- let c = !1;
- try {
- this.hasWrittenBOM || (this.push(this.formatterOptions.BOM), this.hasWrittenBOM = !0), this.rowFormatter.format(a, (r, h) => r ? (c = !0, o(r)) : (h && h.forEach((b) => {
- this.push(e.from(b, "utf8"));
- }), c = !0, o()));
- } catch (r) {
- if (c) throw r;
- o(r);
- }
- }
- _flush(a) {
- this.rowFormatter.finish((d, o) => d ? a(d) : (o && o.forEach((c) => {
- this.push(e.from(c, "utf8"));
- }), a()));
- }
- }
- i.CsvFormatterStream = l;
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { "./formatter": 150, buffer: 220, stream: 505 }], 147: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.FormatterOptions = void 0, i.FormatterOptions = class {
- constructor() {
- let e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
- var A;
- this.objectMode = !0, this.delimiter = ",", this.rowDelimiter = `
- `, this.quote = '"', this.escape = this.quote, this.quoteColumns = !1, this.quoteHeaders = this.quoteColumns, this.headers = null, this.includeEndRowDelimiter = !1, this.writeBOM = !1, this.BOM = "\uFEFF", this.alwaysWriteHeaders = !1, Object.assign(this, e || {}), (e == null ? void 0 : e.quoteHeaders) === void 0 && (this.quoteHeaders = this.quoteColumns), (e == null ? void 0 : e.quote) === !0 ? this.quote = '"' : (e == null ? void 0 : e.quote) === !1 && (this.quote = ""), typeof (e == null ? void 0 : e.escape) != "string" && (this.escape = this.quote), this.shouldWriteHeaders = !!this.headers && ((A = e.writeHeaders) === null || A === void 0 || A), this.headers = Array.isArray(this.headers) ? this.headers : null, this.escapedQuote = `${this.escape}${this.quote}`;
- }
- };
- }, {}], 148: [function(g, C, i) {
- var e = function(n) {
- return n && n.__esModule ? n : { default: n };
- };
- Object.defineProperty(i, "__esModule", { value: !0 }), i.FieldFormatter = void 0;
- const A = e(g("lodash.isboolean")), s = e(g("lodash.isnil")), l = e(g("lodash.escaperegexp"));
- i.FieldFormatter = class {
- constructor(n) {
- this._headers = null, this.formatterOptions = n, n.headers !== null && (this.headers = n.headers), this.REPLACE_REGEXP = new RegExp(n.quote, "g");
- const a = `[${n.delimiter}${l.default(n.rowDelimiter)}|\r|
- ]`;
- this.ESCAPE_REGEXP = new RegExp(a);
- }
- set headers(n) {
- this._headers = n;
- }
- shouldQuote(n, a) {
- const d = a ? this.formatterOptions.quoteHeaders : this.formatterOptions.quoteColumns;
- return A.default(d) ? d : Array.isArray(d) ? d[n] : this._headers !== null && d[this._headers[n]];
- }
- format(n, a, d) {
- const o = ("" + (s.default(n) ? "" : n)).replace(/\0/g, ""), { formatterOptions: c } = this;
- return c.quote !== "" && o.indexOf(c.quote) !== -1 ? this.quoteField(o.replace(this.REPLACE_REGEXP, c.escapedQuote)) : o.search(this.ESCAPE_REGEXP) !== -1 || this.shouldQuote(a, d) ? this.quoteField(o) : o;
- }
- quoteField(n) {
- const { quote: a } = this.formatterOptions;
- return `${a}${n}${a}`;
- }
- };
- }, { "lodash.escaperegexp": 442, "lodash.isboolean": 444, "lodash.isnil": 447 }], 149: [function(g, C, i) {
- var e = function(d) {
- return d && d.__esModule ? d : { default: d };
- };
- Object.defineProperty(i, "__esModule", { value: !0 }), i.RowFormatter = void 0;
- const A = e(g("lodash.isfunction")), s = e(g("lodash.isequal")), l = g("./FieldFormatter"), n = g("../types");
- class a {
- constructor(o) {
- this.rowCount = 0, this.formatterOptions = o, this.fieldFormatter = new l.FieldFormatter(o), this.headers = o.headers, this.shouldWriteHeaders = o.shouldWriteHeaders, this.hasWrittenHeaders = !1, this.headers !== null && (this.fieldFormatter.headers = this.headers), o.transform && (this.rowTransform = o.transform);
- }
- static isRowHashArray(o) {
- return !!Array.isArray(o) && Array.isArray(o[0]) && o[0].length === 2;
- }
- static isRowArray(o) {
- return Array.isArray(o) && !this.isRowHashArray(o);
- }
- static gatherHeaders(o) {
- return a.isRowHashArray(o) ? o.map((c) => c[0]) : Array.isArray(o) ? o : Object.keys(o);
- }
- static createTransform(o) {
- return n.isSyncTransform(o) ? (c, r) => {
- let h = null;
- try {
- h = o(c);
- } catch (b) {
- return r(b);
- }
- return r(null, h);
- } : (c, r) => {
- o(c, r);
- };
- }
- set rowTransform(o) {
- if (!A.default(o)) throw new TypeError("The transform should be a function");
- this._rowTransform = a.createTransform(o);
- }
- format(o, c) {
- this.callTransformer(o, (r, h) => {
- if (r) return c(r);
- if (!o) return c(null);
- const b = [];
- if (h) {
- const { shouldFormatColumns: u, headers: m } = this.checkHeaders(h);
- if (this.shouldWriteHeaders && m && !this.hasWrittenHeaders && (b.push(this.formatColumns(m, !0)), this.hasWrittenHeaders = !0), u) {
- const Z = this.gatherColumns(h);
- b.push(this.formatColumns(Z, !1));
- }
- }
- return c(null, b);
- });
- }
- finish(o) {
- const c = [];
- if (this.formatterOptions.alwaysWriteHeaders && this.rowCount === 0) {
- if (!this.headers) return o(new Error("`alwaysWriteHeaders` option is set to true but `headers` option not provided."));
- c.push(this.formatColumns(this.headers, !0));
- }
- return this.formatterOptions.includeEndRowDelimiter && c.push(this.formatterOptions.rowDelimiter), o(null, c);
- }
- checkHeaders(o) {
- if (this.headers) return { shouldFormatColumns: !0, headers: this.headers };
- const c = a.gatherHeaders(o);
- return this.headers = c, this.fieldFormatter.headers = c, this.shouldWriteHeaders ? { shouldFormatColumns: !s.default(c, o), headers: c } : { shouldFormatColumns: !0, headers: null };
- }
- gatherColumns(o) {
- if (this.headers === null) throw new Error("Headers is currently null");
- return Array.isArray(o) ? a.isRowHashArray(o) ? this.headers.map((c, r) => {
- const h = o[r];
- return h ? h[1] : "";
- }) : a.isRowArray(o) && !this.shouldWriteHeaders ? o : this.headers.map((c, r) => o[r]) : this.headers.map((c) => o[c]);
- }
- callTransformer(o, c) {
- return this._rowTransform ? this._rowTransform(o, c) : c(null, o);
- }
- formatColumns(o, c) {
- const r = o.map((b, u) => this.fieldFormatter.format(b, u, c)).join(this.formatterOptions.delimiter), { rowCount: h } = this;
- return this.rowCount += 1, h ? [this.formatterOptions.rowDelimiter, r].join("") : r;
- }
- }
- i.RowFormatter = a;
- }, { "../types": 152, "./FieldFormatter": 148, "lodash.isequal": 445, "lodash.isfunction": 446 }], 150: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.FieldFormatter = i.RowFormatter = void 0;
- var e = g("./RowFormatter");
- Object.defineProperty(i, "RowFormatter", { enumerable: !0, get: function() {
- return e.RowFormatter;
- } });
- var A = g("./FieldFormatter");
- Object.defineProperty(i, "FieldFormatter", { enumerable: !0, get: function() {
- return A.FieldFormatter;
- } });
- }, { "./FieldFormatter": 148, "./RowFormatter": 149 }], 151: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = Object.create ? function(u, m, Z, p) {
- p === void 0 && (p = Z), Object.defineProperty(u, p, { enumerable: !0, get: function() {
- return m[Z];
- } });
- } : function(u, m, Z, p) {
- p === void 0 && (p = Z), u[p] = m[Z];
- }, s = Object.create ? function(u, m) {
- Object.defineProperty(u, "default", { enumerable: !0, value: m });
- } : function(u, m) {
- u.default = m;
- }, l = function(u) {
- if (u && u.__esModule) return u;
- var m = {};
- if (u != null) for (var Z in u) Z !== "default" && Object.prototype.hasOwnProperty.call(u, Z) && A(m, u, Z);
- return s(m, u), m;
- }, n = function(u, m) {
- for (var Z in u) Z === "default" || Object.prototype.hasOwnProperty.call(m, Z) || A(m, u, Z);
- };
- Object.defineProperty(i, "__esModule", { value: !0 }), i.writeToPath = i.writeToString = i.writeToBuffer = i.writeToStream = i.write = i.format = i.FormatterOptions = i.CsvFormatterStream = void 0;
- const a = g("util"), d = g("stream"), o = l(g("fs")), c = g("./FormatterOptions"), r = g("./CsvFormatterStream");
- n(g("./types"), i);
- var h = g("./CsvFormatterStream");
- Object.defineProperty(i, "CsvFormatterStream", { enumerable: !0, get: function() {
- return h.CsvFormatterStream;
- } });
- var b = g("./FormatterOptions");
- Object.defineProperty(i, "FormatterOptions", { enumerable: !0, get: function() {
- return b.FormatterOptions;
- } }), i.format = (u) => new r.CsvFormatterStream(new c.FormatterOptions(u)), i.write = (u, m) => {
- const Z = i.format(m), p = a.promisify((Y, R) => {
- Z.write(Y, void 0, R);
- });
- return u.reduce((Y, R) => Y.then(() => p(R)), Promise.resolve()).then(() => Z.end()).catch((Y) => {
- Z.emit("error", Y);
- }), Z;
- }, i.writeToStream = (u, m, Z) => i.write(m, Z).pipe(u), i.writeToBuffer = function(u) {
- let m = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
- const Z = [], p = new d.Writable({ write(Y, R, X) {
- Z.push(Y), X();
- } });
- return new Promise((Y, R) => {
- p.on("error", R).on("finish", () => Y(e.concat(Z))), i.write(u, m).pipe(p);
- });
- }, i.writeToString = (u, m) => i.writeToBuffer(u, m).then((Z) => Z.toString()), i.writeToPath = (u, m, Z) => {
- const p = o.createWriteStream(u, { encoding: "utf8" });
- return i.write(m, Z).pipe(p);
- };
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { "./CsvFormatterStream": 146, "./FormatterOptions": 147, "./types": 152, buffer: 220, fs: 216, stream: 505, util: 527 }], 152: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.isSyncTransform = void 0, i.isSyncTransform = (e) => e.length === 1;
- }, {}], 153: [function(g, C, i) {
- (function(e) {
- (function() {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvParserStream = void 0;
- const A = g("string_decoder"), s = g("stream"), l = g("./transforms"), n = g("./parser");
- class a extends s.Transform {
- constructor(o) {
- super({ objectMode: o.objectMode }), this.lines = "", this.rowCount = 0, this.parsedRowCount = 0, this.parsedLineCount = 0, this.endEmitted = !1, this.headersEmitted = !1, this.parserOptions = o, this.parser = new n.Parser(o), this.headerTransformer = new l.HeaderTransformer(o), this.decoder = new A.StringDecoder(o.encoding), this.rowTransformerValidator = new l.RowTransformerValidator();
- }
- get hasHitRowLimit() {
- return this.parserOptions.limitRows && this.rowCount >= this.parserOptions.maxRows;
- }
- get shouldEmitRows() {
- return this.parsedRowCount > this.parserOptions.skipRows;
- }
- get shouldSkipLine() {
- return this.parsedLineCount <= this.parserOptions.skipLines;
- }
- transform(o) {
- return this.rowTransformerValidator.rowTransform = o, this;
- }
- validate(o) {
- return this.rowTransformerValidator.rowValidator = o, this;
- }
- emit(o) {
- if (o === "end") return this.endEmitted || (this.endEmitted = !0, super.emit("end", this.rowCount)), !1;
- for (var c = arguments.length, r = new Array(c > 1 ? c - 1 : 0), h = 1; h < c; h++) r[h - 1] = arguments[h];
- return super.emit(o, ...r);
- }
- _transform(o, c, r) {
- if (this.hasHitRowLimit) return r();
- const h = a.wrapDoneCallback(r);
- try {
- const { lines: b } = this, u = b + this.decoder.write(o), m = this.parse(u, !0);
- return this.processRows(m, h);
- } catch (b) {
- return h(b);
- }
- }
- _flush(o) {
- const c = a.wrapDoneCallback(o);
- if (this.hasHitRowLimit) return c();
- try {
- const r = this.lines + this.decoder.end(), h = this.parse(r, !1);
- return this.processRows(h, c);
- } catch (r) {
- return c(r);
- }
- }
- parse(o, c) {
- if (!o) return [];
- const { line: r, rows: h } = this.parser.parse(o, c);
- return this.lines = r, h;
- }
- processRows(o, c) {
- const r = o.length, h = (b) => {
- const u = (p) => p ? c(p) : b % 100 != 0 ? h(b + 1) : void e(() => h(b + 1));
- if (this.checkAndEmitHeaders(), b >= r || this.hasHitRowLimit) return c();
- if (this.parsedLineCount += 1, this.shouldSkipLine) return u();
- const m = o[b];
- this.rowCount += 1, this.parsedRowCount += 1;
- const Z = this.rowCount;
- return this.transformRow(m, (p, Y) => {
- if (p) return this.rowCount -= 1, u(p);
- if (!Y) return u(new Error("expected transform result"));
- if (Y.isValid) {
- if (Y.row) return this.pushRow(Y.row, u);
- } else this.emit("data-invalid", Y.row, Z, Y.reason);
- return u();
- });
- };
- h(0);
- }
- transformRow(o, c) {
- try {
- this.headerTransformer.transform(o, (r, h) => r ? c(r) : h ? h.isValid ? h.row ? this.shouldEmitRows ? this.rowTransformerValidator.transformAndValidate(h.row, c) : this.skipRow(c) : (this.rowCount -= 1, this.parsedRowCount -= 1, c(null, { row: null, isValid: !0 })) : this.shouldEmitRows ? c(null, { isValid: !1, row: o }) : this.skipRow(c) : c(new Error("Expected result from header transform")));
- } catch (r) {
- c(r);
- }
- }
- checkAndEmitHeaders() {
- !this.headersEmitted && this.headerTransformer.headers && (this.headersEmitted = !0, this.emit("headers", this.headerTransformer.headers));
- }
- skipRow(o) {
- return this.rowCount -= 1, o(null, { row: null, isValid: !0 });
- }
- pushRow(o, c) {
- try {
- this.parserOptions.objectMode ? this.push(o) : this.push(JSON.stringify(o)), c();
- } catch (r) {
- c(r);
- }
- }
- static wrapDoneCallback(o) {
- let c = !1;
- return function(r) {
- if (r) {
- if (c) throw r;
- return c = !0, void o(r);
- }
- for (var h = arguments.length, b = new Array(h > 1 ? h - 1 : 0), u = 1; u < h; u++) b[u - 1] = arguments[u];
- o(...b);
- };
- }
- }
- i.CsvParserStream = a;
- }).call(this);
- }).call(this, g("timers").setImmediate);
- }, { "./parser": 165, "./transforms": 168, stream: 505, string_decoder: 218, timers: 523 }], 154: [function(g, C, i) {
- var e = function(l) {
- return l && l.__esModule ? l : { default: l };
- };
- Object.defineProperty(i, "__esModule", { value: !0 }), i.ParserOptions = void 0;
- const A = e(g("lodash.escaperegexp")), s = e(g("lodash.isnil"));
- i.ParserOptions = class {
- constructor(l) {
- var n;
- if (this.objectMode = !0, this.delimiter = ",", this.ignoreEmpty = !1, this.quote = '"', this.escape = null, this.escapeChar = this.quote, this.comment = null, this.supportsComments = !1, this.ltrim = !1, this.rtrim = !1, this.trim = !1, this.headers = null, this.renameHeaders = !1, this.strictColumnHandling = !1, this.discardUnmappedColumns = !1, this.carriageReturn = "\r", this.encoding = "utf8", this.limitRows = !1, this.maxRows = 0, this.skipLines = 0, this.skipRows = 0, Object.assign(this, l || {}), this.delimiter.length > 1) throw new Error("delimiter option must be one character long");
- this.escapedDelimiter = A.default(this.delimiter), this.escapeChar = (n = this.escape) !== null && n !== void 0 ? n : this.quote, this.supportsComments = !s.default(this.comment), this.NEXT_TOKEN_REGEXP = new RegExp(`([^\\s]|\\r\\n|\\n|\\r|${this.escapedDelimiter})`), this.maxRows > 0 && (this.limitRows = !0);
- }
- };
- }, { "lodash.escaperegexp": 442, "lodash.isnil": 447 }], 155: [function(g, C, i) {
- var e = Object.create ? function(h, b, u, m) {
- m === void 0 && (m = u), Object.defineProperty(h, m, { enumerable: !0, get: function() {
- return b[u];
- } });
- } : function(h, b, u, m) {
- m === void 0 && (m = u), h[m] = b[u];
- }, A = Object.create ? function(h, b) {
- Object.defineProperty(h, "default", { enumerable: !0, value: b });
- } : function(h, b) {
- h.default = b;
- }, s = function(h) {
- if (h && h.__esModule) return h;
- var b = {};
- if (h != null) for (var u in h) u !== "default" && Object.prototype.hasOwnProperty.call(h, u) && e(b, h, u);
- return A(b, h), b;
- }, l = function(h, b) {
- for (var u in h) u === "default" || Object.prototype.hasOwnProperty.call(b, u) || e(b, h, u);
- };
- Object.defineProperty(i, "__esModule", { value: !0 }), i.parseString = i.parseFile = i.parseStream = i.parse = i.ParserOptions = i.CsvParserStream = void 0;
- const n = s(g("fs")), a = g("stream"), d = g("./ParserOptions"), o = g("./CsvParserStream");
- l(g("./types"), i);
- var c = g("./CsvParserStream");
- Object.defineProperty(i, "CsvParserStream", { enumerable: !0, get: function() {
- return c.CsvParserStream;
- } });
- var r = g("./ParserOptions");
- Object.defineProperty(i, "ParserOptions", { enumerable: !0, get: function() {
- return r.ParserOptions;
- } }), i.parse = (h) => new o.CsvParserStream(new d.ParserOptions(h)), i.parseStream = (h, b) => h.pipe(new o.CsvParserStream(new d.ParserOptions(b))), i.parseFile = function(h) {
- let b = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
- return n.createReadStream(h).pipe(new o.CsvParserStream(new d.ParserOptions(b)));
- }, i.parseString = (h, b) => {
- const u = new a.Readable();
- return u.push(h), u.push(null), u.pipe(new o.CsvParserStream(new d.ParserOptions(b)));
- };
- }, { "./CsvParserStream": 153, "./ParserOptions": 154, "./types": 169, fs: 216, stream: 505 }], 156: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.Parser = void 0;
- const e = g("./Scanner"), A = g("./RowParser"), s = g("./Token");
- class l {
- constructor(a) {
- this.parserOptions = a, this.rowParser = new A.RowParser(this.parserOptions);
- }
- static removeBOM(a) {
- return a && a.charCodeAt(0) === 65279 ? a.slice(1) : a;
- }
- parse(a, d) {
- const o = new e.Scanner({ line: l.removeBOM(a), parserOptions: this.parserOptions, hasMoreData: d });
- return this.parserOptions.supportsComments ? this.parseWithComments(o) : this.parseWithoutComments(o);
- }
- parseWithoutComments(a) {
- const d = [];
- let o = !0;
- for (; o; ) o = this.parseRow(a, d);
- return { line: a.line, rows: d };
- }
- parseWithComments(a) {
- const { parserOptions: d } = this, o = [];
- for (let c = a.nextCharacterToken; c !== null; c = a.nextCharacterToken) if (s.Token.isTokenComment(c, d)) {
- if (a.advancePastLine() === null) return { line: a.lineFromCursor, rows: o };
- if (!a.hasMoreCharacters) return { line: a.lineFromCursor, rows: o };
- a.truncateToCursor();
- } else if (!this.parseRow(a, o)) break;
- return { line: a.line, rows: o };
- }
- parseRow(a, d) {
- if (!a.nextNonSpaceToken) return !1;
- const o = this.rowParser.parse(a);
- return o !== null && (this.parserOptions.ignoreEmpty && A.RowParser.isEmptyRow(o) || d.push(o), !0);
- }
- }
- i.Parser = l;
- }, { "./RowParser": 157, "./Scanner": 158, "./Token": 159 }], 157: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.RowParser = void 0;
- const e = g("./column"), A = g("./Token");
- i.RowParser = class {
- constructor(s) {
- this.parserOptions = s, this.columnParser = new e.ColumnParser(s);
- }
- static isEmptyRow(s) {
- return s.join("").replace(/\s+/g, "") === "";
- }
- parse(s) {
- const { parserOptions: l } = this, { hasMoreData: n } = s, a = s, d = [];
- let o = this.getStartToken(a, d);
- for (; o; ) {
- if (A.Token.isTokenRowDelimiter(o)) return a.advancePastToken(o), !a.hasMoreCharacters && A.Token.isTokenCarriageReturn(o, l) && n ? null : (a.truncateToCursor(), d);
- if (!this.shouldSkipColumnParse(a, o, d)) {
- const c = this.columnParser.parse(a);
- if (c === null) return null;
- d.push(c);
- }
- o = a.nextNonSpaceToken;
- }
- return n ? null : (a.truncateToCursor(), d);
- }
- getStartToken(s, l) {
- const n = s.nextNonSpaceToken;
- return n !== null && A.Token.isTokenDelimiter(n, this.parserOptions) ? (l.push(""), s.nextNonSpaceToken) : n;
- }
- shouldSkipColumnParse(s, l, n) {
- const { parserOptions: a } = this;
- if (A.Token.isTokenDelimiter(l, a)) {
- s.advancePastToken(l);
- const d = s.nextCharacterToken;
- if (!s.hasMoreCharacters || d !== null && A.Token.isTokenRowDelimiter(d) || d !== null && A.Token.isTokenDelimiter(d, a)) return n.push(""), !0;
- }
- return !1;
- }
- };
- }, { "./Token": 159, "./column": 164 }], 158: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.Scanner = void 0;
- const e = g("./Token"), A = /((?:\r\n)|\n|\r)/;
- i.Scanner = class {
- constructor(s) {
- this.cursor = 0, this.line = s.line, this.lineLength = this.line.length, this.parserOptions = s.parserOptions, this.hasMoreData = s.hasMoreData, this.cursor = s.cursor || 0;
- }
- get hasMoreCharacters() {
- return this.lineLength > this.cursor;
- }
- get nextNonSpaceToken() {
- const { lineFromCursor: s } = this, l = this.parserOptions.NEXT_TOKEN_REGEXP;
- if (s.search(l) === -1) return null;
- const n = l.exec(s);
- if (n == null) return null;
- const a = n[1], d = this.cursor + (n.index || 0);
- return new e.Token({ token: a, startCursor: d, endCursor: d + a.length - 1 });
- }
- get nextCharacterToken() {
- const { cursor: s, lineLength: l } = this;
- return l <= s ? null : new e.Token({ token: this.line[s], startCursor: s, endCursor: s });
- }
- get lineFromCursor() {
- return this.line.substr(this.cursor);
- }
- advancePastLine() {
- const s = A.exec(this.lineFromCursor);
- return s ? (this.cursor += (s.index || 0) + s[0].length, this) : this.hasMoreData ? null : (this.cursor = this.lineLength, this);
- }
- advanceTo(s) {
- return this.cursor = s, this;
- }
- advanceToToken(s) {
- return this.cursor = s.startCursor, this;
- }
- advancePastToken(s) {
- return this.cursor = s.endCursor + 1, this;
- }
- truncateToCursor() {
- return this.line = this.lineFromCursor, this.lineLength = this.line.length, this.cursor = 0, this;
- }
- };
- }, { "./Token": 159 }], 159: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.Token = void 0, i.Token = class {
- constructor(e) {
- this.token = e.token, this.startCursor = e.startCursor, this.endCursor = e.endCursor;
- }
- static isTokenRowDelimiter(e) {
- const A = e.token;
- return A === "\r" || A === `
- ` || A === `\r
- `;
- }
- static isTokenCarriageReturn(e, A) {
- return e.token === A.carriageReturn;
- }
- static isTokenComment(e, A) {
- return A.supportsComments && !!e && e.token === A.comment;
- }
- static isTokenEscapeCharacter(e, A) {
- return e.token === A.escapeChar;
- }
- static isTokenQuote(e, A) {
- return e.token === A.quote;
- }
- static isTokenDelimiter(e, A) {
- return e.token === A.delimiter;
- }
- };
- }, {}], 160: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnFormatter = void 0, i.ColumnFormatter = class {
- constructor(e) {
- e.trim ? this.format = (A) => A.trim() : e.ltrim ? this.format = (A) => A.trimLeft() : e.rtrim ? this.format = (A) => A.trimRight() : this.format = (A) => A;
- }
- };
- }, {}], 161: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnParser = void 0;
- const e = g("./NonQuotedColumnParser"), A = g("./QuotedColumnParser"), s = g("../Token");
- i.ColumnParser = class {
- constructor(l) {
- this.parserOptions = l, this.quotedColumnParser = new A.QuotedColumnParser(l), this.nonQuotedColumnParser = new e.NonQuotedColumnParser(l);
- }
- parse(l) {
- const { nextNonSpaceToken: n } = l;
- return n !== null && s.Token.isTokenQuote(n, this.parserOptions) ? (l.advanceToToken(n), this.quotedColumnParser.parse(l)) : this.nonQuotedColumnParser.parse(l);
- }
- };
- }, { "../Token": 159, "./NonQuotedColumnParser": 162, "./QuotedColumnParser": 163 }], 162: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.NonQuotedColumnParser = void 0;
- const e = g("./ColumnFormatter"), A = g("../Token");
- i.NonQuotedColumnParser = class {
- constructor(s) {
- this.parserOptions = s, this.columnFormatter = new e.ColumnFormatter(s);
- }
- parse(s) {
- if (!s.hasMoreCharacters) return null;
- const { parserOptions: l } = this, n = [];
- let a = s.nextCharacterToken;
- for (; a && !A.Token.isTokenDelimiter(a, l) && !A.Token.isTokenRowDelimiter(a); a = s.nextCharacterToken) n.push(a.token), s.advancePastToken(a);
- return this.columnFormatter.format(n.join(""));
- }
- };
- }, { "../Token": 159, "./ColumnFormatter": 160 }], 163: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.QuotedColumnParser = void 0;
- const e = g("./ColumnFormatter"), A = g("../Token");
- i.QuotedColumnParser = class {
- constructor(s) {
- this.parserOptions = s, this.columnFormatter = new e.ColumnFormatter(s);
- }
- parse(s) {
- if (!s.hasMoreCharacters) return null;
- const l = s.cursor, { foundClosingQuote: n, col: a } = this.gatherDataBetweenQuotes(s);
- if (!n) {
- if (s.advanceTo(l), !s.hasMoreData) throw new Error(`Parse Error: missing closing: '${this.parserOptions.quote || ""}' in line: at '${s.lineFromCursor.replace(/[\r\n]/g, "\\n'")}'`);
- return null;
- }
- return this.checkForMalformedColumn(s), a;
- }
- gatherDataBetweenQuotes(s) {
- const { parserOptions: l } = this;
- let n = !1, a = !1;
- const d = [];
- let o = s.nextCharacterToken;
- for (; !a && o !== null; o = s.nextCharacterToken) {
- const c = A.Token.isTokenQuote(o, l);
- if (!n && c) n = !0;
- else if (n) if (A.Token.isTokenEscapeCharacter(o, l)) {
- s.advancePastToken(o);
- const r = s.nextCharacterToken;
- r !== null && (A.Token.isTokenQuote(r, l) || A.Token.isTokenEscapeCharacter(r, l)) ? (d.push(r.token), o = r) : c ? a = !0 : d.push(o.token);
- } else c ? a = !0 : d.push(o.token);
- s.advancePastToken(o);
- }
- return { col: this.columnFormatter.format(d.join("")), foundClosingQuote: a };
- }
- checkForMalformedColumn(s) {
- const { parserOptions: l } = this, { nextNonSpaceToken: n } = s;
- if (n) {
- const a = A.Token.isTokenDelimiter(n, l), d = A.Token.isTokenRowDelimiter(n);
- if (!a && !d) {
- const o = s.lineFromCursor.substr(0, 10).replace(/[\r\n]/g, "\\n'");
- throw new Error(`Parse Error: expected: '${l.escapedDelimiter}' OR new line got: '${n.token}'. at '${o}`);
- }
- s.advanceToToken(n);
- } else s.hasMoreData || s.advancePastLine();
- }
- };
- }, { "../Token": 159, "./ColumnFormatter": 160 }], 164: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnFormatter = i.QuotedColumnParser = i.NonQuotedColumnParser = i.ColumnParser = void 0;
- var e = g("./ColumnParser");
- Object.defineProperty(i, "ColumnParser", { enumerable: !0, get: function() {
- return e.ColumnParser;
- } });
- var A = g("./NonQuotedColumnParser");
- Object.defineProperty(i, "NonQuotedColumnParser", { enumerable: !0, get: function() {
- return A.NonQuotedColumnParser;
- } });
- var s = g("./QuotedColumnParser");
- Object.defineProperty(i, "QuotedColumnParser", { enumerable: !0, get: function() {
- return s.QuotedColumnParser;
- } });
- var l = g("./ColumnFormatter");
- Object.defineProperty(i, "ColumnFormatter", { enumerable: !0, get: function() {
- return l.ColumnFormatter;
- } });
- }, { "./ColumnFormatter": 160, "./ColumnParser": 161, "./NonQuotedColumnParser": 162, "./QuotedColumnParser": 163 }], 165: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.QuotedColumnParser = i.NonQuotedColumnParser = i.ColumnParser = i.Token = i.Scanner = i.RowParser = i.Parser = void 0;
- var e = g("./Parser");
- Object.defineProperty(i, "Parser", { enumerable: !0, get: function() {
- return e.Parser;
- } });
- var A = g("./RowParser");
- Object.defineProperty(i, "RowParser", { enumerable: !0, get: function() {
- return A.RowParser;
- } });
- var s = g("./Scanner");
- Object.defineProperty(i, "Scanner", { enumerable: !0, get: function() {
- return s.Scanner;
- } });
- var l = g("./Token");
- Object.defineProperty(i, "Token", { enumerable: !0, get: function() {
- return l.Token;
- } });
- var n = g("./column");
- Object.defineProperty(i, "ColumnParser", { enumerable: !0, get: function() {
- return n.ColumnParser;
- } }), Object.defineProperty(i, "NonQuotedColumnParser", { enumerable: !0, get: function() {
- return n.NonQuotedColumnParser;
- } }), Object.defineProperty(i, "QuotedColumnParser", { enumerable: !0, get: function() {
- return n.QuotedColumnParser;
- } });
- }, { "./Parser": 156, "./RowParser": 157, "./Scanner": 158, "./Token": 159, "./column": 164 }], 166: [function(g, C, i) {
- var e = function(a) {
- return a && a.__esModule ? a : { default: a };
- };
- Object.defineProperty(i, "__esModule", { value: !0 }), i.HeaderTransformer = void 0;
- const A = e(g("lodash.isundefined")), s = e(g("lodash.isfunction")), l = e(g("lodash.uniq")), n = e(g("lodash.groupby"));
- i.HeaderTransformer = class {
- constructor(a) {
- this.headers = null, this.receivedHeaders = !1, this.shouldUseFirstRow = !1, this.processedFirstRow = !1, this.headersLength = 0, this.parserOptions = a, a.headers === !0 ? this.shouldUseFirstRow = !0 : Array.isArray(a.headers) ? this.setHeaders(a.headers) : s.default(a.headers) && (this.headersTransform = a.headers);
- }
- transform(a, d) {
- return this.shouldMapRow(a) ? d(null, this.processRow(a)) : d(null, { row: null, isValid: !0 });
- }
- shouldMapRow(a) {
- const { parserOptions: d } = this;
- if (!this.headersTransform && d.renameHeaders && !this.processedFirstRow) {
- if (!this.receivedHeaders) throw new Error("Error renaming headers: new headers must be provided in an array");
- return this.processedFirstRow = !0, !1;
- }
- if (!this.receivedHeaders && Array.isArray(a)) {
- if (this.headersTransform) this.setHeaders(this.headersTransform(a));
- else {
- if (!this.shouldUseFirstRow) return !0;
- this.setHeaders(a);
- }
- return !1;
- }
- return !0;
- }
- processRow(a) {
- if (!this.headers) return { row: a, isValid: !0 };
- const { parserOptions: d } = this;
- if (!d.discardUnmappedColumns && a.length > this.headersLength) {
- if (!d.strictColumnHandling) throw new Error(`Unexpected Error: column header mismatch expected: ${this.headersLength} columns got: ${a.length}`);
- return { row: a, isValid: !1, reason: `Column header mismatch expected: ${this.headersLength} columns got: ${a.length}` };
- }
- return d.strictColumnHandling && a.length < this.headersLength ? { row: a, isValid: !1, reason: `Column header mismatch expected: ${this.headersLength} columns got: ${a.length}` } : { row: this.mapHeaders(a), isValid: !0 };
- }
- mapHeaders(a) {
- const d = {}, { headers: o, headersLength: c } = this;
- for (let r = 0; r < c; r += 1) {
- const h = o[r];
- if (!A.default(h)) {
- const b = a[r];
- A.default(b) ? d[h] = "" : d[h] = b;
- }
- }
- return d;
- }
- setHeaders(a) {
- var d;
- const o = a.filter((c) => !!c);
- if (l.default(o).length !== o.length) {
- const c = n.default(o), r = Object.keys(c).filter((h) => c[h].length > 1);
- throw new Error("Duplicate headers found " + JSON.stringify(r));
- }
- this.headers = a, this.receivedHeaders = !0, this.headersLength = ((d = this.headers) === null || d === void 0 ? void 0 : d.length) || 0;
- }
- };
- }, { "lodash.groupby": 443, "lodash.isfunction": 446, "lodash.isundefined": 448, "lodash.uniq": 449 }], 167: [function(g, C, i) {
- var e = function(n) {
- return n && n.__esModule ? n : { default: n };
- };
- Object.defineProperty(i, "__esModule", { value: !0 }), i.RowTransformerValidator = void 0;
- const A = e(g("lodash.isfunction")), s = g("../types");
- class l {
- constructor() {
- this._rowTransform = null, this._rowValidator = null;
- }
- static createTransform(a) {
- return s.isSyncTransform(a) ? (d, o) => {
- let c = null;
- try {
- c = a(d);
- } catch (r) {
- return o(r);
- }
- return o(null, c);
- } : a;
- }
- static createValidator(a) {
- return s.isSyncValidate(a) ? (d, o) => {
- o(null, { row: d, isValid: a(d) });
- } : (d, o) => {
- a(d, (c, r, h) => c ? o(c) : o(null, r ? { row: d, isValid: r, reason: h } : { row: d, isValid: !1, reason: h }));
- };
- }
- set rowTransform(a) {
- if (!A.default(a)) throw new TypeError("The transform should be a function");
- this._rowTransform = l.createTransform(a);
- }
- set rowValidator(a) {
- if (!A.default(a)) throw new TypeError("The validate should be a function");
- this._rowValidator = l.createValidator(a);
- }
- transformAndValidate(a, d) {
- return this.callTransformer(a, (o, c) => o ? d(o) : c ? this.callValidator(c, (r, h) => r ? d(r) : h && !h.isValid ? d(null, { row: c, isValid: !1, reason: h.reason }) : d(null, { row: c, isValid: !0 })) : d(null, { row: null, isValid: !0 }));
- }
- callTransformer(a, d) {
- return this._rowTransform ? this._rowTransform(a, d) : d(null, a);
- }
- callValidator(a, d) {
- return this._rowValidator ? this._rowValidator(a, d) : d(null, { row: a, isValid: !0 });
- }
- }
- i.RowTransformerValidator = l;
- }, { "../types": 169, "lodash.isfunction": 446 }], 168: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.HeaderTransformer = i.RowTransformerValidator = void 0;
- var e = g("./RowTransformerValidator");
- Object.defineProperty(i, "RowTransformerValidator", { enumerable: !0, get: function() {
- return e.RowTransformerValidator;
- } });
- var A = g("./HeaderTransformer");
- Object.defineProperty(i, "HeaderTransformer", { enumerable: !0, get: function() {
- return A.HeaderTransformer;
- } });
- }, { "./HeaderTransformer": 166, "./RowTransformerValidator": 167 }], 169: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.isSyncValidate = i.isSyncTransform = void 0, i.isSyncTransform = (e) => e.length === 1, i.isSyncValidate = (e) => e.length === 1;
- }, {}], 170: [function(g, C, i) {
- const e = i;
- e.bignum = g("bn.js"), e.define = g("./asn1/api").define, e.base = g("./asn1/base"), e.constants = g("./asn1/constants"), e.decoders = g("./asn1/decoders"), e.encoders = g("./asn1/encoders");
- }, { "./asn1/api": 171, "./asn1/base": 173, "./asn1/constants": 177, "./asn1/decoders": 179, "./asn1/encoders": 182, "bn.js": 184 }], 171: [function(g, C, i) {
- const e = g("./encoders"), A = g("./decoders"), s = g("inherits");
- function l(n, a) {
- this.name = n, this.body = a, this.decoders = {}, this.encoders = {};
- }
- i.define = function(n, a) {
- return new l(n, a);
- }, l.prototype._createNamed = function(n) {
- const a = this.name;
- function d(o) {
- this._initNamed(o, a);
- }
- return s(d, n), d.prototype._initNamed = function(o, c) {
- n.call(this, o, c);
- }, new d(this);
- }, l.prototype._getDecoder = function(n) {
- return n = n || "der", this.decoders.hasOwnProperty(n) || (this.decoders[n] = this._createNamed(A[n])), this.decoders[n];
- }, l.prototype.decode = function(n, a, d) {
- return this._getDecoder(a).decode(n, d);
- }, l.prototype._getEncoder = function(n) {
- return n = n || "der", this.encoders.hasOwnProperty(n) || (this.encoders[n] = this._createNamed(e[n])), this.encoders[n];
- }, l.prototype.encode = function(n, a, d) {
- return this._getEncoder(a).encode(n, d);
- };
- }, { "./decoders": 179, "./encoders": 182, inherits: 440 }], 172: [function(g, C, i) {
- const e = g("inherits"), A = g("../base/reporter").Reporter, s = g("safer-buffer").Buffer;
- function l(a, d) {
- A.call(this, d), s.isBuffer(a) ? (this.base = a, this.offset = 0, this.length = a.length) : this.error("Input not Buffer");
- }
- function n(a, d) {
- if (Array.isArray(a)) this.length = 0, this.value = a.map(function(o) {
- return n.isEncoderBuffer(o) || (o = new n(o, d)), this.length += o.length, o;
- }, this);
- else if (typeof a == "number") {
- if (!(0 <= a && a <= 255)) return d.error("non-byte EncoderBuffer value");
- this.value = a, this.length = 1;
- } else if (typeof a == "string") this.value = a, this.length = s.byteLength(a);
- else {
- if (!s.isBuffer(a)) return d.error("Unsupported type: " + typeof a);
- this.value = a, this.length = a.length;
- }
- }
- e(l, A), i.DecoderBuffer = l, l.isDecoderBuffer = function(a) {
- return a instanceof l ? !0 : typeof a == "object" && s.isBuffer(a.base) && a.constructor.name === "DecoderBuffer" && typeof a.offset == "number" && typeof a.length == "number" && typeof a.save == "function" && typeof a.restore == "function" && typeof a.isEmpty == "function" && typeof a.readUInt8 == "function" && typeof a.skip == "function" && typeof a.raw == "function";
- }, l.prototype.save = function() {
- return { offset: this.offset, reporter: A.prototype.save.call(this) };
- }, l.prototype.restore = function(a) {
- const d = new l(this.base);
- return d.offset = a.offset, d.length = this.offset, this.offset = a.offset, A.prototype.restore.call(this, a.reporter), d;
- }, l.prototype.isEmpty = function() {
- return this.offset === this.length;
- }, l.prototype.readUInt8 = function(a) {
- return this.offset + 1 <= this.length ? this.base.readUInt8(this.offset++, !0) : this.error(a || "DecoderBuffer overrun");
- }, l.prototype.skip = function(a, d) {
- if (!(this.offset + a <= this.length)) return this.error(d || "DecoderBuffer overrun");
- const o = new l(this.base);
- return o._reporterState = this._reporterState, o.offset = this.offset, o.length = this.offset + a, this.offset += a, o;
- }, l.prototype.raw = function(a) {
- return this.base.slice(a ? a.offset : this.offset, this.length);
- }, i.EncoderBuffer = n, n.isEncoderBuffer = function(a) {
- return a instanceof n ? !0 : typeof a == "object" && a.constructor.name === "EncoderBuffer" && typeof a.length == "number" && typeof a.join == "function";
- }, n.prototype.join = function(a, d) {
- return a || (a = s.alloc(this.length)), d || (d = 0), this.length === 0 || (Array.isArray(this.value) ? this.value.forEach(function(o) {
- o.join(a, d), d += o.length;
- }) : (typeof this.value == "number" ? a[d] = this.value : typeof this.value == "string" ? a.write(this.value, d) : s.isBuffer(this.value) && this.value.copy(a, d), d += this.length)), a;
- };
- }, { "../base/reporter": 175, inherits: 440, "safer-buffer": 495 }], 173: [function(g, C, i) {
- const e = i;
- e.Reporter = g("./reporter").Reporter, e.DecoderBuffer = g("./buffer").DecoderBuffer, e.EncoderBuffer = g("./buffer").EncoderBuffer, e.Node = g("./node");
- }, { "./buffer": 172, "./node": 174, "./reporter": 175 }], 174: [function(g, C, i) {
- const e = g("../base/reporter").Reporter, A = g("../base/buffer").EncoderBuffer, s = g("../base/buffer").DecoderBuffer, l = g("minimalistic-assert"), n = ["seq", "seqof", "set", "setof", "objid", "bool", "gentime", "utctime", "null_", "enum", "int", "objDesc", "bitstr", "bmpstr", "charstr", "genstr", "graphstr", "ia5str", "iso646str", "numstr", "octstr", "printstr", "t61str", "unistr", "utf8str", "videostr"], a = ["key", "obj", "use", "optional", "explicit", "implicit", "def", "choice", "any", "contains"].concat(n);
- function d(c, r, h) {
- const b = {};
- this._baseState = b, b.name = h, b.enc = c, b.parent = r || null, b.children = null, b.tag = null, b.args = null, b.reverseArgs = null, b.choice = null, b.optional = !1, b.any = !1, b.obj = !1, b.use = null, b.useDecoder = null, b.key = null, b.default = null, b.explicit = null, b.implicit = null, b.contains = null, b.parent || (b.children = [], this._wrap());
- }
- C.exports = d;
- const o = ["enc", "parent", "children", "tag", "args", "reverseArgs", "choice", "optional", "any", "obj", "use", "alteredUse", "key", "default", "explicit", "implicit", "contains"];
- d.prototype.clone = function() {
- const c = this._baseState, r = {};
- o.forEach(function(b) {
- r[b] = c[b];
- });
- const h = new this.constructor(r.parent);
- return h._baseState = r, h;
- }, d.prototype._wrap = function() {
- const c = this._baseState;
- a.forEach(function(r) {
- this[r] = function() {
- const h = new this.constructor(this);
- return c.children.push(h), h[r].apply(h, arguments);
- };
- }, this);
- }, d.prototype._init = function(c) {
- const r = this._baseState;
- l(r.parent === null), c.call(this), r.children = r.children.filter(function(h) {
- return h._baseState.parent === this;
- }, this), l.equal(r.children.length, 1, "Root node can have only one child");
- }, d.prototype._useArgs = function(c) {
- const r = this._baseState, h = c.filter(function(b) {
- return b instanceof this.constructor;
- }, this);
- c = c.filter(function(b) {
- return !(b instanceof this.constructor);
- }, this), h.length !== 0 && (l(r.children === null), r.children = h, h.forEach(function(b) {
- b._baseState.parent = this;
- }, this)), c.length !== 0 && (l(r.args === null), r.args = c, r.reverseArgs = c.map(function(b) {
- if (typeof b != "object" || b.constructor !== Object) return b;
- const u = {};
- return Object.keys(b).forEach(function(m) {
- m == (0 | m) && (m |= 0);
- const Z = b[m];
- u[Z] = m;
- }), u;
- }));
- }, ["_peekTag", "_decodeTag", "_use", "_decodeStr", "_decodeObjid", "_decodeTime", "_decodeNull", "_decodeInt", "_decodeBool", "_decodeList", "_encodeComposite", "_encodeStr", "_encodeObjid", "_encodeTime", "_encodeNull", "_encodeInt", "_encodeBool"].forEach(function(c) {
- d.prototype[c] = function() {
- const r = this._baseState;
- throw new Error(c + " not implemented for encoding: " + r.enc);
- };
- }), n.forEach(function(c) {
- d.prototype[c] = function() {
- const r = this._baseState, h = Array.prototype.slice.call(arguments);
- return l(r.tag === null), r.tag = c, this._useArgs(h), this;
- };
- }), d.prototype.use = function(c) {
- l(c);
- const r = this._baseState;
- return l(r.use === null), r.use = c, this;
- }, d.prototype.optional = function() {
- return this._baseState.optional = !0, this;
- }, d.prototype.def = function(c) {
- const r = this._baseState;
- return l(r.default === null), r.default = c, r.optional = !0, this;
- }, d.prototype.explicit = function(c) {
- const r = this._baseState;
- return l(r.explicit === null && r.implicit === null), r.explicit = c, this;
- }, d.prototype.implicit = function(c) {
- const r = this._baseState;
- return l(r.explicit === null && r.implicit === null), r.implicit = c, this;
- }, d.prototype.obj = function() {
- const c = this._baseState, r = Array.prototype.slice.call(arguments);
- return c.obj = !0, r.length !== 0 && this._useArgs(r), this;
- }, d.prototype.key = function(c) {
- const r = this._baseState;
- return l(r.key === null), r.key = c, this;
- }, d.prototype.any = function() {
- return this._baseState.any = !0, this;
- }, d.prototype.choice = function(c) {
- const r = this._baseState;
- return l(r.choice === null), r.choice = c, this._useArgs(Object.keys(c).map(function(h) {
- return c[h];
- })), this;
- }, d.prototype.contains = function(c) {
- const r = this._baseState;
- return l(r.use === null), r.contains = c, this;
- }, d.prototype._decode = function(c, r) {
- const h = this._baseState;
- if (h.parent === null) return c.wrapResult(h.children[0]._decode(c, r));
- let b, u = h.default, m = !0, Z = null;
- if (h.key !== null && (Z = c.enterKey(h.key)), h.optional) {
- let p = null;
- if (h.explicit !== null ? p = h.explicit : h.implicit !== null ? p = h.implicit : h.tag !== null && (p = h.tag), p !== null || h.any) {
- if (m = this._peekTag(c, p, h.any), c.isError(m)) return m;
- } else {
- const Y = c.save();
- try {
- h.choice === null ? this._decodeGeneric(h.tag, c, r) : this._decodeChoice(c, r), m = !0;
- } catch {
- m = !1;
- }
- c.restore(Y);
- }
- }
- if (h.obj && m && (b = c.enterObject()), m) {
- if (h.explicit !== null) {
- const Y = this._decodeTag(c, h.explicit);
- if (c.isError(Y)) return Y;
- c = Y;
- }
- const p = c.offset;
- if (h.use === null && h.choice === null) {
- let Y;
- h.any && (Y = c.save());
- const R = this._decodeTag(c, h.implicit !== null ? h.implicit : h.tag, h.any);
- if (c.isError(R)) return R;
- h.any ? u = c.raw(Y) : c = R;
- }
- if (r && r.track && h.tag !== null && r.track(c.path(), p, c.length, "tagged"), r && r.track && h.tag !== null && r.track(c.path(), c.offset, c.length, "content"), h.any || (u = h.choice === null ? this._decodeGeneric(h.tag, c, r) : this._decodeChoice(c, r)), c.isError(u)) return u;
- if (h.any || h.choice !== null || h.children === null || h.children.forEach(function(Y) {
- Y._decode(c, r);
- }), h.contains && (h.tag === "octstr" || h.tag === "bitstr")) {
- const Y = new s(u);
- u = this._getUse(h.contains, c._reporterState.obj)._decode(Y, r);
- }
- }
- return h.obj && m && (u = c.leaveObject(b)), h.key === null || u === null && m !== !0 ? Z !== null && c.exitKey(Z) : c.leaveKey(Z, h.key, u), u;
- }, d.prototype._decodeGeneric = function(c, r, h) {
- const b = this._baseState;
- return c === "seq" || c === "set" ? null : c === "seqof" || c === "setof" ? this._decodeList(r, c, b.args[0], h) : /str$/.test(c) ? this._decodeStr(r, c, h) : c === "objid" && b.args ? this._decodeObjid(r, b.args[0], b.args[1], h) : c === "objid" ? this._decodeObjid(r, null, null, h) : c === "gentime" || c === "utctime" ? this._decodeTime(r, c, h) : c === "null_" ? this._decodeNull(r, h) : c === "bool" ? this._decodeBool(r, h) : c === "objDesc" ? this._decodeStr(r, c, h) : c === "int" || c === "enum" ? this._decodeInt(r, b.args && b.args[0], h) : b.use !== null ? this._getUse(b.use, r._reporterState.obj)._decode(r, h) : r.error("unknown tag: " + c);
- }, d.prototype._getUse = function(c, r) {
- const h = this._baseState;
- return h.useDecoder = this._use(c, r), l(h.useDecoder._baseState.parent === null), h.useDecoder = h.useDecoder._baseState.children[0], h.implicit !== h.useDecoder._baseState.implicit && (h.useDecoder = h.useDecoder.clone(), h.useDecoder._baseState.implicit = h.implicit), h.useDecoder;
- }, d.prototype._decodeChoice = function(c, r) {
- const h = this._baseState;
- let b = null, u = !1;
- return Object.keys(h.choice).some(function(m) {
- const Z = c.save(), p = h.choice[m];
- try {
- const Y = p._decode(c, r);
- if (c.isError(Y)) return !1;
- b = { type: m, value: Y }, u = !0;
- } catch {
- return c.restore(Z), !1;
- }
- return !0;
- }, this), u ? b : c.error("Choice not matched");
- }, d.prototype._createEncoderBuffer = function(c) {
- return new A(c, this.reporter);
- }, d.prototype._encode = function(c, r, h) {
- const b = this._baseState;
- if (b.default !== null && b.default === c) return;
- const u = this._encodeValue(c, r, h);
- return u === void 0 || this._skipDefault(u, r, h) ? void 0 : u;
- }, d.prototype._encodeValue = function(c, r, h) {
- const b = this._baseState;
- if (b.parent === null) return b.children[0]._encode(c, r || new e());
- let u = null;
- if (this.reporter = r, b.optional && c === void 0) {
- if (b.default === null) return;
- c = b.default;
- }
- let m = null, Z = !1;
- if (b.any) u = this._createEncoderBuffer(c);
- else if (b.choice) u = this._encodeChoice(c, r);
- else if (b.contains) m = this._getUse(b.contains, h)._encode(c, r), Z = !0;
- else if (b.children) m = b.children.map(function(p) {
- if (p._baseState.tag === "null_") return p._encode(null, r, c);
- if (p._baseState.key === null) return r.error("Child should have a key");
- const Y = r.enterKey(p._baseState.key);
- if (typeof c != "object") return r.error("Child expected, but input is not object");
- const R = p._encode(c[p._baseState.key], r, c);
- return r.leaveKey(Y), R;
- }, this).filter(function(p) {
- return p;
- }), m = this._createEncoderBuffer(m);
- else if (b.tag === "seqof" || b.tag === "setof") {
- if (!b.args || b.args.length !== 1) return r.error("Too many args for : " + b.tag);
- if (!Array.isArray(c)) return r.error("seqof/setof, but data is not Array");
- const p = this.clone();
- p._baseState.implicit = null, m = this._createEncoderBuffer(c.map(function(Y) {
- const R = this._baseState;
- return this._getUse(R.args[0], c)._encode(Y, r);
- }, p));
- } else b.use !== null ? u = this._getUse(b.use, h)._encode(c, r) : (m = this._encodePrimitive(b.tag, c), Z = !0);
- if (!b.any && b.choice === null) {
- const p = b.implicit !== null ? b.implicit : b.tag, Y = b.implicit === null ? "universal" : "context";
- p === null ? b.use === null && r.error("Tag could be omitted only for .use()") : b.use === null && (u = this._encodeComposite(p, Z, Y, m));
- }
- return b.explicit !== null && (u = this._encodeComposite(b.explicit, !1, "context", u)), u;
- }, d.prototype._encodeChoice = function(c, r) {
- const h = this._baseState, b = h.choice[c.type];
- return b || l(!1, c.type + " not found in " + JSON.stringify(Object.keys(h.choice))), b._encode(c.value, r);
- }, d.prototype._encodePrimitive = function(c, r) {
- const h = this._baseState;
- if (/str$/.test(c)) return this._encodeStr(r, c);
- if (c === "objid" && h.args) return this._encodeObjid(r, h.reverseArgs[0], h.args[1]);
- if (c === "objid") return this._encodeObjid(r, null, null);
- if (c === "gentime" || c === "utctime") return this._encodeTime(r, c);
- if (c === "null_") return this._encodeNull();
- if (c === "int" || c === "enum") return this._encodeInt(r, h.args && h.reverseArgs[0]);
- if (c === "bool") return this._encodeBool(r);
- if (c === "objDesc") return this._encodeStr(r, c);
- throw new Error("Unsupported tag: " + c);
- }, d.prototype._isNumstr = function(c) {
- return /^[0-9 ]*$/.test(c);
- }, d.prototype._isPrintstr = function(c) {
- return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(c);
- };
- }, { "../base/buffer": 172, "../base/reporter": 175, "minimalistic-assert": 453 }], 175: [function(g, C, i) {
- const e = g("inherits");
- function A(l) {
- this._reporterState = { obj: null, path: [], options: l || {}, errors: [] };
- }
- function s(l, n) {
- this.path = l, this.rethrow(n);
- }
- i.Reporter = A, A.prototype.isError = function(l) {
- return l instanceof s;
- }, A.prototype.save = function() {
- const l = this._reporterState;
- return { obj: l.obj, pathLen: l.path.length };
- }, A.prototype.restore = function(l) {
- const n = this._reporterState;
- n.obj = l.obj, n.path = n.path.slice(0, l.pathLen);
- }, A.prototype.enterKey = function(l) {
- return this._reporterState.path.push(l);
- }, A.prototype.exitKey = function(l) {
- const n = this._reporterState;
- n.path = n.path.slice(0, l - 1);
- }, A.prototype.leaveKey = function(l, n, a) {
- const d = this._reporterState;
- this.exitKey(l), d.obj !== null && (d.obj[n] = a);
- }, A.prototype.path = function() {
- return this._reporterState.path.join("/");
- }, A.prototype.enterObject = function() {
- const l = this._reporterState, n = l.obj;
- return l.obj = {}, n;
- }, A.prototype.leaveObject = function(l) {
- const n = this._reporterState, a = n.obj;
- return n.obj = l, a;
- }, A.prototype.error = function(l) {
- let n;
- const a = this._reporterState, d = l instanceof s;
- if (n = d ? l : new s(a.path.map(function(o) {
- return "[" + JSON.stringify(o) + "]";
- }).join(""), l.message || l, l.stack), !a.options.partial) throw n;
- return d || a.errors.push(n), n;
- }, A.prototype.wrapResult = function(l) {
- const n = this._reporterState;
- return n.options.partial ? { result: this.isError(l) ? null : l, errors: n.errors } : l;
- }, e(s, Error), s.prototype.rethrow = function(l) {
- if (this.message = l + " at: " + (this.path || "(shallow)"), Error.captureStackTrace && Error.captureStackTrace(this, s), !this.stack) try {
- throw new Error(this.message);
- } catch (n) {
- this.stack = n.stack;
- }
- return this;
- };
- }, { inherits: 440 }], 176: [function(g, C, i) {
- function e(A) {
- const s = {};
- return Object.keys(A).forEach(function(l) {
- (0 | l) == l && (l |= 0);
- const n = A[l];
- s[n] = l;
- }), s;
- }
- i.tagClass = { 0: "universal", 1: "application", 2: "context", 3: "private" }, i.tagClassByName = e(i.tagClass), i.tag = { 0: "end", 1: "bool", 2: "int", 3: "bitstr", 4: "octstr", 5: "null_", 6: "objid", 7: "objDesc", 8: "external", 9: "real", 10: "enum", 11: "embed", 12: "utf8str", 13: "relativeOid", 16: "seq", 17: "set", 18: "numstr", 19: "printstr", 20: "t61str", 21: "videostr", 22: "ia5str", 23: "utctime", 24: "gentime", 25: "graphstr", 26: "iso646str", 27: "genstr", 28: "unistr", 29: "charstr", 30: "bmpstr" }, i.tagByName = e(i.tag);
- }, {}], 177: [function(g, C, i) {
- const e = i;
- e._reverse = function(A) {
- const s = {};
- return Object.keys(A).forEach(function(l) {
- (0 | l) == l && (l |= 0);
- const n = A[l];
- s[n] = l;
- }), s;
- }, e.der = g("./der");
- }, { "./der": 176 }], 178: [function(g, C, i) {
- const e = g("inherits"), A = g("bn.js"), s = g("../base/buffer").DecoderBuffer, l = g("../base/node"), n = g("../constants/der");
- function a(r) {
- this.enc = "der", this.name = r.name, this.entity = r, this.tree = new d(), this.tree._init(r.body);
- }
- function d(r) {
- l.call(this, "der", r);
- }
- function o(r, h) {
- let b = r.readUInt8(h);
- if (r.isError(b)) return b;
- const u = n.tagClass[b >> 6], m = (32 & b) == 0;
- if ((31 & b) == 31) {
- let Z = b;
- for (b = 0; (128 & Z) == 128; ) {
- if (Z = r.readUInt8(h), r.isError(Z)) return Z;
- b <<= 7, b |= 127 & Z;
- }
- } else b &= 31;
- return { cls: u, primitive: m, tag: b, tagStr: n.tag[b] };
- }
- function c(r, h, b) {
- let u = r.readUInt8(b);
- if (r.isError(u)) return u;
- if (!h && u === 128) return null;
- if ((128 & u) == 0) return u;
- const m = 127 & u;
- if (m > 4) return r.error("length octect is too long");
- u = 0;
- for (let Z = 0; Z < m; Z++) {
- u <<= 8;
- const p = r.readUInt8(b);
- if (r.isError(p)) return p;
- u |= p;
- }
- return u;
- }
- C.exports = a, a.prototype.decode = function(r, h) {
- return s.isDecoderBuffer(r) || (r = new s(r, h)), this.tree._decode(r, h);
- }, e(d, l), d.prototype._peekTag = function(r, h, b) {
- if (r.isEmpty()) return !1;
- const u = r.save(), m = o(r, 'Failed to peek tag: "' + h + '"');
- return r.isError(m) ? m : (r.restore(u), m.tag === h || m.tagStr === h || m.tagStr + "of" === h || b);
- }, d.prototype._decodeTag = function(r, h, b) {
- const u = o(r, 'Failed to decode tag of "' + h + '"');
- if (r.isError(u)) return u;
- let m = c(r, u.primitive, 'Failed to get length of "' + h + '"');
- if (r.isError(m)) return m;
- if (!b && u.tag !== h && u.tagStr !== h && u.tagStr + "of" !== h) return r.error('Failed to match tag: "' + h + '"');
- if (u.primitive || m !== null) return r.skip(m, 'Failed to match body of: "' + h + '"');
- const Z = r.save(), p = this._skipUntilEnd(r, 'Failed to skip indefinite length body: "' + this.tag + '"');
- return r.isError(p) ? p : (m = r.offset - Z.offset, r.restore(Z), r.skip(m, 'Failed to match body of: "' + h + '"'));
- }, d.prototype._skipUntilEnd = function(r, h) {
- for (; ; ) {
- const b = o(r, h);
- if (r.isError(b)) return b;
- const u = c(r, b.primitive, h);
- if (r.isError(u)) return u;
- let m;
- if (m = b.primitive || u !== null ? r.skip(u) : this._skipUntilEnd(r, h), r.isError(m)) return m;
- if (b.tagStr === "end") break;
- }
- }, d.prototype._decodeList = function(r, h, b, u) {
- const m = [];
- for (; !r.isEmpty(); ) {
- const Z = this._peekTag(r, "end");
- if (r.isError(Z)) return Z;
- const p = b.decode(r, "der", u);
- if (r.isError(p) && Z) break;
- m.push(p);
- }
- return m;
- }, d.prototype._decodeStr = function(r, h) {
- if (h === "bitstr") {
- const b = r.readUInt8();
- return r.isError(b) ? b : { unused: b, data: r.raw() };
- }
- if (h === "bmpstr") {
- const b = r.raw();
- if (b.length % 2 == 1) return r.error("Decoding of string type: bmpstr length mismatch");
- let u = "";
- for (let m = 0; m < b.length / 2; m++) u += String.fromCharCode(b.readUInt16BE(2 * m));
- return u;
- }
- if (h === "numstr") {
- const b = r.raw().toString("ascii");
- return this._isNumstr(b) ? b : r.error("Decoding of string type: numstr unsupported characters");
- }
- if (h === "octstr" || h === "objDesc") return r.raw();
- if (h === "printstr") {
- const b = r.raw().toString("ascii");
- return this._isPrintstr(b) ? b : r.error("Decoding of string type: printstr unsupported characters");
- }
- return /str$/.test(h) ? r.raw().toString() : r.error("Decoding of string type: " + h + " unsupported");
- }, d.prototype._decodeObjid = function(r, h, b) {
- let u;
- const m = [];
- let Z = 0, p = 0;
- for (; !r.isEmpty(); ) p = r.readUInt8(), Z <<= 7, Z |= 127 & p, (128 & p) == 0 && (m.push(Z), Z = 0);
- 128 & p && m.push(Z);
- const Y = m[0] / 40 | 0, R = m[0] % 40;
- if (u = b ? m : [Y, R].concat(m.slice(1)), h) {
- let X = h[u.join(" ")];
- X === void 0 && (X = h[u.join(".")]), X !== void 0 && (u = X);
- }
- return u;
- }, d.prototype._decodeTime = function(r, h) {
- const b = r.raw().toString();
- let u, m, Z, p, Y, R;
- if (h === "gentime") u = 0 | b.slice(0, 4), m = 0 | b.slice(4, 6), Z = 0 | b.slice(6, 8), p = 0 | b.slice(8, 10), Y = 0 | b.slice(10, 12), R = 0 | b.slice(12, 14);
- else {
- if (h !== "utctime") return r.error("Decoding " + h + " time is not supported yet");
- u = 0 | b.slice(0, 2), m = 0 | b.slice(2, 4), Z = 0 | b.slice(4, 6), p = 0 | b.slice(6, 8), Y = 0 | b.slice(8, 10), R = 0 | b.slice(10, 12), u = u < 70 ? 2e3 + u : 1900 + u;
- }
- return Date.UTC(u, m - 1, Z, p, Y, R, 0);
- }, d.prototype._decodeNull = function() {
- return null;
- }, d.prototype._decodeBool = function(r) {
- const h = r.readUInt8();
- return r.isError(h) ? h : h !== 0;
- }, d.prototype._decodeInt = function(r, h) {
- const b = r.raw();
- let u = new A(b);
- return h && (u = h[u.toString(10)] || u), u;
- }, d.prototype._use = function(r, h) {
- return typeof r == "function" && (r = r(h)), r._getDecoder("der").tree;
- };
- }, { "../base/buffer": 172, "../base/node": 174, "../constants/der": 176, "bn.js": 184, inherits: 440 }], 179: [function(g, C, i) {
- const e = i;
- e.der = g("./der"), e.pem = g("./pem");
- }, { "./der": 178, "./pem": 180 }], 180: [function(g, C, i) {
- const e = g("inherits"), A = g("safer-buffer").Buffer, s = g("./der");
- function l(n) {
- s.call(this, n), this.enc = "pem";
- }
- e(l, s), C.exports = l, l.prototype.decode = function(n, a) {
- const d = n.toString().split(/[\r\n]+/g), o = a.label.toUpperCase(), c = /^-----(BEGIN|END) ([^-]+)-----$/;
- let r = -1, h = -1;
- for (let m = 0; m < d.length; m++) {
- const Z = d[m].match(c);
- if (Z !== null && Z[2] === o) {
- if (r !== -1) {
- if (Z[1] !== "END") break;
- h = m;
- break;
- }
- if (Z[1] !== "BEGIN") break;
- r = m;
- }
- }
- if (r === -1 || h === -1) throw new Error("PEM section not found for: " + o);
- const b = d.slice(r + 1, h).join("");
- b.replace(/[^a-z0-9+/=]+/gi, "");
- const u = A.from(b, "base64");
- return s.prototype.decode.call(this, u, a);
- };
- }, { "./der": 178, inherits: 440, "safer-buffer": 495 }], 181: [function(g, C, i) {
- const e = g("inherits"), A = g("safer-buffer").Buffer, s = g("../base/node"), l = g("../constants/der");
- function n(o) {
- this.enc = "der", this.name = o.name, this.entity = o, this.tree = new a(), this.tree._init(o.body);
- }
- function a(o) {
- s.call(this, "der", o);
- }
- function d(o) {
- return o < 10 ? "0" + o : o;
- }
- C.exports = n, n.prototype.encode = function(o, c) {
- return this.tree._encode(o, c).join();
- }, e(a, s), a.prototype._encodeComposite = function(o, c, r, h) {
- const b = function(Z, p, Y, R) {
- let X;
- if (Z === "seqof" ? Z = "seq" : Z === "setof" && (Z = "set"), l.tagByName.hasOwnProperty(Z)) X = l.tagByName[Z];
- else {
- if (typeof Z != "number" || (0 | Z) !== Z) return R.error("Unknown tag: " + Z);
- X = Z;
- }
- return X >= 31 ? R.error("Multi-octet tag encoding unsupported") : (p || (X |= 32), X |= l.tagClassByName[Y || "universal"] << 6, X);
- }(o, c, r, this.reporter);
- if (h.length < 128) {
- const Z = A.alloc(2);
- return Z[0] = b, Z[1] = h.length, this._createEncoderBuffer([Z, h]);
- }
- let u = 1;
- for (let Z = h.length; Z >= 256; Z >>= 8) u++;
- const m = A.alloc(2 + u);
- m[0] = b, m[1] = 128 | u;
- for (let Z = 1 + u, p = h.length; p > 0; Z--, p >>= 8) m[Z] = 255 & p;
- return this._createEncoderBuffer([m, h]);
- }, a.prototype._encodeStr = function(o, c) {
- if (c === "bitstr") return this._createEncoderBuffer([0 | o.unused, o.data]);
- if (c === "bmpstr") {
- const r = A.alloc(2 * o.length);
- for (let h = 0; h < o.length; h++) r.writeUInt16BE(o.charCodeAt(h), 2 * h);
- return this._createEncoderBuffer(r);
- }
- return c === "numstr" ? this._isNumstr(o) ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: numstr supports only digits and space") : c === "printstr" ? this._isPrintstr(o) ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: printstr supports only latin upper and lower case letters, digits, space, apostrophe, left and rigth parenthesis, plus sign, comma, hyphen, dot, slash, colon, equal sign, question mark") : /str$/.test(c) || c === "objDesc" ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: " + c + " unsupported");
- }, a.prototype._encodeObjid = function(o, c, r) {
- if (typeof o == "string") {
- if (!c) return this.reporter.error("string objid given, but no values map found");
- if (!c.hasOwnProperty(o)) return this.reporter.error("objid not found in values map");
- o = c[o].split(/[\s.]+/g);
- for (let m = 0; m < o.length; m++) o[m] |= 0;
- } else if (Array.isArray(o)) {
- o = o.slice();
- for (let m = 0; m < o.length; m++) o[m] |= 0;
- }
- if (!Array.isArray(o)) return this.reporter.error("objid() should be either array or string, got: " + JSON.stringify(o));
- if (!r) {
- if (o[1] >= 40) return this.reporter.error("Second objid identifier OOB");
- o.splice(0, 2, 40 * o[0] + o[1]);
- }
- let h = 0;
- for (let m = 0; m < o.length; m++) {
- let Z = o[m];
- for (h++; Z >= 128; Z >>= 7) h++;
- }
- const b = A.alloc(h);
- let u = b.length - 1;
- for (let m = o.length - 1; m >= 0; m--) {
- let Z = o[m];
- for (b[u--] = 127 & Z; (Z >>= 7) > 0; ) b[u--] = 128 | 127 & Z;
- }
- return this._createEncoderBuffer(b);
- }, a.prototype._encodeTime = function(o, c) {
- let r;
- const h = new Date(o);
- return c === "gentime" ? r = [d(h.getUTCFullYear()), d(h.getUTCMonth() + 1), d(h.getUTCDate()), d(h.getUTCHours()), d(h.getUTCMinutes()), d(h.getUTCSeconds()), "Z"].join("") : c === "utctime" ? r = [d(h.getUTCFullYear() % 100), d(h.getUTCMonth() + 1), d(h.getUTCDate()), d(h.getUTCHours()), d(h.getUTCMinutes()), d(h.getUTCSeconds()), "Z"].join("") : this.reporter.error("Encoding " + c + " time is not supported yet"), this._encodeStr(r, "octstr");
- }, a.prototype._encodeNull = function() {
- return this._createEncoderBuffer("");
- }, a.prototype._encodeInt = function(o, c) {
- if (typeof o == "string") {
- if (!c) return this.reporter.error("String int or enum given, but no values map");
- if (!c.hasOwnProperty(o)) return this.reporter.error("Values map doesn't contain: " + JSON.stringify(o));
- o = c[o];
- }
- if (typeof o != "number" && !A.isBuffer(o)) {
- const b = o.toArray();
- !o.sign && 128 & b[0] && b.unshift(0), o = A.from(b);
- }
- if (A.isBuffer(o)) {
- let b = o.length;
- o.length === 0 && b++;
- const u = A.alloc(b);
- return o.copy(u), o.length === 0 && (u[0] = 0), this._createEncoderBuffer(u);
- }
- if (o < 128) return this._createEncoderBuffer(o);
- if (o < 256) return this._createEncoderBuffer([0, o]);
- let r = 1;
- for (let b = o; b >= 256; b >>= 8) r++;
- const h = new Array(r);
- for (let b = h.length - 1; b >= 0; b--) h[b] = 255 & o, o >>= 8;
- return 128 & h[0] && h.unshift(0), this._createEncoderBuffer(A.from(h));
- }, a.prototype._encodeBool = function(o) {
- return this._createEncoderBuffer(o ? 255 : 0);
- }, a.prototype._use = function(o, c) {
- return typeof o == "function" && (o = o(c)), o._getEncoder("der").tree;
- }, a.prototype._skipDefault = function(o, c, r) {
- const h = this._baseState;
- let b;
- if (h.default === null) return !1;
- const u = o.join();
- if (h.defaultBuffer === void 0 && (h.defaultBuffer = this._encodeValue(h.default, c, r).join()), u.length !== h.defaultBuffer.length) return !1;
- for (b = 0; b < u.length; b++) if (u[b] !== h.defaultBuffer[b]) return !1;
- return !0;
- };
- }, { "../base/node": 174, "../constants/der": 176, inherits: 440, "safer-buffer": 495 }], 182: [function(g, C, i) {
- const e = i;
- e.der = g("./der"), e.pem = g("./pem");
- }, { "./der": 181, "./pem": 183 }], 183: [function(g, C, i) {
- const e = g("inherits"), A = g("./der");
- function s(l) {
- A.call(this, l), this.enc = "pem";
- }
- e(s, A), C.exports = s, s.prototype.encode = function(l, n) {
- const a = A.prototype.encode.call(this, l).toString("base64"), d = ["-----BEGIN " + n.label + "-----"];
- for (let o = 0; o < a.length; o += 64) d.push(a.slice(o, o + 64));
- return d.push("-----END " + n.label + "-----"), d.join(`
- `);
- };
- }, { "./der": 181, inherits: 440 }], 184: [function(g, C, i) {
- (function(e, A) {
- function s(V, N) {
- if (!V) throw new Error(N || "Assertion failed");
- }
- function l(V, N) {
- V.super_ = N;
- var B = function() {
- };
- B.prototype = N.prototype, V.prototype = new B(), V.prototype.constructor = V;
- }
- function n(V, N, B) {
- if (n.isBN(V)) return V;
- this.negative = 0, this.words = null, this.length = 0, this.red = null, V !== null && (N !== "le" && N !== "be" || (B = N, N = 10), this._init(V || 0, N || 10, B || "be"));
- }
- var a;
- typeof e == "object" ? e.exports = n : (void 0).BN = n, n.BN = n, n.wordSize = 26;
- try {
- a = typeof window < "u" && window.Buffer !== void 0 ? window.Buffer : g("buffer").Buffer;
- } catch {
- }
- function d(V, N) {
- var B = V.charCodeAt(N);
- return B >= 65 && B <= 70 ? B - 55 : B >= 97 && B <= 102 ? B - 87 : B - 48 & 15;
- }
- function o(V, N, B) {
- var G = d(V, B);
- return B - 1 >= N && (G |= d(V, B - 1) << 4), G;
- }
- function c(V, N, B, G) {
- for (var w = 0, W = Math.min(V.length, B), y = N; y < W; y++) {
- var f = V.charCodeAt(y) - 48;
- w *= G, w += f >= 49 ? f - 49 + 10 : f >= 17 ? f - 17 + 10 : f;
- }
- return w;
- }
- n.isBN = function(V) {
- return V instanceof n || V !== null && typeof V == "object" && V.constructor.wordSize === n.wordSize && Array.isArray(V.words);
- }, n.max = function(V, N) {
- return V.cmp(N) > 0 ? V : N;
- }, n.min = function(V, N) {
- return V.cmp(N) < 0 ? V : N;
- }, n.prototype._init = function(V, N, B) {
- if (typeof V == "number") return this._initNumber(V, N, B);
- if (typeof V == "object") return this._initArray(V, N, B);
- N === "hex" && (N = 16), s(N === (0 | N) && N >= 2 && N <= 36);
- var G = 0;
- (V = V.toString().replace(/\s+/g, ""))[0] === "-" && (G++, this.negative = 1), G < V.length && (N === 16 ? this._parseHex(V, G, B) : (this._parseBase(V, N, G), B === "le" && this._initArray(this.toArray(), N, B)));
- }, n.prototype._initNumber = function(V, N, B) {
- V < 0 && (this.negative = 1, V = -V), V < 67108864 ? (this.words = [67108863 & V], this.length = 1) : V < 4503599627370496 ? (this.words = [67108863 & V, V / 67108864 & 67108863], this.length = 2) : (s(V < 9007199254740992), this.words = [67108863 & V, V / 67108864 & 67108863, 1], this.length = 3), B === "le" && this._initArray(this.toArray(), N, B);
- }, n.prototype._initArray = function(V, N, B) {
- if (s(typeof V.length == "number"), V.length <= 0) return this.words = [0], this.length = 1, this;
- this.length = Math.ceil(V.length / 3), this.words = new Array(this.length);
- for (var G = 0; G < this.length; G++) this.words[G] = 0;
- var w, W, y = 0;
- if (B === "be") for (G = V.length - 1, w = 0; G >= 0; G -= 3) W = V[G] | V[G - 1] << 8 | V[G - 2] << 16, this.words[w] |= W << y & 67108863, this.words[w + 1] = W >>> 26 - y & 67108863, (y += 24) >= 26 && (y -= 26, w++);
- else if (B === "le") for (G = 0, w = 0; G < V.length; G += 3) W = V[G] | V[G + 1] << 8 | V[G + 2] << 16, this.words[w] |= W << y & 67108863, this.words[w + 1] = W >>> 26 - y & 67108863, (y += 24) >= 26 && (y -= 26, w++);
- return this.strip();
- }, n.prototype._parseHex = function(V, N, B) {
- this.length = Math.ceil((V.length - N) / 6), this.words = new Array(this.length);
- for (var G = 0; G < this.length; G++) this.words[G] = 0;
- var w, W = 0, y = 0;
- if (B === "be") for (G = V.length - 1; G >= N; G -= 2) w = o(V, N, G) << W, this.words[y] |= 67108863 & w, W >= 18 ? (W -= 18, y += 1, this.words[y] |= w >>> 26) : W += 8;
- else for (G = (V.length - N) % 2 == 0 ? N + 1 : N; G < V.length; G += 2) w = o(V, N, G) << W, this.words[y] |= 67108863 & w, W >= 18 ? (W -= 18, y += 1, this.words[y] |= w >>> 26) : W += 8;
- this.strip();
- }, n.prototype._parseBase = function(V, N, B) {
- this.words = [0], this.length = 1;
- for (var G = 0, w = 1; w <= 67108863; w *= N) G++;
- G--, w = w / N | 0;
- for (var W = V.length - B, y = W % G, f = Math.min(W, W - y) + B, D = 0, F = B; F < f; F += G) D = c(V, F, F + G, N), this.imuln(w), this.words[0] + D < 67108864 ? this.words[0] += D : this._iaddn(D);
- if (y !== 0) {
- var T = 1;
- for (D = c(V, F, V.length, N), F = 0; F < y; F++) T *= N;
- this.imuln(T), this.words[0] + D < 67108864 ? this.words[0] += D : this._iaddn(D);
- }
- this.strip();
- }, n.prototype.copy = function(V) {
- V.words = new Array(this.length);
- for (var N = 0; N < this.length; N++) V.words[N] = this.words[N];
- V.length = this.length, V.negative = this.negative, V.red = this.red;
- }, n.prototype.clone = function() {
- var V = new n(null);
- return this.copy(V), V;
- }, n.prototype._expand = function(V) {
- for (; this.length < V; ) this.words[this.length++] = 0;
- return this;
- }, n.prototype.strip = function() {
- for (; this.length > 1 && this.words[this.length - 1] === 0; ) this.length--;
- return this._normSign();
- }, n.prototype._normSign = function() {
- return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;
- }, n.prototype.inspect = function() {
- return (this.red ? "<BN-R: " : "<BN: ") + this.toString(16) + ">";
- };
- var r = ["", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000", "000000000", "0000000000", "00000000000", "000000000000", "0000000000000", "00000000000000", "000000000000000", "0000000000000000", "00000000000000000", "000000000000000000", "0000000000000000000", "00000000000000000000", "000000000000000000000", "0000000000000000000000", "00000000000000000000000", "000000000000000000000000", "0000000000000000000000000"], h = [0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], b = [0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 1e7, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64e6, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 243e5, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176];
- function u(V, N, B) {
- B.negative = N.negative ^ V.negative;
- var G = V.length + N.length | 0;
- B.length = G, G = G - 1 | 0;
- var w = 0 | V.words[0], W = 0 | N.words[0], y = w * W, f = 67108863 & y, D = y / 67108864 | 0;
- B.words[0] = f;
- for (var F = 1; F < G; F++) {
- for (var T = D >>> 26, Q = 67108863 & D, P = Math.min(F, N.length - 1), L = Math.max(0, F - V.length + 1); L <= P; L++) {
- var E = F - L | 0;
- T += (y = (w = 0 | V.words[E]) * (W = 0 | N.words[L]) + Q) / 67108864 | 0, Q = 67108863 & y;
- }
- B.words[F] = 0 | Q, D = 0 | T;
- }
- return D !== 0 ? B.words[F] = 0 | D : B.length--, B.strip();
- }
- n.prototype.toString = function(V, N) {
- var B;
- if (N = 0 | N || 1, (V = V || 10) === 16 || V === "hex") {
- B = "";
- for (var G = 0, w = 0, W = 0; W < this.length; W++) {
- var y = this.words[W], f = (16777215 & (y << G | w)).toString(16);
- B = (w = y >>> 24 - G & 16777215) !== 0 || W !== this.length - 1 ? r[6 - f.length] + f + B : f + B, (G += 2) >= 26 && (G -= 26, W--);
- }
- for (w !== 0 && (B = w.toString(16) + B); B.length % N != 0; ) B = "0" + B;
- return this.negative !== 0 && (B = "-" + B), B;
- }
- if (V === (0 | V) && V >= 2 && V <= 36) {
- var D = h[V], F = b[V];
- B = "";
- var T = this.clone();
- for (T.negative = 0; !T.isZero(); ) {
- var Q = T.modn(F).toString(V);
- B = (T = T.idivn(F)).isZero() ? Q + B : r[D - Q.length] + Q + B;
- }
- for (this.isZero() && (B = "0" + B); B.length % N != 0; ) B = "0" + B;
- return this.negative !== 0 && (B = "-" + B), B;
- }
- s(!1, "Base should be between 2 and 36");
- }, n.prototype.toNumber = function() {
- var V = this.words[0];
- return this.length === 2 ? V += 67108864 * this.words[1] : this.length === 3 && this.words[2] === 1 ? V += 4503599627370496 + 67108864 * this.words[1] : this.length > 2 && s(!1, "Number can only safely store up to 53 bits"), this.negative !== 0 ? -V : V;
- }, n.prototype.toJSON = function() {
- return this.toString(16);
- }, n.prototype.toBuffer = function(V, N) {
- return s(a !== void 0), this.toArrayLike(a, V, N);
- }, n.prototype.toArray = function(V, N) {
- return this.toArrayLike(Array, V, N);
- }, n.prototype.toArrayLike = function(V, N, B) {
- var G = this.byteLength(), w = B || Math.max(1, G);
- s(G <= w, "byte array longer than desired length"), s(w > 0, "Requested array length <= 0"), this.strip();
- var W, y, f = N === "le", D = new V(w), F = this.clone();
- if (f) {
- for (y = 0; !F.isZero(); y++) W = F.andln(255), F.iushrn(8), D[y] = W;
- for (; y < w; y++) D[y] = 0;
- } else {
- for (y = 0; y < w - G; y++) D[y] = 0;
- for (y = 0; !F.isZero(); y++) W = F.andln(255), F.iushrn(8), D[w - y - 1] = W;
- }
- return D;
- }, Math.clz32 ? n.prototype._countBits = function(V) {
- return 32 - Math.clz32(V);
- } : n.prototype._countBits = function(V) {
- var N = V, B = 0;
- return N >= 4096 && (B += 13, N >>>= 13), N >= 64 && (B += 7, N >>>= 7), N >= 8 && (B += 4, N >>>= 4), N >= 2 && (B += 2, N >>>= 2), B + N;
- }, n.prototype._zeroBits = function(V) {
- if (V === 0) return 26;
- var N = V, B = 0;
- return (8191 & N) == 0 && (B += 13, N >>>= 13), (127 & N) == 0 && (B += 7, N >>>= 7), (15 & N) == 0 && (B += 4, N >>>= 4), (3 & N) == 0 && (B += 2, N >>>= 2), (1 & N) == 0 && B++, B;
- }, n.prototype.bitLength = function() {
- var V = this.words[this.length - 1], N = this._countBits(V);
- return 26 * (this.length - 1) + N;
- }, n.prototype.zeroBits = function() {
- if (this.isZero()) return 0;
- for (var V = 0, N = 0; N < this.length; N++) {
- var B = this._zeroBits(this.words[N]);
- if (V += B, B !== 26) break;
- }
- return V;
- }, n.prototype.byteLength = function() {
- return Math.ceil(this.bitLength() / 8);
- }, n.prototype.toTwos = function(V) {
- return this.negative !== 0 ? this.abs().inotn(V).iaddn(1) : this.clone();
- }, n.prototype.fromTwos = function(V) {
- return this.testn(V - 1) ? this.notn(V).iaddn(1).ineg() : this.clone();
- }, n.prototype.isNeg = function() {
- return this.negative !== 0;
- }, n.prototype.neg = function() {
- return this.clone().ineg();
- }, n.prototype.ineg = function() {
- return this.isZero() || (this.negative ^= 1), this;
- }, n.prototype.iuor = function(V) {
- for (; this.length < V.length; ) this.words[this.length++] = 0;
- for (var N = 0; N < V.length; N++) this.words[N] = this.words[N] | V.words[N];
- return this.strip();
- }, n.prototype.ior = function(V) {
- return s((this.negative | V.negative) == 0), this.iuor(V);
- }, n.prototype.or = function(V) {
- return this.length > V.length ? this.clone().ior(V) : V.clone().ior(this);
- }, n.prototype.uor = function(V) {
- return this.length > V.length ? this.clone().iuor(V) : V.clone().iuor(this);
- }, n.prototype.iuand = function(V) {
- var N;
- N = this.length > V.length ? V : this;
- for (var B = 0; B < N.length; B++) this.words[B] = this.words[B] & V.words[B];
- return this.length = N.length, this.strip();
- }, n.prototype.iand = function(V) {
- return s((this.negative | V.negative) == 0), this.iuand(V);
- }, n.prototype.and = function(V) {
- return this.length > V.length ? this.clone().iand(V) : V.clone().iand(this);
- }, n.prototype.uand = function(V) {
- return this.length > V.length ? this.clone().iuand(V) : V.clone().iuand(this);
- }, n.prototype.iuxor = function(V) {
- var N, B;
- this.length > V.length ? (N = this, B = V) : (N = V, B = this);
- for (var G = 0; G < B.length; G++) this.words[G] = N.words[G] ^ B.words[G];
- if (this !== N) for (; G < N.length; G++) this.words[G] = N.words[G];
- return this.length = N.length, this.strip();
- }, n.prototype.ixor = function(V) {
- return s((this.negative | V.negative) == 0), this.iuxor(V);
- }, n.prototype.xor = function(V) {
- return this.length > V.length ? this.clone().ixor(V) : V.clone().ixor(this);
- }, n.prototype.uxor = function(V) {
- return this.length > V.length ? this.clone().iuxor(V) : V.clone().iuxor(this);
- }, n.prototype.inotn = function(V) {
- s(typeof V == "number" && V >= 0);
- var N = 0 | Math.ceil(V / 26), B = V % 26;
- this._expand(N), B > 0 && N--;
- for (var G = 0; G < N; G++) this.words[G] = 67108863 & ~this.words[G];
- return B > 0 && (this.words[G] = ~this.words[G] & 67108863 >> 26 - B), this.strip();
- }, n.prototype.notn = function(V) {
- return this.clone().inotn(V);
- }, n.prototype.setn = function(V, N) {
- s(typeof V == "number" && V >= 0);
- var B = V / 26 | 0, G = V % 26;
- return this._expand(B + 1), this.words[B] = N ? this.words[B] | 1 << G : this.words[B] & ~(1 << G), this.strip();
- }, n.prototype.iadd = function(V) {
- var N, B, G;
- if (this.negative !== 0 && V.negative === 0) return this.negative = 0, N = this.isub(V), this.negative ^= 1, this._normSign();
- if (this.negative === 0 && V.negative !== 0) return V.negative = 0, N = this.isub(V), V.negative = 1, N._normSign();
- this.length > V.length ? (B = this, G = V) : (B = V, G = this);
- for (var w = 0, W = 0; W < G.length; W++) N = (0 | B.words[W]) + (0 | G.words[W]) + w, this.words[W] = 67108863 & N, w = N >>> 26;
- for (; w !== 0 && W < B.length; W++) N = (0 | B.words[W]) + w, this.words[W] = 67108863 & N, w = N >>> 26;
- if (this.length = B.length, w !== 0) this.words[this.length] = w, this.length++;
- else if (B !== this) for (; W < B.length; W++) this.words[W] = B.words[W];
- return this;
- }, n.prototype.add = function(V) {
- var N;
- return V.negative !== 0 && this.negative === 0 ? (V.negative = 0, N = this.sub(V), V.negative ^= 1, N) : V.negative === 0 && this.negative !== 0 ? (this.negative = 0, N = V.sub(this), this.negative = 1, N) : this.length > V.length ? this.clone().iadd(V) : V.clone().iadd(this);
- }, n.prototype.isub = function(V) {
- if (V.negative !== 0) {
- V.negative = 0;
- var N = this.iadd(V);
- return V.negative = 1, N._normSign();
- }
- if (this.negative !== 0) return this.negative = 0, this.iadd(V), this.negative = 1, this._normSign();
- var B, G, w = this.cmp(V);
- if (w === 0) return this.negative = 0, this.length = 1, this.words[0] = 0, this;
- w > 0 ? (B = this, G = V) : (B = V, G = this);
- for (var W = 0, y = 0; y < G.length; y++) W = (N = (0 | B.words[y]) - (0 | G.words[y]) + W) >> 26, this.words[y] = 67108863 & N;
- for (; W !== 0 && y < B.length; y++) W = (N = (0 | B.words[y]) + W) >> 26, this.words[y] = 67108863 & N;
- if (W === 0 && y < B.length && B !== this) for (; y < B.length; y++) this.words[y] = B.words[y];
- return this.length = Math.max(this.length, y), B !== this && (this.negative = 1), this.strip();
- }, n.prototype.sub = function(V) {
- return this.clone().isub(V);
- };
- var m = function(V, N, B) {
- var G, w, W, y = V.words, f = N.words, D = B.words, F = 0, T = 0 | y[0], Q = 8191 & T, P = T >>> 13, L = 0 | y[1], E = 8191 & L, J = L >>> 13, k = 0 | y[2], j = 8191 & k, q = k >>> 13, Cg = 0 | y[3], Ig = 8191 & Cg, x = Cg >>> 13, Ag = 0 | y[4], eg = 8191 & Ag, O = Ag >>> 13, _ = 0 | y[5], gg = 8191 & _, lg = _ >>> 13, ng = 0 | y[6], sg = 8191 & ng, og = ng >>> 13, cg = 0 | y[7], rg = 8191 & cg, dg = cg >>> 13, Bg = 0 | y[8], Zg = 8191 & Bg, Xg = Bg >>> 13, Kg = 0 | y[9], kg = 8191 & Kg, Wg = Kg >>> 13, Ng = 0 | f[0], wg = 8191 & Ng, fg = Ng >>> 13, Jg = 0 | f[1], zg = 8191 & Jg, cI = Jg >>> 13, YI = 0 | f[2], Eg = 8191 & YI, aI = YI >>> 13, dI = 0 | f[3], _g = 8191 & dI, xI = dI >>> 13, SI = 0 | f[4], eI = 8191 & SI, NI = SI >>> 13, EI = 0 | f[5], oI = 8191 & EI, LI = EI >>> 13, pg = 0 | f[6], uI = 8191 & pg, hg = pg >>> 13, bg = 0 | f[7], Rg = 8191 & bg, Tg = bg >>> 13, rI = 0 | f[8], jg = 8191 & rI, GI = rI >>> 13, nI = 0 | f[9], CI = 8191 & nI, WI = nI >>> 13;
- B.negative = V.negative ^ N.negative, B.length = 19;
- var mI = (F + (G = Math.imul(Q, wg)) | 0) + ((8191 & (w = (w = Math.imul(Q, fg)) + Math.imul(P, wg) | 0)) << 13) | 0;
- F = ((W = Math.imul(P, fg)) + (w >>> 13) | 0) + (mI >>> 26) | 0, mI &= 67108863, G = Math.imul(E, wg), w = (w = Math.imul(E, fg)) + Math.imul(J, wg) | 0, W = Math.imul(J, fg);
- var VI = (F + (G = G + Math.imul(Q, zg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, cI) | 0) + Math.imul(P, zg) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, cI) | 0) + (w >>> 13) | 0) + (VI >>> 26) | 0, VI &= 67108863, G = Math.imul(j, wg), w = (w = Math.imul(j, fg)) + Math.imul(q, wg) | 0, W = Math.imul(q, fg), G = G + Math.imul(E, zg) | 0, w = (w = w + Math.imul(E, cI) | 0) + Math.imul(J, zg) | 0, W = W + Math.imul(J, cI) | 0;
- var yC = (F + (G = G + Math.imul(Q, Eg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, aI) | 0) + Math.imul(P, Eg) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, aI) | 0) + (w >>> 13) | 0) + (yC >>> 26) | 0, yC &= 67108863, G = Math.imul(Ig, wg), w = (w = Math.imul(Ig, fg)) + Math.imul(x, wg) | 0, W = Math.imul(x, fg), G = G + Math.imul(j, zg) | 0, w = (w = w + Math.imul(j, cI) | 0) + Math.imul(q, zg) | 0, W = W + Math.imul(q, cI) | 0, G = G + Math.imul(E, Eg) | 0, w = (w = w + Math.imul(E, aI) | 0) + Math.imul(J, Eg) | 0, W = W + Math.imul(J, aI) | 0;
- var gC = (F + (G = G + Math.imul(Q, _g) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, xI) | 0) + Math.imul(P, _g) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, xI) | 0) + (w >>> 13) | 0) + (gC >>> 26) | 0, gC &= 67108863, G = Math.imul(eg, wg), w = (w = Math.imul(eg, fg)) + Math.imul(O, wg) | 0, W = Math.imul(O, fg), G = G + Math.imul(Ig, zg) | 0, w = (w = w + Math.imul(Ig, cI) | 0) + Math.imul(x, zg) | 0, W = W + Math.imul(x, cI) | 0, G = G + Math.imul(j, Eg) | 0, w = (w = w + Math.imul(j, aI) | 0) + Math.imul(q, Eg) | 0, W = W + Math.imul(q, aI) | 0, G = G + Math.imul(E, _g) | 0, w = (w = w + Math.imul(E, xI) | 0) + Math.imul(J, _g) | 0, W = W + Math.imul(J, xI) | 0;
- var It = (F + (G = G + Math.imul(Q, eI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, NI) | 0) + Math.imul(P, eI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, NI) | 0) + (w >>> 13) | 0) + (It >>> 26) | 0, It &= 67108863, G = Math.imul(gg, wg), w = (w = Math.imul(gg, fg)) + Math.imul(lg, wg) | 0, W = Math.imul(lg, fg), G = G + Math.imul(eg, zg) | 0, w = (w = w + Math.imul(eg, cI) | 0) + Math.imul(O, zg) | 0, W = W + Math.imul(O, cI) | 0, G = G + Math.imul(Ig, Eg) | 0, w = (w = w + Math.imul(Ig, aI) | 0) + Math.imul(x, Eg) | 0, W = W + Math.imul(x, aI) | 0, G = G + Math.imul(j, _g) | 0, w = (w = w + Math.imul(j, xI) | 0) + Math.imul(q, _g) | 0, W = W + Math.imul(q, xI) | 0, G = G + Math.imul(E, eI) | 0, w = (w = w + Math.imul(E, NI) | 0) + Math.imul(J, eI) | 0, W = W + Math.imul(J, NI) | 0;
- var dC = (F + (G = G + Math.imul(Q, oI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, LI) | 0) + Math.imul(P, oI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, LI) | 0) + (w >>> 13) | 0) + (dC >>> 26) | 0, dC &= 67108863, G = Math.imul(sg, wg), w = (w = Math.imul(sg, fg)) + Math.imul(og, wg) | 0, W = Math.imul(og, fg), G = G + Math.imul(gg, zg) | 0, w = (w = w + Math.imul(gg, cI) | 0) + Math.imul(lg, zg) | 0, W = W + Math.imul(lg, cI) | 0, G = G + Math.imul(eg, Eg) | 0, w = (w = w + Math.imul(eg, aI) | 0) + Math.imul(O, Eg) | 0, W = W + Math.imul(O, aI) | 0, G = G + Math.imul(Ig, _g) | 0, w = (w = w + Math.imul(Ig, xI) | 0) + Math.imul(x, _g) | 0, W = W + Math.imul(x, xI) | 0, G = G + Math.imul(j, eI) | 0, w = (w = w + Math.imul(j, NI) | 0) + Math.imul(q, eI) | 0, W = W + Math.imul(q, NI) | 0, G = G + Math.imul(E, oI) | 0, w = (w = w + Math.imul(E, LI) | 0) + Math.imul(J, oI) | 0, W = W + Math.imul(J, LI) | 0;
- var Tt = (F + (G = G + Math.imul(Q, uI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, hg) | 0) + Math.imul(P, uI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, hg) | 0) + (w >>> 13) | 0) + (Tt >>> 26) | 0, Tt &= 67108863, G = Math.imul(rg, wg), w = (w = Math.imul(rg, fg)) + Math.imul(dg, wg) | 0, W = Math.imul(dg, fg), G = G + Math.imul(sg, zg) | 0, w = (w = w + Math.imul(sg, cI) | 0) + Math.imul(og, zg) | 0, W = W + Math.imul(og, cI) | 0, G = G + Math.imul(gg, Eg) | 0, w = (w = w + Math.imul(gg, aI) | 0) + Math.imul(lg, Eg) | 0, W = W + Math.imul(lg, aI) | 0, G = G + Math.imul(eg, _g) | 0, w = (w = w + Math.imul(eg, xI) | 0) + Math.imul(O, _g) | 0, W = W + Math.imul(O, xI) | 0, G = G + Math.imul(Ig, eI) | 0, w = (w = w + Math.imul(Ig, NI) | 0) + Math.imul(x, eI) | 0, W = W + Math.imul(x, NI) | 0, G = G + Math.imul(j, oI) | 0, w = (w = w + Math.imul(j, LI) | 0) + Math.imul(q, oI) | 0, W = W + Math.imul(q, LI) | 0, G = G + Math.imul(E, uI) | 0, w = (w = w + Math.imul(E, hg) | 0) + Math.imul(J, uI) | 0, W = W + Math.imul(J, hg) | 0;
- var ag = (F + (G = G + Math.imul(Q, Rg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, Tg) | 0) + Math.imul(P, Rg) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, Tg) | 0) + (w >>> 13) | 0) + (ag >>> 26) | 0, ag &= 67108863, G = Math.imul(Zg, wg), w = (w = Math.imul(Zg, fg)) + Math.imul(Xg, wg) | 0, W = Math.imul(Xg, fg), G = G + Math.imul(rg, zg) | 0, w = (w = w + Math.imul(rg, cI) | 0) + Math.imul(dg, zg) | 0, W = W + Math.imul(dg, cI) | 0, G = G + Math.imul(sg, Eg) | 0, w = (w = w + Math.imul(sg, aI) | 0) + Math.imul(og, Eg) | 0, W = W + Math.imul(og, aI) | 0, G = G + Math.imul(gg, _g) | 0, w = (w = w + Math.imul(gg, xI) | 0) + Math.imul(lg, _g) | 0, W = W + Math.imul(lg, xI) | 0, G = G + Math.imul(eg, eI) | 0, w = (w = w + Math.imul(eg, NI) | 0) + Math.imul(O, eI) | 0, W = W + Math.imul(O, NI) | 0, G = G + Math.imul(Ig, oI) | 0, w = (w = w + Math.imul(Ig, LI) | 0) + Math.imul(x, oI) | 0, W = W + Math.imul(x, LI) | 0, G = G + Math.imul(j, uI) | 0, w = (w = w + Math.imul(j, hg) | 0) + Math.imul(q, uI) | 0, W = W + Math.imul(q, hg) | 0, G = G + Math.imul(E, Rg) | 0, w = (w = w + Math.imul(E, Tg) | 0) + Math.imul(J, Rg) | 0, W = W + Math.imul(J, Tg) | 0;
- var mg = (F + (G = G + Math.imul(Q, jg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, GI) | 0) + Math.imul(P, jg) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, GI) | 0) + (w >>> 13) | 0) + (mg >>> 26) | 0, mg &= 67108863, G = Math.imul(kg, wg), w = (w = Math.imul(kg, fg)) + Math.imul(Wg, wg) | 0, W = Math.imul(Wg, fg), G = G + Math.imul(Zg, zg) | 0, w = (w = w + Math.imul(Zg, cI) | 0) + Math.imul(Xg, zg) | 0, W = W + Math.imul(Xg, cI) | 0, G = G + Math.imul(rg, Eg) | 0, w = (w = w + Math.imul(rg, aI) | 0) + Math.imul(dg, Eg) | 0, W = W + Math.imul(dg, aI) | 0, G = G + Math.imul(sg, _g) | 0, w = (w = w + Math.imul(sg, xI) | 0) + Math.imul(og, _g) | 0, W = W + Math.imul(og, xI) | 0, G = G + Math.imul(gg, eI) | 0, w = (w = w + Math.imul(gg, NI) | 0) + Math.imul(lg, eI) | 0, W = W + Math.imul(lg, NI) | 0, G = G + Math.imul(eg, oI) | 0, w = (w = w + Math.imul(eg, LI) | 0) + Math.imul(O, oI) | 0, W = W + Math.imul(O, LI) | 0, G = G + Math.imul(Ig, uI) | 0, w = (w = w + Math.imul(Ig, hg) | 0) + Math.imul(x, uI) | 0, W = W + Math.imul(x, hg) | 0, G = G + Math.imul(j, Rg) | 0, w = (w = w + Math.imul(j, Tg) | 0) + Math.imul(q, Rg) | 0, W = W + Math.imul(q, Tg) | 0, G = G + Math.imul(E, jg) | 0, w = (w = w + Math.imul(E, GI) | 0) + Math.imul(J, jg) | 0, W = W + Math.imul(J, GI) | 0;
- var Sg = (F + (G = G + Math.imul(Q, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, WI) | 0) + Math.imul(P, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(P, WI) | 0) + (w >>> 13) | 0) + (Sg >>> 26) | 0, Sg &= 67108863, G = Math.imul(kg, zg), w = (w = Math.imul(kg, cI)) + Math.imul(Wg, zg) | 0, W = Math.imul(Wg, cI), G = G + Math.imul(Zg, Eg) | 0, w = (w = w + Math.imul(Zg, aI) | 0) + Math.imul(Xg, Eg) | 0, W = W + Math.imul(Xg, aI) | 0, G = G + Math.imul(rg, _g) | 0, w = (w = w + Math.imul(rg, xI) | 0) + Math.imul(dg, _g) | 0, W = W + Math.imul(dg, xI) | 0, G = G + Math.imul(sg, eI) | 0, w = (w = w + Math.imul(sg, NI) | 0) + Math.imul(og, eI) | 0, W = W + Math.imul(og, NI) | 0, G = G + Math.imul(gg, oI) | 0, w = (w = w + Math.imul(gg, LI) | 0) + Math.imul(lg, oI) | 0, W = W + Math.imul(lg, LI) | 0, G = G + Math.imul(eg, uI) | 0, w = (w = w + Math.imul(eg, hg) | 0) + Math.imul(O, uI) | 0, W = W + Math.imul(O, hg) | 0, G = G + Math.imul(Ig, Rg) | 0, w = (w = w + Math.imul(Ig, Tg) | 0) + Math.imul(x, Rg) | 0, W = W + Math.imul(x, Tg) | 0, G = G + Math.imul(j, jg) | 0, w = (w = w + Math.imul(j, GI) | 0) + Math.imul(q, jg) | 0, W = W + Math.imul(q, GI) | 0;
- var Fg = (F + (G = G + Math.imul(E, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(E, WI) | 0) + Math.imul(J, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(J, WI) | 0) + (w >>> 13) | 0) + (Fg >>> 26) | 0, Fg &= 67108863, G = Math.imul(kg, Eg), w = (w = Math.imul(kg, aI)) + Math.imul(Wg, Eg) | 0, W = Math.imul(Wg, aI), G = G + Math.imul(Zg, _g) | 0, w = (w = w + Math.imul(Zg, xI) | 0) + Math.imul(Xg, _g) | 0, W = W + Math.imul(Xg, xI) | 0, G = G + Math.imul(rg, eI) | 0, w = (w = w + Math.imul(rg, NI) | 0) + Math.imul(dg, eI) | 0, W = W + Math.imul(dg, NI) | 0, G = G + Math.imul(sg, oI) | 0, w = (w = w + Math.imul(sg, LI) | 0) + Math.imul(og, oI) | 0, W = W + Math.imul(og, LI) | 0, G = G + Math.imul(gg, uI) | 0, w = (w = w + Math.imul(gg, hg) | 0) + Math.imul(lg, uI) | 0, W = W + Math.imul(lg, hg) | 0, G = G + Math.imul(eg, Rg) | 0, w = (w = w + Math.imul(eg, Tg) | 0) + Math.imul(O, Rg) | 0, W = W + Math.imul(O, Tg) | 0, G = G + Math.imul(Ig, jg) | 0, w = (w = w + Math.imul(Ig, GI) | 0) + Math.imul(x, jg) | 0, W = W + Math.imul(x, GI) | 0;
- var tI = (F + (G = G + Math.imul(j, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(j, WI) | 0) + Math.imul(q, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(q, WI) | 0) + (w >>> 13) | 0) + (tI >>> 26) | 0, tI &= 67108863, G = Math.imul(kg, _g), w = (w = Math.imul(kg, xI)) + Math.imul(Wg, _g) | 0, W = Math.imul(Wg, xI), G = G + Math.imul(Zg, eI) | 0, w = (w = w + Math.imul(Zg, NI) | 0) + Math.imul(Xg, eI) | 0, W = W + Math.imul(Xg, NI) | 0, G = G + Math.imul(rg, oI) | 0, w = (w = w + Math.imul(rg, LI) | 0) + Math.imul(dg, oI) | 0, W = W + Math.imul(dg, LI) | 0, G = G + Math.imul(sg, uI) | 0, w = (w = w + Math.imul(sg, hg) | 0) + Math.imul(og, uI) | 0, W = W + Math.imul(og, hg) | 0, G = G + Math.imul(gg, Rg) | 0, w = (w = w + Math.imul(gg, Tg) | 0) + Math.imul(lg, Rg) | 0, W = W + Math.imul(lg, Tg) | 0, G = G + Math.imul(eg, jg) | 0, w = (w = w + Math.imul(eg, GI) | 0) + Math.imul(O, jg) | 0, W = W + Math.imul(O, GI) | 0;
- var vg = (F + (G = G + Math.imul(Ig, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Ig, WI) | 0) + Math.imul(x, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(x, WI) | 0) + (w >>> 13) | 0) + (vg >>> 26) | 0, vg &= 67108863, G = Math.imul(kg, eI), w = (w = Math.imul(kg, NI)) + Math.imul(Wg, eI) | 0, W = Math.imul(Wg, NI), G = G + Math.imul(Zg, oI) | 0, w = (w = w + Math.imul(Zg, LI) | 0) + Math.imul(Xg, oI) | 0, W = W + Math.imul(Xg, LI) | 0, G = G + Math.imul(rg, uI) | 0, w = (w = w + Math.imul(rg, hg) | 0) + Math.imul(dg, uI) | 0, W = W + Math.imul(dg, hg) | 0, G = G + Math.imul(sg, Rg) | 0, w = (w = w + Math.imul(sg, Tg) | 0) + Math.imul(og, Rg) | 0, W = W + Math.imul(og, Tg) | 0, G = G + Math.imul(gg, jg) | 0, w = (w = w + Math.imul(gg, GI) | 0) + Math.imul(lg, jg) | 0, W = W + Math.imul(lg, GI) | 0;
- var xg = (F + (G = G + Math.imul(eg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(eg, WI) | 0) + Math.imul(O, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(O, WI) | 0) + (w >>> 13) | 0) + (xg >>> 26) | 0, xg &= 67108863, G = Math.imul(kg, oI), w = (w = Math.imul(kg, LI)) + Math.imul(Wg, oI) | 0, W = Math.imul(Wg, LI), G = G + Math.imul(Zg, uI) | 0, w = (w = w + Math.imul(Zg, hg) | 0) + Math.imul(Xg, uI) | 0, W = W + Math.imul(Xg, hg) | 0, G = G + Math.imul(rg, Rg) | 0, w = (w = w + Math.imul(rg, Tg) | 0) + Math.imul(dg, Rg) | 0, W = W + Math.imul(dg, Tg) | 0, G = G + Math.imul(sg, jg) | 0, w = (w = w + Math.imul(sg, GI) | 0) + Math.imul(og, jg) | 0, W = W + Math.imul(og, GI) | 0;
- var vI = (F + (G = G + Math.imul(gg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(gg, WI) | 0) + Math.imul(lg, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(lg, WI) | 0) + (w >>> 13) | 0) + (vI >>> 26) | 0, vI &= 67108863, G = Math.imul(kg, uI), w = (w = Math.imul(kg, hg)) + Math.imul(Wg, uI) | 0, W = Math.imul(Wg, hg), G = G + Math.imul(Zg, Rg) | 0, w = (w = w + Math.imul(Zg, Tg) | 0) + Math.imul(Xg, Rg) | 0, W = W + Math.imul(Xg, Tg) | 0, G = G + Math.imul(rg, jg) | 0, w = (w = w + Math.imul(rg, GI) | 0) + Math.imul(dg, jg) | 0, W = W + Math.imul(dg, GI) | 0;
- var fI = (F + (G = G + Math.imul(sg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(sg, WI) | 0) + Math.imul(og, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(og, WI) | 0) + (w >>> 13) | 0) + (fI >>> 26) | 0, fI &= 67108863, G = Math.imul(kg, Rg), w = (w = Math.imul(kg, Tg)) + Math.imul(Wg, Rg) | 0, W = Math.imul(Wg, Tg), G = G + Math.imul(Zg, jg) | 0, w = (w = w + Math.imul(Zg, GI) | 0) + Math.imul(Xg, jg) | 0, W = W + Math.imul(Xg, GI) | 0;
- var MI = (F + (G = G + Math.imul(rg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(rg, WI) | 0) + Math.imul(dg, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(dg, WI) | 0) + (w >>> 13) | 0) + (MI >>> 26) | 0, MI &= 67108863, G = Math.imul(kg, jg), w = (w = Math.imul(kg, GI)) + Math.imul(Wg, jg) | 0, W = Math.imul(Wg, GI);
- var hI = (F + (G = G + Math.imul(Zg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Zg, WI) | 0) + Math.imul(Xg, CI) | 0)) << 13) | 0;
- F = ((W = W + Math.imul(Xg, WI) | 0) + (w >>> 13) | 0) + (hI >>> 26) | 0, hI &= 67108863;
- var AC = (F + (G = Math.imul(kg, CI)) | 0) + ((8191 & (w = (w = Math.imul(kg, WI)) + Math.imul(Wg, CI) | 0)) << 13) | 0;
- return F = ((W = Math.imul(Wg, WI)) + (w >>> 13) | 0) + (AC >>> 26) | 0, AC &= 67108863, D[0] = mI, D[1] = VI, D[2] = yC, D[3] = gC, D[4] = It, D[5] = dC, D[6] = Tt, D[7] = ag, D[8] = mg, D[9] = Sg, D[10] = Fg, D[11] = tI, D[12] = vg, D[13] = xg, D[14] = vI, D[15] = fI, D[16] = MI, D[17] = hI, D[18] = AC, F !== 0 && (D[19] = F, B.length++), B;
- };
- function Z(V, N, B) {
- return new p().mulp(V, N, B);
- }
- function p(V, N) {
- this.x = V, this.y = N;
- }
- Math.imul || (m = u), n.prototype.mulTo = function(V, N) {
- var B = this.length + V.length;
- return this.length === 10 && V.length === 10 ? m(this, V, N) : B < 63 ? u(this, V, N) : B < 1024 ? function(G, w, W) {
- W.negative = w.negative ^ G.negative, W.length = G.length + w.length;
- for (var y = 0, f = 0, D = 0; D < W.length - 1; D++) {
- var F = f;
- f = 0;
- for (var T = 67108863 & y, Q = Math.min(D, w.length - 1), P = Math.max(0, D - G.length + 1); P <= Q; P++) {
- var L = D - P, E = (0 | G.words[L]) * (0 | w.words[P]), J = 67108863 & E;
- T = 67108863 & (J = J + T | 0), f += (F = (F = F + (E / 67108864 | 0) | 0) + (J >>> 26) | 0) >>> 26, F &= 67108863;
- }
- W.words[D] = T, y = F, F = f;
- }
- return y !== 0 ? W.words[D] = y : W.length--, W.strip();
- }(this, V, N) : Z(this, V, N);
- }, p.prototype.makeRBT = function(V) {
- for (var N = new Array(V), B = n.prototype._countBits(V) - 1, G = 0; G < V; G++) N[G] = this.revBin(G, B, V);
- return N;
- }, p.prototype.revBin = function(V, N, B) {
- if (V === 0 || V === B - 1) return V;
- for (var G = 0, w = 0; w < N; w++) G |= (1 & V) << N - w - 1, V >>= 1;
- return G;
- }, p.prototype.permute = function(V, N, B, G, w, W) {
- for (var y = 0; y < W; y++) G[y] = N[V[y]], w[y] = B[V[y]];
- }, p.prototype.transform = function(V, N, B, G, w, W) {
- this.permute(W, V, N, B, G, w);
- for (var y = 1; y < w; y <<= 1) for (var f = y << 1, D = Math.cos(2 * Math.PI / f), F = Math.sin(2 * Math.PI / f), T = 0; T < w; T += f) for (var Q = D, P = F, L = 0; L < y; L++) {
- var E = B[T + L], J = G[T + L], k = B[T + L + y], j = G[T + L + y], q = Q * k - P * j;
- j = Q * j + P * k, k = q, B[T + L] = E + k, G[T + L] = J + j, B[T + L + y] = E - k, G[T + L + y] = J - j, L !== f && (q = D * Q - F * P, P = D * P + F * Q, Q = q);
- }
- }, p.prototype.guessLen13b = function(V, N) {
- var B = 1 | Math.max(N, V), G = 1 & B, w = 0;
- for (B = B / 2 | 0; B; B >>>= 1) w++;
- return 1 << w + 1 + G;
- }, p.prototype.conjugate = function(V, N, B) {
- if (!(B <= 1)) for (var G = 0; G < B / 2; G++) {
- var w = V[G];
- V[G] = V[B - G - 1], V[B - G - 1] = w, w = N[G], N[G] = -N[B - G - 1], N[B - G - 1] = -w;
- }
- }, p.prototype.normalize13b = function(V, N) {
- for (var B = 0, G = 0; G < N / 2; G++) {
- var w = 8192 * Math.round(V[2 * G + 1] / N) + Math.round(V[2 * G] / N) + B;
- V[G] = 67108863 & w, B = w < 67108864 ? 0 : w / 67108864 | 0;
- }
- return V;
- }, p.prototype.convert13b = function(V, N, B, G) {
- for (var w = 0, W = 0; W < N; W++) w += 0 | V[W], B[2 * W] = 8191 & w, w >>>= 13, B[2 * W + 1] = 8191 & w, w >>>= 13;
- for (W = 2 * N; W < G; ++W) B[W] = 0;
- s(w === 0), s((-8192 & w) == 0);
- }, p.prototype.stub = function(V) {
- for (var N = new Array(V), B = 0; B < V; B++) N[B] = 0;
- return N;
- }, p.prototype.mulp = function(V, N, B) {
- var G = 2 * this.guessLen13b(V.length, N.length), w = this.makeRBT(G), W = this.stub(G), y = new Array(G), f = new Array(G), D = new Array(G), F = new Array(G), T = new Array(G), Q = new Array(G), P = B.words;
- P.length = G, this.convert13b(V.words, V.length, y, G), this.convert13b(N.words, N.length, F, G), this.transform(y, W, f, D, G, w), this.transform(F, W, T, Q, G, w);
- for (var L = 0; L < G; L++) {
- var E = f[L] * T[L] - D[L] * Q[L];
- D[L] = f[L] * Q[L] + D[L] * T[L], f[L] = E;
- }
- return this.conjugate(f, D, G), this.transform(f, D, P, W, G, w), this.conjugate(P, W, G), this.normalize13b(P, G), B.negative = V.negative ^ N.negative, B.length = V.length + N.length, B.strip();
- }, n.prototype.mul = function(V) {
- var N = new n(null);
- return N.words = new Array(this.length + V.length), this.mulTo(V, N);
- }, n.prototype.mulf = function(V) {
- var N = new n(null);
- return N.words = new Array(this.length + V.length), Z(this, V, N);
- }, n.prototype.imul = function(V) {
- return this.clone().mulTo(V, this);
- }, n.prototype.imuln = function(V) {
- s(typeof V == "number"), s(V < 67108864);
- for (var N = 0, B = 0; B < this.length; B++) {
- var G = (0 | this.words[B]) * V, w = (67108863 & G) + (67108863 & N);
- N >>= 26, N += G / 67108864 | 0, N += w >>> 26, this.words[B] = 67108863 & w;
- }
- return N !== 0 && (this.words[B] = N, this.length++), this;
- }, n.prototype.muln = function(V) {
- return this.clone().imuln(V);
- }, n.prototype.sqr = function() {
- return this.mul(this);
- }, n.prototype.isqr = function() {
- return this.imul(this.clone());
- }, n.prototype.pow = function(V) {
- var N = function(W) {
- for (var y = new Array(W.bitLength()), f = 0; f < y.length; f++) {
- var D = f / 26 | 0, F = f % 26;
- y[f] = (W.words[D] & 1 << F) >>> F;
- }
- return y;
- }(V);
- if (N.length === 0) return new n(1);
- for (var B = this, G = 0; G < N.length && N[G] === 0; G++, B = B.sqr()) ;
- if (++G < N.length) for (var w = B.sqr(); G < N.length; G++, w = w.sqr()) N[G] !== 0 && (B = B.mul(w));
- return B;
- }, n.prototype.iushln = function(V) {
- s(typeof V == "number" && V >= 0);
- var N, B = V % 26, G = (V - B) / 26, w = 67108863 >>> 26 - B << 26 - B;
- if (B !== 0) {
- var W = 0;
- for (N = 0; N < this.length; N++) {
- var y = this.words[N] & w, f = (0 | this.words[N]) - y << B;
- this.words[N] = f | W, W = y >>> 26 - B;
- }
- W && (this.words[N] = W, this.length++);
- }
- if (G !== 0) {
- for (N = this.length - 1; N >= 0; N--) this.words[N + G] = this.words[N];
- for (N = 0; N < G; N++) this.words[N] = 0;
- this.length += G;
- }
- return this.strip();
- }, n.prototype.ishln = function(V) {
- return s(this.negative === 0), this.iushln(V);
- }, n.prototype.iushrn = function(V, N, B) {
- var G;
- s(typeof V == "number" && V >= 0), G = N ? (N - N % 26) / 26 : 0;
- var w = V % 26, W = Math.min((V - w) / 26, this.length), y = 67108863 ^ 67108863 >>> w << w, f = B;
- if (G -= W, G = Math.max(0, G), f) {
- for (var D = 0; D < W; D++) f.words[D] = this.words[D];
- f.length = W;
- }
- if (W !== 0) if (this.length > W) for (this.length -= W, D = 0; D < this.length; D++) this.words[D] = this.words[D + W];
- else this.words[0] = 0, this.length = 1;
- var F = 0;
- for (D = this.length - 1; D >= 0 && (F !== 0 || D >= G); D--) {
- var T = 0 | this.words[D];
- this.words[D] = F << 26 - w | T >>> w, F = T & y;
- }
- return f && F !== 0 && (f.words[f.length++] = F), this.length === 0 && (this.words[0] = 0, this.length = 1), this.strip();
- }, n.prototype.ishrn = function(V, N, B) {
- return s(this.negative === 0), this.iushrn(V, N, B);
- }, n.prototype.shln = function(V) {
- return this.clone().ishln(V);
- }, n.prototype.ushln = function(V) {
- return this.clone().iushln(V);
- }, n.prototype.shrn = function(V) {
- return this.clone().ishrn(V);
- }, n.prototype.ushrn = function(V) {
- return this.clone().iushrn(V);
- }, n.prototype.testn = function(V) {
- s(typeof V == "number" && V >= 0);
- var N = V % 26, B = (V - N) / 26, G = 1 << N;
- return !(this.length <= B) && !!(this.words[B] & G);
- }, n.prototype.imaskn = function(V) {
- s(typeof V == "number" && V >= 0);
- var N = V % 26, B = (V - N) / 26;
- if (s(this.negative === 0, "imaskn works only with positive numbers"), this.length <= B) return this;
- if (N !== 0 && B++, this.length = Math.min(B, this.length), N !== 0) {
- var G = 67108863 ^ 67108863 >>> N << N;
- this.words[this.length - 1] &= G;
- }
- return this.strip();
- }, n.prototype.maskn = function(V) {
- return this.clone().imaskn(V);
- }, n.prototype.iaddn = function(V) {
- return s(typeof V == "number"), s(V < 67108864), V < 0 ? this.isubn(-V) : this.negative !== 0 ? this.length === 1 && (0 | this.words[0]) < V ? (this.words[0] = V - (0 | this.words[0]), this.negative = 0, this) : (this.negative = 0, this.isubn(V), this.negative = 1, this) : this._iaddn(V);
- }, n.prototype._iaddn = function(V) {
- this.words[0] += V;
- for (var N = 0; N < this.length && this.words[N] >= 67108864; N++) this.words[N] -= 67108864, N === this.length - 1 ? this.words[N + 1] = 1 : this.words[N + 1]++;
- return this.length = Math.max(this.length, N + 1), this;
- }, n.prototype.isubn = function(V) {
- if (s(typeof V == "number"), s(V < 67108864), V < 0) return this.iaddn(-V);
- if (this.negative !== 0) return this.negative = 0, this.iaddn(V), this.negative = 1, this;
- if (this.words[0] -= V, this.length === 1 && this.words[0] < 0) this.words[0] = -this.words[0], this.negative = 1;
- else for (var N = 0; N < this.length && this.words[N] < 0; N++) this.words[N] += 67108864, this.words[N + 1] -= 1;
- return this.strip();
- }, n.prototype.addn = function(V) {
- return this.clone().iaddn(V);
- }, n.prototype.subn = function(V) {
- return this.clone().isubn(V);
- }, n.prototype.iabs = function() {
- return this.negative = 0, this;
- }, n.prototype.abs = function() {
- return this.clone().iabs();
- }, n.prototype._ishlnsubmul = function(V, N, B) {
- var G, w, W = V.length + B;
- this._expand(W);
- var y = 0;
- for (G = 0; G < V.length; G++) {
- w = (0 | this.words[G + B]) + y;
- var f = (0 | V.words[G]) * N;
- y = ((w -= 67108863 & f) >> 26) - (f / 67108864 | 0), this.words[G + B] = 67108863 & w;
- }
- for (; G < this.length - B; G++) y = (w = (0 | this.words[G + B]) + y) >> 26, this.words[G + B] = 67108863 & w;
- if (y === 0) return this.strip();
- for (s(y === -1), y = 0, G = 0; G < this.length; G++) y = (w = -(0 | this.words[G]) + y) >> 26, this.words[G] = 67108863 & w;
- return this.negative = 1, this.strip();
- }, n.prototype._wordDiv = function(V, N) {
- var B = (this.length, V.length), G = this.clone(), w = V, W = 0 | w.words[w.length - 1];
- (B = 26 - this._countBits(W)) !== 0 && (w = w.ushln(B), G.iushln(B), W = 0 | w.words[w.length - 1]);
- var y, f = G.length - w.length;
- if (N !== "mod") {
- (y = new n(null)).length = f + 1, y.words = new Array(y.length);
- for (var D = 0; D < y.length; D++) y.words[D] = 0;
- }
- var F = G.clone()._ishlnsubmul(w, 1, f);
- F.negative === 0 && (G = F, y && (y.words[f] = 1));
- for (var T = f - 1; T >= 0; T--) {
- var Q = 67108864 * (0 | G.words[w.length + T]) + (0 | G.words[w.length + T - 1]);
- for (Q = Math.min(Q / W | 0, 67108863), G._ishlnsubmul(w, Q, T); G.negative !== 0; ) Q--, G.negative = 0, G._ishlnsubmul(w, 1, T), G.isZero() || (G.negative ^= 1);
- y && (y.words[T] = Q);
- }
- return y && y.strip(), G.strip(), N !== "div" && B !== 0 && G.iushrn(B), { div: y || null, mod: G };
- }, n.prototype.divmod = function(V, N, B) {
- return s(!V.isZero()), this.isZero() ? { div: new n(0), mod: new n(0) } : this.negative !== 0 && V.negative === 0 ? (W = this.neg().divmod(V, N), N !== "mod" && (G = W.div.neg()), N !== "div" && (w = W.mod.neg(), B && w.negative !== 0 && w.iadd(V)), { div: G, mod: w }) : this.negative === 0 && V.negative !== 0 ? (W = this.divmod(V.neg(), N), N !== "mod" && (G = W.div.neg()), { div: G, mod: W.mod }) : (this.negative & V.negative) != 0 ? (W = this.neg().divmod(V.neg(), N), N !== "div" && (w = W.mod.neg(), B && w.negative !== 0 && w.isub(V)), { div: W.div, mod: w }) : V.length > this.length || this.cmp(V) < 0 ? { div: new n(0), mod: this } : V.length === 1 ? N === "div" ? { div: this.divn(V.words[0]), mod: null } : N === "mod" ? { div: null, mod: new n(this.modn(V.words[0])) } : { div: this.divn(V.words[0]), mod: new n(this.modn(V.words[0])) } : this._wordDiv(V, N);
- var G, w, W;
- }, n.prototype.div = function(V) {
- return this.divmod(V, "div", !1).div;
- }, n.prototype.mod = function(V) {
- return this.divmod(V, "mod", !1).mod;
- }, n.prototype.umod = function(V) {
- return this.divmod(V, "mod", !0).mod;
- }, n.prototype.divRound = function(V) {
- var N = this.divmod(V);
- if (N.mod.isZero()) return N.div;
- var B = N.div.negative !== 0 ? N.mod.isub(V) : N.mod, G = V.ushrn(1), w = V.andln(1), W = B.cmp(G);
- return W < 0 || w === 1 && W === 0 ? N.div : N.div.negative !== 0 ? N.div.isubn(1) : N.div.iaddn(1);
- }, n.prototype.modn = function(V) {
- s(V <= 67108863);
- for (var N = (1 << 26) % V, B = 0, G = this.length - 1; G >= 0; G--) B = (N * B + (0 | this.words[G])) % V;
- return B;
- }, n.prototype.idivn = function(V) {
- s(V <= 67108863);
- for (var N = 0, B = this.length - 1; B >= 0; B--) {
- var G = (0 | this.words[B]) + 67108864 * N;
- this.words[B] = G / V | 0, N = G % V;
- }
- return this.strip();
- }, n.prototype.divn = function(V) {
- return this.clone().idivn(V);
- }, n.prototype.egcd = function(V) {
- s(V.negative === 0), s(!V.isZero());
- var N = this, B = V.clone();
- N = N.negative !== 0 ? N.umod(V) : N.clone();
- for (var G = new n(1), w = new n(0), W = new n(0), y = new n(1), f = 0; N.isEven() && B.isEven(); ) N.iushrn(1), B.iushrn(1), ++f;
- for (var D = B.clone(), F = N.clone(); !N.isZero(); ) {
- for (var T = 0, Q = 1; (N.words[0] & Q) == 0 && T < 26; ++T, Q <<= 1) ;
- if (T > 0) for (N.iushrn(T); T-- > 0; ) (G.isOdd() || w.isOdd()) && (G.iadd(D), w.isub(F)), G.iushrn(1), w.iushrn(1);
- for (var P = 0, L = 1; (B.words[0] & L) == 0 && P < 26; ++P, L <<= 1) ;
- if (P > 0) for (B.iushrn(P); P-- > 0; ) (W.isOdd() || y.isOdd()) && (W.iadd(D), y.isub(F)), W.iushrn(1), y.iushrn(1);
- N.cmp(B) >= 0 ? (N.isub(B), G.isub(W), w.isub(y)) : (B.isub(N), W.isub(G), y.isub(w));
- }
- return { a: W, b: y, gcd: B.iushln(f) };
- }, n.prototype._invmp = function(V) {
- s(V.negative === 0), s(!V.isZero());
- var N = this, B = V.clone();
- N = N.negative !== 0 ? N.umod(V) : N.clone();
- for (var G, w = new n(1), W = new n(0), y = B.clone(); N.cmpn(1) > 0 && B.cmpn(1) > 0; ) {
- for (var f = 0, D = 1; (N.words[0] & D) == 0 && f < 26; ++f, D <<= 1) ;
- if (f > 0) for (N.iushrn(f); f-- > 0; ) w.isOdd() && w.iadd(y), w.iushrn(1);
- for (var F = 0, T = 1; (B.words[0] & T) == 0 && F < 26; ++F, T <<= 1) ;
- if (F > 0) for (B.iushrn(F); F-- > 0; ) W.isOdd() && W.iadd(y), W.iushrn(1);
- N.cmp(B) >= 0 ? (N.isub(B), w.isub(W)) : (B.isub(N), W.isub(w));
- }
- return (G = N.cmpn(1) === 0 ? w : W).cmpn(0) < 0 && G.iadd(V), G;
- }, n.prototype.gcd = function(V) {
- if (this.isZero()) return V.abs();
- if (V.isZero()) return this.abs();
- var N = this.clone(), B = V.clone();
- N.negative = 0, B.negative = 0;
- for (var G = 0; N.isEven() && B.isEven(); G++) N.iushrn(1), B.iushrn(1);
- for (; ; ) {
- for (; N.isEven(); ) N.iushrn(1);
- for (; B.isEven(); ) B.iushrn(1);
- var w = N.cmp(B);
- if (w < 0) {
- var W = N;
- N = B, B = W;
- } else if (w === 0 || B.cmpn(1) === 0) break;
- N.isub(B);
- }
- return B.iushln(G);
- }, n.prototype.invm = function(V) {
- return this.egcd(V).a.umod(V);
- }, n.prototype.isEven = function() {
- return (1 & this.words[0]) == 0;
- }, n.prototype.isOdd = function() {
- return (1 & this.words[0]) == 1;
- }, n.prototype.andln = function(V) {
- return this.words[0] & V;
- }, n.prototype.bincn = function(V) {
- s(typeof V == "number");
- var N = V % 26, B = (V - N) / 26, G = 1 << N;
- if (this.length <= B) return this._expand(B + 1), this.words[B] |= G, this;
- for (var w = G, W = B; w !== 0 && W < this.length; W++) {
- var y = 0 | this.words[W];
- w = (y += w) >>> 26, y &= 67108863, this.words[W] = y;
- }
- return w !== 0 && (this.words[W] = w, this.length++), this;
- }, n.prototype.isZero = function() {
- return this.length === 1 && this.words[0] === 0;
- }, n.prototype.cmpn = function(V) {
- var N, B = V < 0;
- if (this.negative !== 0 && !B) return -1;
- if (this.negative === 0 && B) return 1;
- if (this.strip(), this.length > 1) N = 1;
- else {
- B && (V = -V), s(V <= 67108863, "Number is too big");
- var G = 0 | this.words[0];
- N = G === V ? 0 : G < V ? -1 : 1;
- }
- return this.negative !== 0 ? 0 | -N : N;
- }, n.prototype.cmp = function(V) {
- if (this.negative !== 0 && V.negative === 0) return -1;
- if (this.negative === 0 && V.negative !== 0) return 1;
- var N = this.ucmp(V);
- return this.negative !== 0 ? 0 | -N : N;
- }, n.prototype.ucmp = function(V) {
- if (this.length > V.length) return 1;
- if (this.length < V.length) return -1;
- for (var N = 0, B = this.length - 1; B >= 0; B--) {
- var G = 0 | this.words[B], w = 0 | V.words[B];
- if (G !== w) {
- G < w ? N = -1 : G > w && (N = 1);
- break;
- }
- }
- return N;
- }, n.prototype.gtn = function(V) {
- return this.cmpn(V) === 1;
- }, n.prototype.gt = function(V) {
- return this.cmp(V) === 1;
- }, n.prototype.gten = function(V) {
- return this.cmpn(V) >= 0;
- }, n.prototype.gte = function(V) {
- return this.cmp(V) >= 0;
- }, n.prototype.ltn = function(V) {
- return this.cmpn(V) === -1;
- }, n.prototype.lt = function(V) {
- return this.cmp(V) === -1;
- }, n.prototype.lten = function(V) {
- return this.cmpn(V) <= 0;
- }, n.prototype.lte = function(V) {
- return this.cmp(V) <= 0;
- }, n.prototype.eqn = function(V) {
- return this.cmpn(V) === 0;
- }, n.prototype.eq = function(V) {
- return this.cmp(V) === 0;
- }, n.red = function(V) {
- return new v(V);
- }, n.prototype.toRed = function(V) {
- return s(!this.red, "Already a number in reduction context"), s(this.negative === 0, "red works only with positives"), V.convertTo(this)._forceRed(V);
- }, n.prototype.fromRed = function() {
- return s(this.red, "fromRed works only with numbers in reduction context"), this.red.convertFrom(this);
- }, n.prototype._forceRed = function(V) {
- return this.red = V, this;
- }, n.prototype.forceRed = function(V) {
- return s(!this.red, "Already a number in reduction context"), this._forceRed(V);
- }, n.prototype.redAdd = function(V) {
- return s(this.red, "redAdd works only with red numbers"), this.red.add(this, V);
- }, n.prototype.redIAdd = function(V) {
- return s(this.red, "redIAdd works only with red numbers"), this.red.iadd(this, V);
- }, n.prototype.redSub = function(V) {
- return s(this.red, "redSub works only with red numbers"), this.red.sub(this, V);
- }, n.prototype.redISub = function(V) {
- return s(this.red, "redISub works only with red numbers"), this.red.isub(this, V);
- }, n.prototype.redShl = function(V) {
- return s(this.red, "redShl works only with red numbers"), this.red.shl(this, V);
- }, n.prototype.redMul = function(V) {
- return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, V), this.red.mul(this, V);
- }, n.prototype.redIMul = function(V) {
- return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, V), this.red.imul(this, V);
- }, n.prototype.redSqr = function() {
- return s(this.red, "redSqr works only with red numbers"), this.red._verify1(this), this.red.sqr(this);
- }, n.prototype.redISqr = function() {
- return s(this.red, "redISqr works only with red numbers"), this.red._verify1(this), this.red.isqr(this);
- }, n.prototype.redSqrt = function() {
- return s(this.red, "redSqrt works only with red numbers"), this.red._verify1(this), this.red.sqrt(this);
- }, n.prototype.redInvm = function() {
- return s(this.red, "redInvm works only with red numbers"), this.red._verify1(this), this.red.invm(this);
- }, n.prototype.redNeg = function() {
- return s(this.red, "redNeg works only with red numbers"), this.red._verify1(this), this.red.neg(this);
- }, n.prototype.redPow = function(V) {
- return s(this.red && !V.red, "redPow(normalNum)"), this.red._verify1(this), this.red.pow(this, V);
- };
- var Y = { k256: null, p224: null, p192: null, p25519: null };
- function R(V, N) {
- this.name = V, this.p = new n(N, 16), this.n = this.p.bitLength(), this.k = new n(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();
- }
- function X() {
- R.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
- }
- function H() {
- R.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
- }
- function S() {
- R.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
- }
- function z() {
- R.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
- }
- function v(V) {
- if (typeof V == "string") {
- var N = n._prime(V);
- this.m = N.p, this.prime = N;
- } else s(V.gtn(1), "modulus must be greater than 1"), this.m = V, this.prime = null;
- }
- function K(V) {
- v.call(this, V), this.shift = this.m.bitLength(), this.shift % 26 != 0 && (this.shift += 26 - this.shift % 26), this.r = new n(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);
- }
- R.prototype._tmp = function() {
- var V = new n(null);
- return V.words = new Array(Math.ceil(this.n / 13)), V;
- }, R.prototype.ireduce = function(V) {
- var N, B = V;
- do
- this.split(B, this.tmp), N = (B = (B = this.imulK(B)).iadd(this.tmp)).bitLength();
- while (N > this.n);
- var G = N < this.n ? -1 : B.ucmp(this.p);
- return G === 0 ? (B.words[0] = 0, B.length = 1) : G > 0 ? B.isub(this.p) : B.strip !== void 0 ? B.strip() : B._strip(), B;
- }, R.prototype.split = function(V, N) {
- V.iushrn(this.n, 0, N);
- }, R.prototype.imulK = function(V) {
- return V.imul(this.k);
- }, l(X, R), X.prototype.split = function(V, N) {
- for (var B = Math.min(V.length, 9), G = 0; G < B; G++) N.words[G] = V.words[G];
- if (N.length = B, V.length <= 9) return V.words[0] = 0, void (V.length = 1);
- var w = V.words[9];
- for (N.words[N.length++] = 4194303 & w, G = 10; G < V.length; G++) {
- var W = 0 | V.words[G];
- V.words[G - 10] = (4194303 & W) << 4 | w >>> 22, w = W;
- }
- w >>>= 22, V.words[G - 10] = w, w === 0 && V.length > 10 ? V.length -= 10 : V.length -= 9;
- }, X.prototype.imulK = function(V) {
- V.words[V.length] = 0, V.words[V.length + 1] = 0, V.length += 2;
- for (var N = 0, B = 0; B < V.length; B++) {
- var G = 0 | V.words[B];
- N += 977 * G, V.words[B] = 67108863 & N, N = 64 * G + (N / 67108864 | 0);
- }
- return V.words[V.length - 1] === 0 && (V.length--, V.words[V.length - 1] === 0 && V.length--), V;
- }, l(H, R), l(S, R), l(z, R), z.prototype.imulK = function(V) {
- for (var N = 0, B = 0; B < V.length; B++) {
- var G = 19 * (0 | V.words[B]) + N, w = 67108863 & G;
- G >>>= 26, V.words[B] = w, N = G;
- }
- return N !== 0 && (V.words[V.length++] = N), V;
- }, n._prime = function(V) {
- if (Y[V]) return Y[V];
- var N;
- if (V === "k256") N = new X();
- else if (V === "p224") N = new H();
- else if (V === "p192") N = new S();
- else {
- if (V !== "p25519") throw new Error("Unknown prime " + V);
- N = new z();
- }
- return Y[V] = N, N;
- }, v.prototype._verify1 = function(V) {
- s(V.negative === 0, "red works only with positives"), s(V.red, "red works only with red numbers");
- }, v.prototype._verify2 = function(V, N) {
- s((V.negative | N.negative) == 0, "red works only with positives"), s(V.red && V.red === N.red, "red works only with red numbers");
- }, v.prototype.imod = function(V) {
- return this.prime ? this.prime.ireduce(V)._forceRed(this) : V.umod(this.m)._forceRed(this);
- }, v.prototype.neg = function(V) {
- return V.isZero() ? V.clone() : this.m.sub(V)._forceRed(this);
- }, v.prototype.add = function(V, N) {
- this._verify2(V, N);
- var B = V.add(N);
- return B.cmp(this.m) >= 0 && B.isub(this.m), B._forceRed(this);
- }, v.prototype.iadd = function(V, N) {
- this._verify2(V, N);
- var B = V.iadd(N);
- return B.cmp(this.m) >= 0 && B.isub(this.m), B;
- }, v.prototype.sub = function(V, N) {
- this._verify2(V, N);
- var B = V.sub(N);
- return B.cmpn(0) < 0 && B.iadd(this.m), B._forceRed(this);
- }, v.prototype.isub = function(V, N) {
- this._verify2(V, N);
- var B = V.isub(N);
- return B.cmpn(0) < 0 && B.iadd(this.m), B;
- }, v.prototype.shl = function(V, N) {
- return this._verify1(V), this.imod(V.ushln(N));
- }, v.prototype.imul = function(V, N) {
- return this._verify2(V, N), this.imod(V.imul(N));
- }, v.prototype.mul = function(V, N) {
- return this._verify2(V, N), this.imod(V.mul(N));
- }, v.prototype.isqr = function(V) {
- return this.imul(V, V.clone());
- }, v.prototype.sqr = function(V) {
- return this.mul(V, V);
- }, v.prototype.sqrt = function(V) {
- if (V.isZero()) return V.clone();
- var N = this.m.andln(3);
- if (s(N % 2 == 1), N === 3) {
- var B = this.m.add(new n(1)).iushrn(2);
- return this.pow(V, B);
- }
- for (var G = this.m.subn(1), w = 0; !G.isZero() && G.andln(1) === 0; ) w++, G.iushrn(1);
- s(!G.isZero());
- var W = new n(1).toRed(this), y = W.redNeg(), f = this.m.subn(1).iushrn(1), D = this.m.bitLength();
- for (D = new n(2 * D * D).toRed(this); this.pow(D, f).cmp(y) !== 0; ) D.redIAdd(y);
- for (var F = this.pow(D, G), T = this.pow(V, G.addn(1).iushrn(1)), Q = this.pow(V, G), P = w; Q.cmp(W) !== 0; ) {
- for (var L = Q, E = 0; L.cmp(W) !== 0; E++) L = L.redSqr();
- s(E < P);
- var J = this.pow(F, new n(1).iushln(P - E - 1));
- T = T.redMul(J), F = J.redSqr(), Q = Q.redMul(F), P = E;
- }
- return T;
- }, v.prototype.invm = function(V) {
- var N = V._invmp(this.m);
- return N.negative !== 0 ? (N.negative = 0, this.imod(N).redNeg()) : this.imod(N);
- }, v.prototype.pow = function(V, N) {
- if (N.isZero()) return new n(1).toRed(this);
- if (N.cmpn(1) === 0) return V.clone();
- var B = new Array(16);
- B[0] = new n(1).toRed(this), B[1] = V;
- for (var G = 2; G < B.length; G++) B[G] = this.mul(B[G - 1], V);
- var w = B[0], W = 0, y = 0, f = N.bitLength() % 26;
- for (f === 0 && (f = 26), G = N.length - 1; G >= 0; G--) {
- for (var D = N.words[G], F = f - 1; F >= 0; F--) {
- var T = D >> F & 1;
- w !== B[0] && (w = this.sqr(w)), T !== 0 || W !== 0 ? (W <<= 1, W |= T, (++y === 4 || G === 0 && F === 0) && (w = this.mul(w, B[W]), y = 0, W = 0)) : y = 0;
- }
- f = 26;
- }
- return w;
- }, v.prototype.convertTo = function(V) {
- var N = V.umod(this.m);
- return N === V ? N.clone() : N;
- }, v.prototype.convertFrom = function(V) {
- var N = V.clone();
- return N.red = null, N;
- }, n.mont = function(V) {
- return new K(V);
- }, l(K, v), K.prototype.convertTo = function(V) {
- return this.imod(V.ushln(this.shift));
- }, K.prototype.convertFrom = function(V) {
- var N = this.imod(V.mul(this.rinv));
- return N.red = null, N;
- }, K.prototype.imul = function(V, N) {
- if (V.isZero() || N.isZero()) return V.words[0] = 0, V.length = 1, V;
- var B = V.imul(N), G = B.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), w = B.isub(G).iushrn(this.shift), W = w;
- return w.cmp(this.m) >= 0 ? W = w.isub(this.m) : w.cmpn(0) < 0 && (W = w.iadd(this.m)), W._forceRed(this);
- }, K.prototype.mul = function(V, N) {
- if (V.isZero() || N.isZero()) return new n(0)._forceRed(this);
- var B = V.mul(N), G = B.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), w = B.isub(G).iushrn(this.shift), W = w;
- return w.cmp(this.m) >= 0 ? W = w.isub(this.m) : w.cmpn(0) < 0 && (W = w.iadd(this.m)), W._forceRed(this);
- }, K.prototype.invm = function(V) {
- return this.imod(V._invmp(this.m).mul(this.r2))._forceRed(this);
- };
- })(C === void 0 || C);
- }, { buffer: 188 }], 185: [function(g, C, i) {
- i.byteLength = function(c) {
- var r = d(c), h = r[0], b = r[1];
- return 3 * (h + b) / 4 - b;
- }, i.toByteArray = function(c) {
- var r, h, b = d(c), u = b[0], m = b[1], Z = new s(function(R, X, H) {
- return 3 * (X + H) / 4 - H;
- }(0, u, m)), p = 0, Y = m > 0 ? u - 4 : u;
- for (h = 0; h < Y; h += 4) r = A[c.charCodeAt(h)] << 18 | A[c.charCodeAt(h + 1)] << 12 | A[c.charCodeAt(h + 2)] << 6 | A[c.charCodeAt(h + 3)], Z[p++] = r >> 16 & 255, Z[p++] = r >> 8 & 255, Z[p++] = 255 & r;
- return m === 2 && (r = A[c.charCodeAt(h)] << 2 | A[c.charCodeAt(h + 1)] >> 4, Z[p++] = 255 & r), m === 1 && (r = A[c.charCodeAt(h)] << 10 | A[c.charCodeAt(h + 1)] << 4 | A[c.charCodeAt(h + 2)] >> 2, Z[p++] = r >> 8 & 255, Z[p++] = 255 & r), Z;
- }, i.fromByteArray = function(c) {
- for (var r, h = c.length, b = h % 3, u = [], m = 0, Z = h - b; m < Z; m += 16383) u.push(o(c, m, m + 16383 > Z ? Z : m + 16383));
- return b === 1 ? (r = c[h - 1], u.push(e[r >> 2] + e[r << 4 & 63] + "==")) : b === 2 && (r = (c[h - 2] << 8) + c[h - 1], u.push(e[r >> 10] + e[r >> 4 & 63] + e[r << 2 & 63] + "=")), u.join("");
- };
- for (var e = [], A = [], s = typeof Uint8Array < "u" ? Uint8Array : Array, l = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", n = 0, a = l.length; n < a; ++n) e[n] = l[n], A[l.charCodeAt(n)] = n;
- function d(c) {
- var r = c.length;
- if (r % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
- var h = c.indexOf("=");
- return h === -1 && (h = r), [h, h === r ? 0 : 4 - h % 4];
- }
- function o(c, r, h) {
- for (var b, u, m = [], Z = r; Z < h; Z += 3) b = (c[Z] << 16 & 16711680) + (c[Z + 1] << 8 & 65280) + (255 & c[Z + 2]), m.push(e[(u = b) >> 18 & 63] + e[u >> 12 & 63] + e[u >> 6 & 63] + e[63 & u]);
- return m.join("");
- }
- A[45] = 62, A[95] = 63;
- }, {}], 186: [function(g, C, i) {
- (function(e, A) {
- function s(B, G) {
- if (!B) throw new Error(G || "Assertion failed");
- }
- function l(B, G) {
- B.super_ = G;
- var w = function() {
- };
- w.prototype = G.prototype, B.prototype = new w(), B.prototype.constructor = B;
- }
- function n(B, G, w) {
- if (n.isBN(B)) return B;
- this.negative = 0, this.words = null, this.length = 0, this.red = null, B !== null && (G !== "le" && G !== "be" || (w = G, G = 10), this._init(B || 0, G || 10, w || "be"));
- }
- var a;
- typeof e == "object" ? e.exports = n : (void 0).BN = n, n.BN = n, n.wordSize = 26;
- try {
- a = typeof window < "u" && window.Buffer !== void 0 ? window.Buffer : g("buffer").Buffer;
- } catch {
- }
- function d(B, G) {
- var w = B.charCodeAt(G);
- return w >= 48 && w <= 57 ? w - 48 : w >= 65 && w <= 70 ? w - 55 : w >= 97 && w <= 102 ? w - 87 : void s(!1, "Invalid character in " + B);
- }
- function o(B, G, w) {
- var W = d(B, w);
- return w - 1 >= G && (W |= d(B, w - 1) << 4), W;
- }
- function c(B, G, w, W) {
- for (var y = 0, f = 0, D = Math.min(B.length, w), F = G; F < D; F++) {
- var T = B.charCodeAt(F) - 48;
- y *= W, f = T >= 49 ? T - 49 + 10 : T >= 17 ? T - 17 + 10 : T, s(T >= 0 && f < W, "Invalid character"), y += f;
- }
- return y;
- }
- function r(B, G) {
- B.words = G.words, B.length = G.length, B.negative = G.negative, B.red = G.red;
- }
- if (n.isBN = function(B) {
- return B instanceof n || B !== null && typeof B == "object" && B.constructor.wordSize === n.wordSize && Array.isArray(B.words);
- }, n.max = function(B, G) {
- return B.cmp(G) > 0 ? B : G;
- }, n.min = function(B, G) {
- return B.cmp(G) < 0 ? B : G;
- }, n.prototype._init = function(B, G, w) {
- if (typeof B == "number") return this._initNumber(B, G, w);
- if (typeof B == "object") return this._initArray(B, G, w);
- G === "hex" && (G = 16), s(G === (0 | G) && G >= 2 && G <= 36);
- var W = 0;
- (B = B.toString().replace(/\s+/g, ""))[0] === "-" && (W++, this.negative = 1), W < B.length && (G === 16 ? this._parseHex(B, W, w) : (this._parseBase(B, G, W), w === "le" && this._initArray(this.toArray(), G, w)));
- }, n.prototype._initNumber = function(B, G, w) {
- B < 0 && (this.negative = 1, B = -B), B < 67108864 ? (this.words = [67108863 & B], this.length = 1) : B < 4503599627370496 ? (this.words = [67108863 & B, B / 67108864 & 67108863], this.length = 2) : (s(B < 9007199254740992), this.words = [67108863 & B, B / 67108864 & 67108863, 1], this.length = 3), w === "le" && this._initArray(this.toArray(), G, w);
- }, n.prototype._initArray = function(B, G, w) {
- if (s(typeof B.length == "number"), B.length <= 0) return this.words = [0], this.length = 1, this;
- this.length = Math.ceil(B.length / 3), this.words = new Array(this.length);
- for (var W = 0; W < this.length; W++) this.words[W] = 0;
- var y, f, D = 0;
- if (w === "be") for (W = B.length - 1, y = 0; W >= 0; W -= 3) f = B[W] | B[W - 1] << 8 | B[W - 2] << 16, this.words[y] |= f << D & 67108863, this.words[y + 1] = f >>> 26 - D & 67108863, (D += 24) >= 26 && (D -= 26, y++);
- else if (w === "le") for (W = 0, y = 0; W < B.length; W += 3) f = B[W] | B[W + 1] << 8 | B[W + 2] << 16, this.words[y] |= f << D & 67108863, this.words[y + 1] = f >>> 26 - D & 67108863, (D += 24) >= 26 && (D -= 26, y++);
- return this._strip();
- }, n.prototype._parseHex = function(B, G, w) {
- this.length = Math.ceil((B.length - G) / 6), this.words = new Array(this.length);
- for (var W = 0; W < this.length; W++) this.words[W] = 0;
- var y, f = 0, D = 0;
- if (w === "be") for (W = B.length - 1; W >= G; W -= 2) y = o(B, G, W) << f, this.words[D] |= 67108863 & y, f >= 18 ? (f -= 18, D += 1, this.words[D] |= y >>> 26) : f += 8;
- else for (W = (B.length - G) % 2 == 0 ? G + 1 : G; W < B.length; W += 2) y = o(B, G, W) << f, this.words[D] |= 67108863 & y, f >= 18 ? (f -= 18, D += 1, this.words[D] |= y >>> 26) : f += 8;
- this._strip();
- }, n.prototype._parseBase = function(B, G, w) {
- this.words = [0], this.length = 1;
- for (var W = 0, y = 1; y <= 67108863; y *= G) W++;
- W--, y = y / G | 0;
- for (var f = B.length - w, D = f % W, F = Math.min(f, f - D) + w, T = 0, Q = w; Q < F; Q += W) T = c(B, Q, Q + W, G), this.imuln(y), this.words[0] + T < 67108864 ? this.words[0] += T : this._iaddn(T);
- if (D !== 0) {
- var P = 1;
- for (T = c(B, Q, B.length, G), Q = 0; Q < D; Q++) P *= G;
- this.imuln(P), this.words[0] + T < 67108864 ? this.words[0] += T : this._iaddn(T);
- }
- this._strip();
- }, n.prototype.copy = function(B) {
- B.words = new Array(this.length);
- for (var G = 0; G < this.length; G++) B.words[G] = this.words[G];
- B.length = this.length, B.negative = this.negative, B.red = this.red;
- }, n.prototype._move = function(B) {
- r(B, this);
- }, n.prototype.clone = function() {
- var B = new n(null);
- return this.copy(B), B;
- }, n.prototype._expand = function(B) {
- for (; this.length < B; ) this.words[this.length++] = 0;
- return this;
- }, n.prototype._strip = function() {
- for (; this.length > 1 && this.words[this.length - 1] === 0; ) this.length--;
- return this._normSign();
- }, n.prototype._normSign = function() {
- return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;
- }, typeof Symbol < "u" && typeof Symbol.for == "function") try {
- n.prototype[Symbol.for("nodejs.util.inspect.custom")] = h;
- } catch {
- n.prototype.inspect = h;
- }
- else n.prototype.inspect = h;
- function h() {
- return (this.red ? "<BN-R: " : "<BN: ") + this.toString(16) + ">";
- }
- var b = ["", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000", "000000000", "0000000000", "00000000000", "000000000000", "0000000000000", "00000000000000", "000000000000000", "0000000000000000", "00000000000000000", "000000000000000000", "0000000000000000000", "00000000000000000000", "000000000000000000000", "0000000000000000000000", "00000000000000000000000", "000000000000000000000000", "0000000000000000000000000"], u = [0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], m = [0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 1e7, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64e6, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 243e5, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176];
- n.prototype.toString = function(B, G) {
- var w;
- if (G = 0 | G || 1, (B = B || 10) === 16 || B === "hex") {
- w = "";
- for (var W = 0, y = 0, f = 0; f < this.length; f++) {
- var D = this.words[f], F = (16777215 & (D << W | y)).toString(16);
- y = D >>> 24 - W & 16777215, (W += 2) >= 26 && (W -= 26, f--), w = y !== 0 || f !== this.length - 1 ? b[6 - F.length] + F + w : F + w;
- }
- for (y !== 0 && (w = y.toString(16) + w); w.length % G != 0; ) w = "0" + w;
- return this.negative !== 0 && (w = "-" + w), w;
- }
- if (B === (0 | B) && B >= 2 && B <= 36) {
- var T = u[B], Q = m[B];
- w = "";
- var P = this.clone();
- for (P.negative = 0; !P.isZero(); ) {
- var L = P.modrn(Q).toString(B);
- w = (P = P.idivn(Q)).isZero() ? L + w : b[T - L.length] + L + w;
- }
- for (this.isZero() && (w = "0" + w); w.length % G != 0; ) w = "0" + w;
- return this.negative !== 0 && (w = "-" + w), w;
- }
- s(!1, "Base should be between 2 and 36");
- }, n.prototype.toNumber = function() {
- var B = this.words[0];
- return this.length === 2 ? B += 67108864 * this.words[1] : this.length === 3 && this.words[2] === 1 ? B += 4503599627370496 + 67108864 * this.words[1] : this.length > 2 && s(!1, "Number can only safely store up to 53 bits"), this.negative !== 0 ? -B : B;
- }, n.prototype.toJSON = function() {
- return this.toString(16, 2);
- }, a && (n.prototype.toBuffer = function(B, G) {
- return this.toArrayLike(a, B, G);
- }), n.prototype.toArray = function(B, G) {
- return this.toArrayLike(Array, B, G);
- };
- function Z(B, G, w) {
- w.negative = G.negative ^ B.negative;
- var W = B.length + G.length | 0;
- w.length = W, W = W - 1 | 0;
- var y = 0 | B.words[0], f = 0 | G.words[0], D = y * f, F = 67108863 & D, T = D / 67108864 | 0;
- w.words[0] = F;
- for (var Q = 1; Q < W; Q++) {
- for (var P = T >>> 26, L = 67108863 & T, E = Math.min(Q, G.length - 1), J = Math.max(0, Q - B.length + 1); J <= E; J++) {
- var k = Q - J | 0;
- P += (D = (y = 0 | B.words[k]) * (f = 0 | G.words[J]) + L) / 67108864 | 0, L = 67108863 & D;
- }
- w.words[Q] = 0 | L, T = 0 | P;
- }
- return T !== 0 ? w.words[Q] = 0 | T : w.length--, w._strip();
- }
- n.prototype.toArrayLike = function(B, G, w) {
- this._strip();
- var W = this.byteLength(), y = w || Math.max(1, W);
- s(W <= y, "byte array longer than desired length"), s(y > 0, "Requested array length <= 0");
- var f = function(D, F) {
- return D.allocUnsafe ? D.allocUnsafe(F) : new D(F);
- }(B, y);
- return this["_toArrayLike" + (G === "le" ? "LE" : "BE")](f, W), f;
- }, n.prototype._toArrayLikeLE = function(B, G) {
- for (var w = 0, W = 0, y = 0, f = 0; y < this.length; y++) {
- var D = this.words[y] << f | W;
- B[w++] = 255 & D, w < B.length && (B[w++] = D >> 8 & 255), w < B.length && (B[w++] = D >> 16 & 255), f === 6 ? (w < B.length && (B[w++] = D >> 24 & 255), W = 0, f = 0) : (W = D >>> 24, f += 2);
- }
- if (w < B.length) for (B[w++] = W; w < B.length; ) B[w++] = 0;
- }, n.prototype._toArrayLikeBE = function(B, G) {
- for (var w = B.length - 1, W = 0, y = 0, f = 0; y < this.length; y++) {
- var D = this.words[y] << f | W;
- B[w--] = 255 & D, w >= 0 && (B[w--] = D >> 8 & 255), w >= 0 && (B[w--] = D >> 16 & 255), f === 6 ? (w >= 0 && (B[w--] = D >> 24 & 255), W = 0, f = 0) : (W = D >>> 24, f += 2);
- }
- if (w >= 0) for (B[w--] = W; w >= 0; ) B[w--] = 0;
- }, Math.clz32 ? n.prototype._countBits = function(B) {
- return 32 - Math.clz32(B);
- } : n.prototype._countBits = function(B) {
- var G = B, w = 0;
- return G >= 4096 && (w += 13, G >>>= 13), G >= 64 && (w += 7, G >>>= 7), G >= 8 && (w += 4, G >>>= 4), G >= 2 && (w += 2, G >>>= 2), w + G;
- }, n.prototype._zeroBits = function(B) {
- if (B === 0) return 26;
- var G = B, w = 0;
- return (8191 & G) == 0 && (w += 13, G >>>= 13), (127 & G) == 0 && (w += 7, G >>>= 7), (15 & G) == 0 && (w += 4, G >>>= 4), (3 & G) == 0 && (w += 2, G >>>= 2), (1 & G) == 0 && w++, w;
- }, n.prototype.bitLength = function() {
- var B = this.words[this.length - 1], G = this._countBits(B);
- return 26 * (this.length - 1) + G;
- }, n.prototype.zeroBits = function() {
- if (this.isZero()) return 0;
- for (var B = 0, G = 0; G < this.length; G++) {
- var w = this._zeroBits(this.words[G]);
- if (B += w, w !== 26) break;
- }
- return B;
- }, n.prototype.byteLength = function() {
- return Math.ceil(this.bitLength() / 8);
- }, n.prototype.toTwos = function(B) {
- return this.negative !== 0 ? this.abs().inotn(B).iaddn(1) : this.clone();
- }, n.prototype.fromTwos = function(B) {
- return this.testn(B - 1) ? this.notn(B).iaddn(1).ineg() : this.clone();
- }, n.prototype.isNeg = function() {
- return this.negative !== 0;
- }, n.prototype.neg = function() {
- return this.clone().ineg();
- }, n.prototype.ineg = function() {
- return this.isZero() || (this.negative ^= 1), this;
- }, n.prototype.iuor = function(B) {
- for (; this.length < B.length; ) this.words[this.length++] = 0;
- for (var G = 0; G < B.length; G++) this.words[G] = this.words[G] | B.words[G];
- return this._strip();
- }, n.prototype.ior = function(B) {
- return s((this.negative | B.negative) == 0), this.iuor(B);
- }, n.prototype.or = function(B) {
- return this.length > B.length ? this.clone().ior(B) : B.clone().ior(this);
- }, n.prototype.uor = function(B) {
- return this.length > B.length ? this.clone().iuor(B) : B.clone().iuor(this);
- }, n.prototype.iuand = function(B) {
- var G;
- G = this.length > B.length ? B : this;
- for (var w = 0; w < G.length; w++) this.words[w] = this.words[w] & B.words[w];
- return this.length = G.length, this._strip();
- }, n.prototype.iand = function(B) {
- return s((this.negative | B.negative) == 0), this.iuand(B);
- }, n.prototype.and = function(B) {
- return this.length > B.length ? this.clone().iand(B) : B.clone().iand(this);
- }, n.prototype.uand = function(B) {
- return this.length > B.length ? this.clone().iuand(B) : B.clone().iuand(this);
- }, n.prototype.iuxor = function(B) {
- var G, w;
- this.length > B.length ? (G = this, w = B) : (G = B, w = this);
- for (var W = 0; W < w.length; W++) this.words[W] = G.words[W] ^ w.words[W];
- if (this !== G) for (; W < G.length; W++) this.words[W] = G.words[W];
- return this.length = G.length, this._strip();
- }, n.prototype.ixor = function(B) {
- return s((this.negative | B.negative) == 0), this.iuxor(B);
- }, n.prototype.xor = function(B) {
- return this.length > B.length ? this.clone().ixor(B) : B.clone().ixor(this);
- }, n.prototype.uxor = function(B) {
- return this.length > B.length ? this.clone().iuxor(B) : B.clone().iuxor(this);
- }, n.prototype.inotn = function(B) {
- s(typeof B == "number" && B >= 0);
- var G = 0 | Math.ceil(B / 26), w = B % 26;
- this._expand(G), w > 0 && G--;
- for (var W = 0; W < G; W++) this.words[W] = 67108863 & ~this.words[W];
- return w > 0 && (this.words[W] = ~this.words[W] & 67108863 >> 26 - w), this._strip();
- }, n.prototype.notn = function(B) {
- return this.clone().inotn(B);
- }, n.prototype.setn = function(B, G) {
- s(typeof B == "number" && B >= 0);
- var w = B / 26 | 0, W = B % 26;
- return this._expand(w + 1), this.words[w] = G ? this.words[w] | 1 << W : this.words[w] & ~(1 << W), this._strip();
- }, n.prototype.iadd = function(B) {
- var G, w, W;
- if (this.negative !== 0 && B.negative === 0) return this.negative = 0, G = this.isub(B), this.negative ^= 1, this._normSign();
- if (this.negative === 0 && B.negative !== 0) return B.negative = 0, G = this.isub(B), B.negative = 1, G._normSign();
- this.length > B.length ? (w = this, W = B) : (w = B, W = this);
- for (var y = 0, f = 0; f < W.length; f++) G = (0 | w.words[f]) + (0 | W.words[f]) + y, this.words[f] = 67108863 & G, y = G >>> 26;
- for (; y !== 0 && f < w.length; f++) G = (0 | w.words[f]) + y, this.words[f] = 67108863 & G, y = G >>> 26;
- if (this.length = w.length, y !== 0) this.words[this.length] = y, this.length++;
- else if (w !== this) for (; f < w.length; f++) this.words[f] = w.words[f];
- return this;
- }, n.prototype.add = function(B) {
- var G;
- return B.negative !== 0 && this.negative === 0 ? (B.negative = 0, G = this.sub(B), B.negative ^= 1, G) : B.negative === 0 && this.negative !== 0 ? (this.negative = 0, G = B.sub(this), this.negative = 1, G) : this.length > B.length ? this.clone().iadd(B) : B.clone().iadd(this);
- }, n.prototype.isub = function(B) {
- if (B.negative !== 0) {
- B.negative = 0;
- var G = this.iadd(B);
- return B.negative = 1, G._normSign();
- }
- if (this.negative !== 0) return this.negative = 0, this.iadd(B), this.negative = 1, this._normSign();
- var w, W, y = this.cmp(B);
- if (y === 0) return this.negative = 0, this.length = 1, this.words[0] = 0, this;
- y > 0 ? (w = this, W = B) : (w = B, W = this);
- for (var f = 0, D = 0; D < W.length; D++) f = (G = (0 | w.words[D]) - (0 | W.words[D]) + f) >> 26, this.words[D] = 67108863 & G;
- for (; f !== 0 && D < w.length; D++) f = (G = (0 | w.words[D]) + f) >> 26, this.words[D] = 67108863 & G;
- if (f === 0 && D < w.length && w !== this) for (; D < w.length; D++) this.words[D] = w.words[D];
- return this.length = Math.max(this.length, D), w !== this && (this.negative = 1), this._strip();
- }, n.prototype.sub = function(B) {
- return this.clone().isub(B);
- };
- var p = function(B, G, w) {
- var W, y, f, D = B.words, F = G.words, T = w.words, Q = 0, P = 0 | D[0], L = 8191 & P, E = P >>> 13, J = 0 | D[1], k = 8191 & J, j = J >>> 13, q = 0 | D[2], Cg = 8191 & q, Ig = q >>> 13, x = 0 | D[3], Ag = 8191 & x, eg = x >>> 13, O = 0 | D[4], _ = 8191 & O, gg = O >>> 13, lg = 0 | D[5], ng = 8191 & lg, sg = lg >>> 13, og = 0 | D[6], cg = 8191 & og, rg = og >>> 13, dg = 0 | D[7], Bg = 8191 & dg, Zg = dg >>> 13, Xg = 0 | D[8], Kg = 8191 & Xg, kg = Xg >>> 13, Wg = 0 | D[9], Ng = 8191 & Wg, wg = Wg >>> 13, fg = 0 | F[0], Jg = 8191 & fg, zg = fg >>> 13, cI = 0 | F[1], YI = 8191 & cI, Eg = cI >>> 13, aI = 0 | F[2], dI = 8191 & aI, _g = aI >>> 13, xI = 0 | F[3], SI = 8191 & xI, eI = xI >>> 13, NI = 0 | F[4], EI = 8191 & NI, oI = NI >>> 13, LI = 0 | F[5], pg = 8191 & LI, uI = LI >>> 13, hg = 0 | F[6], bg = 8191 & hg, Rg = hg >>> 13, Tg = 0 | F[7], rI = 8191 & Tg, jg = Tg >>> 13, GI = 0 | F[8], nI = 8191 & GI, CI = GI >>> 13, WI = 0 | F[9], mI = 8191 & WI, VI = WI >>> 13;
- w.negative = B.negative ^ G.negative, w.length = 19;
- var yC = (Q + (W = Math.imul(L, Jg)) | 0) + ((8191 & (y = (y = Math.imul(L, zg)) + Math.imul(E, Jg) | 0)) << 13) | 0;
- Q = ((f = Math.imul(E, zg)) + (y >>> 13) | 0) + (yC >>> 26) | 0, yC &= 67108863, W = Math.imul(k, Jg), y = (y = Math.imul(k, zg)) + Math.imul(j, Jg) | 0, f = Math.imul(j, zg);
- var gC = (Q + (W = W + Math.imul(L, YI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, Eg) | 0) + Math.imul(E, YI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, Eg) | 0) + (y >>> 13) | 0) + (gC >>> 26) | 0, gC &= 67108863, W = Math.imul(Cg, Jg), y = (y = Math.imul(Cg, zg)) + Math.imul(Ig, Jg) | 0, f = Math.imul(Ig, zg), W = W + Math.imul(k, YI) | 0, y = (y = y + Math.imul(k, Eg) | 0) + Math.imul(j, YI) | 0, f = f + Math.imul(j, Eg) | 0;
- var It = (Q + (W = W + Math.imul(L, dI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, _g) | 0) + Math.imul(E, dI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, _g) | 0) + (y >>> 13) | 0) + (It >>> 26) | 0, It &= 67108863, W = Math.imul(Ag, Jg), y = (y = Math.imul(Ag, zg)) + Math.imul(eg, Jg) | 0, f = Math.imul(eg, zg), W = W + Math.imul(Cg, YI) | 0, y = (y = y + Math.imul(Cg, Eg) | 0) + Math.imul(Ig, YI) | 0, f = f + Math.imul(Ig, Eg) | 0, W = W + Math.imul(k, dI) | 0, y = (y = y + Math.imul(k, _g) | 0) + Math.imul(j, dI) | 0, f = f + Math.imul(j, _g) | 0;
- var dC = (Q + (W = W + Math.imul(L, SI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, eI) | 0) + Math.imul(E, SI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, eI) | 0) + (y >>> 13) | 0) + (dC >>> 26) | 0, dC &= 67108863, W = Math.imul(_, Jg), y = (y = Math.imul(_, zg)) + Math.imul(gg, Jg) | 0, f = Math.imul(gg, zg), W = W + Math.imul(Ag, YI) | 0, y = (y = y + Math.imul(Ag, Eg) | 0) + Math.imul(eg, YI) | 0, f = f + Math.imul(eg, Eg) | 0, W = W + Math.imul(Cg, dI) | 0, y = (y = y + Math.imul(Cg, _g) | 0) + Math.imul(Ig, dI) | 0, f = f + Math.imul(Ig, _g) | 0, W = W + Math.imul(k, SI) | 0, y = (y = y + Math.imul(k, eI) | 0) + Math.imul(j, SI) | 0, f = f + Math.imul(j, eI) | 0;
- var Tt = (Q + (W = W + Math.imul(L, EI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, oI) | 0) + Math.imul(E, EI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, oI) | 0) + (y >>> 13) | 0) + (Tt >>> 26) | 0, Tt &= 67108863, W = Math.imul(ng, Jg), y = (y = Math.imul(ng, zg)) + Math.imul(sg, Jg) | 0, f = Math.imul(sg, zg), W = W + Math.imul(_, YI) | 0, y = (y = y + Math.imul(_, Eg) | 0) + Math.imul(gg, YI) | 0, f = f + Math.imul(gg, Eg) | 0, W = W + Math.imul(Ag, dI) | 0, y = (y = y + Math.imul(Ag, _g) | 0) + Math.imul(eg, dI) | 0, f = f + Math.imul(eg, _g) | 0, W = W + Math.imul(Cg, SI) | 0, y = (y = y + Math.imul(Cg, eI) | 0) + Math.imul(Ig, SI) | 0, f = f + Math.imul(Ig, eI) | 0, W = W + Math.imul(k, EI) | 0, y = (y = y + Math.imul(k, oI) | 0) + Math.imul(j, EI) | 0, f = f + Math.imul(j, oI) | 0;
- var ag = (Q + (W = W + Math.imul(L, pg) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, uI) | 0) + Math.imul(E, pg) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, uI) | 0) + (y >>> 13) | 0) + (ag >>> 26) | 0, ag &= 67108863, W = Math.imul(cg, Jg), y = (y = Math.imul(cg, zg)) + Math.imul(rg, Jg) | 0, f = Math.imul(rg, zg), W = W + Math.imul(ng, YI) | 0, y = (y = y + Math.imul(ng, Eg) | 0) + Math.imul(sg, YI) | 0, f = f + Math.imul(sg, Eg) | 0, W = W + Math.imul(_, dI) | 0, y = (y = y + Math.imul(_, _g) | 0) + Math.imul(gg, dI) | 0, f = f + Math.imul(gg, _g) | 0, W = W + Math.imul(Ag, SI) | 0, y = (y = y + Math.imul(Ag, eI) | 0) + Math.imul(eg, SI) | 0, f = f + Math.imul(eg, eI) | 0, W = W + Math.imul(Cg, EI) | 0, y = (y = y + Math.imul(Cg, oI) | 0) + Math.imul(Ig, EI) | 0, f = f + Math.imul(Ig, oI) | 0, W = W + Math.imul(k, pg) | 0, y = (y = y + Math.imul(k, uI) | 0) + Math.imul(j, pg) | 0, f = f + Math.imul(j, uI) | 0;
- var mg = (Q + (W = W + Math.imul(L, bg) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, Rg) | 0) + Math.imul(E, bg) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, Rg) | 0) + (y >>> 13) | 0) + (mg >>> 26) | 0, mg &= 67108863, W = Math.imul(Bg, Jg), y = (y = Math.imul(Bg, zg)) + Math.imul(Zg, Jg) | 0, f = Math.imul(Zg, zg), W = W + Math.imul(cg, YI) | 0, y = (y = y + Math.imul(cg, Eg) | 0) + Math.imul(rg, YI) | 0, f = f + Math.imul(rg, Eg) | 0, W = W + Math.imul(ng, dI) | 0, y = (y = y + Math.imul(ng, _g) | 0) + Math.imul(sg, dI) | 0, f = f + Math.imul(sg, _g) | 0, W = W + Math.imul(_, SI) | 0, y = (y = y + Math.imul(_, eI) | 0) + Math.imul(gg, SI) | 0, f = f + Math.imul(gg, eI) | 0, W = W + Math.imul(Ag, EI) | 0, y = (y = y + Math.imul(Ag, oI) | 0) + Math.imul(eg, EI) | 0, f = f + Math.imul(eg, oI) | 0, W = W + Math.imul(Cg, pg) | 0, y = (y = y + Math.imul(Cg, uI) | 0) + Math.imul(Ig, pg) | 0, f = f + Math.imul(Ig, uI) | 0, W = W + Math.imul(k, bg) | 0, y = (y = y + Math.imul(k, Rg) | 0) + Math.imul(j, bg) | 0, f = f + Math.imul(j, Rg) | 0;
- var Sg = (Q + (W = W + Math.imul(L, rI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, jg) | 0) + Math.imul(E, rI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, jg) | 0) + (y >>> 13) | 0) + (Sg >>> 26) | 0, Sg &= 67108863, W = Math.imul(Kg, Jg), y = (y = Math.imul(Kg, zg)) + Math.imul(kg, Jg) | 0, f = Math.imul(kg, zg), W = W + Math.imul(Bg, YI) | 0, y = (y = y + Math.imul(Bg, Eg) | 0) + Math.imul(Zg, YI) | 0, f = f + Math.imul(Zg, Eg) | 0, W = W + Math.imul(cg, dI) | 0, y = (y = y + Math.imul(cg, _g) | 0) + Math.imul(rg, dI) | 0, f = f + Math.imul(rg, _g) | 0, W = W + Math.imul(ng, SI) | 0, y = (y = y + Math.imul(ng, eI) | 0) + Math.imul(sg, SI) | 0, f = f + Math.imul(sg, eI) | 0, W = W + Math.imul(_, EI) | 0, y = (y = y + Math.imul(_, oI) | 0) + Math.imul(gg, EI) | 0, f = f + Math.imul(gg, oI) | 0, W = W + Math.imul(Ag, pg) | 0, y = (y = y + Math.imul(Ag, uI) | 0) + Math.imul(eg, pg) | 0, f = f + Math.imul(eg, uI) | 0, W = W + Math.imul(Cg, bg) | 0, y = (y = y + Math.imul(Cg, Rg) | 0) + Math.imul(Ig, bg) | 0, f = f + Math.imul(Ig, Rg) | 0, W = W + Math.imul(k, rI) | 0, y = (y = y + Math.imul(k, jg) | 0) + Math.imul(j, rI) | 0, f = f + Math.imul(j, jg) | 0;
- var Fg = (Q + (W = W + Math.imul(L, nI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, CI) | 0) + Math.imul(E, nI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, CI) | 0) + (y >>> 13) | 0) + (Fg >>> 26) | 0, Fg &= 67108863, W = Math.imul(Ng, Jg), y = (y = Math.imul(Ng, zg)) + Math.imul(wg, Jg) | 0, f = Math.imul(wg, zg), W = W + Math.imul(Kg, YI) | 0, y = (y = y + Math.imul(Kg, Eg) | 0) + Math.imul(kg, YI) | 0, f = f + Math.imul(kg, Eg) | 0, W = W + Math.imul(Bg, dI) | 0, y = (y = y + Math.imul(Bg, _g) | 0) + Math.imul(Zg, dI) | 0, f = f + Math.imul(Zg, _g) | 0, W = W + Math.imul(cg, SI) | 0, y = (y = y + Math.imul(cg, eI) | 0) + Math.imul(rg, SI) | 0, f = f + Math.imul(rg, eI) | 0, W = W + Math.imul(ng, EI) | 0, y = (y = y + Math.imul(ng, oI) | 0) + Math.imul(sg, EI) | 0, f = f + Math.imul(sg, oI) | 0, W = W + Math.imul(_, pg) | 0, y = (y = y + Math.imul(_, uI) | 0) + Math.imul(gg, pg) | 0, f = f + Math.imul(gg, uI) | 0, W = W + Math.imul(Ag, bg) | 0, y = (y = y + Math.imul(Ag, Rg) | 0) + Math.imul(eg, bg) | 0, f = f + Math.imul(eg, Rg) | 0, W = W + Math.imul(Cg, rI) | 0, y = (y = y + Math.imul(Cg, jg) | 0) + Math.imul(Ig, rI) | 0, f = f + Math.imul(Ig, jg) | 0, W = W + Math.imul(k, nI) | 0, y = (y = y + Math.imul(k, CI) | 0) + Math.imul(j, nI) | 0, f = f + Math.imul(j, CI) | 0;
- var tI = (Q + (W = W + Math.imul(L, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, VI) | 0) + Math.imul(E, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(E, VI) | 0) + (y >>> 13) | 0) + (tI >>> 26) | 0, tI &= 67108863, W = Math.imul(Ng, YI), y = (y = Math.imul(Ng, Eg)) + Math.imul(wg, YI) | 0, f = Math.imul(wg, Eg), W = W + Math.imul(Kg, dI) | 0, y = (y = y + Math.imul(Kg, _g) | 0) + Math.imul(kg, dI) | 0, f = f + Math.imul(kg, _g) | 0, W = W + Math.imul(Bg, SI) | 0, y = (y = y + Math.imul(Bg, eI) | 0) + Math.imul(Zg, SI) | 0, f = f + Math.imul(Zg, eI) | 0, W = W + Math.imul(cg, EI) | 0, y = (y = y + Math.imul(cg, oI) | 0) + Math.imul(rg, EI) | 0, f = f + Math.imul(rg, oI) | 0, W = W + Math.imul(ng, pg) | 0, y = (y = y + Math.imul(ng, uI) | 0) + Math.imul(sg, pg) | 0, f = f + Math.imul(sg, uI) | 0, W = W + Math.imul(_, bg) | 0, y = (y = y + Math.imul(_, Rg) | 0) + Math.imul(gg, bg) | 0, f = f + Math.imul(gg, Rg) | 0, W = W + Math.imul(Ag, rI) | 0, y = (y = y + Math.imul(Ag, jg) | 0) + Math.imul(eg, rI) | 0, f = f + Math.imul(eg, jg) | 0, W = W + Math.imul(Cg, nI) | 0, y = (y = y + Math.imul(Cg, CI) | 0) + Math.imul(Ig, nI) | 0, f = f + Math.imul(Ig, CI) | 0;
- var vg = (Q + (W = W + Math.imul(k, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(k, VI) | 0) + Math.imul(j, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(j, VI) | 0) + (y >>> 13) | 0) + (vg >>> 26) | 0, vg &= 67108863, W = Math.imul(Ng, dI), y = (y = Math.imul(Ng, _g)) + Math.imul(wg, dI) | 0, f = Math.imul(wg, _g), W = W + Math.imul(Kg, SI) | 0, y = (y = y + Math.imul(Kg, eI) | 0) + Math.imul(kg, SI) | 0, f = f + Math.imul(kg, eI) | 0, W = W + Math.imul(Bg, EI) | 0, y = (y = y + Math.imul(Bg, oI) | 0) + Math.imul(Zg, EI) | 0, f = f + Math.imul(Zg, oI) | 0, W = W + Math.imul(cg, pg) | 0, y = (y = y + Math.imul(cg, uI) | 0) + Math.imul(rg, pg) | 0, f = f + Math.imul(rg, uI) | 0, W = W + Math.imul(ng, bg) | 0, y = (y = y + Math.imul(ng, Rg) | 0) + Math.imul(sg, bg) | 0, f = f + Math.imul(sg, Rg) | 0, W = W + Math.imul(_, rI) | 0, y = (y = y + Math.imul(_, jg) | 0) + Math.imul(gg, rI) | 0, f = f + Math.imul(gg, jg) | 0, W = W + Math.imul(Ag, nI) | 0, y = (y = y + Math.imul(Ag, CI) | 0) + Math.imul(eg, nI) | 0, f = f + Math.imul(eg, CI) | 0;
- var xg = (Q + (W = W + Math.imul(Cg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Cg, VI) | 0) + Math.imul(Ig, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(Ig, VI) | 0) + (y >>> 13) | 0) + (xg >>> 26) | 0, xg &= 67108863, W = Math.imul(Ng, SI), y = (y = Math.imul(Ng, eI)) + Math.imul(wg, SI) | 0, f = Math.imul(wg, eI), W = W + Math.imul(Kg, EI) | 0, y = (y = y + Math.imul(Kg, oI) | 0) + Math.imul(kg, EI) | 0, f = f + Math.imul(kg, oI) | 0, W = W + Math.imul(Bg, pg) | 0, y = (y = y + Math.imul(Bg, uI) | 0) + Math.imul(Zg, pg) | 0, f = f + Math.imul(Zg, uI) | 0, W = W + Math.imul(cg, bg) | 0, y = (y = y + Math.imul(cg, Rg) | 0) + Math.imul(rg, bg) | 0, f = f + Math.imul(rg, Rg) | 0, W = W + Math.imul(ng, rI) | 0, y = (y = y + Math.imul(ng, jg) | 0) + Math.imul(sg, rI) | 0, f = f + Math.imul(sg, jg) | 0, W = W + Math.imul(_, nI) | 0, y = (y = y + Math.imul(_, CI) | 0) + Math.imul(gg, nI) | 0, f = f + Math.imul(gg, CI) | 0;
- var vI = (Q + (W = W + Math.imul(Ag, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Ag, VI) | 0) + Math.imul(eg, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(eg, VI) | 0) + (y >>> 13) | 0) + (vI >>> 26) | 0, vI &= 67108863, W = Math.imul(Ng, EI), y = (y = Math.imul(Ng, oI)) + Math.imul(wg, EI) | 0, f = Math.imul(wg, oI), W = W + Math.imul(Kg, pg) | 0, y = (y = y + Math.imul(Kg, uI) | 0) + Math.imul(kg, pg) | 0, f = f + Math.imul(kg, uI) | 0, W = W + Math.imul(Bg, bg) | 0, y = (y = y + Math.imul(Bg, Rg) | 0) + Math.imul(Zg, bg) | 0, f = f + Math.imul(Zg, Rg) | 0, W = W + Math.imul(cg, rI) | 0, y = (y = y + Math.imul(cg, jg) | 0) + Math.imul(rg, rI) | 0, f = f + Math.imul(rg, jg) | 0, W = W + Math.imul(ng, nI) | 0, y = (y = y + Math.imul(ng, CI) | 0) + Math.imul(sg, nI) | 0, f = f + Math.imul(sg, CI) | 0;
- var fI = (Q + (W = W + Math.imul(_, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(_, VI) | 0) + Math.imul(gg, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(gg, VI) | 0) + (y >>> 13) | 0) + (fI >>> 26) | 0, fI &= 67108863, W = Math.imul(Ng, pg), y = (y = Math.imul(Ng, uI)) + Math.imul(wg, pg) | 0, f = Math.imul(wg, uI), W = W + Math.imul(Kg, bg) | 0, y = (y = y + Math.imul(Kg, Rg) | 0) + Math.imul(kg, bg) | 0, f = f + Math.imul(kg, Rg) | 0, W = W + Math.imul(Bg, rI) | 0, y = (y = y + Math.imul(Bg, jg) | 0) + Math.imul(Zg, rI) | 0, f = f + Math.imul(Zg, jg) | 0, W = W + Math.imul(cg, nI) | 0, y = (y = y + Math.imul(cg, CI) | 0) + Math.imul(rg, nI) | 0, f = f + Math.imul(rg, CI) | 0;
- var MI = (Q + (W = W + Math.imul(ng, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(ng, VI) | 0) + Math.imul(sg, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(sg, VI) | 0) + (y >>> 13) | 0) + (MI >>> 26) | 0, MI &= 67108863, W = Math.imul(Ng, bg), y = (y = Math.imul(Ng, Rg)) + Math.imul(wg, bg) | 0, f = Math.imul(wg, Rg), W = W + Math.imul(Kg, rI) | 0, y = (y = y + Math.imul(Kg, jg) | 0) + Math.imul(kg, rI) | 0, f = f + Math.imul(kg, jg) | 0, W = W + Math.imul(Bg, nI) | 0, y = (y = y + Math.imul(Bg, CI) | 0) + Math.imul(Zg, nI) | 0, f = f + Math.imul(Zg, CI) | 0;
- var hI = (Q + (W = W + Math.imul(cg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(cg, VI) | 0) + Math.imul(rg, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(rg, VI) | 0) + (y >>> 13) | 0) + (hI >>> 26) | 0, hI &= 67108863, W = Math.imul(Ng, rI), y = (y = Math.imul(Ng, jg)) + Math.imul(wg, rI) | 0, f = Math.imul(wg, jg), W = W + Math.imul(Kg, nI) | 0, y = (y = y + Math.imul(Kg, CI) | 0) + Math.imul(kg, nI) | 0, f = f + Math.imul(kg, CI) | 0;
- var AC = (Q + (W = W + Math.imul(Bg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Bg, VI) | 0) + Math.imul(Zg, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(Zg, VI) | 0) + (y >>> 13) | 0) + (AC >>> 26) | 0, AC &= 67108863, W = Math.imul(Ng, nI), y = (y = Math.imul(Ng, CI)) + Math.imul(wg, nI) | 0, f = Math.imul(wg, CI);
- var PI = (Q + (W = W + Math.imul(Kg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Kg, VI) | 0) + Math.imul(kg, mI) | 0)) << 13) | 0;
- Q = ((f = f + Math.imul(kg, VI) | 0) + (y >>> 13) | 0) + (PI >>> 26) | 0, PI &= 67108863;
- var jI = (Q + (W = Math.imul(Ng, mI)) | 0) + ((8191 & (y = (y = Math.imul(Ng, VI)) + Math.imul(wg, mI) | 0)) << 13) | 0;
- return Q = ((f = Math.imul(wg, VI)) + (y >>> 13) | 0) + (jI >>> 26) | 0, jI &= 67108863, T[0] = yC, T[1] = gC, T[2] = It, T[3] = dC, T[4] = Tt, T[5] = ag, T[6] = mg, T[7] = Sg, T[8] = Fg, T[9] = tI, T[10] = vg, T[11] = xg, T[12] = vI, T[13] = fI, T[14] = MI, T[15] = hI, T[16] = AC, T[17] = PI, T[18] = jI, Q !== 0 && (T[19] = Q, w.length++), w;
- };
- function Y(B, G, w) {
- w.negative = G.negative ^ B.negative, w.length = B.length + G.length;
- for (var W = 0, y = 0, f = 0; f < w.length - 1; f++) {
- var D = y;
- y = 0;
- for (var F = 67108863 & W, T = Math.min(f, G.length - 1), Q = Math.max(0, f - B.length + 1); Q <= T; Q++) {
- var P = f - Q, L = (0 | B.words[P]) * (0 | G.words[Q]), E = 67108863 & L;
- F = 67108863 & (E = E + F | 0), y += (D = (D = D + (L / 67108864 | 0) | 0) + (E >>> 26) | 0) >>> 26, D &= 67108863;
- }
- w.words[f] = F, W = D, D = y;
- }
- return W !== 0 ? w.words[f] = W : w.length--, w._strip();
- }
- function R(B, G, w) {
- return Y(B, G, w);
- }
- Math.imul || (p = Z), n.prototype.mulTo = function(B, G) {
- var w = this.length + B.length;
- return this.length === 10 && B.length === 10 ? p(this, B, G) : w < 63 ? Z(this, B, G) : w < 1024 ? Y(this, B, G) : R(this, B, G);
- }, n.prototype.mul = function(B) {
- var G = new n(null);
- return G.words = new Array(this.length + B.length), this.mulTo(B, G);
- }, n.prototype.mulf = function(B) {
- var G = new n(null);
- return G.words = new Array(this.length + B.length), R(this, B, G);
- }, n.prototype.imul = function(B) {
- return this.clone().mulTo(B, this);
- }, n.prototype.imuln = function(B) {
- var G = B < 0;
- G && (B = -B), s(typeof B == "number"), s(B < 67108864);
- for (var w = 0, W = 0; W < this.length; W++) {
- var y = (0 | this.words[W]) * B, f = (67108863 & y) + (67108863 & w);
- w >>= 26, w += y / 67108864 | 0, w += f >>> 26, this.words[W] = 67108863 & f;
- }
- return w !== 0 && (this.words[W] = w, this.length++), G ? this.ineg() : this;
- }, n.prototype.muln = function(B) {
- return this.clone().imuln(B);
- }, n.prototype.sqr = function() {
- return this.mul(this);
- }, n.prototype.isqr = function() {
- return this.imul(this.clone());
- }, n.prototype.pow = function(B) {
- var G = function(f) {
- for (var D = new Array(f.bitLength()), F = 0; F < D.length; F++) {
- var T = F / 26 | 0, Q = F % 26;
- D[F] = f.words[T] >>> Q & 1;
- }
- return D;
- }(B);
- if (G.length === 0) return new n(1);
- for (var w = this, W = 0; W < G.length && G[W] === 0; W++, w = w.sqr()) ;
- if (++W < G.length) for (var y = w.sqr(); W < G.length; W++, y = y.sqr()) G[W] !== 0 && (w = w.mul(y));
- return w;
- }, n.prototype.iushln = function(B) {
- s(typeof B == "number" && B >= 0);
- var G, w = B % 26, W = (B - w) / 26, y = 67108863 >>> 26 - w << 26 - w;
- if (w !== 0) {
- var f = 0;
- for (G = 0; G < this.length; G++) {
- var D = this.words[G] & y, F = (0 | this.words[G]) - D << w;
- this.words[G] = F | f, f = D >>> 26 - w;
- }
- f && (this.words[G] = f, this.length++);
- }
- if (W !== 0) {
- for (G = this.length - 1; G >= 0; G--) this.words[G + W] = this.words[G];
- for (G = 0; G < W; G++) this.words[G] = 0;
- this.length += W;
- }
- return this._strip();
- }, n.prototype.ishln = function(B) {
- return s(this.negative === 0), this.iushln(B);
- }, n.prototype.iushrn = function(B, G, w) {
- var W;
- s(typeof B == "number" && B >= 0), W = G ? (G - G % 26) / 26 : 0;
- var y = B % 26, f = Math.min((B - y) / 26, this.length), D = 67108863 ^ 67108863 >>> y << y, F = w;
- if (W -= f, W = Math.max(0, W), F) {
- for (var T = 0; T < f; T++) F.words[T] = this.words[T];
- F.length = f;
- }
- if (f !== 0) if (this.length > f) for (this.length -= f, T = 0; T < this.length; T++) this.words[T] = this.words[T + f];
- else this.words[0] = 0, this.length = 1;
- var Q = 0;
- for (T = this.length - 1; T >= 0 && (Q !== 0 || T >= W); T--) {
- var P = 0 | this.words[T];
- this.words[T] = Q << 26 - y | P >>> y, Q = P & D;
- }
- return F && Q !== 0 && (F.words[F.length++] = Q), this.length === 0 && (this.words[0] = 0, this.length = 1), this._strip();
- }, n.prototype.ishrn = function(B, G, w) {
- return s(this.negative === 0), this.iushrn(B, G, w);
- }, n.prototype.shln = function(B) {
- return this.clone().ishln(B);
- }, n.prototype.ushln = function(B) {
- return this.clone().iushln(B);
- }, n.prototype.shrn = function(B) {
- return this.clone().ishrn(B);
- }, n.prototype.ushrn = function(B) {
- return this.clone().iushrn(B);
- }, n.prototype.testn = function(B) {
- s(typeof B == "number" && B >= 0);
- var G = B % 26, w = (B - G) / 26, W = 1 << G;
- return !(this.length <= w) && !!(this.words[w] & W);
- }, n.prototype.imaskn = function(B) {
- s(typeof B == "number" && B >= 0);
- var G = B % 26, w = (B - G) / 26;
- if (s(this.negative === 0, "imaskn works only with positive numbers"), this.length <= w) return this;
- if (G !== 0 && w++, this.length = Math.min(w, this.length), G !== 0) {
- var W = 67108863 ^ 67108863 >>> G << G;
- this.words[this.length - 1] &= W;
- }
- return this._strip();
- }, n.prototype.maskn = function(B) {
- return this.clone().imaskn(B);
- }, n.prototype.iaddn = function(B) {
- return s(typeof B == "number"), s(B < 67108864), B < 0 ? this.isubn(-B) : this.negative !== 0 ? this.length === 1 && (0 | this.words[0]) <= B ? (this.words[0] = B - (0 | this.words[0]), this.negative = 0, this) : (this.negative = 0, this.isubn(B), this.negative = 1, this) : this._iaddn(B);
- }, n.prototype._iaddn = function(B) {
- this.words[0] += B;
- for (var G = 0; G < this.length && this.words[G] >= 67108864; G++) this.words[G] -= 67108864, G === this.length - 1 ? this.words[G + 1] = 1 : this.words[G + 1]++;
- return this.length = Math.max(this.length, G + 1), this;
- }, n.prototype.isubn = function(B) {
- if (s(typeof B == "number"), s(B < 67108864), B < 0) return this.iaddn(-B);
- if (this.negative !== 0) return this.negative = 0, this.iaddn(B), this.negative = 1, this;
- if (this.words[0] -= B, this.length === 1 && this.words[0] < 0) this.words[0] = -this.words[0], this.negative = 1;
- else for (var G = 0; G < this.length && this.words[G] < 0; G++) this.words[G] += 67108864, this.words[G + 1] -= 1;
- return this._strip();
- }, n.prototype.addn = function(B) {
- return this.clone().iaddn(B);
- }, n.prototype.subn = function(B) {
- return this.clone().isubn(B);
- }, n.prototype.iabs = function() {
- return this.negative = 0, this;
- }, n.prototype.abs = function() {
- return this.clone().iabs();
- }, n.prototype._ishlnsubmul = function(B, G, w) {
- var W, y, f = B.length + w;
- this._expand(f);
- var D = 0;
- for (W = 0; W < B.length; W++) {
- y = (0 | this.words[W + w]) + D;
- var F = (0 | B.words[W]) * G;
- D = ((y -= 67108863 & F) >> 26) - (F / 67108864 | 0), this.words[W + w] = 67108863 & y;
- }
- for (; W < this.length - w; W++) D = (y = (0 | this.words[W + w]) + D) >> 26, this.words[W + w] = 67108863 & y;
- if (D === 0) return this._strip();
- for (s(D === -1), D = 0, W = 0; W < this.length; W++) D = (y = -(0 | this.words[W]) + D) >> 26, this.words[W] = 67108863 & y;
- return this.negative = 1, this._strip();
- }, n.prototype._wordDiv = function(B, G) {
- var w = (this.length, B.length), W = this.clone(), y = B, f = 0 | y.words[y.length - 1];
- (w = 26 - this._countBits(f)) !== 0 && (y = y.ushln(w), W.iushln(w), f = 0 | y.words[y.length - 1]);
- var D, F = W.length - y.length;
- if (G !== "mod") {
- (D = new n(null)).length = F + 1, D.words = new Array(D.length);
- for (var T = 0; T < D.length; T++) D.words[T] = 0;
- }
- var Q = W.clone()._ishlnsubmul(y, 1, F);
- Q.negative === 0 && (W = Q, D && (D.words[F] = 1));
- for (var P = F - 1; P >= 0; P--) {
- var L = 67108864 * (0 | W.words[y.length + P]) + (0 | W.words[y.length + P - 1]);
- for (L = Math.min(L / f | 0, 67108863), W._ishlnsubmul(y, L, P); W.negative !== 0; ) L--, W.negative = 0, W._ishlnsubmul(y, 1, P), W.isZero() || (W.negative ^= 1);
- D && (D.words[P] = L);
- }
- return D && D._strip(), W._strip(), G !== "div" && w !== 0 && W.iushrn(w), { div: D || null, mod: W };
- }, n.prototype.divmod = function(B, G, w) {
- return s(!B.isZero()), this.isZero() ? { div: new n(0), mod: new n(0) } : this.negative !== 0 && B.negative === 0 ? (f = this.neg().divmod(B, G), G !== "mod" && (W = f.div.neg()), G !== "div" && (y = f.mod.neg(), w && y.negative !== 0 && y.iadd(B)), { div: W, mod: y }) : this.negative === 0 && B.negative !== 0 ? (f = this.divmod(B.neg(), G), G !== "mod" && (W = f.div.neg()), { div: W, mod: f.mod }) : (this.negative & B.negative) != 0 ? (f = this.neg().divmod(B.neg(), G), G !== "div" && (y = f.mod.neg(), w && y.negative !== 0 && y.isub(B)), { div: f.div, mod: y }) : B.length > this.length || this.cmp(B) < 0 ? { div: new n(0), mod: this } : B.length === 1 ? G === "div" ? { div: this.divn(B.words[0]), mod: null } : G === "mod" ? { div: null, mod: new n(this.modrn(B.words[0])) } : { div: this.divn(B.words[0]), mod: new n(this.modrn(B.words[0])) } : this._wordDiv(B, G);
- var W, y, f;
- }, n.prototype.div = function(B) {
- return this.divmod(B, "div", !1).div;
- }, n.prototype.mod = function(B) {
- return this.divmod(B, "mod", !1).mod;
- }, n.prototype.umod = function(B) {
- return this.divmod(B, "mod", !0).mod;
- }, n.prototype.divRound = function(B) {
- var G = this.divmod(B);
- if (G.mod.isZero()) return G.div;
- var w = G.div.negative !== 0 ? G.mod.isub(B) : G.mod, W = B.ushrn(1), y = B.andln(1), f = w.cmp(W);
- return f < 0 || y === 1 && f === 0 ? G.div : G.div.negative !== 0 ? G.div.isubn(1) : G.div.iaddn(1);
- }, n.prototype.modrn = function(B) {
- var G = B < 0;
- G && (B = -B), s(B <= 67108863);
- for (var w = (1 << 26) % B, W = 0, y = this.length - 1; y >= 0; y--) W = (w * W + (0 | this.words[y])) % B;
- return G ? -W : W;
- }, n.prototype.modn = function(B) {
- return this.modrn(B);
- }, n.prototype.idivn = function(B) {
- var G = B < 0;
- G && (B = -B), s(B <= 67108863);
- for (var w = 0, W = this.length - 1; W >= 0; W--) {
- var y = (0 | this.words[W]) + 67108864 * w;
- this.words[W] = y / B | 0, w = y % B;
- }
- return this._strip(), G ? this.ineg() : this;
- }, n.prototype.divn = function(B) {
- return this.clone().idivn(B);
- }, n.prototype.egcd = function(B) {
- s(B.negative === 0), s(!B.isZero());
- var G = this, w = B.clone();
- G = G.negative !== 0 ? G.umod(B) : G.clone();
- for (var W = new n(1), y = new n(0), f = new n(0), D = new n(1), F = 0; G.isEven() && w.isEven(); ) G.iushrn(1), w.iushrn(1), ++F;
- for (var T = w.clone(), Q = G.clone(); !G.isZero(); ) {
- for (var P = 0, L = 1; (G.words[0] & L) == 0 && P < 26; ++P, L <<= 1) ;
- if (P > 0) for (G.iushrn(P); P-- > 0; ) (W.isOdd() || y.isOdd()) && (W.iadd(T), y.isub(Q)), W.iushrn(1), y.iushrn(1);
- for (var E = 0, J = 1; (w.words[0] & J) == 0 && E < 26; ++E, J <<= 1) ;
- if (E > 0) for (w.iushrn(E); E-- > 0; ) (f.isOdd() || D.isOdd()) && (f.iadd(T), D.isub(Q)), f.iushrn(1), D.iushrn(1);
- G.cmp(w) >= 0 ? (G.isub(w), W.isub(f), y.isub(D)) : (w.isub(G), f.isub(W), D.isub(y));
- }
- return { a: f, b: D, gcd: w.iushln(F) };
- }, n.prototype._invmp = function(B) {
- s(B.negative === 0), s(!B.isZero());
- var G = this, w = B.clone();
- G = G.negative !== 0 ? G.umod(B) : G.clone();
- for (var W, y = new n(1), f = new n(0), D = w.clone(); G.cmpn(1) > 0 && w.cmpn(1) > 0; ) {
- for (var F = 0, T = 1; (G.words[0] & T) == 0 && F < 26; ++F, T <<= 1) ;
- if (F > 0) for (G.iushrn(F); F-- > 0; ) y.isOdd() && y.iadd(D), y.iushrn(1);
- for (var Q = 0, P = 1; (w.words[0] & P) == 0 && Q < 26; ++Q, P <<= 1) ;
- if (Q > 0) for (w.iushrn(Q); Q-- > 0; ) f.isOdd() && f.iadd(D), f.iushrn(1);
- G.cmp(w) >= 0 ? (G.isub(w), y.isub(f)) : (w.isub(G), f.isub(y));
- }
- return (W = G.cmpn(1) === 0 ? y : f).cmpn(0) < 0 && W.iadd(B), W;
- }, n.prototype.gcd = function(B) {
- if (this.isZero()) return B.abs();
- if (B.isZero()) return this.abs();
- var G = this.clone(), w = B.clone();
- G.negative = 0, w.negative = 0;
- for (var W = 0; G.isEven() && w.isEven(); W++) G.iushrn(1), w.iushrn(1);
- for (; ; ) {
- for (; G.isEven(); ) G.iushrn(1);
- for (; w.isEven(); ) w.iushrn(1);
- var y = G.cmp(w);
- if (y < 0) {
- var f = G;
- G = w, w = f;
- } else if (y === 0 || w.cmpn(1) === 0) break;
- G.isub(w);
- }
- return w.iushln(W);
- }, n.prototype.invm = function(B) {
- return this.egcd(B).a.umod(B);
- }, n.prototype.isEven = function() {
- return (1 & this.words[0]) == 0;
- }, n.prototype.isOdd = function() {
- return (1 & this.words[0]) == 1;
- }, n.prototype.andln = function(B) {
- return this.words[0] & B;
- }, n.prototype.bincn = function(B) {
- s(typeof B == "number");
- var G = B % 26, w = (B - G) / 26, W = 1 << G;
- if (this.length <= w) return this._expand(w + 1), this.words[w] |= W, this;
- for (var y = W, f = w; y !== 0 && f < this.length; f++) {
- var D = 0 | this.words[f];
- y = (D += y) >>> 26, D &= 67108863, this.words[f] = D;
- }
- return y !== 0 && (this.words[f] = y, this.length++), this;
- }, n.prototype.isZero = function() {
- return this.length === 1 && this.words[0] === 0;
- }, n.prototype.cmpn = function(B) {
- var G, w = B < 0;
- if (this.negative !== 0 && !w) return -1;
- if (this.negative === 0 && w) return 1;
- if (this._strip(), this.length > 1) G = 1;
- else {
- w && (B = -B), s(B <= 67108863, "Number is too big");
- var W = 0 | this.words[0];
- G = W === B ? 0 : W < B ? -1 : 1;
- }
- return this.negative !== 0 ? 0 | -G : G;
- }, n.prototype.cmp = function(B) {
- if (this.negative !== 0 && B.negative === 0) return -1;
- if (this.negative === 0 && B.negative !== 0) return 1;
- var G = this.ucmp(B);
- return this.negative !== 0 ? 0 | -G : G;
- }, n.prototype.ucmp = function(B) {
- if (this.length > B.length) return 1;
- if (this.length < B.length) return -1;
- for (var G = 0, w = this.length - 1; w >= 0; w--) {
- var W = 0 | this.words[w], y = 0 | B.words[w];
- if (W !== y) {
- W < y ? G = -1 : W > y && (G = 1);
- break;
- }
- }
- return G;
- }, n.prototype.gtn = function(B) {
- return this.cmpn(B) === 1;
- }, n.prototype.gt = function(B) {
- return this.cmp(B) === 1;
- }, n.prototype.gten = function(B) {
- return this.cmpn(B) >= 0;
- }, n.prototype.gte = function(B) {
- return this.cmp(B) >= 0;
- }, n.prototype.ltn = function(B) {
- return this.cmpn(B) === -1;
- }, n.prototype.lt = function(B) {
- return this.cmp(B) === -1;
- }, n.prototype.lten = function(B) {
- return this.cmpn(B) <= 0;
- }, n.prototype.lte = function(B) {
- return this.cmp(B) <= 0;
- }, n.prototype.eqn = function(B) {
- return this.cmpn(B) === 0;
- }, n.prototype.eq = function(B) {
- return this.cmp(B) === 0;
- }, n.red = function(B) {
- return new V(B);
- }, n.prototype.toRed = function(B) {
- return s(!this.red, "Already a number in reduction context"), s(this.negative === 0, "red works only with positives"), B.convertTo(this)._forceRed(B);
- }, n.prototype.fromRed = function() {
- return s(this.red, "fromRed works only with numbers in reduction context"), this.red.convertFrom(this);
- }, n.prototype._forceRed = function(B) {
- return this.red = B, this;
- }, n.prototype.forceRed = function(B) {
- return s(!this.red, "Already a number in reduction context"), this._forceRed(B);
- }, n.prototype.redAdd = function(B) {
- return s(this.red, "redAdd works only with red numbers"), this.red.add(this, B);
- }, n.prototype.redIAdd = function(B) {
- return s(this.red, "redIAdd works only with red numbers"), this.red.iadd(this, B);
- }, n.prototype.redSub = function(B) {
- return s(this.red, "redSub works only with red numbers"), this.red.sub(this, B);
- }, n.prototype.redISub = function(B) {
- return s(this.red, "redISub works only with red numbers"), this.red.isub(this, B);
- }, n.prototype.redShl = function(B) {
- return s(this.red, "redShl works only with red numbers"), this.red.shl(this, B);
- }, n.prototype.redMul = function(B) {
- return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, B), this.red.mul(this, B);
- }, n.prototype.redIMul = function(B) {
- return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, B), this.red.imul(this, B);
- }, n.prototype.redSqr = function() {
- return s(this.red, "redSqr works only with red numbers"), this.red._verify1(this), this.red.sqr(this);
- }, n.prototype.redISqr = function() {
- return s(this.red, "redISqr works only with red numbers"), this.red._verify1(this), this.red.isqr(this);
- }, n.prototype.redSqrt = function() {
- return s(this.red, "redSqrt works only with red numbers"), this.red._verify1(this), this.red.sqrt(this);
- }, n.prototype.redInvm = function() {
- return s(this.red, "redInvm works only with red numbers"), this.red._verify1(this), this.red.invm(this);
- }, n.prototype.redNeg = function() {
- return s(this.red, "redNeg works only with red numbers"), this.red._verify1(this), this.red.neg(this);
- }, n.prototype.redPow = function(B) {
- return s(this.red && !B.red, "redPow(normalNum)"), this.red._verify1(this), this.red.pow(this, B);
- };
- var X = { k256: null, p224: null, p192: null, p25519: null };
- function H(B, G) {
- this.name = B, this.p = new n(G, 16), this.n = this.p.bitLength(), this.k = new n(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();
- }
- function S() {
- H.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
- }
- function z() {
- H.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
- }
- function v() {
- H.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
- }
- function K() {
- H.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
- }
- function V(B) {
- if (typeof B == "string") {
- var G = n._prime(B);
- this.m = G.p, this.prime = G;
- } else s(B.gtn(1), "modulus must be greater than 1"), this.m = B, this.prime = null;
- }
- function N(B) {
- V.call(this, B), this.shift = this.m.bitLength(), this.shift % 26 != 0 && (this.shift += 26 - this.shift % 26), this.r = new n(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);
- }
- H.prototype._tmp = function() {
- var B = new n(null);
- return B.words = new Array(Math.ceil(this.n / 13)), B;
- }, H.prototype.ireduce = function(B) {
- var G, w = B;
- do
- this.split(w, this.tmp), G = (w = (w = this.imulK(w)).iadd(this.tmp)).bitLength();
- while (G > this.n);
- var W = G < this.n ? -1 : w.ucmp(this.p);
- return W === 0 ? (w.words[0] = 0, w.length = 1) : W > 0 ? w.isub(this.p) : w.strip !== void 0 ? w.strip() : w._strip(), w;
- }, H.prototype.split = function(B, G) {
- B.iushrn(this.n, 0, G);
- }, H.prototype.imulK = function(B) {
- return B.imul(this.k);
- }, l(S, H), S.prototype.split = function(B, G) {
- for (var w = Math.min(B.length, 9), W = 0; W < w; W++) G.words[W] = B.words[W];
- if (G.length = w, B.length <= 9) return B.words[0] = 0, void (B.length = 1);
- var y = B.words[9];
- for (G.words[G.length++] = 4194303 & y, W = 10; W < B.length; W++) {
- var f = 0 | B.words[W];
- B.words[W - 10] = (4194303 & f) << 4 | y >>> 22, y = f;
- }
- y >>>= 22, B.words[W - 10] = y, y === 0 && B.length > 10 ? B.length -= 10 : B.length -= 9;
- }, S.prototype.imulK = function(B) {
- B.words[B.length] = 0, B.words[B.length + 1] = 0, B.length += 2;
- for (var G = 0, w = 0; w < B.length; w++) {
- var W = 0 | B.words[w];
- G += 977 * W, B.words[w] = 67108863 & G, G = 64 * W + (G / 67108864 | 0);
- }
- return B.words[B.length - 1] === 0 && (B.length--, B.words[B.length - 1] === 0 && B.length--), B;
- }, l(z, H), l(v, H), l(K, H), K.prototype.imulK = function(B) {
- for (var G = 0, w = 0; w < B.length; w++) {
- var W = 19 * (0 | B.words[w]) + G, y = 67108863 & W;
- W >>>= 26, B.words[w] = y, G = W;
- }
- return G !== 0 && (B.words[B.length++] = G), B;
- }, n._prime = function(B) {
- if (X[B]) return X[B];
- var G;
- if (B === "k256") G = new S();
- else if (B === "p224") G = new z();
- else if (B === "p192") G = new v();
- else {
- if (B !== "p25519") throw new Error("Unknown prime " + B);
- G = new K();
- }
- return X[B] = G, G;
- }, V.prototype._verify1 = function(B) {
- s(B.negative === 0, "red works only with positives"), s(B.red, "red works only with red numbers");
- }, V.prototype._verify2 = function(B, G) {
- s((B.negative | G.negative) == 0, "red works only with positives"), s(B.red && B.red === G.red, "red works only with red numbers");
- }, V.prototype.imod = function(B) {
- return this.prime ? this.prime.ireduce(B)._forceRed(this) : (r(B, B.umod(this.m)._forceRed(this)), B);
- }, V.prototype.neg = function(B) {
- return B.isZero() ? B.clone() : this.m.sub(B)._forceRed(this);
- }, V.prototype.add = function(B, G) {
- this._verify2(B, G);
- var w = B.add(G);
- return w.cmp(this.m) >= 0 && w.isub(this.m), w._forceRed(this);
- }, V.prototype.iadd = function(B, G) {
- this._verify2(B, G);
- var w = B.iadd(G);
- return w.cmp(this.m) >= 0 && w.isub(this.m), w;
- }, V.prototype.sub = function(B, G) {
- this._verify2(B, G);
- var w = B.sub(G);
- return w.cmpn(0) < 0 && w.iadd(this.m), w._forceRed(this);
- }, V.prototype.isub = function(B, G) {
- this._verify2(B, G);
- var w = B.isub(G);
- return w.cmpn(0) < 0 && w.iadd(this.m), w;
- }, V.prototype.shl = function(B, G) {
- return this._verify1(B), this.imod(B.ushln(G));
- }, V.prototype.imul = function(B, G) {
- return this._verify2(B, G), this.imod(B.imul(G));
- }, V.prototype.mul = function(B, G) {
- return this._verify2(B, G), this.imod(B.mul(G));
- }, V.prototype.isqr = function(B) {
- return this.imul(B, B.clone());
- }, V.prototype.sqr = function(B) {
- return this.mul(B, B);
- }, V.prototype.sqrt = function(B) {
- if (B.isZero()) return B.clone();
- var G = this.m.andln(3);
- if (s(G % 2 == 1), G === 3) {
- var w = this.m.add(new n(1)).iushrn(2);
- return this.pow(B, w);
- }
- for (var W = this.m.subn(1), y = 0; !W.isZero() && W.andln(1) === 0; ) y++, W.iushrn(1);
- s(!W.isZero());
- var f = new n(1).toRed(this), D = f.redNeg(), F = this.m.subn(1).iushrn(1), T = this.m.bitLength();
- for (T = new n(2 * T * T).toRed(this); this.pow(T, F).cmp(D) !== 0; ) T.redIAdd(D);
- for (var Q = this.pow(T, W), P = this.pow(B, W.addn(1).iushrn(1)), L = this.pow(B, W), E = y; L.cmp(f) !== 0; ) {
- for (var J = L, k = 0; J.cmp(f) !== 0; k++) J = J.redSqr();
- s(k < E);
- var j = this.pow(Q, new n(1).iushln(E - k - 1));
- P = P.redMul(j), Q = j.redSqr(), L = L.redMul(Q), E = k;
- }
- return P;
- }, V.prototype.invm = function(B) {
- var G = B._invmp(this.m);
- return G.negative !== 0 ? (G.negative = 0, this.imod(G).redNeg()) : this.imod(G);
- }, V.prototype.pow = function(B, G) {
- if (G.isZero()) return new n(1).toRed(this);
- if (G.cmpn(1) === 0) return B.clone();
- var w = new Array(16);
- w[0] = new n(1).toRed(this), w[1] = B;
- for (var W = 2; W < w.length; W++) w[W] = this.mul(w[W - 1], B);
- var y = w[0], f = 0, D = 0, F = G.bitLength() % 26;
- for (F === 0 && (F = 26), W = G.length - 1; W >= 0; W--) {
- for (var T = G.words[W], Q = F - 1; Q >= 0; Q--) {
- var P = T >> Q & 1;
- y !== w[0] && (y = this.sqr(y)), P !== 0 || f !== 0 ? (f <<= 1, f |= P, (++D === 4 || W === 0 && Q === 0) && (y = this.mul(y, w[f]), D = 0, f = 0)) : D = 0;
- }
- F = 26;
- }
- return y;
- }, V.prototype.convertTo = function(B) {
- var G = B.umod(this.m);
- return G === B ? G.clone() : G;
- }, V.prototype.convertFrom = function(B) {
- var G = B.clone();
- return G.red = null, G;
- }, n.mont = function(B) {
- return new N(B);
- }, l(N, V), N.prototype.convertTo = function(B) {
- return this.imod(B.ushln(this.shift));
- }, N.prototype.convertFrom = function(B) {
- var G = this.imod(B.mul(this.rinv));
- return G.red = null, G;
- }, N.prototype.imul = function(B, G) {
- if (B.isZero() || G.isZero()) return B.words[0] = 0, B.length = 1, B;
- var w = B.imul(G), W = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), y = w.isub(W).iushrn(this.shift), f = y;
- return y.cmp(this.m) >= 0 ? f = y.isub(this.m) : y.cmpn(0) < 0 && (f = y.iadd(this.m)), f._forceRed(this);
- }, N.prototype.mul = function(B, G) {
- if (B.isZero() || G.isZero()) return new n(0)._forceRed(this);
- var w = B.mul(G), W = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), y = w.isub(W).iushrn(this.shift), f = y;
- return y.cmp(this.m) >= 0 ? f = y.isub(this.m) : y.cmpn(0) < 0 && (f = y.iadd(this.m)), f._forceRed(this);
- }, N.prototype.invm = function(B) {
- return this.imod(B._invmp(this.m).mul(this.r2))._forceRed(this);
- };
- })(C === void 0 || C);
- }, { buffer: 188 }], 187: [function(g, C, i) {
- var e;
- function A(l) {
- this.rand = l;
- }
- if (C.exports = function(l) {
- return e || (e = new A(null)), e.generate(l);
- }, C.exports.Rand = A, A.prototype.generate = function(l) {
- return this._rand(l);
- }, A.prototype._rand = function(l) {
- if (this.rand.getBytes) return this.rand.getBytes(l);
- for (var n = new Uint8Array(l), a = 0; a < n.length; a++) n[a] = this.rand.getByte();
- return n;
- }, typeof self == "object") self.crypto && self.crypto.getRandomValues ? A.prototype._rand = function(l) {
- var n = new Uint8Array(l);
- return self.crypto.getRandomValues(n), n;
- } : self.msCrypto && self.msCrypto.getRandomValues ? A.prototype._rand = function(l) {
- var n = new Uint8Array(l);
- return self.msCrypto.getRandomValues(n), n;
- } : typeof window == "object" && (A.prototype._rand = function() {
- throw new Error("Not implemented yet");
- });
- else try {
- var s = g("crypto");
- if (typeof s.randomBytes != "function") throw new Error("Not supported");
- A.prototype._rand = function(l) {
- return s.randomBytes(l);
- };
- } catch {
- }
- }, { crypto: 188 }], 188: [function(g, C, i) {
- }, {}], 189: [function(g, C, i) {
- var e = g("safe-buffer").Buffer;
- function A(o) {
- e.isBuffer(o) || (o = e.from(o));
- for (var c = o.length / 4 | 0, r = new Array(c), h = 0; h < c; h++) r[h] = o.readUInt32BE(4 * h);
- return r;
- }
- function s(o) {
- for (; 0 < o.length; o++) o[0] = 0;
- }
- function l(o, c, r, h, b) {
- for (var u, m, Z, p, Y = r[0], R = r[1], X = r[2], H = r[3], S = o[0] ^ c[0], z = o[1] ^ c[1], v = o[2] ^ c[2], K = o[3] ^ c[3], V = 4, N = 1; N < b; N++) u = Y[S >>> 24] ^ R[z >>> 16 & 255] ^ X[v >>> 8 & 255] ^ H[255 & K] ^ c[V++], m = Y[z >>> 24] ^ R[v >>> 16 & 255] ^ X[K >>> 8 & 255] ^ H[255 & S] ^ c[V++], Z = Y[v >>> 24] ^ R[K >>> 16 & 255] ^ X[S >>> 8 & 255] ^ H[255 & z] ^ c[V++], p = Y[K >>> 24] ^ R[S >>> 16 & 255] ^ X[z >>> 8 & 255] ^ H[255 & v] ^ c[V++], S = u, z = m, v = Z, K = p;
- return u = (h[S >>> 24] << 24 | h[z >>> 16 & 255] << 16 | h[v >>> 8 & 255] << 8 | h[255 & K]) ^ c[V++], m = (h[z >>> 24] << 24 | h[v >>> 16 & 255] << 16 | h[K >>> 8 & 255] << 8 | h[255 & S]) ^ c[V++], Z = (h[v >>> 24] << 24 | h[K >>> 16 & 255] << 16 | h[S >>> 8 & 255] << 8 | h[255 & z]) ^ c[V++], p = (h[K >>> 24] << 24 | h[S >>> 16 & 255] << 16 | h[z >>> 8 & 255] << 8 | h[255 & v]) ^ c[V++], [u >>>= 0, m >>>= 0, Z >>>= 0, p >>>= 0];
- }
- var n = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], a = function() {
- for (var o = new Array(256), c = 0; c < 256; c++) o[c] = c < 128 ? c << 1 : c << 1 ^ 283;
- for (var r = [], h = [], b = [[], [], [], []], u = [[], [], [], []], m = 0, Z = 0, p = 0; p < 256; ++p) {
- var Y = Z ^ Z << 1 ^ Z << 2 ^ Z << 3 ^ Z << 4;
- Y = Y >>> 8 ^ 255 & Y ^ 99, r[m] = Y, h[Y] = m;
- var R = o[m], X = o[R], H = o[X], S = 257 * o[Y] ^ 16843008 * Y;
- b[0][m] = S << 24 | S >>> 8, b[1][m] = S << 16 | S >>> 16, b[2][m] = S << 8 | S >>> 24, b[3][m] = S, S = 16843009 * H ^ 65537 * X ^ 257 * R ^ 16843008 * m, u[0][Y] = S << 24 | S >>> 8, u[1][Y] = S << 16 | S >>> 16, u[2][Y] = S << 8 | S >>> 24, u[3][Y] = S, m === 0 ? m = Z = 1 : (m = R ^ o[o[o[H ^ R]]], Z ^= o[o[Z]]);
- }
- return { SBOX: r, INV_SBOX: h, SUB_MIX: b, INV_SUB_MIX: u };
- }();
- function d(o) {
- this._key = A(o), this._reset();
- }
- d.blockSize = 16, d.keySize = 32, d.prototype.blockSize = d.blockSize, d.prototype.keySize = d.keySize, d.prototype._reset = function() {
- for (var o = this._key, c = o.length, r = c + 6, h = 4 * (r + 1), b = [], u = 0; u < c; u++) b[u] = o[u];
- for (u = c; u < h; u++) {
- var m = b[u - 1];
- u % c == 0 ? (m = m << 8 | m >>> 24, m = a.SBOX[m >>> 24] << 24 | a.SBOX[m >>> 16 & 255] << 16 | a.SBOX[m >>> 8 & 255] << 8 | a.SBOX[255 & m], m ^= n[u / c | 0] << 24) : c > 6 && u % c == 4 && (m = a.SBOX[m >>> 24] << 24 | a.SBOX[m >>> 16 & 255] << 16 | a.SBOX[m >>> 8 & 255] << 8 | a.SBOX[255 & m]), b[u] = b[u - c] ^ m;
- }
- for (var Z = [], p = 0; p < h; p++) {
- var Y = h - p, R = b[Y - (p % 4 ? 0 : 4)];
- Z[p] = p < 4 || Y <= 4 ? R : a.INV_SUB_MIX[0][a.SBOX[R >>> 24]] ^ a.INV_SUB_MIX[1][a.SBOX[R >>> 16 & 255]] ^ a.INV_SUB_MIX[2][a.SBOX[R >>> 8 & 255]] ^ a.INV_SUB_MIX[3][a.SBOX[255 & R]];
- }
- this._nRounds = r, this._keySchedule = b, this._invKeySchedule = Z;
- }, d.prototype.encryptBlockRaw = function(o) {
- return l(o = A(o), this._keySchedule, a.SUB_MIX, a.SBOX, this._nRounds);
- }, d.prototype.encryptBlock = function(o) {
- var c = this.encryptBlockRaw(o), r = e.allocUnsafe(16);
- return r.writeUInt32BE(c[0], 0), r.writeUInt32BE(c[1], 4), r.writeUInt32BE(c[2], 8), r.writeUInt32BE(c[3], 12), r;
- }, d.prototype.decryptBlock = function(o) {
- var c = (o = A(o))[1];
- o[1] = o[3], o[3] = c;
- var r = l(o, this._invKeySchedule, a.INV_SUB_MIX, a.INV_SBOX, this._nRounds), h = e.allocUnsafe(16);
- return h.writeUInt32BE(r[0], 0), h.writeUInt32BE(r[3], 4), h.writeUInt32BE(r[2], 8), h.writeUInt32BE(r[1], 12), h;
- }, d.prototype.scrub = function() {
- s(this._keySchedule), s(this._invKeySchedule), s(this._key);
- }, C.exports.AES = d;
- }, { "safe-buffer": 494 }], 190: [function(g, C, i) {
- var e = g("./aes"), A = g("safe-buffer").Buffer, s = g("cipher-base"), l = g("inherits"), n = g("./ghash"), a = g("buffer-xor"), d = g("./incr32");
- function o(c, r, h, b) {
- s.call(this);
- var u = A.alloc(4, 0);
- this._cipher = new e.AES(r);
- var m = this._cipher.encryptBlock(u);
- this._ghash = new n(m), h = function(Z, p, Y) {
- if (p.length === 12) return Z._finID = A.concat([p, A.from([0, 0, 0, 1])]), A.concat([p, A.from([0, 0, 0, 2])]);
- var R = new n(Y), X = p.length, H = X % 16;
- R.update(p), H && (H = 16 - H, R.update(A.alloc(H, 0))), R.update(A.alloc(8, 0));
- var S = 8 * X, z = A.alloc(8);
- z.writeUIntBE(S, 0, 8), R.update(z), Z._finID = R.state;
- var v = A.from(Z._finID);
- return d(v), v;
- }(this, h, m), this._prev = A.from(h), this._cache = A.allocUnsafe(0), this._secCache = A.allocUnsafe(0), this._decrypt = b, this._alen = 0, this._len = 0, this._mode = c, this._authTag = null, this._called = !1;
- }
- l(o, s), o.prototype._update = function(c) {
- if (!this._called && this._alen) {
- var r = 16 - this._alen % 16;
- r < 16 && (r = A.alloc(r, 0), this._ghash.update(r));
- }
- this._called = !0;
- var h = this._mode.encrypt(this, c);
- return this._decrypt ? this._ghash.update(c) : this._ghash.update(h), this._len += c.length, h;
- }, o.prototype._final = function() {
- if (this._decrypt && !this._authTag) throw new Error("Unsupported state or unable to authenticate data");
- var c = a(this._ghash.final(8 * this._alen, 8 * this._len), this._cipher.encryptBlock(this._finID));
- if (this._decrypt && function(r, h) {
- var b = 0;
- r.length !== h.length && b++;
- for (var u = Math.min(r.length, h.length), m = 0; m < u; ++m) b += r[m] ^ h[m];
- return b;
- }(c, this._authTag)) throw new Error("Unsupported state or unable to authenticate data");
- this._authTag = c, this._cipher.scrub();
- }, o.prototype.getAuthTag = function() {
- if (this._decrypt || !A.isBuffer(this._authTag)) throw new Error("Attempting to get auth tag in unsupported state");
- return this._authTag;
- }, o.prototype.setAuthTag = function(c) {
- if (!this._decrypt) throw new Error("Attempting to set auth tag in unsupported state");
- this._authTag = c;
- }, o.prototype.setAAD = function(c) {
- if (this._called) throw new Error("Attempting to set AAD in unsupported state");
- this._ghash.update(c), this._alen += c.length;
- }, C.exports = o;
- }, { "./aes": 189, "./ghash": 194, "./incr32": 195, "buffer-xor": 219, "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 191: [function(g, C, i) {
- var e = g("./encrypter"), A = g("./decrypter"), s = g("./modes/list.json");
- i.createCipher = i.Cipher = e.createCipher, i.createCipheriv = i.Cipheriv = e.createCipheriv, i.createDecipher = i.Decipher = A.createDecipher, i.createDecipheriv = i.Decipheriv = A.createDecipheriv, i.listCiphers = i.getCiphers = function() {
- return Object.keys(s);
- };
- }, { "./decrypter": 192, "./encrypter": 193, "./modes/list.json": 203 }], 192: [function(g, C, i) {
- var e = g("./authCipher"), A = g("safe-buffer").Buffer, s = g("./modes"), l = g("./streamCipher"), n = g("cipher-base"), a = g("./aes"), d = g("evp_bytestokey");
- function o(h, b, u) {
- n.call(this), this._cache = new c(), this._last = void 0, this._cipher = new a.AES(b), this._prev = A.from(u), this._mode = h, this._autopadding = !0;
- }
- function c() {
- this.cache = A.allocUnsafe(0);
- }
- function r(h, b, u) {
- var m = s[h.toLowerCase()];
- if (!m) throw new TypeError("invalid suite type");
- if (typeof u == "string" && (u = A.from(u)), m.mode !== "GCM" && u.length !== m.iv) throw new TypeError("invalid iv length " + u.length);
- if (typeof b == "string" && (b = A.from(b)), b.length !== m.key / 8) throw new TypeError("invalid key length " + b.length);
- return m.type === "stream" ? new l(m.module, b, u, !0) : m.type === "auth" ? new e(m.module, b, u, !0) : new o(m.module, b, u);
- }
- g("inherits")(o, n), o.prototype._update = function(h) {
- var b, u;
- this._cache.add(h);
- for (var m = []; b = this._cache.get(this._autopadding); ) u = this._mode.decrypt(this, b), m.push(u);
- return A.concat(m);
- }, o.prototype._final = function() {
- var h = this._cache.flush();
- if (this._autopadding) return function(b) {
- var u = b[15];
- if (u < 1 || u > 16) throw new Error("unable to decrypt data");
- for (var m = -1; ++m < u; ) if (b[m + (16 - u)] !== u) throw new Error("unable to decrypt data");
- if (u !== 16)
- return b.slice(0, 16 - u);
- }(this._mode.decrypt(this, h));
- if (h) throw new Error("data not multiple of block length");
- }, o.prototype.setAutoPadding = function(h) {
- return this._autopadding = !!h, this;
- }, c.prototype.add = function(h) {
- this.cache = A.concat([this.cache, h]);
- }, c.prototype.get = function(h) {
- var b;
- if (h) {
- if (this.cache.length > 16) return b = this.cache.slice(0, 16), this.cache = this.cache.slice(16), b;
- } else if (this.cache.length >= 16) return b = this.cache.slice(0, 16), this.cache = this.cache.slice(16), b;
- return null;
- }, c.prototype.flush = function() {
- if (this.cache.length) return this.cache;
- }, i.createDecipher = function(h, b) {
- var u = s[h.toLowerCase()];
- if (!u) throw new TypeError("invalid suite type");
- var m = d(b, !1, u.key, u.iv);
- return r(h, m.key, m.iv);
- }, i.createDecipheriv = r;
- }, { "./aes": 189, "./authCipher": 190, "./modes": 202, "./streamCipher": 205, "cipher-base": 221, evp_bytestokey: 423, inherits: 440, "safe-buffer": 494 }], 193: [function(g, C, i) {
- var e = g("./modes"), A = g("./authCipher"), s = g("safe-buffer").Buffer, l = g("./streamCipher"), n = g("cipher-base"), a = g("./aes"), d = g("evp_bytestokey");
- function o(b, u, m) {
- n.call(this), this._cache = new r(), this._cipher = new a.AES(u), this._prev = s.from(m), this._mode = b, this._autopadding = !0;
- }
- g("inherits")(o, n), o.prototype._update = function(b) {
- var u, m;
- this._cache.add(b);
- for (var Z = []; u = this._cache.get(); ) m = this._mode.encrypt(this, u), Z.push(m);
- return s.concat(Z);
- };
- var c = s.alloc(16, 16);
- function r() {
- this.cache = s.allocUnsafe(0);
- }
- function h(b, u, m) {
- var Z = e[b.toLowerCase()];
- if (!Z) throw new TypeError("invalid suite type");
- if (typeof u == "string" && (u = s.from(u)), u.length !== Z.key / 8) throw new TypeError("invalid key length " + u.length);
- if (typeof m == "string" && (m = s.from(m)), Z.mode !== "GCM" && m.length !== Z.iv) throw new TypeError("invalid iv length " + m.length);
- return Z.type === "stream" ? new l(Z.module, u, m) : Z.type === "auth" ? new A(Z.module, u, m) : new o(Z.module, u, m);
- }
- o.prototype._final = function() {
- var b = this._cache.flush();
- if (this._autopadding) return b = this._mode.encrypt(this, b), this._cipher.scrub(), b;
- if (!b.equals(c)) throw this._cipher.scrub(), new Error("data not multiple of block length");
- }, o.prototype.setAutoPadding = function(b) {
- return this._autopadding = !!b, this;
- }, r.prototype.add = function(b) {
- this.cache = s.concat([this.cache, b]);
- }, r.prototype.get = function() {
- if (this.cache.length > 15) {
- var b = this.cache.slice(0, 16);
- return this.cache = this.cache.slice(16), b;
- }
- return null;
- }, r.prototype.flush = function() {
- for (var b = 16 - this.cache.length, u = s.allocUnsafe(b), m = -1; ++m < b; ) u.writeUInt8(b, m);
- return s.concat([this.cache, u]);
- }, i.createCipheriv = h, i.createCipher = function(b, u) {
- var m = e[b.toLowerCase()];
- if (!m) throw new TypeError("invalid suite type");
- var Z = d(u, !1, m.key, m.iv);
- return h(b, Z.key, Z.iv);
- };
- }, { "./aes": 189, "./authCipher": 190, "./modes": 202, "./streamCipher": 205, "cipher-base": 221, evp_bytestokey: 423, inherits: 440, "safe-buffer": 494 }], 194: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = e.alloc(16, 0);
- function s(n) {
- var a = e.allocUnsafe(16);
- return a.writeUInt32BE(n[0] >>> 0, 0), a.writeUInt32BE(n[1] >>> 0, 4), a.writeUInt32BE(n[2] >>> 0, 8), a.writeUInt32BE(n[3] >>> 0, 12), a;
- }
- function l(n) {
- this.h = n, this.state = e.alloc(16, 0), this.cache = e.allocUnsafe(0);
- }
- l.prototype.ghash = function(n) {
- for (var a = -1; ++a < n.length; ) this.state[a] ^= n[a];
- this._multiply();
- }, l.prototype._multiply = function() {
- for (var n, a, d, o = [(n = this.h).readUInt32BE(0), n.readUInt32BE(4), n.readUInt32BE(8), n.readUInt32BE(12)], c = [0, 0, 0, 0], r = -1; ++r < 128; ) {
- for ((this.state[~~(r / 8)] & 1 << 7 - r % 8) != 0 && (c[0] ^= o[0], c[1] ^= o[1], c[2] ^= o[2], c[3] ^= o[3]), d = (1 & o[3]) != 0, a = 3; a > 0; a--) o[a] = o[a] >>> 1 | (1 & o[a - 1]) << 31;
- o[0] = o[0] >>> 1, d && (o[0] = o[0] ^ 225 << 24);
- }
- this.state = s(c);
- }, l.prototype.update = function(n) {
- var a;
- for (this.cache = e.concat([this.cache, n]); this.cache.length >= 16; ) a = this.cache.slice(0, 16), this.cache = this.cache.slice(16), this.ghash(a);
- }, l.prototype.final = function(n, a) {
- return this.cache.length && this.ghash(e.concat([this.cache, A], 16)), this.ghash(s([0, n, 0, a])), this.state;
- }, C.exports = l;
- }, { "safe-buffer": 494 }], 195: [function(g, C, i) {
- C.exports = function(e) {
- for (var A, s = e.length; s--; ) {
- if ((A = e.readUInt8(s)) !== 255) {
- A++, e.writeUInt8(A, s);
- break;
- }
- e.writeUInt8(0, s);
- }
- };
- }, {}], 196: [function(g, C, i) {
- var e = g("buffer-xor");
- i.encrypt = function(A, s) {
- var l = e(s, A._prev);
- return A._prev = A._cipher.encryptBlock(l), A._prev;
- }, i.decrypt = function(A, s) {
- var l = A._prev;
- A._prev = s;
- var n = A._cipher.decryptBlock(s);
- return e(n, l);
- };
- }, { "buffer-xor": 219 }], 197: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("buffer-xor");
- function s(l, n, a) {
- var d = n.length, o = A(n, l._cache);
- return l._cache = l._cache.slice(d), l._prev = e.concat([l._prev, a ? n : o]), o;
- }
- i.encrypt = function(l, n, a) {
- for (var d, o = e.allocUnsafe(0); n.length; ) {
- if (l._cache.length === 0 && (l._cache = l._cipher.encryptBlock(l._prev), l._prev = e.allocUnsafe(0)), !(l._cache.length <= n.length)) {
- o = e.concat([o, s(l, n, a)]);
- break;
- }
- d = l._cache.length, o = e.concat([o, s(l, n.slice(0, d), a)]), n = n.slice(d);
- }
- return o;
- };
- }, { "buffer-xor": 219, "safe-buffer": 494 }], 198: [function(g, C, i) {
- var e = g("safe-buffer").Buffer;
- function A(l, n, a) {
- for (var d, o, c = -1, r = 0; ++c < 8; ) d = n & 1 << 7 - c ? 128 : 0, r += (128 & (o = l._cipher.encryptBlock(l._prev)[0] ^ d)) >> c % 8, l._prev = s(l._prev, a ? d : o);
- return r;
- }
- function s(l, n) {
- var a = l.length, d = -1, o = e.allocUnsafe(l.length);
- for (l = e.concat([l, e.from([n])]); ++d < a; ) o[d] = l[d] << 1 | l[d + 1] >> 7;
- return o;
- }
- i.encrypt = function(l, n, a) {
- for (var d = n.length, o = e.allocUnsafe(d), c = -1; ++c < d; ) o[c] = A(l, n[c], a);
- return o;
- };
- }, { "safe-buffer": 494 }], 199: [function(g, C, i) {
- var e = g("safe-buffer").Buffer;
- function A(s, l, n) {
- var a = s._cipher.encryptBlock(s._prev)[0] ^ l;
- return s._prev = e.concat([s._prev.slice(1), e.from([n ? l : a])]), a;
- }
- i.encrypt = function(s, l, n) {
- for (var a = l.length, d = e.allocUnsafe(a), o = -1; ++o < a; ) d[o] = A(s, l[o], n);
- return d;
- };
- }, { "safe-buffer": 494 }], 200: [function(g, C, i) {
- var e = g("buffer-xor"), A = g("safe-buffer").Buffer, s = g("../incr32");
- function l(n) {
- var a = n._cipher.encryptBlockRaw(n._prev);
- return s(n._prev), a;
- }
- i.encrypt = function(n, a) {
- var d = Math.ceil(a.length / 16), o = n._cache.length;
- n._cache = A.concat([n._cache, A.allocUnsafe(16 * d)]);
- for (var c = 0; c < d; c++) {
- var r = l(n), h = o + 16 * c;
- n._cache.writeUInt32BE(r[0], h + 0), n._cache.writeUInt32BE(r[1], h + 4), n._cache.writeUInt32BE(r[2], h + 8), n._cache.writeUInt32BE(r[3], h + 12);
- }
- var b = n._cache.slice(0, a.length);
- return n._cache = n._cache.slice(a.length), e(a, b);
- };
- }, { "../incr32": 195, "buffer-xor": 219, "safe-buffer": 494 }], 201: [function(g, C, i) {
- i.encrypt = function(e, A) {
- return e._cipher.encryptBlock(A);
- }, i.decrypt = function(e, A) {
- return e._cipher.decryptBlock(A);
- };
- }, {}], 202: [function(g, C, i) {
- var e = { ECB: g("./ecb"), CBC: g("./cbc"), CFB: g("./cfb"), CFB8: g("./cfb8"), CFB1: g("./cfb1"), OFB: g("./ofb"), CTR: g("./ctr"), GCM: g("./ctr") }, A = g("./list.json");
- for (var s in A) A[s].module = e[A[s].mode];
- C.exports = A;
- }, { "./cbc": 196, "./cfb": 197, "./cfb1": 198, "./cfb8": 199, "./ctr": 200, "./ecb": 201, "./list.json": 203, "./ofb": 204 }], 203: [function(g, C, i) {
- C.exports = { "aes-128-ecb": { cipher: "AES", key: 128, iv: 0, mode: "ECB", type: "block" }, "aes-192-ecb": { cipher: "AES", key: 192, iv: 0, mode: "ECB", type: "block" }, "aes-256-ecb": { cipher: "AES", key: 256, iv: 0, mode: "ECB", type: "block" }, "aes-128-cbc": { cipher: "AES", key: 128, iv: 16, mode: "CBC", type: "block" }, "aes-192-cbc": { cipher: "AES", key: 192, iv: 16, mode: "CBC", type: "block" }, "aes-256-cbc": { cipher: "AES", key: 256, iv: 16, mode: "CBC", type: "block" }, aes128: { cipher: "AES", key: 128, iv: 16, mode: "CBC", type: "block" }, aes192: { cipher: "AES", key: 192, iv: 16, mode: "CBC", type: "block" }, aes256: { cipher: "AES", key: 256, iv: 16, mode: "CBC", type: "block" }, "aes-128-cfb": { cipher: "AES", key: 128, iv: 16, mode: "CFB", type: "stream" }, "aes-192-cfb": { cipher: "AES", key: 192, iv: 16, mode: "CFB", type: "stream" }, "aes-256-cfb": { cipher: "AES", key: 256, iv: 16, mode: "CFB", type: "stream" }, "aes-128-cfb8": { cipher: "AES", key: 128, iv: 16, mode: "CFB8", type: "stream" }, "aes-192-cfb8": { cipher: "AES", key: 192, iv: 16, mode: "CFB8", type: "stream" }, "aes-256-cfb8": { cipher: "AES", key: 256, iv: 16, mode: "CFB8", type: "stream" }, "aes-128-cfb1": { cipher: "AES", key: 128, iv: 16, mode: "CFB1", type: "stream" }, "aes-192-cfb1": { cipher: "AES", key: 192, iv: 16, mode: "CFB1", type: "stream" }, "aes-256-cfb1": { cipher: "AES", key: 256, iv: 16, mode: "CFB1", type: "stream" }, "aes-128-ofb": { cipher: "AES", key: 128, iv: 16, mode: "OFB", type: "stream" }, "aes-192-ofb": { cipher: "AES", key: 192, iv: 16, mode: "OFB", type: "stream" }, "aes-256-ofb": { cipher: "AES", key: 256, iv: 16, mode: "OFB", type: "stream" }, "aes-128-ctr": { cipher: "AES", key: 128, iv: 16, mode: "CTR", type: "stream" }, "aes-192-ctr": { cipher: "AES", key: 192, iv: 16, mode: "CTR", type: "stream" }, "aes-256-ctr": { cipher: "AES", key: 256, iv: 16, mode: "CTR", type: "stream" }, "aes-128-gcm": { cipher: "AES", key: 128, iv: 12, mode: "GCM", type: "auth" }, "aes-192-gcm": { cipher: "AES", key: 192, iv: 12, mode: "GCM", type: "auth" }, "aes-256-gcm": { cipher: "AES", key: 256, iv: 12, mode: "GCM", type: "auth" } };
- }, {}], 204: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = g("buffer-xor");
- function s(l) {
- return l._prev = l._cipher.encryptBlock(l._prev), l._prev;
- }
- i.encrypt = function(l, n) {
- for (; l._cache.length < n.length; ) l._cache = e.concat([l._cache, s(l)]);
- var a = l._cache.slice(0, n.length);
- return l._cache = l._cache.slice(n.length), A(n, a);
- };
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { buffer: 220, "buffer-xor": 219 }], 205: [function(g, C, i) {
- var e = g("./aes"), A = g("safe-buffer").Buffer, s = g("cipher-base");
- function l(n, a, d, o) {
- s.call(this), this._cipher = new e.AES(a), this._prev = A.from(d), this._cache = A.allocUnsafe(0), this._secCache = A.allocUnsafe(0), this._decrypt = o, this._mode = n;
- }
- g("inherits")(l, s), l.prototype._update = function(n) {
- return this._mode.encrypt(this, n, this._decrypt);
- }, l.prototype._final = function() {
- this._cipher.scrub();
- }, C.exports = l;
- }, { "./aes": 189, "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 206: [function(g, C, i) {
- var e = g("browserify-des"), A = g("browserify-aes/browser"), s = g("browserify-aes/modes"), l = g("browserify-des/modes"), n = g("evp_bytestokey");
- function a(o, c, r) {
- if (o = o.toLowerCase(), s[o]) return A.createCipheriv(o, c, r);
- if (l[o]) return new e({ key: c, iv: r, mode: o });
- throw new TypeError("invalid suite type");
- }
- function d(o, c, r) {
- if (o = o.toLowerCase(), s[o]) return A.createDecipheriv(o, c, r);
- if (l[o]) return new e({ key: c, iv: r, mode: o, decrypt: !0 });
- throw new TypeError("invalid suite type");
- }
- i.createCipher = i.Cipher = function(o, c) {
- var r, h;
- if (o = o.toLowerCase(), s[o]) r = s[o].key, h = s[o].iv;
- else {
- if (!l[o]) throw new TypeError("invalid suite type");
- r = 8 * l[o].key, h = l[o].iv;
- }
- var b = n(c, !1, r, h);
- return a(o, b.key, b.iv);
- }, i.createCipheriv = i.Cipheriv = a, i.createDecipher = i.Decipher = function(o, c) {
- var r, h;
- if (o = o.toLowerCase(), s[o]) r = s[o].key, h = s[o].iv;
- else {
- if (!l[o]) throw new TypeError("invalid suite type");
- r = 8 * l[o].key, h = l[o].iv;
- }
- var b = n(c, !1, r, h);
- return d(o, b.key, b.iv);
- }, i.createDecipheriv = i.Decipheriv = d, i.listCiphers = i.getCiphers = function() {
- return Object.keys(l).concat(A.getCiphers());
- };
- }, { "browserify-aes/browser": 191, "browserify-aes/modes": 202, "browserify-des": 207, "browserify-des/modes": 208, evp_bytestokey: 423 }], 207: [function(g, C, i) {
- var e = g("cipher-base"), A = g("des.js"), s = g("inherits"), l = g("safe-buffer").Buffer, n = { "des-ede3-cbc": A.CBC.instantiate(A.EDE), "des-ede3": A.EDE, "des-ede-cbc": A.CBC.instantiate(A.EDE), "des-ede": A.EDE, "des-cbc": A.CBC.instantiate(A.DES), "des-ecb": A.DES };
- function a(d) {
- e.call(this);
- var o, c = d.mode.toLowerCase(), r = n[c];
- o = d.decrypt ? "decrypt" : "encrypt";
- var h = d.key;
- l.isBuffer(h) || (h = l.from(h)), c !== "des-ede" && c !== "des-ede-cbc" || (h = l.concat([h, h.slice(0, 8)]));
- var b = d.iv;
- l.isBuffer(b) || (b = l.from(b)), this._des = r.create({ key: h, iv: b, type: o });
- }
- n.des = n["des-cbc"], n.des3 = n["des-ede3-cbc"], C.exports = a, s(a, e), a.prototype._update = function(d) {
- return l.from(this._des.update(d));
- }, a.prototype._final = function() {
- return l.from(this._des.final());
- };
- }, { "cipher-base": 221, "des.js": 394, inherits: 440, "safe-buffer": 494 }], 208: [function(g, C, i) {
- i["des-ecb"] = { key: 8, iv: 0 }, i["des-cbc"] = i.des = { key: 8, iv: 8 }, i["des-ede3-cbc"] = i.des3 = { key: 24, iv: 8 }, i["des-ede3"] = { key: 24, iv: 0 }, i["des-ede-cbc"] = { key: 16, iv: 8 }, i["des-ede"] = { key: 16, iv: 0 };
- }, {}], 209: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = g("bn.js"), s = g("randombytes");
- function l(a) {
- var d, o = a.modulus.byteLength();
- do
- d = new A(s(o));
- while (d.cmp(a.modulus) >= 0 || !d.umod(a.prime1) || !d.umod(a.prime2));
- return d;
- }
- function n(a, d) {
- var o = function(X) {
- var H = l(X);
- return { blinder: H.toRed(A.mont(X.modulus)).redPow(new A(X.publicExponent)).fromRed(), unblinder: H.invm(X.modulus) };
- }(d), c = d.modulus.byteLength(), r = new A(a).mul(o.blinder).umod(d.modulus), h = r.toRed(A.mont(d.prime1)), b = r.toRed(A.mont(d.prime2)), u = d.coefficient, m = d.prime1, Z = d.prime2, p = h.redPow(d.exponent1).fromRed(), Y = b.redPow(d.exponent2).fromRed(), R = p.isub(Y).imul(u).umod(m).imul(Z);
- return Y.iadd(R).imul(o.unblinder).umod(d.modulus).toArrayLike(e, "be", c);
- }
- n.getr = l, C.exports = n;
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { "bn.js": 186, buffer: 220, randombytes: 475 }], 210: [function(g, C, i) {
- C.exports = g("./browser/algorithms.json");
- }, { "./browser/algorithms.json": 211 }], 211: [function(g, C, i) {
- C.exports = { sha224WithRSAEncryption: { sign: "rsa", hash: "sha224", id: "302d300d06096086480165030402040500041c" }, "RSA-SHA224": { sign: "ecdsa/rsa", hash: "sha224", id: "302d300d06096086480165030402040500041c" }, sha256WithRSAEncryption: { sign: "rsa", hash: "sha256", id: "3031300d060960864801650304020105000420" }, "RSA-SHA256": { sign: "ecdsa/rsa", hash: "sha256", id: "3031300d060960864801650304020105000420" }, sha384WithRSAEncryption: { sign: "rsa", hash: "sha384", id: "3041300d060960864801650304020205000430" }, "RSA-SHA384": { sign: "ecdsa/rsa", hash: "sha384", id: "3041300d060960864801650304020205000430" }, sha512WithRSAEncryption: { sign: "rsa", hash: "sha512", id: "3051300d060960864801650304020305000440" }, "RSA-SHA512": { sign: "ecdsa/rsa", hash: "sha512", id: "3051300d060960864801650304020305000440" }, "RSA-SHA1": { sign: "rsa", hash: "sha1", id: "3021300906052b0e03021a05000414" }, "ecdsa-with-SHA1": { sign: "ecdsa", hash: "sha1", id: "" }, sha256: { sign: "ecdsa", hash: "sha256", id: "" }, sha224: { sign: "ecdsa", hash: "sha224", id: "" }, sha384: { sign: "ecdsa", hash: "sha384", id: "" }, sha512: { sign: "ecdsa", hash: "sha512", id: "" }, "DSA-SHA": { sign: "dsa", hash: "sha1", id: "" }, "DSA-SHA1": { sign: "dsa", hash: "sha1", id: "" }, DSA: { sign: "dsa", hash: "sha1", id: "" }, "DSA-WITH-SHA224": { sign: "dsa", hash: "sha224", id: "" }, "DSA-SHA224": { sign: "dsa", hash: "sha224", id: "" }, "DSA-WITH-SHA256": { sign: "dsa", hash: "sha256", id: "" }, "DSA-SHA256": { sign: "dsa", hash: "sha256", id: "" }, "DSA-WITH-SHA384": { sign: "dsa", hash: "sha384", id: "" }, "DSA-SHA384": { sign: "dsa", hash: "sha384", id: "" }, "DSA-WITH-SHA512": { sign: "dsa", hash: "sha512", id: "" }, "DSA-SHA512": { sign: "dsa", hash: "sha512", id: "" }, "DSA-RIPEMD160": { sign: "dsa", hash: "rmd160", id: "" }, ripemd160WithRSA: { sign: "rsa", hash: "rmd160", id: "3021300906052b2403020105000414" }, "RSA-RIPEMD160": { sign: "rsa", hash: "rmd160", id: "3021300906052b2403020105000414" }, md5WithRSAEncryption: { sign: "rsa", hash: "md5", id: "3020300c06082a864886f70d020505000410" }, "RSA-MD5": { sign: "rsa", hash: "md5", id: "3020300c06082a864886f70d020505000410" } };
- }, {}], 212: [function(g, C, i) {
- C.exports = { "1.3.132.0.10": "secp256k1", "1.3.132.0.33": "p224", "1.2.840.10045.3.1.1": "p192", "1.2.840.10045.3.1.7": "p256", "1.3.132.0.34": "p384", "1.3.132.0.35": "p521" };
- }, {}], 213: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("create-hash"), s = g("readable-stream"), l = g("inherits"), n = g("./sign"), a = g("./verify"), d = g("./algorithms.json");
- function o(b) {
- s.Writable.call(this);
- var u = d[b];
- if (!u) throw new Error("Unknown message digest");
- this._hashType = u.hash, this._hash = A(u.hash), this._tag = u.id, this._signType = u.sign;
- }
- function c(b) {
- s.Writable.call(this);
- var u = d[b];
- if (!u) throw new Error("Unknown message digest");
- this._hash = A(u.hash), this._tag = u.id, this._signType = u.sign;
- }
- function r(b) {
- return new o(b);
- }
- function h(b) {
- return new c(b);
- }
- Object.keys(d).forEach(function(b) {
- d[b].id = e.from(d[b].id, "hex"), d[b.toLowerCase()] = d[b];
- }), l(o, s.Writable), o.prototype._write = function(b, u, m) {
- this._hash.update(b), m();
- }, o.prototype.update = function(b, u) {
- return typeof b == "string" && (b = e.from(b, u)), this._hash.update(b), this;
- }, o.prototype.sign = function(b, u) {
- this.end();
- var m = this._hash.digest(), Z = n(m, b, this._hashType, this._signType, this._tag);
- return u ? Z.toString(u) : Z;
- }, l(c, s.Writable), c.prototype._write = function(b, u, m) {
- this._hash.update(b), m();
- }, c.prototype.update = function(b, u) {
- return typeof b == "string" && (b = e.from(b, u)), this._hash.update(b), this;
- }, c.prototype.verify = function(b, u, m) {
- typeof u == "string" && (u = e.from(u, m)), this.end();
- var Z = this._hash.digest();
- return a(u, Z, b, this._signType, this._tag);
- }, C.exports = { Sign: r, Verify: h, createSign: r, createVerify: h };
- }, { "./algorithms.json": 211, "./sign": 214, "./verify": 215, "create-hash": 386, inherits: 440, "readable-stream": 491, "safe-buffer": 494 }], 214: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("create-hmac"), s = g("browserify-rsa"), l = g("elliptic").ec, n = g("bn.js"), a = g("parse-asn1"), d = g("./curves.json");
- function o(b, u, m, Z) {
- if ((b = e.from(b.toArray())).length < u.byteLength()) {
- var p = e.alloc(u.byteLength() - b.length);
- b = e.concat([p, b]);
- }
- var Y = m.length, R = function(S, z) {
- S = (S = c(S, z)).mod(z);
- var v = e.from(S.toArray());
- if (v.length < z.byteLength()) {
- var K = e.alloc(z.byteLength() - v.length);
- v = e.concat([K, v]);
- }
- return v;
- }(m, u), X = e.alloc(Y);
- X.fill(1);
- var H = e.alloc(Y);
- return H = A(Z, H).update(X).update(e.from([0])).update(b).update(R).digest(), X = A(Z, H).update(X).digest(), { k: H = A(Z, H).update(X).update(e.from([1])).update(b).update(R).digest(), v: X = A(Z, H).update(X).digest() };
- }
- function c(b, u) {
- var m = new n(b), Z = (b.length << 3) - u.bitLength();
- return Z > 0 && m.ishrn(Z), m;
- }
- function r(b, u, m) {
- var Z, p;
- do {
- for (Z = e.alloc(0); 8 * Z.length < b.bitLength(); ) u.v = A(m, u.k).update(u.v).digest(), Z = e.concat([Z, u.v]);
- p = c(Z, b), u.k = A(m, u.k).update(u.v).update(e.from([0])).digest(), u.v = A(m, u.k).update(u.v).digest();
- } while (p.cmp(b) !== -1);
- return p;
- }
- function h(b, u, m, Z) {
- return b.toRed(n.mont(m)).redPow(u).fromRed().mod(Z);
- }
- C.exports = function(b, u, m, Z, p) {
- var Y = a(u);
- if (Y.curve) {
- if (Z !== "ecdsa" && Z !== "ecdsa/rsa") throw new Error("wrong private key type");
- return function(S, z) {
- var v = d[z.curve.join(".")];
- if (!v) throw new Error("unknown curve " + z.curve.join("."));
- var K = new l(v).keyFromPrivate(z.privateKey).sign(S);
- return e.from(K.toDER());
- }(b, Y);
- }
- if (Y.type === "dsa") {
- if (Z !== "dsa") throw new Error("wrong private key type");
- return function(S, z, v) {
- for (var K, V = z.params.priv_key, N = z.params.p, B = z.params.q, G = z.params.g, w = new n(0), W = c(S, B).mod(B), y = !1, f = o(V, B, S, v); y === !1; ) K = r(B, f, v), w = h(G, K, N, B), (y = K.invm(B).imul(W.add(V.mul(w))).mod(B)).cmpn(0) === 0 && (y = !1, w = new n(0));
- return function(D, F) {
- D = D.toArray(), F = F.toArray(), 128 & D[0] && (D = [0].concat(D)), 128 & F[0] && (F = [0].concat(F));
- var T = [48, D.length + F.length + 4, 2, D.length];
- return T = T.concat(D, [2, F.length], F), e.from(T);
- }(w, y);
- }(b, Y, m);
- }
- if (Z !== "rsa" && Z !== "ecdsa/rsa") throw new Error("wrong private key type");
- b = e.concat([p, b]);
- for (var R = Y.modulus.byteLength(), X = [0, 1]; b.length + X.length + 1 < R; ) X.push(255);
- X.push(0);
- for (var H = -1; ++H < b.length; ) X.push(b[H]);
- return s(X, Y);
- }, C.exports.getKey = o, C.exports.makeKey = r;
- }, { "./curves.json": 212, "bn.js": 186, "browserify-rsa": 209, "create-hmac": 388, elliptic: 405, "parse-asn1": 459, "safe-buffer": 494 }], 215: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("bn.js"), s = g("elliptic").ec, l = g("parse-asn1"), n = g("./curves.json");
- function a(d, o) {
- if (d.cmpn(0) <= 0) throw new Error("invalid sig");
- if (d.cmp(o) >= o) throw new Error("invalid sig");
- }
- C.exports = function(d, o, c, r, h) {
- var b = l(c);
- if (b.type === "ec") {
- if (r !== "ecdsa" && r !== "ecdsa/rsa") throw new Error("wrong public key type");
- return function(X, H, S) {
- var z = n[S.data.algorithm.curve.join(".")];
- if (!z) throw new Error("unknown curve " + S.data.algorithm.curve.join("."));
- var v = new s(z), K = S.data.subjectPrivateKey.data;
- return v.verify(H, X, K);
- }(d, o, b);
- }
- if (b.type === "dsa") {
- if (r !== "dsa") throw new Error("wrong public key type");
- return function(X, H, S) {
- var z = S.data.p, v = S.data.q, K = S.data.g, V = S.data.pub_key, N = l.signature.decode(X, "der"), B = N.s, G = N.r;
- a(B, v), a(G, v);
- var w = A.mont(z), W = B.invm(v);
- return K.toRed(w).redPow(new A(H).mul(W).mod(v)).fromRed().mul(V.toRed(w).redPow(G.mul(W).mod(v)).fromRed()).mod(z).mod(v).cmp(G) === 0;
- }(d, o, b);
- }
- if (r !== "rsa" && r !== "ecdsa/rsa") throw new Error("wrong public key type");
- o = e.concat([h, o]);
- for (var u = b.modulus.byteLength(), m = [1], Z = 0; o.length + m.length + 2 < u; ) m.push(255), Z++;
- m.push(0);
- for (var p = -1; ++p < o.length; ) m.push(o[p]);
- m = e.from(m);
- var Y = A.mont(b.modulus);
- d = (d = new A(d).toRed(Y)).redPow(new A(b.publicExponent)), d = e.from(d.fromRed().toArray());
- var R = Z < 8 ? 1 : 0;
- for (u = Math.min(d.length, m.length), d.length !== m.length && (R = 1), p = -1; ++p < u; ) R |= d[p] ^ m[p];
- return R === 0;
- };
- }, { "./curves.json": 212, "bn.js": 186, elliptic: 405, "parse-asn1": 459, "safe-buffer": 494 }], 216: [function(g, C, i) {
- }, {}], 217: [function(g, C, i) {
- var e = g("buffer"), A = e.Buffer;
- function s(n, a) {
- for (var d in n) a[d] = n[d];
- }
- function l(n, a, d) {
- return A(n, a, d);
- }
- A.from && A.alloc && A.allocUnsafe && A.allocUnsafeSlow ? C.exports = e : (s(e, i), i.Buffer = l), s(A, l), l.from = function(n, a, d) {
- if (typeof n == "number") throw new TypeError("Argument must not be a number");
- return A(n, a, d);
- }, l.alloc = function(n, a, d) {
- if (typeof n != "number") throw new TypeError("Argument must be a number");
- var o = A(n);
- return a !== void 0 ? typeof d == "string" ? o.fill(a, d) : o.fill(a) : o.fill(0), o;
- }, l.allocUnsafe = function(n) {
- if (typeof n != "number") throw new TypeError("Argument must be a number");
- return A(n);
- }, l.allocUnsafeSlow = function(n) {
- if (typeof n != "number") throw new TypeError("Argument must be a number");
- return e.SlowBuffer(n);
- };
- }, { buffer: 220 }], 218: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = e.isEncoding || function(b) {
- switch ((b = "" + b) && b.toLowerCase()) {
- case "hex":
- case "utf8":
- case "utf-8":
- case "ascii":
- case "binary":
- case "base64":
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- case "raw":
- return !0;
- default:
- return !1;
- }
- };
- function s(b) {
- var u;
- switch (this.encoding = function(m) {
- var Z = function(p) {
- if (!p) return "utf8";
- for (var Y; ; ) switch (p) {
- case "utf8":
- case "utf-8":
- return "utf8";
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return "utf16le";
- case "latin1":
- case "binary":
- return "latin1";
- case "base64":
- case "ascii":
- case "hex":
- return p;
- default:
- if (Y) return;
- p = ("" + p).toLowerCase(), Y = !0;
- }
- }(m);
- if (typeof Z != "string" && (e.isEncoding === A || !A(m))) throw new Error("Unknown encoding: " + m);
- return Z || m;
- }(b), this.encoding) {
- case "utf16le":
- this.text = a, this.end = d, u = 4;
- break;
- case "utf8":
- this.fillLast = n, u = 4;
- break;
- case "base64":
- this.text = o, this.end = c, u = 3;
- break;
- default:
- return this.write = r, void (this.end = h);
- }
- this.lastNeed = 0, this.lastTotal = 0, this.lastChar = e.allocUnsafe(u);
- }
- function l(b) {
- return b <= 127 ? 0 : b >> 5 == 6 ? 2 : b >> 4 == 14 ? 3 : b >> 3 == 30 ? 4 : b >> 6 == 2 ? -1 : -2;
- }
- function n(b) {
- var u = this.lastTotal - this.lastNeed, m = function(Z, p, Y) {
- if ((192 & p[0]) != 128) return Z.lastNeed = 0, "�";
- if (Z.lastNeed > 1 && p.length > 1) {
- if ((192 & p[1]) != 128) return Z.lastNeed = 1, "�";
- if (Z.lastNeed > 2 && p.length > 2 && (192 & p[2]) != 128) return Z.lastNeed = 2, "�";
- }
- }(this, b);
- return m !== void 0 ? m : this.lastNeed <= b.length ? (b.copy(this.lastChar, u, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (b.copy(this.lastChar, u, 0, b.length), void (this.lastNeed -= b.length));
- }
- function a(b, u) {
- if ((b.length - u) % 2 == 0) {
- var m = b.toString("utf16le", u);
- if (m) {
- var Z = m.charCodeAt(m.length - 1);
- if (Z >= 55296 && Z <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = b[b.length - 2], this.lastChar[1] = b[b.length - 1], m.slice(0, -1);
- }
- return m;
- }
- return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = b[b.length - 1], b.toString("utf16le", u, b.length - 1);
- }
- function d(b) {
- var u = b && b.length ? this.write(b) : "";
- if (this.lastNeed) {
- var m = this.lastTotal - this.lastNeed;
- return u + this.lastChar.toString("utf16le", 0, m);
- }
- return u;
- }
- function o(b, u) {
- var m = (b.length - u) % 3;
- return m === 0 ? b.toString("base64", u) : (this.lastNeed = 3 - m, this.lastTotal = 3, m === 1 ? this.lastChar[0] = b[b.length - 1] : (this.lastChar[0] = b[b.length - 2], this.lastChar[1] = b[b.length - 1]), b.toString("base64", u, b.length - m));
- }
- function c(b) {
- var u = b && b.length ? this.write(b) : "";
- return this.lastNeed ? u + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : u;
- }
- function r(b) {
- return b.toString(this.encoding);
- }
- function h(b) {
- return b && b.length ? this.write(b) : "";
- }
- i.StringDecoder = s, s.prototype.write = function(b) {
- if (b.length === 0) return "";
- var u, m;
- if (this.lastNeed) {
- if ((u = this.fillLast(b)) === void 0) return "";
- m = this.lastNeed, this.lastNeed = 0;
- } else m = 0;
- return m < b.length ? u ? u + this.text(b, m) : this.text(b, m) : u || "";
- }, s.prototype.end = function(b) {
- var u = b && b.length ? this.write(b) : "";
- return this.lastNeed ? u + "�" : u;
- }, s.prototype.text = function(b, u) {
- var m = function(p, Y, R) {
- var X = Y.length - 1;
- if (X < R) return 0;
- var H = l(Y[X]);
- return H >= 0 ? (H > 0 && (p.lastNeed = H - 1), H) : --X < R || H === -2 ? 0 : (H = l(Y[X])) >= 0 ? (H > 0 && (p.lastNeed = H - 2), H) : --X < R || H === -2 ? 0 : (H = l(Y[X])) >= 0 ? (H > 0 && (H === 2 ? H = 0 : p.lastNeed = H - 3), H) : 0;
- }(this, b, u);
- if (!this.lastNeed) return b.toString("utf8", u);
- this.lastTotal = m;
- var Z = b.length - (m - this.lastNeed);
- return b.copy(this.lastChar, 0, Z), b.toString("utf8", u, Z);
- }, s.prototype.fillLast = function(b) {
- if (this.lastNeed <= b.length) return b.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);
- b.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, b.length), this.lastNeed -= b.length;
- };
- }, { "safe-buffer": 217 }], 219: [function(g, C, i) {
- (function(e) {
- (function() {
- C.exports = function(A, s) {
- for (var l = Math.min(A.length, s.length), n = new e(l), a = 0; a < l; ++a) n[a] = A[a] ^ s[a];
- return n;
- };
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { buffer: 220 }], 220: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = g("base64-js"), s = g("ieee754");
- i.Buffer = n, i.SlowBuffer = function(J) {
- return +J != J && (J = 0), n.alloc(+J);
- }, i.INSPECT_MAX_BYTES = 50;
- function l(J) {
- if (J > 2147483647) throw new RangeError('The value "' + J + '" is invalid for option "size"');
- var k = new Uint8Array(J);
- return k.__proto__ = n.prototype, k;
- }
- function n(J, k, j) {
- if (typeof J == "number") {
- if (typeof k == "string") throw new TypeError('The "string" argument must be of type string. Received type number');
- return o(J);
- }
- return a(J, k, j);
- }
- function a(J, k, j) {
- if (typeof J == "string") return function(Ig, x) {
- if (typeof x == "string" && x !== "" || (x = "utf8"), !n.isEncoding(x)) throw new TypeError("Unknown encoding: " + x);
- var Ag = 0 | h(Ig, x), eg = l(Ag), O = eg.write(Ig, x);
- return O !== Ag && (eg = eg.slice(0, O)), eg;
- }(J, k);
- if (ArrayBuffer.isView(J)) return c(J);
- if (J == null) throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof J);
- if (L(J, ArrayBuffer) || J && L(J.buffer, ArrayBuffer)) return function(Ig, x, Ag) {
- if (x < 0 || Ig.byteLength < x) throw new RangeError('"offset" is outside of buffer bounds');
- if (Ig.byteLength < x + (Ag || 0)) throw new RangeError('"length" is outside of buffer bounds');
- var eg;
- return eg = x === void 0 && Ag === void 0 ? new Uint8Array(Ig) : Ag === void 0 ? new Uint8Array(Ig, x) : new Uint8Array(Ig, x, Ag), eg.__proto__ = n.prototype, eg;
- }(J, k, j);
- if (typeof J == "number") throw new TypeError('The "value" argument must not be of type number. Received type number');
- var q = J.valueOf && J.valueOf();
- if (q != null && q !== J) return n.from(q, k, j);
- var Cg = function(Ig) {
- if (n.isBuffer(Ig)) {
- var x = 0 | r(Ig.length), Ag = l(x);
- return Ag.length === 0 || Ig.copy(Ag, 0, 0, x), Ag;
- }
- if (Ig.length !== void 0) return typeof Ig.length != "number" || E(Ig.length) ? l(0) : c(Ig);
- if (Ig.type === "Buffer" && Array.isArray(Ig.data)) return c(Ig.data);
- }(J);
- if (Cg) return Cg;
- if (typeof Symbol < "u" && Symbol.toPrimitive != null && typeof J[Symbol.toPrimitive] == "function") return n.from(J[Symbol.toPrimitive]("string"), k, j);
- throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof J);
- }
- function d(J) {
- if (typeof J != "number") throw new TypeError('"size" argument must be of type number');
- if (J < 0) throw new RangeError('The value "' + J + '" is invalid for option "size"');
- }
- function o(J) {
- return d(J), l(J < 0 ? 0 : 0 | r(J));
- }
- function c(J) {
- for (var k = J.length < 0 ? 0 : 0 | r(J.length), j = l(k), q = 0; q < k; q += 1) j[q] = 255 & J[q];
- return j;
- }
- function r(J) {
- if (J >= 2147483647) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x7fffffff bytes");
- return 0 | J;
- }
- function h(J, k) {
- if (n.isBuffer(J)) return J.length;
- if (ArrayBuffer.isView(J) || L(J, ArrayBuffer)) return J.byteLength;
- if (typeof J != "string") throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof J);
- var j = J.length, q = arguments.length > 2 && arguments[2] === !0;
- if (!q && j === 0) return 0;
- for (var Cg = !1; ; ) switch (k) {
- case "ascii":
- case "latin1":
- case "binary":
- return j;
- case "utf8":
- case "utf-8":
- return T(J).length;
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return 2 * j;
- case "hex":
- return j >>> 1;
- case "base64":
- return Q(J).length;
- default:
- if (Cg) return q ? -1 : T(J).length;
- k = ("" + k).toLowerCase(), Cg = !0;
- }
- }
- function b(J, k, j) {
- var q = !1;
- if ((k === void 0 || k < 0) && (k = 0), k > this.length || ((j === void 0 || j > this.length) && (j = this.length), j <= 0) || (j >>>= 0) <= (k >>>= 0)) return "";
- for (J || (J = "utf8"); ; ) switch (J) {
- case "hex":
- return N(this, k, j);
- case "utf8":
- case "utf-8":
- return v(this, k, j);
- case "ascii":
- return K(this, k, j);
- case "latin1":
- case "binary":
- return V(this, k, j);
- case "base64":
- return z(this, k, j);
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return B(this, k, j);
- default:
- if (q) throw new TypeError("Unknown encoding: " + J);
- J = (J + "").toLowerCase(), q = !0;
- }
- }
- function u(J, k, j) {
- var q = J[k];
- J[k] = J[j], J[j] = q;
- }
- function m(J, k, j, q, Cg) {
- if (J.length === 0) return -1;
- if (typeof j == "string" ? (q = j, j = 0) : j > 2147483647 ? j = 2147483647 : j < -2147483648 && (j = -2147483648), E(j = +j) && (j = Cg ? 0 : J.length - 1), j < 0 && (j = J.length + j), j >= J.length) {
- if (Cg) return -1;
- j = J.length - 1;
- } else if (j < 0) {
- if (!Cg) return -1;
- j = 0;
- }
- if (typeof k == "string" && (k = n.from(k, q)), n.isBuffer(k)) return k.length === 0 ? -1 : Z(J, k, j, q, Cg);
- if (typeof k == "number") return k &= 255, typeof Uint8Array.prototype.indexOf == "function" ? Cg ? Uint8Array.prototype.indexOf.call(J, k, j) : Uint8Array.prototype.lastIndexOf.call(J, k, j) : Z(J, [k], j, q, Cg);
- throw new TypeError("val must be string, number or Buffer");
- }
- function Z(J, k, j, q, Cg) {
- var Ig, x = 1, Ag = J.length, eg = k.length;
- if (q !== void 0 && ((q = String(q).toLowerCase()) === "ucs2" || q === "ucs-2" || q === "utf16le" || q === "utf-16le")) {
- if (J.length < 2 || k.length < 2) return -1;
- x = 2, Ag /= 2, eg /= 2, j /= 2;
- }
- function O(ng, sg) {
- return x === 1 ? ng[sg] : ng.readUInt16BE(sg * x);
- }
- if (Cg) {
- var _ = -1;
- for (Ig = j; Ig < Ag; Ig++) if (O(J, Ig) === O(k, _ === -1 ? 0 : Ig - _)) {
- if (_ === -1 && (_ = Ig), Ig - _ + 1 === eg) return _ * x;
- } else _ !== -1 && (Ig -= Ig - _), _ = -1;
- } else for (j + eg > Ag && (j = Ag - eg), Ig = j; Ig >= 0; Ig--) {
- for (var gg = !0, lg = 0; lg < eg; lg++) if (O(J, Ig + lg) !== O(k, lg)) {
- gg = !1;
- break;
- }
- if (gg) return Ig;
- }
- return -1;
- }
- function p(J, k, j, q) {
- j = Number(j) || 0;
- var Cg = J.length - j;
- q ? (q = Number(q)) > Cg && (q = Cg) : q = Cg;
- var Ig = k.length;
- q > Ig / 2 && (q = Ig / 2);
- for (var x = 0; x < q; ++x) {
- var Ag = parseInt(k.substr(2 * x, 2), 16);
- if (E(Ag)) return x;
- J[j + x] = Ag;
- }
- return x;
- }
- function Y(J, k, j, q) {
- return P(T(k, J.length - j), J, j, q);
- }
- function R(J, k, j, q) {
- return P(function(Cg) {
- for (var Ig = [], x = 0; x < Cg.length; ++x) Ig.push(255 & Cg.charCodeAt(x));
- return Ig;
- }(k), J, j, q);
- }
- function X(J, k, j, q) {
- return R(J, k, j, q);
- }
- function H(J, k, j, q) {
- return P(Q(k), J, j, q);
- }
- function S(J, k, j, q) {
- return P(function(Cg, Ig) {
- for (var x, Ag, eg, O = [], _ = 0; _ < Cg.length && !((Ig -= 2) < 0); ++_) x = Cg.charCodeAt(_), Ag = x >> 8, eg = x % 256, O.push(eg), O.push(Ag);
- return O;
- }(k, J.length - j), J, j, q);
- }
- function z(J, k, j) {
- return k === 0 && j === J.length ? A.fromByteArray(J) : A.fromByteArray(J.slice(k, j));
- }
- function v(J, k, j) {
- j = Math.min(J.length, j);
- for (var q = [], Cg = k; Cg < j; ) {
- var Ig, x, Ag, eg, O = J[Cg], _ = null, gg = O > 239 ? 4 : O > 223 ? 3 : O > 191 ? 2 : 1;
- if (Cg + gg <= j) switch (gg) {
- case 1:
- O < 128 && (_ = O);
- break;
- case 2:
- (192 & (Ig = J[Cg + 1])) == 128 && (eg = (31 & O) << 6 | 63 & Ig) > 127 && (_ = eg);
- break;
- case 3:
- Ig = J[Cg + 1], x = J[Cg + 2], (192 & Ig) == 128 && (192 & x) == 128 && (eg = (15 & O) << 12 | (63 & Ig) << 6 | 63 & x) > 2047 && (eg < 55296 || eg > 57343) && (_ = eg);
- break;
- case 4:
- Ig = J[Cg + 1], x = J[Cg + 2], Ag = J[Cg + 3], (192 & Ig) == 128 && (192 & x) == 128 && (192 & Ag) == 128 && (eg = (15 & O) << 18 | (63 & Ig) << 12 | (63 & x) << 6 | 63 & Ag) > 65535 && eg < 1114112 && (_ = eg);
- }
- _ === null ? (_ = 65533, gg = 1) : _ > 65535 && (_ -= 65536, q.push(_ >>> 10 & 1023 | 55296), _ = 56320 | 1023 & _), q.push(_), Cg += gg;
- }
- return function(lg) {
- var ng = lg.length;
- if (ng <= 4096) return String.fromCharCode.apply(String, lg);
- for (var sg = "", og = 0; og < ng; ) sg += String.fromCharCode.apply(String, lg.slice(og, og += 4096));
- return sg;
- }(q);
- }
- i.kMaxLength = 2147483647, n.TYPED_ARRAY_SUPPORT = function() {
- try {
- var J = new Uint8Array(1);
- return J.__proto__ = { __proto__: Uint8Array.prototype, foo: function() {
- return 42;
- } }, J.foo() === 42;
- } catch {
- return !1;
- }
- }(), n.TYPED_ARRAY_SUPPORT || typeof console > "u" || typeof console.error != "function" || console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."), Object.defineProperty(n.prototype, "parent", { enumerable: !0, get: function() {
- if (n.isBuffer(this)) return this.buffer;
- } }), Object.defineProperty(n.prototype, "offset", { enumerable: !0, get: function() {
- if (n.isBuffer(this)) return this.byteOffset;
- } }), typeof Symbol < "u" && Symbol.species != null && n[Symbol.species] === n && Object.defineProperty(n, Symbol.species, { value: null, configurable: !0, enumerable: !1, writable: !1 }), n.poolSize = 8192, n.from = function(J, k, j) {
- return a(J, k, j);
- }, n.prototype.__proto__ = Uint8Array.prototype, n.__proto__ = Uint8Array, n.alloc = function(J, k, j) {
- return function(q, Cg, Ig) {
- return d(q), q <= 0 ? l(q) : Cg !== void 0 ? typeof Ig == "string" ? l(q).fill(Cg, Ig) : l(q).fill(Cg) : l(q);
- }(J, k, j);
- }, n.allocUnsafe = function(J) {
- return o(J);
- }, n.allocUnsafeSlow = function(J) {
- return o(J);
- }, n.isBuffer = function(J) {
- return J != null && J._isBuffer === !0 && J !== n.prototype;
- }, n.compare = function(J, k) {
- if (L(J, Uint8Array) && (J = n.from(J, J.offset, J.byteLength)), L(k, Uint8Array) && (k = n.from(k, k.offset, k.byteLength)), !n.isBuffer(J) || !n.isBuffer(k)) throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');
- if (J === k) return 0;
- for (var j = J.length, q = k.length, Cg = 0, Ig = Math.min(j, q); Cg < Ig; ++Cg) if (J[Cg] !== k[Cg]) {
- j = J[Cg], q = k[Cg];
- break;
- }
- return j < q ? -1 : q < j ? 1 : 0;
- }, n.isEncoding = function(J) {
- switch (String(J).toLowerCase()) {
- case "hex":
- case "utf8":
- case "utf-8":
- case "ascii":
- case "latin1":
- case "binary":
- case "base64":
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return !0;
- default:
- return !1;
- }
- }, n.concat = function(J, k) {
- if (!Array.isArray(J)) throw new TypeError('"list" argument must be an Array of Buffers');
- if (J.length === 0) return n.alloc(0);
- var j;
- if (k === void 0) for (k = 0, j = 0; j < J.length; ++j) k += J[j].length;
- var q = n.allocUnsafe(k), Cg = 0;
- for (j = 0; j < J.length; ++j) {
- var Ig = J[j];
- if (L(Ig, Uint8Array) && (Ig = n.from(Ig)), !n.isBuffer(Ig)) throw new TypeError('"list" argument must be an Array of Buffers');
- Ig.copy(q, Cg), Cg += Ig.length;
- }
- return q;
- }, n.byteLength = h, n.prototype._isBuffer = !0, n.prototype.swap16 = function() {
- var J = this.length;
- if (J % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
- for (var k = 0; k < J; k += 2) u(this, k, k + 1);
- return this;
- }, n.prototype.swap32 = function() {
- var J = this.length;
- if (J % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
- for (var k = 0; k < J; k += 4) u(this, k, k + 3), u(this, k + 1, k + 2);
- return this;
- }, n.prototype.swap64 = function() {
- var J = this.length;
- if (J % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
- for (var k = 0; k < J; k += 8) u(this, k, k + 7), u(this, k + 1, k + 6), u(this, k + 2, k + 5), u(this, k + 3, k + 4);
- return this;
- }, n.prototype.toString = function() {
- var J = this.length;
- return J === 0 ? "" : arguments.length === 0 ? v(this, 0, J) : b.apply(this, arguments);
- }, n.prototype.toLocaleString = n.prototype.toString, n.prototype.equals = function(J) {
- if (!n.isBuffer(J)) throw new TypeError("Argument must be a Buffer");
- return this === J || n.compare(this, J) === 0;
- }, n.prototype.inspect = function() {
- var J = "", k = i.INSPECT_MAX_BYTES;
- return J = this.toString("hex", 0, k).replace(/(.{2})/g, "$1 ").trim(), this.length > k && (J += " ... "), "<Buffer " + J + ">";
- }, n.prototype.compare = function(J, k, j, q, Cg) {
- if (L(J, Uint8Array) && (J = n.from(J, J.offset, J.byteLength)), !n.isBuffer(J)) throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof J);
- if (k === void 0 && (k = 0), j === void 0 && (j = J ? J.length : 0), q === void 0 && (q = 0), Cg === void 0 && (Cg = this.length), k < 0 || j > J.length || q < 0 || Cg > this.length) throw new RangeError("out of range index");
- if (q >= Cg && k >= j) return 0;
- if (q >= Cg) return -1;
- if (k >= j) return 1;
- if (this === J) return 0;
- for (var Ig = (Cg >>>= 0) - (q >>>= 0), x = (j >>>= 0) - (k >>>= 0), Ag = Math.min(Ig, x), eg = this.slice(q, Cg), O = J.slice(k, j), _ = 0; _ < Ag; ++_) if (eg[_] !== O[_]) {
- Ig = eg[_], x = O[_];
- break;
- }
- return Ig < x ? -1 : x < Ig ? 1 : 0;
- }, n.prototype.includes = function(J, k, j) {
- return this.indexOf(J, k, j) !== -1;
- }, n.prototype.indexOf = function(J, k, j) {
- return m(this, J, k, j, !0);
- }, n.prototype.lastIndexOf = function(J, k, j) {
- return m(this, J, k, j, !1);
- }, n.prototype.write = function(J, k, j, q) {
- if (k === void 0) q = "utf8", j = this.length, k = 0;
- else if (j === void 0 && typeof k == "string") q = k, j = this.length, k = 0;
- else {
- if (!isFinite(k)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
- k >>>= 0, isFinite(j) ? (j >>>= 0, q === void 0 && (q = "utf8")) : (q = j, j = void 0);
- }
- var Cg = this.length - k;
- if ((j === void 0 || j > Cg) && (j = Cg), J.length > 0 && (j < 0 || k < 0) || k > this.length) throw new RangeError("Attempt to write outside buffer bounds");
- q || (q = "utf8");
- for (var Ig = !1; ; ) switch (q) {
- case "hex":
- return p(this, J, k, j);
- case "utf8":
- case "utf-8":
- return Y(this, J, k, j);
- case "ascii":
- return R(this, J, k, j);
- case "latin1":
- case "binary":
- return X(this, J, k, j);
- case "base64":
- return H(this, J, k, j);
- case "ucs2":
- case "ucs-2":
- case "utf16le":
- case "utf-16le":
- return S(this, J, k, j);
- default:
- if (Ig) throw new TypeError("Unknown encoding: " + q);
- q = ("" + q).toLowerCase(), Ig = !0;
- }
- }, n.prototype.toJSON = function() {
- return { type: "Buffer", data: Array.prototype.slice.call(this._arr || this, 0) };
- };
- function K(J, k, j) {
- var q = "";
- j = Math.min(J.length, j);
- for (var Cg = k; Cg < j; ++Cg) q += String.fromCharCode(127 & J[Cg]);
- return q;
- }
- function V(J, k, j) {
- var q = "";
- j = Math.min(J.length, j);
- for (var Cg = k; Cg < j; ++Cg) q += String.fromCharCode(J[Cg]);
- return q;
- }
- function N(J, k, j) {
- var q = J.length;
- (!k || k < 0) && (k = 0), (!j || j < 0 || j > q) && (j = q);
- for (var Cg = "", Ig = k; Ig < j; ++Ig) Cg += F(J[Ig]);
- return Cg;
- }
- function B(J, k, j) {
- for (var q = J.slice(k, j), Cg = "", Ig = 0; Ig < q.length; Ig += 2) Cg += String.fromCharCode(q[Ig] + 256 * q[Ig + 1]);
- return Cg;
- }
- function G(J, k, j) {
- if (J % 1 != 0 || J < 0) throw new RangeError("offset is not uint");
- if (J + k > j) throw new RangeError("Trying to access beyond buffer length");
- }
- function w(J, k, j, q, Cg, Ig) {
- if (!n.isBuffer(J)) throw new TypeError('"buffer" argument must be a Buffer instance');
- if (k > Cg || k < Ig) throw new RangeError('"value" argument is out of bounds');
- if (j + q > J.length) throw new RangeError("Index out of range");
- }
- function W(J, k, j, q, Cg, Ig) {
- if (j + q > J.length) throw new RangeError("Index out of range");
- if (j < 0) throw new RangeError("Index out of range");
- }
- function y(J, k, j, q, Cg) {
- return k = +k, j >>>= 0, Cg || W(J, 0, j, 4), s.write(J, k, j, q, 23, 4), j + 4;
- }
- function f(J, k, j, q, Cg) {
- return k = +k, j >>>= 0, Cg || W(J, 0, j, 8), s.write(J, k, j, q, 52, 8), j + 8;
- }
- n.prototype.slice = function(J, k) {
- var j = this.length;
- (J = ~~J) < 0 ? (J += j) < 0 && (J = 0) : J > j && (J = j), (k = k === void 0 ? j : ~~k) < 0 ? (k += j) < 0 && (k = 0) : k > j && (k = j), k < J && (k = J);
- var q = this.subarray(J, k);
- return q.__proto__ = n.prototype, q;
- }, n.prototype.readUIntLE = function(J, k, j) {
- J >>>= 0, k >>>= 0, j || G(J, k, this.length);
- for (var q = this[J], Cg = 1, Ig = 0; ++Ig < k && (Cg *= 256); ) q += this[J + Ig] * Cg;
- return q;
- }, n.prototype.readUIntBE = function(J, k, j) {
- J >>>= 0, k >>>= 0, j || G(J, k, this.length);
- for (var q = this[J + --k], Cg = 1; k > 0 && (Cg *= 256); ) q += this[J + --k] * Cg;
- return q;
- }, n.prototype.readUInt8 = function(J, k) {
- return J >>>= 0, k || G(J, 1, this.length), this[J];
- }, n.prototype.readUInt16LE = function(J, k) {
- return J >>>= 0, k || G(J, 2, this.length), this[J] | this[J + 1] << 8;
- }, n.prototype.readUInt16BE = function(J, k) {
- return J >>>= 0, k || G(J, 2, this.length), this[J] << 8 | this[J + 1];
- }, n.prototype.readUInt32LE = function(J, k) {
- return J >>>= 0, k || G(J, 4, this.length), (this[J] | this[J + 1] << 8 | this[J + 2] << 16) + 16777216 * this[J + 3];
- }, n.prototype.readUInt32BE = function(J, k) {
- return J >>>= 0, k || G(J, 4, this.length), 16777216 * this[J] + (this[J + 1] << 16 | this[J + 2] << 8 | this[J + 3]);
- }, n.prototype.readIntLE = function(J, k, j) {
- J >>>= 0, k >>>= 0, j || G(J, k, this.length);
- for (var q = this[J], Cg = 1, Ig = 0; ++Ig < k && (Cg *= 256); ) q += this[J + Ig] * Cg;
- return q >= (Cg *= 128) && (q -= Math.pow(2, 8 * k)), q;
- }, n.prototype.readIntBE = function(J, k, j) {
- J >>>= 0, k >>>= 0, j || G(J, k, this.length);
- for (var q = k, Cg = 1, Ig = this[J + --q]; q > 0 && (Cg *= 256); ) Ig += this[J + --q] * Cg;
- return Ig >= (Cg *= 128) && (Ig -= Math.pow(2, 8 * k)), Ig;
- }, n.prototype.readInt8 = function(J, k) {
- return J >>>= 0, k || G(J, 1, this.length), 128 & this[J] ? -1 * (255 - this[J] + 1) : this[J];
- }, n.prototype.readInt16LE = function(J, k) {
- J >>>= 0, k || G(J, 2, this.length);
- var j = this[J] | this[J + 1] << 8;
- return 32768 & j ? 4294901760 | j : j;
- }, n.prototype.readInt16BE = function(J, k) {
- J >>>= 0, k || G(J, 2, this.length);
- var j = this[J + 1] | this[J] << 8;
- return 32768 & j ? 4294901760 | j : j;
- }, n.prototype.readInt32LE = function(J, k) {
- return J >>>= 0, k || G(J, 4, this.length), this[J] | this[J + 1] << 8 | this[J + 2] << 16 | this[J + 3] << 24;
- }, n.prototype.readInt32BE = function(J, k) {
- return J >>>= 0, k || G(J, 4, this.length), this[J] << 24 | this[J + 1] << 16 | this[J + 2] << 8 | this[J + 3];
- }, n.prototype.readFloatLE = function(J, k) {
- return J >>>= 0, k || G(J, 4, this.length), s.read(this, J, !0, 23, 4);
- }, n.prototype.readFloatBE = function(J, k) {
- return J >>>= 0, k || G(J, 4, this.length), s.read(this, J, !1, 23, 4);
- }, n.prototype.readDoubleLE = function(J, k) {
- return J >>>= 0, k || G(J, 8, this.length), s.read(this, J, !0, 52, 8);
- }, n.prototype.readDoubleBE = function(J, k) {
- return J >>>= 0, k || G(J, 8, this.length), s.read(this, J, !1, 52, 8);
- }, n.prototype.writeUIntLE = function(J, k, j, q) {
- J = +J, k >>>= 0, j >>>= 0, q || w(this, J, k, j, Math.pow(2, 8 * j) - 1, 0);
- var Cg = 1, Ig = 0;
- for (this[k] = 255 & J; ++Ig < j && (Cg *= 256); ) this[k + Ig] = J / Cg & 255;
- return k + j;
- }, n.prototype.writeUIntBE = function(J, k, j, q) {
- J = +J, k >>>= 0, j >>>= 0, q || w(this, J, k, j, Math.pow(2, 8 * j) - 1, 0);
- var Cg = j - 1, Ig = 1;
- for (this[k + Cg] = 255 & J; --Cg >= 0 && (Ig *= 256); ) this[k + Cg] = J / Ig & 255;
- return k + j;
- }, n.prototype.writeUInt8 = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 1, 255, 0), this[k] = 255 & J, k + 1;
- }, n.prototype.writeUInt16LE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 2, 65535, 0), this[k] = 255 & J, this[k + 1] = J >>> 8, k + 2;
- }, n.prototype.writeUInt16BE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 2, 65535, 0), this[k] = J >>> 8, this[k + 1] = 255 & J, k + 2;
- }, n.prototype.writeUInt32LE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 4, 4294967295, 0), this[k + 3] = J >>> 24, this[k + 2] = J >>> 16, this[k + 1] = J >>> 8, this[k] = 255 & J, k + 4;
- }, n.prototype.writeUInt32BE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 4, 4294967295, 0), this[k] = J >>> 24, this[k + 1] = J >>> 16, this[k + 2] = J >>> 8, this[k + 3] = 255 & J, k + 4;
- }, n.prototype.writeIntLE = function(J, k, j, q) {
- if (J = +J, k >>>= 0, !q) {
- var Cg = Math.pow(2, 8 * j - 1);
- w(this, J, k, j, Cg - 1, -Cg);
- }
- var Ig = 0, x = 1, Ag = 0;
- for (this[k] = 255 & J; ++Ig < j && (x *= 256); ) J < 0 && Ag === 0 && this[k + Ig - 1] !== 0 && (Ag = 1), this[k + Ig] = (J / x >> 0) - Ag & 255;
- return k + j;
- }, n.prototype.writeIntBE = function(J, k, j, q) {
- if (J = +J, k >>>= 0, !q) {
- var Cg = Math.pow(2, 8 * j - 1);
- w(this, J, k, j, Cg - 1, -Cg);
- }
- var Ig = j - 1, x = 1, Ag = 0;
- for (this[k + Ig] = 255 & J; --Ig >= 0 && (x *= 256); ) J < 0 && Ag === 0 && this[k + Ig + 1] !== 0 && (Ag = 1), this[k + Ig] = (J / x >> 0) - Ag & 255;
- return k + j;
- }, n.prototype.writeInt8 = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 1, 127, -128), J < 0 && (J = 255 + J + 1), this[k] = 255 & J, k + 1;
- }, n.prototype.writeInt16LE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 2, 32767, -32768), this[k] = 255 & J, this[k + 1] = J >>> 8, k + 2;
- }, n.prototype.writeInt16BE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 2, 32767, -32768), this[k] = J >>> 8, this[k + 1] = 255 & J, k + 2;
- }, n.prototype.writeInt32LE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 4, 2147483647, -2147483648), this[k] = 255 & J, this[k + 1] = J >>> 8, this[k + 2] = J >>> 16, this[k + 3] = J >>> 24, k + 4;
- }, n.prototype.writeInt32BE = function(J, k, j) {
- return J = +J, k >>>= 0, j || w(this, J, k, 4, 2147483647, -2147483648), J < 0 && (J = 4294967295 + J + 1), this[k] = J >>> 24, this[k + 1] = J >>> 16, this[k + 2] = J >>> 8, this[k + 3] = 255 & J, k + 4;
- }, n.prototype.writeFloatLE = function(J, k, j) {
- return y(this, J, k, !0, j);
- }, n.prototype.writeFloatBE = function(J, k, j) {
- return y(this, J, k, !1, j);
- }, n.prototype.writeDoubleLE = function(J, k, j) {
- return f(this, J, k, !0, j);
- }, n.prototype.writeDoubleBE = function(J, k, j) {
- return f(this, J, k, !1, j);
- }, n.prototype.copy = function(J, k, j, q) {
- if (!n.isBuffer(J)) throw new TypeError("argument should be a Buffer");
- if (j || (j = 0), q || q === 0 || (q = this.length), k >= J.length && (k = J.length), k || (k = 0), q > 0 && q < j && (q = j), q === j || J.length === 0 || this.length === 0) return 0;
- if (k < 0) throw new RangeError("targetStart out of bounds");
- if (j < 0 || j >= this.length) throw new RangeError("Index out of range");
- if (q < 0) throw new RangeError("sourceEnd out of bounds");
- q > this.length && (q = this.length), J.length - k < q - j && (q = J.length - k + j);
- var Cg = q - j;
- if (this === J && typeof Uint8Array.prototype.copyWithin == "function") this.copyWithin(k, j, q);
- else if (this === J && j < k && k < q) for (var Ig = Cg - 1; Ig >= 0; --Ig) J[Ig + k] = this[Ig + j];
- else Uint8Array.prototype.set.call(J, this.subarray(j, q), k);
- return Cg;
- }, n.prototype.fill = function(J, k, j, q) {
- if (typeof J == "string") {
- if (typeof k == "string" ? (q = k, k = 0, j = this.length) : typeof j == "string" && (q = j, j = this.length), q !== void 0 && typeof q != "string") throw new TypeError("encoding must be a string");
- if (typeof q == "string" && !n.isEncoding(q)) throw new TypeError("Unknown encoding: " + q);
- if (J.length === 1) {
- var Cg = J.charCodeAt(0);
- (q === "utf8" && Cg < 128 || q === "latin1") && (J = Cg);
- }
- } else typeof J == "number" && (J &= 255);
- if (k < 0 || this.length < k || this.length < j) throw new RangeError("Out of range index");
- if (j <= k) return this;
- var Ig;
- if (k >>>= 0, j = j === void 0 ? this.length : j >>> 0, J || (J = 0), typeof J == "number") for (Ig = k; Ig < j; ++Ig) this[Ig] = J;
- else {
- var x = n.isBuffer(J) ? J : n.from(J, q), Ag = x.length;
- if (Ag === 0) throw new TypeError('The value "' + J + '" is invalid for argument "value"');
- for (Ig = 0; Ig < j - k; ++Ig) this[Ig + k] = x[Ig % Ag];
- }
- return this;
- };
- var D = /[^+/0-9A-Za-z-_]/g;
- function F(J) {
- return J < 16 ? "0" + J.toString(16) : J.toString(16);
- }
- function T(J, k) {
- var j;
- k = k || 1 / 0;
- for (var q = J.length, Cg = null, Ig = [], x = 0; x < q; ++x) {
- if ((j = J.charCodeAt(x)) > 55295 && j < 57344) {
- if (!Cg) {
- if (j > 56319) {
- (k -= 3) > -1 && Ig.push(239, 191, 189);
- continue;
- }
- if (x + 1 === q) {
- (k -= 3) > -1 && Ig.push(239, 191, 189);
- continue;
- }
- Cg = j;
- continue;
- }
- if (j < 56320) {
- (k -= 3) > -1 && Ig.push(239, 191, 189), Cg = j;
- continue;
- }
- j = 65536 + (Cg - 55296 << 10 | j - 56320);
- } else Cg && (k -= 3) > -1 && Ig.push(239, 191, 189);
- if (Cg = null, j < 128) {
- if ((k -= 1) < 0) break;
- Ig.push(j);
- } else if (j < 2048) {
- if ((k -= 2) < 0) break;
- Ig.push(j >> 6 | 192, 63 & j | 128);
- } else if (j < 65536) {
- if ((k -= 3) < 0) break;
- Ig.push(j >> 12 | 224, j >> 6 & 63 | 128, 63 & j | 128);
- } else {
- if (!(j < 1114112)) throw new Error("Invalid code point");
- if ((k -= 4) < 0) break;
- Ig.push(j >> 18 | 240, j >> 12 & 63 | 128, j >> 6 & 63 | 128, 63 & j | 128);
- }
- }
- return Ig;
- }
- function Q(J) {
- return A.toByteArray(function(k) {
- if ((k = (k = k.split("=")[0]).trim().replace(D, "")).length < 2) return "";
- for (; k.length % 4 != 0; ) k += "=";
- return k;
- }(J));
- }
- function P(J, k, j, q) {
- for (var Cg = 0; Cg < q && !(Cg + j >= k.length || Cg >= J.length); ++Cg) k[Cg + j] = J[Cg];
- return Cg;
- }
- function L(J, k) {
- return J instanceof k || J != null && J.constructor != null && J.constructor.name != null && J.constructor.name === k.name;
- }
- function E(J) {
- return J != J;
- }
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { "base64-js": 185, buffer: 220, ieee754: 439 }], 221: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("stream").Transform, s = g("string_decoder").StringDecoder;
- function l(n) {
- A.call(this), this.hashMode = typeof n == "string", this.hashMode ? this[n] = this._finalOrDigest : this.final = this._finalOrDigest, this._final && (this.__final = this._final, this._final = null), this._decoder = null, this._encoding = null;
- }
- g("inherits")(l, A), l.prototype.update = function(n, a, d) {
- typeof n == "string" && (n = e.from(n, a));
- var o = this._update(n);
- return this.hashMode ? this : (d && (o = this._toString(o, d)), o);
- }, l.prototype.setAutoPadding = function() {
- }, l.prototype.getAuthTag = function() {
- throw new Error("trying to get auth tag in unsupported state");
- }, l.prototype.setAuthTag = function() {
- throw new Error("trying to set auth tag in unsupported state");
- }, l.prototype.setAAD = function() {
- throw new Error("trying to set aad in unsupported state");
- }, l.prototype._transform = function(n, a, d) {
- var o;
- try {
- this.hashMode ? this._update(n) : this.push(this._update(n));
- } catch (c) {
- o = c;
- } finally {
- d(o);
- }
- }, l.prototype._flush = function(n) {
- var a;
- try {
- this.push(this.__final());
- } catch (d) {
- a = d;
- }
- n(a);
- }, l.prototype._finalOrDigest = function(n) {
- var a = this.__final() || e.alloc(0);
- return n && (a = this._toString(a, n, !0)), a;
- }, l.prototype._toString = function(n, a, d) {
- if (this._decoder || (this._decoder = new s(a), this._encoding = a), this._encoding !== a) throw new Error("can't switch encodings");
- var o = this._decoder.write(n);
- return d && (o += this._decoder.end()), o;
- }, C.exports = l;
- }, { inherits: 440, "safe-buffer": 494, stream: 505, string_decoder: 218 }], 222: [function(g, C, i) {
- var e = g("../internals/is-callable"), A = g("../internals/try-to-string"), s = TypeError;
- C.exports = function(l) {
- if (e(l)) return l;
- throw new s(A(l) + " is not a function");
- };
- }, { "../internals/is-callable": 285, "../internals/try-to-string": 349 }], 223: [function(g, C, i) {
- var e = g("../internals/is-constructor"), A = g("../internals/try-to-string"), s = TypeError;
- C.exports = function(l) {
- if (e(l)) return l;
- throw new s(A(l) + " is not a constructor");
- };
- }, { "../internals/is-constructor": 286, "../internals/try-to-string": 349 }], 224: [function(g, C, i) {
- var e = g("../internals/is-callable"), A = String, s = TypeError;
- C.exports = function(l) {
- if (typeof l == "object" || e(l)) return l;
- throw new s("Can't set " + A(l) + " as a prototype");
- };
- }, { "../internals/is-callable": 285 }], 225: [function(g, C, i) {
- var e = g("../internals/well-known-symbol"), A = g("../internals/object-create"), s = g("../internals/object-define-property").f, l = e("unscopables"), n = Array.prototype;
- n[l] === void 0 && s(n, l, { configurable: !0, value: A(null) }), C.exports = function(a) {
- n[l][a] = !0;
- };
- }, { "../internals/object-create": 306, "../internals/object-define-property": 308, "../internals/well-known-symbol": 357 }], 226: [function(g, C, i) {
- var e = g("../internals/object-is-prototype-of"), A = TypeError;
- C.exports = function(s, l) {
- if (e(l, s)) return s;
- throw new A("Incorrect invocation");
- };
- }, { "../internals/object-is-prototype-of": 314 }], 227: [function(g, C, i) {
- var e = g("../internals/is-object"), A = String, s = TypeError;
- C.exports = function(l) {
- if (e(l)) return l;
- throw new s(A(l) + " is not an object");
- };
- }, { "../internals/is-object": 289 }], 228: [function(g, C, i) {
- var e = g("../internals/to-indexed-object"), A = g("../internals/to-absolute-index"), s = g("../internals/length-of-array-like"), l = function(n) {
- return function(a, d, o) {
- var c, r = e(a), h = s(r), b = A(o, h);
- if (n && d != d) {
- for (; h > b; ) if ((c = r[b++]) != c) return !0;
- } else for (; h > b; b++) if ((n || b in r) && r[b] === d) return n || b || 0;
- return !n && -1;
- };
- };
- C.exports = { includes: l(!0), indexOf: l(!1) };
- }, { "../internals/length-of-array-like": 299, "../internals/to-absolute-index": 340, "../internals/to-indexed-object": 341 }], 229: [function(g, C, i) {
- var e = g("../internals/function-bind-context"), A = g("../internals/function-uncurry-this"), s = g("../internals/indexed-object"), l = g("../internals/to-object"), n = g("../internals/length-of-array-like"), a = g("../internals/array-species-create"), d = A([].push), o = function(c) {
- var r = c === 1, h = c === 2, b = c === 3, u = c === 4, m = c === 6, Z = c === 7, p = c === 5 || m;
- return function(Y, R, X, H) {
- for (var S, z, v = l(Y), K = s(v), V = e(R, X), N = n(K), B = 0, G = H || a, w = r ? G(Y, N) : h || Z ? G(Y, 0) : void 0; N > B; B++) if ((p || B in K) && (z = V(S = K[B], B, v), c)) if (r) w[B] = z;
- else if (z) switch (c) {
- case 3:
- return !0;
- case 5:
- return S;
- case 6:
- return B;
- case 2:
- d(w, S);
- }
- else switch (c) {
- case 4:
- return !1;
- case 7:
- d(w, S);
- }
- return m ? -1 : b || u ? u : w;
- };
- };
- C.exports = { forEach: o(0), map: o(1), filter: o(2), some: o(3), every: o(4), find: o(5), findIndex: o(6), filterReject: o(7) };
- }, { "../internals/array-species-create": 233, "../internals/function-bind-context": 262, "../internals/function-uncurry-this": 268, "../internals/indexed-object": 280, "../internals/length-of-array-like": 299, "../internals/to-object": 344 }], 230: [function(g, C, i) {
- var e = g("../internals/to-absolute-index"), A = g("../internals/length-of-array-like"), s = g("../internals/create-property"), l = Array, n = Math.max;
- C.exports = function(a, d, o) {
- for (var c = A(a), r = e(d, c), h = e(o === void 0 ? c : o, c), b = l(n(h - r, 0)), u = 0; r < h; r++, u++) s(b, u, a[r]);
- return b.length = u, b;
- };
- }, { "../internals/create-property": 243, "../internals/length-of-array-like": 299, "../internals/to-absolute-index": 340 }], 231: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this");
- C.exports = e([].slice);
- }, { "../internals/function-uncurry-this": 268 }], 232: [function(g, C, i) {
- var e = g("../internals/is-array"), A = g("../internals/is-constructor"), s = g("../internals/is-object"), l = g("../internals/well-known-symbol")("species"), n = Array;
- C.exports = function(a) {
- var d;
- return e(a) && (d = a.constructor, (A(d) && (d === n || e(d.prototype)) || s(d) && (d = d[l]) === null) && (d = void 0)), d === void 0 ? n : d;
- };
- }, { "../internals/is-array": 284, "../internals/is-constructor": 286, "../internals/is-object": 289, "../internals/well-known-symbol": 357 }], 233: [function(g, C, i) {
- var e = g("../internals/array-species-constructor");
- C.exports = function(A, s) {
- return new (e(A))(s === 0 ? 0 : s);
- };
- }, { "../internals/array-species-constructor": 232 }], 234: [function(g, C, i) {
- var e = g("../internals/well-known-symbol")("iterator"), A = !1;
- try {
- var s = 0, l = { next: function() {
- return { done: !!s++ };
- }, return: function() {
- A = !0;
- } };
- l[e] = function() {
- return this;
- }, Array.from(l, function() {
- throw 2;
- });
- } catch {
- }
- C.exports = function(n, a) {
- try {
- if (!a && !A) return !1;
- } catch {
- return !1;
- }
- var d = !1;
- try {
- var o = {};
- o[e] = function() {
- return { next: function() {
- return { done: d = !0 };
- } };
- }, n(o);
- } catch {
- }
- return d;
- };
- }, { "../internals/well-known-symbol": 357 }], 235: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = e({}.toString), s = e("".slice);
- C.exports = function(l) {
- return s(A(l), 8, -1);
- };
- }, { "../internals/function-uncurry-this": 268 }], 236: [function(g, C, i) {
- var e = g("../internals/to-string-tag-support"), A = g("../internals/is-callable"), s = g("../internals/classof-raw"), l = g("../internals/well-known-symbol")("toStringTag"), n = Object, a = s(/* @__PURE__ */ function() {
- return arguments;
- }()) === "Arguments";
- C.exports = e ? s : function(d) {
- var o, c, r;
- return d === void 0 ? "Undefined" : d === null ? "Null" : typeof (c = function(h, b) {
- try {
- return h[b];
- } catch {
- }
- }(o = n(d), l)) == "string" ? c : a ? s(o) : (r = s(o)) === "Object" && A(o.callee) ? "Arguments" : r;
- };
- }, { "../internals/classof-raw": 235, "../internals/is-callable": 285, "../internals/to-string-tag-support": 347, "../internals/well-known-symbol": 357 }], 237: [function(g, C, i) {
- var e = g("../internals/has-own-property"), A = g("../internals/own-keys"), s = g("../internals/object-get-own-property-descriptor"), l = g("../internals/object-define-property");
- C.exports = function(n, a, d) {
- for (var o = A(a), c = l.f, r = s.f, h = 0; h < o.length; h++) {
- var b = o[h];
- e(n, b) || d && e(d, b) || c(n, b, r(a, b));
- }
- };
- }, { "../internals/has-own-property": 275, "../internals/object-define-property": 308, "../internals/object-get-own-property-descriptor": 309, "../internals/own-keys": 321 }], 238: [function(g, C, i) {
- var e = g("../internals/well-known-symbol")("match");
- C.exports = function(A) {
- var s = /./;
- try {
- "/./"[A](s);
- } catch {
- try {
- return s[e] = !1, "/./"[A](s);
- } catch {
- }
- }
- return !1;
- };
- }, { "../internals/well-known-symbol": 357 }], 239: [function(g, C, i) {
- var e = g("../internals/fails");
- C.exports = !e(function() {
- function A() {
- }
- return A.prototype.constructor = null, Object.getPrototypeOf(new A()) !== A.prototype;
- });
- }, { "../internals/fails": 260 }], 240: [function(g, C, i) {
- C.exports = function(e, A) {
- return { value: e, done: A };
- };
- }, {}], 241: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/object-define-property"), s = g("../internals/create-property-descriptor");
- C.exports = e ? function(l, n, a) {
- return A.f(l, n, s(1, a));
- } : function(l, n, a) {
- return l[n] = a, l;
- };
- }, { "../internals/create-property-descriptor": 242, "../internals/descriptors": 247, "../internals/object-define-property": 308 }], 242: [function(g, C, i) {
- C.exports = function(e, A) {
- return { enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: A };
- };
- }, {}], 243: [function(g, C, i) {
- var e = g("../internals/to-property-key"), A = g("../internals/object-define-property"), s = g("../internals/create-property-descriptor");
- C.exports = function(l, n, a) {
- var d = e(n);
- d in l ? A.f(l, d, s(0, a)) : l[d] = a;
- };
- }, { "../internals/create-property-descriptor": 242, "../internals/object-define-property": 308, "../internals/to-property-key": 346 }], 244: [function(g, C, i) {
- var e = g("../internals/make-built-in"), A = g("../internals/object-define-property");
- C.exports = function(s, l, n) {
- return n.get && e(n.get, l, { getter: !0 }), n.set && e(n.set, l, { setter: !0 }), A.f(s, l, n);
- };
- }, { "../internals/make-built-in": 300, "../internals/object-define-property": 308 }], 245: [function(g, C, i) {
- var e = g("../internals/is-callable"), A = g("../internals/object-define-property"), s = g("../internals/make-built-in"), l = g("../internals/define-global-property");
- C.exports = function(n, a, d, o) {
- o || (o = {});
- var c = o.enumerable, r = o.name !== void 0 ? o.name : a;
- if (e(d) && s(d, r, o), o.global) c ? n[a] = d : l(a, d);
- else {
- try {
- o.unsafe ? n[a] && (c = !0) : delete n[a];
- } catch {
- }
- c ? n[a] = d : A.f(n, a, { value: d, enumerable: !1, configurable: !o.nonConfigurable, writable: !o.nonWritable });
- }
- return n;
- };
- }, { "../internals/define-global-property": 246, "../internals/is-callable": 285, "../internals/make-built-in": 300, "../internals/object-define-property": 308 }], 246: [function(g, C, i) {
- var e = g("../internals/global"), A = Object.defineProperty;
- C.exports = function(s, l) {
- try {
- A(e, s, { value: l, configurable: !0, writable: !0 });
- } catch {
- e[s] = l;
- }
- return l;
- };
- }, { "../internals/global": 274 }], 247: [function(g, C, i) {
- var e = g("../internals/fails");
- C.exports = !e(function() {
- return Object.defineProperty({}, 1, { get: function() {
- return 7;
- } })[1] !== 7;
- });
- }, { "../internals/fails": 260 }], 248: [function(g, C, i) {
- var e = typeof document == "object" && document.all, A = e === void 0 && e !== void 0;
- C.exports = { all: e, IS_HTMLDDA: A };
- }, {}], 249: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/is-object"), s = e.document, l = A(s) && A(s.createElement);
- C.exports = function(n) {
- return l ? s.createElement(n) : {};
- };
- }, { "../internals/global": 274, "../internals/is-object": 289 }], 250: [function(g, C, i) {
- var e = g("../internals/engine-is-deno"), A = g("../internals/engine-is-node");
- C.exports = !e && !A && typeof window == "object" && typeof document == "object";
- }, { "../internals/engine-is-deno": 251, "../internals/engine-is-node": 254 }], 251: [function(g, C, i) {
- C.exports = typeof Deno == "object" && Deno && typeof Deno.version == "object";
- }, {}], 252: [function(g, C, i) {
- var e = g("../internals/engine-user-agent");
- C.exports = /ipad|iphone|ipod/i.test(e) && typeof Pebble < "u";
- }, { "../internals/engine-user-agent": 256 }], 253: [function(g, C, i) {
- var e = g("../internals/engine-user-agent");
- C.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(e);
- }, { "../internals/engine-user-agent": 256 }], 254: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/classof-raw");
- C.exports = A(e.process) === "process";
- }, { "../internals/classof-raw": 235, "../internals/global": 274 }], 255: [function(g, C, i) {
- var e = g("../internals/engine-user-agent");
- C.exports = /web0s(?!.*chrome)/i.test(e);
- }, { "../internals/engine-user-agent": 256 }], 256: [function(g, C, i) {
- C.exports = typeof navigator < "u" && String(navigator.userAgent) || "";
- }, {}], 257: [function(g, C, i) {
- var e, A, s = g("../internals/global"), l = g("../internals/engine-user-agent"), n = s.process, a = s.Deno, d = n && n.versions || a && a.version, o = d && d.v8;
- o && (A = (e = o.split("."))[0] > 0 && e[0] < 4 ? 1 : +(e[0] + e[1])), !A && l && (!(e = l.match(/Edge\/(\d+)/)) || e[1] >= 74) && (e = l.match(/Chrome\/(\d+)/)) && (A = +e[1]), C.exports = A;
- }, { "../internals/engine-user-agent": 256, "../internals/global": 274 }], 258: [function(g, C, i) {
- C.exports = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"];
- }, {}], 259: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/object-get-own-property-descriptor").f, s = g("../internals/create-non-enumerable-property"), l = g("../internals/define-built-in"), n = g("../internals/define-global-property"), a = g("../internals/copy-constructor-properties"), d = g("../internals/is-forced");
- C.exports = function(o, c) {
- var r, h, b, u, m, Z = o.target, p = o.global, Y = o.stat;
- if (r = p ? e : Y ? e[Z] || n(Z, {}) : (e[Z] || {}).prototype) for (h in c) {
- if (u = c[h], b = o.dontCallGetSet ? (m = A(r, h)) && m.value : r[h], !d(p ? h : Z + (Y ? "." : "#") + h, o.forced) && b !== void 0) {
- if (typeof u == typeof b) continue;
- a(u, b);
- }
- (o.sham || b && b.sham) && s(u, "sham", !0), l(r, h, u, o);
- }
- };
- }, { "../internals/copy-constructor-properties": 237, "../internals/create-non-enumerable-property": 241, "../internals/define-built-in": 245, "../internals/define-global-property": 246, "../internals/global": 274, "../internals/is-forced": 287, "../internals/object-get-own-property-descriptor": 309 }], 260: [function(g, C, i) {
- C.exports = function(e) {
- try {
- return !!e();
- } catch {
- return !0;
- }
- };
- }, {}], 261: [function(g, C, i) {
- var e = g("../internals/function-bind-native"), A = Function.prototype, s = A.apply, l = A.call;
- C.exports = typeof Reflect == "object" && Reflect.apply || (e ? l.bind(s) : function() {
- return l.apply(s, arguments);
- });
- }, { "../internals/function-bind-native": 263 }], 262: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this-clause"), A = g("../internals/a-callable"), s = g("../internals/function-bind-native"), l = e(e.bind);
- C.exports = function(n, a) {
- return A(n), a === void 0 ? n : s ? l(n, a) : function() {
- return n.apply(a, arguments);
- };
- };
- }, { "../internals/a-callable": 222, "../internals/function-bind-native": 263, "../internals/function-uncurry-this-clause": 267 }], 263: [function(g, C, i) {
- var e = g("../internals/fails");
- C.exports = !e(function() {
- var A = (function() {
- }).bind();
- return typeof A != "function" || A.hasOwnProperty("prototype");
- });
- }, { "../internals/fails": 260 }], 264: [function(g, C, i) {
- var e = g("../internals/function-bind-native"), A = Function.prototype.call;
- C.exports = e ? A.bind(A) : function() {
- return A.apply(A, arguments);
- };
- }, { "../internals/function-bind-native": 263 }], 265: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/has-own-property"), s = Function.prototype, l = e && Object.getOwnPropertyDescriptor, n = A(s, "name"), a = n && (function() {
- }).name === "something", d = n && (!e || e && l(s, "name").configurable);
- C.exports = { EXISTS: n, PROPER: a, CONFIGURABLE: d };
- }, { "../internals/descriptors": 247, "../internals/has-own-property": 275 }], 266: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/a-callable");
- C.exports = function(s, l, n) {
- try {
- return e(A(Object.getOwnPropertyDescriptor(s, l)[n]));
- } catch {
- }
- };
- }, { "../internals/a-callable": 222, "../internals/function-uncurry-this": 268 }], 267: [function(g, C, i) {
- var e = g("../internals/classof-raw"), A = g("../internals/function-uncurry-this");
- C.exports = function(s) {
- if (e(s) === "Function") return A(s);
- };
- }, { "../internals/classof-raw": 235, "../internals/function-uncurry-this": 268 }], 268: [function(g, C, i) {
- var e = g("../internals/function-bind-native"), A = Function.prototype, s = A.call, l = e && A.bind.bind(s, s);
- C.exports = e ? l : function(n) {
- return function() {
- return s.apply(n, arguments);
- };
- };
- }, { "../internals/function-bind-native": 263 }], 269: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/is-callable"), s = function(l) {
- return A(l) ? l : void 0;
- };
- C.exports = function(l, n) {
- return arguments.length < 2 ? s(e[l]) : e[l] && e[l][n];
- };
- }, { "../internals/global": 274, "../internals/is-callable": 285 }], 270: [function(g, C, i) {
- var e = g("../internals/classof"), A = g("../internals/get-method"), s = g("../internals/is-null-or-undefined"), l = g("../internals/iterators"), n = g("../internals/well-known-symbol")("iterator");
- C.exports = function(a) {
- if (!s(a)) return A(a, n) || A(a, "@@iterator") || l[e(a)];
- };
- }, { "../internals/classof": 236, "../internals/get-method": 273, "../internals/is-null-or-undefined": 288, "../internals/iterators": 298, "../internals/well-known-symbol": 357 }], 271: [function(g, C, i) {
- var e = g("../internals/function-call"), A = g("../internals/a-callable"), s = g("../internals/an-object"), l = g("../internals/try-to-string"), n = g("../internals/get-iterator-method"), a = TypeError;
- C.exports = function(d, o) {
- var c = arguments.length < 2 ? n(d) : o;
- if (A(c)) return s(e(c, d));
- throw new a(l(d) + " is not iterable");
- };
- }, { "../internals/a-callable": 222, "../internals/an-object": 227, "../internals/function-call": 264, "../internals/get-iterator-method": 270, "../internals/try-to-string": 349 }], 272: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/is-array"), s = g("../internals/is-callable"), l = g("../internals/classof-raw"), n = g("../internals/to-string"), a = e([].push);
- C.exports = function(d) {
- if (s(d)) return d;
- if (A(d)) {
- for (var o = d.length, c = [], r = 0; r < o; r++) {
- var h = d[r];
- typeof h == "string" ? a(c, h) : typeof h != "number" && l(h) !== "Number" && l(h) !== "String" || a(c, n(h));
- }
- var b = c.length, u = !0;
- return function(m, Z) {
- if (u) return u = !1, Z;
- if (A(this)) return Z;
- for (var p = 0; p < b; p++) if (c[p] === m) return Z;
- };
- }
- };
- }, { "../internals/classof-raw": 235, "../internals/function-uncurry-this": 268, "../internals/is-array": 284, "../internals/is-callable": 285, "../internals/to-string": 348 }], 273: [function(g, C, i) {
- var e = g("../internals/a-callable"), A = g("../internals/is-null-or-undefined");
- C.exports = function(s, l) {
- var n = s[l];
- return A(n) ? void 0 : e(n);
- };
- }, { "../internals/a-callable": 222, "../internals/is-null-or-undefined": 288 }], 274: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = function(s) {
- return s && s.Math === Math && s;
- };
- C.exports = A(typeof globalThis == "object" && globalThis) || A(typeof window == "object" && window) || A(typeof self == "object" && self) || A(typeof e == "object" && e) || /* @__PURE__ */ function() {
- return this;
- }() || this || Function("return this")();
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 275: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/to-object"), s = e({}.hasOwnProperty);
- C.exports = Object.hasOwn || function(l, n) {
- return s(A(l), n);
- };
- }, { "../internals/function-uncurry-this": 268, "../internals/to-object": 344 }], 276: [function(g, C, i) {
- C.exports = {};
- }, {}], 277: [function(g, C, i) {
- C.exports = function(e, A) {
- try {
- arguments.length === 1 ? console.error(e) : console.error(e, A);
- } catch {
- }
- };
- }, {}], 278: [function(g, C, i) {
- var e = g("../internals/get-built-in");
- C.exports = e("document", "documentElement");
- }, { "../internals/get-built-in": 269 }], 279: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/fails"), s = g("../internals/document-create-element");
- C.exports = !e && !A(function() {
- return Object.defineProperty(s("div"), "a", { get: function() {
- return 7;
- } }).a !== 7;
- });
- }, { "../internals/descriptors": 247, "../internals/document-create-element": 249, "../internals/fails": 260 }], 280: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/classof-raw"), l = Object, n = e("".split);
- C.exports = A(function() {
- return !l("z").propertyIsEnumerable(0);
- }) ? function(a) {
- return s(a) === "String" ? n(a, "") : l(a);
- } : l;
- }, { "../internals/classof-raw": 235, "../internals/fails": 260, "../internals/function-uncurry-this": 268 }], 281: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/is-callable"), s = g("../internals/shared-store"), l = e(Function.toString);
- A(s.inspectSource) || (s.inspectSource = function(n) {
- return l(n);
- }), C.exports = s.inspectSource;
- }, { "../internals/function-uncurry-this": 268, "../internals/is-callable": 285, "../internals/shared-store": 333 }], 282: [function(g, C, i) {
- var e, A, s, l = g("../internals/weak-map-basic-detection"), n = g("../internals/global"), a = g("../internals/is-object"), d = g("../internals/create-non-enumerable-property"), o = g("../internals/has-own-property"), c = g("../internals/shared-store"), r = g("../internals/shared-key"), h = g("../internals/hidden-keys"), b = n.TypeError, u = n.WeakMap;
- if (l || c.state) {
- var m = c.state || (c.state = new u());
- m.get = m.get, m.has = m.has, m.set = m.set, e = function(p, Y) {
- if (m.has(p)) throw new b("Object already initialized");
- return Y.facade = p, m.set(p, Y), Y;
- }, A = function(p) {
- return m.get(p) || {};
- }, s = function(p) {
- return m.has(p);
- };
- } else {
- var Z = r("state");
- h[Z] = !0, e = function(p, Y) {
- if (o(p, Z)) throw new b("Object already initialized");
- return Y.facade = p, d(p, Z, Y), Y;
- }, A = function(p) {
- return o(p, Z) ? p[Z] : {};
- }, s = function(p) {
- return o(p, Z);
- };
- }
- C.exports = { set: e, get: A, has: s, enforce: function(p) {
- return s(p) ? A(p) : e(p, {});
- }, getterFor: function(p) {
- return function(Y) {
- var R;
- if (!a(Y) || (R = A(Y)).type !== p) throw new b("Incompatible receiver, " + p + " required");
- return R;
- };
- } };
- }, { "../internals/create-non-enumerable-property": 241, "../internals/global": 274, "../internals/has-own-property": 275, "../internals/hidden-keys": 276, "../internals/is-object": 289, "../internals/shared-key": 332, "../internals/shared-store": 333, "../internals/weak-map-basic-detection": 354 }], 283: [function(g, C, i) {
- var e = g("../internals/well-known-symbol"), A = g("../internals/iterators"), s = e("iterator"), l = Array.prototype;
- C.exports = function(n) {
- return n !== void 0 && (A.Array === n || l[s] === n);
- };
- }, { "../internals/iterators": 298, "../internals/well-known-symbol": 357 }], 284: [function(g, C, i) {
- var e = g("../internals/classof-raw");
- C.exports = Array.isArray || function(A) {
- return e(A) === "Array";
- };
- }, { "../internals/classof-raw": 235 }], 285: [function(g, C, i) {
- var e = g("../internals/document-all"), A = e.all;
- C.exports = e.IS_HTMLDDA ? function(s) {
- return typeof s == "function" || s === A;
- } : function(s) {
- return typeof s == "function";
- };
- }, { "../internals/document-all": 248 }], 286: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/is-callable"), l = g("../internals/classof"), n = g("../internals/get-built-in"), a = g("../internals/inspect-source"), d = function() {
- }, o = [], c = n("Reflect", "construct"), r = /^\s*(?:class|function)\b/, h = e(r.exec), b = !r.test(d), u = function(Z) {
- if (!s(Z)) return !1;
- try {
- return c(d, o, Z), !0;
- } catch {
- return !1;
- }
- }, m = function(Z) {
- if (!s(Z)) return !1;
- switch (l(Z)) {
- case "AsyncFunction":
- case "GeneratorFunction":
- case "AsyncGeneratorFunction":
- return !1;
- }
- try {
- return b || !!h(r, a(Z));
- } catch {
- return !0;
- }
- };
- m.sham = !0, C.exports = !c || A(function() {
- var Z;
- return u(u.call) || !u(Object) || !u(function() {
- Z = !0;
- }) || Z;
- }) ? m : u;
- }, { "../internals/classof": 236, "../internals/fails": 260, "../internals/function-uncurry-this": 268, "../internals/get-built-in": 269, "../internals/inspect-source": 281, "../internals/is-callable": 285 }], 287: [function(g, C, i) {
- var e = g("../internals/fails"), A = g("../internals/is-callable"), s = /#|\.prototype\./, l = function(c, r) {
- var h = a[n(c)];
- return h === o || h !== d && (A(r) ? e(r) : !!r);
- }, n = l.normalize = function(c) {
- return String(c).replace(s, ".").toLowerCase();
- }, a = l.data = {}, d = l.NATIVE = "N", o = l.POLYFILL = "P";
- C.exports = l;
- }, { "../internals/fails": 260, "../internals/is-callable": 285 }], 288: [function(g, C, i) {
- C.exports = function(e) {
- return e == null;
- };
- }, {}], 289: [function(g, C, i) {
- var e = g("../internals/is-callable"), A = g("../internals/document-all"), s = A.all;
- C.exports = A.IS_HTMLDDA ? function(l) {
- return typeof l == "object" ? l !== null : e(l) || l === s;
- } : function(l) {
- return typeof l == "object" ? l !== null : e(l);
- };
- }, { "../internals/document-all": 248, "../internals/is-callable": 285 }], 290: [function(g, C, i) {
- C.exports = !1;
- }, {}], 291: [function(g, C, i) {
- var e = g("../internals/is-object"), A = g("../internals/classof-raw"), s = g("../internals/well-known-symbol")("match");
- C.exports = function(l) {
- var n;
- return e(l) && ((n = l[s]) !== void 0 ? !!n : A(l) === "RegExp");
- };
- }, { "../internals/classof-raw": 235, "../internals/is-object": 289, "../internals/well-known-symbol": 357 }], 292: [function(g, C, i) {
- var e = g("../internals/get-built-in"), A = g("../internals/is-callable"), s = g("../internals/object-is-prototype-of"), l = g("../internals/use-symbol-as-uid"), n = Object;
- C.exports = l ? function(a) {
- return typeof a == "symbol";
- } : function(a) {
- var d = e("Symbol");
- return A(d) && s(d.prototype, n(a));
- };
- }, { "../internals/get-built-in": 269, "../internals/is-callable": 285, "../internals/object-is-prototype-of": 314, "../internals/use-symbol-as-uid": 351 }], 293: [function(g, C, i) {
- var e = g("../internals/function-bind-context"), A = g("../internals/function-call"), s = g("../internals/an-object"), l = g("../internals/try-to-string"), n = g("../internals/is-array-iterator-method"), a = g("../internals/length-of-array-like"), d = g("../internals/object-is-prototype-of"), o = g("../internals/get-iterator"), c = g("../internals/get-iterator-method"), r = g("../internals/iterator-close"), h = TypeError, b = function(m, Z) {
- this.stopped = m, this.result = Z;
- }, u = b.prototype;
- C.exports = function(m, Z, p) {
- var Y, R, X, H, S, z, v, K = p && p.that, V = !(!p || !p.AS_ENTRIES), N = !(!p || !p.IS_RECORD), B = !(!p || !p.IS_ITERATOR), G = !(!p || !p.INTERRUPTED), w = e(Z, K), W = function(f) {
- return Y && r(Y, "normal", f), new b(!0, f);
- }, y = function(f) {
- return V ? (s(f), G ? w(f[0], f[1], W) : w(f[0], f[1])) : G ? w(f, W) : w(f);
- };
- if (N) Y = m.iterator;
- else if (B) Y = m;
- else {
- if (!(R = c(m))) throw new h(l(m) + " is not iterable");
- if (n(R)) {
- for (X = 0, H = a(m); H > X; X++) if ((S = y(m[X])) && d(u, S)) return S;
- return new b(!1);
- }
- Y = o(m, R);
- }
- for (z = N ? m.next : Y.next; !(v = A(z, Y)).done; ) {
- try {
- S = y(v.value);
- } catch (f) {
- r(Y, "throw", f);
- }
- if (typeof S == "object" && S && d(u, S)) return S;
- }
- return new b(!1);
- };
- }, { "../internals/an-object": 227, "../internals/function-bind-context": 262, "../internals/function-call": 264, "../internals/get-iterator": 271, "../internals/get-iterator-method": 270, "../internals/is-array-iterator-method": 283, "../internals/iterator-close": 294, "../internals/length-of-array-like": 299, "../internals/object-is-prototype-of": 314, "../internals/try-to-string": 349 }], 294: [function(g, C, i) {
- var e = g("../internals/function-call"), A = g("../internals/an-object"), s = g("../internals/get-method");
- C.exports = function(l, n, a) {
- var d, o;
- A(l);
- try {
- if (!(d = s(l, "return"))) {
- if (n === "throw") throw a;
- return a;
- }
- d = e(d, l);
- } catch (c) {
- o = !0, d = c;
- }
- if (n === "throw") throw a;
- if (o) throw d;
- return A(d), a;
- };
- }, { "../internals/an-object": 227, "../internals/function-call": 264, "../internals/get-method": 273 }], 295: [function(g, C, i) {
- var e = g("../internals/iterators-core").IteratorPrototype, A = g("../internals/object-create"), s = g("../internals/create-property-descriptor"), l = g("../internals/set-to-string-tag"), n = g("../internals/iterators"), a = function() {
- return this;
- };
- C.exports = function(d, o, c, r) {
- var h = o + " Iterator";
- return d.prototype = A(e, { next: s(+!r, c) }), l(d, h, !1, !0), n[h] = a, d;
- };
- }, { "../internals/create-property-descriptor": 242, "../internals/iterators": 298, "../internals/iterators-core": 297, "../internals/object-create": 306, "../internals/set-to-string-tag": 331 }], 296: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/is-pure"), l = g("../internals/function-name"), n = g("../internals/is-callable"), a = g("../internals/iterator-create-constructor"), d = g("../internals/object-get-prototype-of"), o = g("../internals/object-set-prototype-of"), c = g("../internals/set-to-string-tag"), r = g("../internals/create-non-enumerable-property"), h = g("../internals/define-built-in"), b = g("../internals/well-known-symbol"), u = g("../internals/iterators"), m = g("../internals/iterators-core"), Z = l.PROPER, p = l.CONFIGURABLE, Y = m.IteratorPrototype, R = m.BUGGY_SAFARI_ITERATORS, X = b("iterator"), H = function() {
- return this;
- };
- C.exports = function(S, z, v, K, V, N, B) {
- a(v, z, K);
- var G, w, W, y = function(L) {
- if (L === V && Q) return Q;
- if (!R && L && L in F) return F[L];
- switch (L) {
- case "keys":
- case "values":
- case "entries":
- return function() {
- return new v(this, L);
- };
- }
- return function() {
- return new v(this);
- };
- }, f = z + " Iterator", D = !1, F = S.prototype, T = F[X] || F["@@iterator"] || V && F[V], Q = !R && T || y(V), P = z === "Array" && F.entries || T;
- if (P && (G = d(P.call(new S()))) !== Object.prototype && G.next && (s || d(G) === Y || (o ? o(G, Y) : n(G[X]) || h(G, X, H)), c(G, f, !0, !0), s && (u[f] = H)), Z && V === "values" && T && T.name !== "values" && (!s && p ? r(F, "name", "values") : (D = !0, Q = function() {
- return A(T, this);
- })), V) if (w = { values: y("values"), keys: N ? Q : y("keys"), entries: y("entries") }, B) for (W in w) (R || D || !(W in F)) && h(F, W, w[W]);
- else e({ target: z, proto: !0, forced: R || D }, w);
- return s && !B || F[X] === Q || h(F, X, Q, { name: V }), u[z] = Q, w;
- };
- }, { "../internals/create-non-enumerable-property": 241, "../internals/define-built-in": 245, "../internals/export": 259, "../internals/function-call": 264, "../internals/function-name": 265, "../internals/is-callable": 285, "../internals/is-pure": 290, "../internals/iterator-create-constructor": 295, "../internals/iterators": 298, "../internals/iterators-core": 297, "../internals/object-get-prototype-of": 313, "../internals/object-set-prototype-of": 318, "../internals/set-to-string-tag": 331, "../internals/well-known-symbol": 357 }], 297: [function(g, C, i) {
- var e, A, s, l = g("../internals/fails"), n = g("../internals/is-callable"), a = g("../internals/is-object"), d = g("../internals/object-create"), o = g("../internals/object-get-prototype-of"), c = g("../internals/define-built-in"), r = g("../internals/well-known-symbol"), h = g("../internals/is-pure"), b = r("iterator"), u = !1;
- [].keys && ("next" in (s = [].keys()) ? (A = o(o(s))) !== Object.prototype && (e = A) : u = !0), !a(e) || l(function() {
- var m = {};
- return e[b].call(m) !== m;
- }) ? e = {} : h && (e = d(e)), n(e[b]) || c(e, b, function() {
- return this;
- }), C.exports = { IteratorPrototype: e, BUGGY_SAFARI_ITERATORS: u };
- }, { "../internals/define-built-in": 245, "../internals/fails": 260, "../internals/is-callable": 285, "../internals/is-object": 289, "../internals/is-pure": 290, "../internals/object-create": 306, "../internals/object-get-prototype-of": 313, "../internals/well-known-symbol": 357 }], 298: [function(g, C, i) {
- arguments[4][276][0].apply(i, arguments);
- }, { dup: 276 }], 299: [function(g, C, i) {
- var e = g("../internals/to-length");
- C.exports = function(A) {
- return e(A.length);
- };
- }, { "../internals/to-length": 343 }], 300: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/is-callable"), l = g("../internals/has-own-property"), n = g("../internals/descriptors"), a = g("../internals/function-name").CONFIGURABLE, d = g("../internals/inspect-source"), o = g("../internals/internal-state"), c = o.enforce, r = o.get, h = String, b = Object.defineProperty, u = e("".slice), m = e("".replace), Z = e([].join), p = n && !A(function() {
- return b(function() {
- }, "length", { value: 8 }).length !== 8;
- }), Y = String(String).split("String"), R = C.exports = function(X, H, S) {
- u(h(H), 0, 7) === "Symbol(" && (H = "[" + m(h(H), /^Symbol\(([^)]*)\)/, "$1") + "]"), S && S.getter && (H = "get " + H), S && S.setter && (H = "set " + H), (!l(X, "name") || a && X.name !== H) && (n ? b(X, "name", { value: H, configurable: !0 }) : X.name = H), p && S && l(S, "arity") && X.length !== S.arity && b(X, "length", { value: S.arity });
- try {
- S && l(S, "constructor") && S.constructor ? n && b(X, "prototype", { writable: !1 }) : X.prototype && (X.prototype = void 0);
- } catch {
- }
- var z = c(X);
- return l(z, "source") || (z.source = Z(Y, typeof H == "string" ? H : "")), X;
- };
- Function.prototype.toString = R(function() {
- return s(this) && r(this).source || d(this);
- }, "toString");
- }, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-name": 265, "../internals/function-uncurry-this": 268, "../internals/has-own-property": 275, "../internals/inspect-source": 281, "../internals/internal-state": 282, "../internals/is-callable": 285 }], 301: [function(g, C, i) {
- var e = Math.ceil, A = Math.floor;
- C.exports = Math.trunc || function(s) {
- var l = +s;
- return (l > 0 ? A : e)(l);
- };
- }, {}], 302: [function(g, C, i) {
- var e, A, s, l, n, a = g("../internals/global"), d = g("../internals/function-bind-context"), o = g("../internals/object-get-own-property-descriptor").f, c = g("../internals/task").set, r = g("../internals/queue"), h = g("../internals/engine-is-ios"), b = g("../internals/engine-is-ios-pebble"), u = g("../internals/engine-is-webos-webkit"), m = g("../internals/engine-is-node"), Z = a.MutationObserver || a.WebKitMutationObserver, p = a.document, Y = a.process, R = a.Promise, X = o(a, "queueMicrotask"), H = X && X.value;
- if (!H) {
- var S = new r(), z = function() {
- var v, K;
- for (m && (v = Y.domain) && v.exit(); K = S.get(); ) try {
- K();
- } catch (V) {
- throw S.head && e(), V;
- }
- v && v.enter();
- };
- h || m || u || !Z || !p ? !b && R && R.resolve ? ((l = R.resolve(void 0)).constructor = R, n = d(l.then, l), e = function() {
- n(z);
- }) : m ? e = function() {
- Y.nextTick(z);
- } : (c = d(c, a), e = function() {
- c(z);
- }) : (A = !0, s = p.createTextNode(""), new Z(z).observe(s, { characterData: !0 }), e = function() {
- s.data = A = !A;
- }), H = function(v) {
- S.head || e(), S.add(v);
- };
- }
- C.exports = H;
- }, { "../internals/engine-is-ios": 253, "../internals/engine-is-ios-pebble": 252, "../internals/engine-is-node": 254, "../internals/engine-is-webos-webkit": 255, "../internals/function-bind-context": 262, "../internals/global": 274, "../internals/object-get-own-property-descriptor": 309, "../internals/queue": 328, "../internals/task": 339 }], 303: [function(g, C, i) {
- var e = g("../internals/a-callable"), A = TypeError, s = function(l) {
- var n, a;
- this.promise = new l(function(d, o) {
- if (n !== void 0 || a !== void 0) throw new A("Bad Promise constructor");
- n = d, a = o;
- }), this.resolve = e(n), this.reject = e(a);
- };
- C.exports.f = function(l) {
- return new s(l);
- };
- }, { "../internals/a-callable": 222 }], 304: [function(g, C, i) {
- var e = g("../internals/is-regexp"), A = TypeError;
- C.exports = function(s) {
- if (e(s)) throw new A("The method doesn't accept regular expressions");
- return s;
- };
- }, { "../internals/is-regexp": 291 }], 305: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/function-uncurry-this"), s = g("../internals/function-call"), l = g("../internals/fails"), n = g("../internals/object-keys"), a = g("../internals/object-get-own-property-symbols"), d = g("../internals/object-property-is-enumerable"), o = g("../internals/to-object"), c = g("../internals/indexed-object"), r = Object.assign, h = Object.defineProperty, b = A([].concat);
- C.exports = !r || l(function() {
- if (e && r({ b: 1 }, r(h({}, "a", { enumerable: !0, get: function() {
- h(this, "b", { value: 3, enumerable: !1 });
- } }), { b: 2 })).b !== 1) return !0;
- var u = {}, m = {}, Z = Symbol("assign detection");
- return u[Z] = 7, "abcdefghijklmnopqrst".split("").forEach(function(p) {
- m[p] = p;
- }), r({}, u)[Z] !== 7 || n(r({}, m)).join("") !== "abcdefghijklmnopqrst";
- }) ? function(u, m) {
- for (var Z = o(u), p = arguments.length, Y = 1, R = a.f, X = d.f; p > Y; ) for (var H, S = c(arguments[Y++]), z = R ? b(n(S), R(S)) : n(S), v = z.length, K = 0; v > K; ) H = z[K++], e && !s(X, S, H) || (Z[H] = S[H]);
- return Z;
- } : r;
- }, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-call": 264, "../internals/function-uncurry-this": 268, "../internals/indexed-object": 280, "../internals/object-get-own-property-symbols": 312, "../internals/object-keys": 316, "../internals/object-property-is-enumerable": 317, "../internals/to-object": 344 }], 306: [function(g, C, i) {
- var e, A = g("../internals/an-object"), s = g("../internals/object-define-properties"), l = g("../internals/enum-bug-keys"), n = g("../internals/hidden-keys"), a = g("../internals/html"), d = g("../internals/document-create-element"), o = g("../internals/shared-key"), c = o("IE_PROTO"), r = function() {
- }, h = function(m) {
- return "<script>" + m + "<\/script>";
- }, b = function(m) {
- m.write(h("")), m.close();
- var Z = m.parentWindow.Object;
- return m = null, Z;
- }, u = function() {
- try {
- e = new ActiveXObject("htmlfile");
- } catch {
- }
- var m, Z;
- u = typeof document < "u" ? document.domain && e ? b(e) : ((Z = d("iframe")).style.display = "none", a.appendChild(Z), Z.src = "javascript:", (m = Z.contentWindow.document).open(), m.write(h("document.F=Object")), m.close(), m.F) : b(e);
- for (var p = l.length; p--; ) delete u.prototype[l[p]];
- return u();
- };
- n[c] = !0, C.exports = Object.create || function(m, Z) {
- var p;
- return m !== null ? (r.prototype = A(m), p = new r(), r.prototype = null, p[c] = m) : p = u(), Z === void 0 ? p : s.f(p, Z);
- };
- }, { "../internals/an-object": 227, "../internals/document-create-element": 249, "../internals/enum-bug-keys": 258, "../internals/hidden-keys": 276, "../internals/html": 278, "../internals/object-define-properties": 307, "../internals/shared-key": 332 }], 307: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/v8-prototype-define-bug"), s = g("../internals/object-define-property"), l = g("../internals/an-object"), n = g("../internals/to-indexed-object"), a = g("../internals/object-keys");
- i.f = e && !A ? Object.defineProperties : function(d, o) {
- l(d);
- for (var c, r = n(o), h = a(o), b = h.length, u = 0; b > u; ) s.f(d, c = h[u++], r[c]);
- return d;
- };
- }, { "../internals/an-object": 227, "../internals/descriptors": 247, "../internals/object-define-property": 308, "../internals/object-keys": 316, "../internals/to-indexed-object": 341, "../internals/v8-prototype-define-bug": 352 }], 308: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/ie8-dom-define"), s = g("../internals/v8-prototype-define-bug"), l = g("../internals/an-object"), n = g("../internals/to-property-key"), a = TypeError, d = Object.defineProperty, o = Object.getOwnPropertyDescriptor;
- i.f = e ? s ? function(c, r, h) {
- if (l(c), r = n(r), l(h), typeof c == "function" && r === "prototype" && "value" in h && "writable" in h && !h.writable) {
- var b = o(c, r);
- b && b.writable && (c[r] = h.value, h = { configurable: "configurable" in h ? h.configurable : b.configurable, enumerable: "enumerable" in h ? h.enumerable : b.enumerable, writable: !1 });
- }
- return d(c, r, h);
- } : d : function(c, r, h) {
- if (l(c), r = n(r), l(h), A) try {
- return d(c, r, h);
- } catch {
- }
- if ("get" in h || "set" in h) throw new a("Accessors not supported");
- return "value" in h && (c[r] = h.value), c;
- };
- }, { "../internals/an-object": 227, "../internals/descriptors": 247, "../internals/ie8-dom-define": 279, "../internals/to-property-key": 346, "../internals/v8-prototype-define-bug": 352 }], 309: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/function-call"), s = g("../internals/object-property-is-enumerable"), l = g("../internals/create-property-descriptor"), n = g("../internals/to-indexed-object"), a = g("../internals/to-property-key"), d = g("../internals/has-own-property"), o = g("../internals/ie8-dom-define"), c = Object.getOwnPropertyDescriptor;
- i.f = e ? c : function(r, h) {
- if (r = n(r), h = a(h), o) try {
- return c(r, h);
- } catch {
- }
- if (d(r, h)) return l(!A(s.f, r, h), r[h]);
- };
- }, { "../internals/create-property-descriptor": 242, "../internals/descriptors": 247, "../internals/function-call": 264, "../internals/has-own-property": 275, "../internals/ie8-dom-define": 279, "../internals/object-property-is-enumerable": 317, "../internals/to-indexed-object": 341, "../internals/to-property-key": 346 }], 310: [function(g, C, i) {
- var e = g("../internals/classof-raw"), A = g("../internals/to-indexed-object"), s = g("../internals/object-get-own-property-names").f, l = g("../internals/array-slice-simple"), n = typeof window == "object" && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];
- C.exports.f = function(a) {
- return n && e(a) === "Window" ? function(d) {
- try {
- return s(d);
- } catch {
- return l(n);
- }
- }(a) : s(A(a));
- };
- }, { "../internals/array-slice-simple": 230, "../internals/classof-raw": 235, "../internals/object-get-own-property-names": 311, "../internals/to-indexed-object": 341 }], 311: [function(g, C, i) {
- var e = g("../internals/object-keys-internal"), A = g("../internals/enum-bug-keys").concat("length", "prototype");
- i.f = Object.getOwnPropertyNames || function(s) {
- return e(s, A);
- };
- }, { "../internals/enum-bug-keys": 258, "../internals/object-keys-internal": 315 }], 312: [function(g, C, i) {
- i.f = Object.getOwnPropertySymbols;
- }, {}], 313: [function(g, C, i) {
- var e = g("../internals/has-own-property"), A = g("../internals/is-callable"), s = g("../internals/to-object"), l = g("../internals/shared-key"), n = g("../internals/correct-prototype-getter"), a = l("IE_PROTO"), d = Object, o = d.prototype;
- C.exports = n ? d.getPrototypeOf : function(c) {
- var r = s(c);
- if (e(r, a)) return r[a];
- var h = r.constructor;
- return A(h) && r instanceof h ? h.prototype : r instanceof d ? o : null;
- };
- }, { "../internals/correct-prototype-getter": 239, "../internals/has-own-property": 275, "../internals/is-callable": 285, "../internals/shared-key": 332, "../internals/to-object": 344 }], 314: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this");
- C.exports = e({}.isPrototypeOf);
- }, { "../internals/function-uncurry-this": 268 }], 315: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = g("../internals/has-own-property"), s = g("../internals/to-indexed-object"), l = g("../internals/array-includes").indexOf, n = g("../internals/hidden-keys"), a = e([].push);
- C.exports = function(d, o) {
- var c, r = s(d), h = 0, b = [];
- for (c in r) !A(n, c) && A(r, c) && a(b, c);
- for (; o.length > h; ) A(r, c = o[h++]) && (~l(b, c) || a(b, c));
- return b;
- };
- }, { "../internals/array-includes": 228, "../internals/function-uncurry-this": 268, "../internals/has-own-property": 275, "../internals/hidden-keys": 276, "../internals/to-indexed-object": 341 }], 316: [function(g, C, i) {
- var e = g("../internals/object-keys-internal"), A = g("../internals/enum-bug-keys");
- C.exports = Object.keys || function(s) {
- return e(s, A);
- };
- }, { "../internals/enum-bug-keys": 258, "../internals/object-keys-internal": 315 }], 317: [function(g, C, i) {
- var e = {}.propertyIsEnumerable, A = Object.getOwnPropertyDescriptor, s = A && !e.call({ 1: 2 }, 1);
- i.f = s ? function(l) {
- var n = A(this, l);
- return !!n && n.enumerable;
- } : e;
- }, {}], 318: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this-accessor"), A = g("../internals/an-object"), s = g("../internals/a-possible-prototype");
- C.exports = Object.setPrototypeOf || ("__proto__" in {} ? function() {
- var l, n = !1, a = {};
- try {
- (l = e(Object.prototype, "__proto__", "set"))(a, []), n = a instanceof Array;
- } catch {
- }
- return function(d, o) {
- return A(d), s(o), n ? l(d, o) : d.__proto__ = o, d;
- };
- }() : void 0);
- }, { "../internals/a-possible-prototype": 224, "../internals/an-object": 227, "../internals/function-uncurry-this-accessor": 266 }], 319: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/fails"), s = g("../internals/function-uncurry-this"), l = g("../internals/object-get-prototype-of"), n = g("../internals/object-keys"), a = g("../internals/to-indexed-object"), d = s(g("../internals/object-property-is-enumerable").f), o = s([].push), c = e && A(function() {
- var h = /* @__PURE__ */ Object.create(null);
- return h[2] = 2, !d(h, 2);
- }), r = function(h) {
- return function(b) {
- for (var u, m = a(b), Z = n(m), p = c && l(m) === null, Y = Z.length, R = 0, X = []; Y > R; ) u = Z[R++], e && !(p ? u in m : d(m, u)) || o(X, h ? [u, m[u]] : m[u]);
- return X;
- };
- };
- C.exports = { entries: r(!0), values: r(!1) };
- }, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-uncurry-this": 268, "../internals/object-get-prototype-of": 313, "../internals/object-keys": 316, "../internals/object-property-is-enumerable": 317, "../internals/to-indexed-object": 341 }], 320: [function(g, C, i) {
- var e = g("../internals/function-call"), A = g("../internals/is-callable"), s = g("../internals/is-object"), l = TypeError;
- C.exports = function(n, a) {
- var d, o;
- if (a === "string" && A(d = n.toString) && !s(o = e(d, n)) || A(d = n.valueOf) && !s(o = e(d, n)) || a !== "string" && A(d = n.toString) && !s(o = e(d, n))) return o;
- throw new l("Can't convert object to primitive value");
- };
- }, { "../internals/function-call": 264, "../internals/is-callable": 285, "../internals/is-object": 289 }], 321: [function(g, C, i) {
- var e = g("../internals/get-built-in"), A = g("../internals/function-uncurry-this"), s = g("../internals/object-get-own-property-names"), l = g("../internals/object-get-own-property-symbols"), n = g("../internals/an-object"), a = A([].concat);
- C.exports = e("Reflect", "ownKeys") || function(d) {
- var o = s.f(n(d)), c = l.f;
- return c ? a(o, c(d)) : o;
- };
- }, { "../internals/an-object": 227, "../internals/function-uncurry-this": 268, "../internals/get-built-in": 269, "../internals/object-get-own-property-names": 311, "../internals/object-get-own-property-symbols": 312 }], 322: [function(g, C, i) {
- var e = g("../internals/global");
- C.exports = e;
- }, { "../internals/global": 274 }], 323: [function(g, C, i) {
- C.exports = function(e) {
- try {
- return { error: !1, value: e() };
- } catch (A) {
- return { error: !0, value: A };
- }
- };
- }, {}], 324: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/promise-native-constructor"), s = g("../internals/is-callable"), l = g("../internals/is-forced"), n = g("../internals/inspect-source"), a = g("../internals/well-known-symbol"), d = g("../internals/engine-is-browser"), o = g("../internals/engine-is-deno"), c = g("../internals/is-pure"), r = g("../internals/engine-v8-version"), h = A && A.prototype, b = a("species"), u = !1, m = s(e.PromiseRejectionEvent), Z = l("Promise", function() {
- var p = n(A), Y = p !== String(A);
- if (!Y && r === 66 || c && (!h.catch || !h.finally)) return !0;
- if (!r || r < 51 || !/native code/.test(p)) {
- var R = new A(function(H) {
- H(1);
- }), X = function(H) {
- H(function() {
- }, function() {
- });
- };
- if ((R.constructor = {})[b] = X, !(u = R.then(function() {
- }) instanceof X)) return !0;
- }
- return !Y && (d || o) && !m;
- });
- C.exports = { CONSTRUCTOR: Z, REJECTION_EVENT: m, SUBCLASSING: u };
- }, { "../internals/engine-is-browser": 250, "../internals/engine-is-deno": 251, "../internals/engine-v8-version": 257, "../internals/global": 274, "../internals/inspect-source": 281, "../internals/is-callable": 285, "../internals/is-forced": 287, "../internals/is-pure": 290, "../internals/promise-native-constructor": 325, "../internals/well-known-symbol": 357 }], 325: [function(g, C, i) {
- var e = g("../internals/global");
- C.exports = e.Promise;
- }, { "../internals/global": 274 }], 326: [function(g, C, i) {
- var e = g("../internals/an-object"), A = g("../internals/is-object"), s = g("../internals/new-promise-capability");
- C.exports = function(l, n) {
- if (e(l), A(n) && n.constructor === l) return n;
- var a = s.f(l);
- return (0, a.resolve)(n), a.promise;
- };
- }, { "../internals/an-object": 227, "../internals/is-object": 289, "../internals/new-promise-capability": 303 }], 327: [function(g, C, i) {
- var e = g("../internals/promise-native-constructor"), A = g("../internals/check-correctness-of-iteration"), s = g("../internals/promise-constructor-detection").CONSTRUCTOR;
- C.exports = s || !A(function(l) {
- e.all(l).then(void 0, function() {
- });
- });
- }, { "../internals/check-correctness-of-iteration": 234, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325 }], 328: [function(g, C, i) {
- var e = function() {
- this.head = null, this.tail = null;
- };
- e.prototype = { add: function(A) {
- var s = { item: A, next: null }, l = this.tail;
- l ? l.next = s : this.head = s, this.tail = s;
- }, get: function() {
- var A = this.head;
- if (A) return (this.head = A.next) === null && (this.tail = null), A.item;
- } }, C.exports = e;
- }, {}], 329: [function(g, C, i) {
- var e = g("../internals/is-null-or-undefined"), A = TypeError;
- C.exports = function(s) {
- if (e(s)) throw new A("Can't call method on " + s);
- return s;
- };
- }, { "../internals/is-null-or-undefined": 288 }], 330: [function(g, C, i) {
- var e = g("../internals/get-built-in"), A = g("../internals/define-built-in-accessor"), s = g("../internals/well-known-symbol"), l = g("../internals/descriptors"), n = s("species");
- C.exports = function(a) {
- var d = e(a);
- l && d && !d[n] && A(d, n, { configurable: !0, get: function() {
- return this;
- } });
- };
- }, { "../internals/define-built-in-accessor": 244, "../internals/descriptors": 247, "../internals/get-built-in": 269, "../internals/well-known-symbol": 357 }], 331: [function(g, C, i) {
- var e = g("../internals/object-define-property").f, A = g("../internals/has-own-property"), s = g("../internals/well-known-symbol")("toStringTag");
- C.exports = function(l, n, a) {
- l && !a && (l = l.prototype), l && !A(l, s) && e(l, s, { configurable: !0, value: n });
- };
- }, { "../internals/has-own-property": 275, "../internals/object-define-property": 308, "../internals/well-known-symbol": 357 }], 332: [function(g, C, i) {
- var e = g("../internals/shared"), A = g("../internals/uid"), s = e("keys");
- C.exports = function(l) {
- return s[l] || (s[l] = A(l));
- };
- }, { "../internals/shared": 334, "../internals/uid": 350 }], 333: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/define-global-property"), s = e["__core-js_shared__"] || A("__core-js_shared__", {});
- C.exports = s;
- }, { "../internals/define-global-property": 246, "../internals/global": 274 }], 334: [function(g, C, i) {
- var e = g("../internals/is-pure"), A = g("../internals/shared-store");
- (C.exports = function(s, l) {
- return A[s] || (A[s] = l !== void 0 ? l : {});
- })("versions", []).push({ version: "3.33.0", mode: e ? "pure" : "global", copyright: "© 2014-2023 Denis Pushkarev (zloirock.ru)", license: "https://github.com/zloirock/core-js/blob/v3.33.0/LICENSE", source: "https://github.com/zloirock/core-js" });
- }, { "../internals/is-pure": 290, "../internals/shared-store": 333 }], 335: [function(g, C, i) {
- var e = g("../internals/an-object"), A = g("../internals/a-constructor"), s = g("../internals/is-null-or-undefined"), l = g("../internals/well-known-symbol")("species");
- C.exports = function(n, a) {
- var d, o = e(n).constructor;
- return o === void 0 || s(d = e(o)[l]) ? a : A(d);
- };
- }, { "../internals/a-constructor": 223, "../internals/an-object": 227, "../internals/is-null-or-undefined": 288, "../internals/well-known-symbol": 357 }], 336: [function(g, C, i) {
- var e = g("../internals/engine-v8-version"), A = g("../internals/fails"), s = g("../internals/global").String;
- C.exports = !!Object.getOwnPropertySymbols && !A(function() {
- var l = Symbol("symbol detection");
- return !s(l) || !(Object(l) instanceof Symbol) || !Symbol.sham && e && e < 41;
- });
- }, { "../internals/engine-v8-version": 257, "../internals/fails": 260, "../internals/global": 274 }], 337: [function(g, C, i) {
- var e = g("../internals/function-call"), A = g("../internals/get-built-in"), s = g("../internals/well-known-symbol"), l = g("../internals/define-built-in");
- C.exports = function() {
- var n = A("Symbol"), a = n && n.prototype, d = a && a.valueOf, o = s("toPrimitive");
- a && !a[o] && l(a, o, function(c) {
- return e(d, this);
- }, { arity: 1 });
- };
- }, { "../internals/define-built-in": 245, "../internals/function-call": 264, "../internals/get-built-in": 269, "../internals/well-known-symbol": 357 }], 338: [function(g, C, i) {
- var e = g("../internals/symbol-constructor-detection");
- C.exports = e && !!Symbol.for && !!Symbol.keyFor;
- }, { "../internals/symbol-constructor-detection": 336 }], 339: [function(g, C, i) {
- var e, A, s, l, n = g("../internals/global"), a = g("../internals/function-apply"), d = g("../internals/function-bind-context"), o = g("../internals/is-callable"), c = g("../internals/has-own-property"), r = g("../internals/fails"), h = g("../internals/html"), b = g("../internals/array-slice"), u = g("../internals/document-create-element"), m = g("../internals/validate-arguments-length"), Z = g("../internals/engine-is-ios"), p = g("../internals/engine-is-node"), Y = n.setImmediate, R = n.clearImmediate, X = n.process, H = n.Dispatch, S = n.Function, z = n.MessageChannel, v = n.String, K = 0, V = {};
- r(function() {
- e = n.location;
- });
- var N = function(W) {
- if (c(V, W)) {
- var y = V[W];
- delete V[W], y();
- }
- }, B = function(W) {
- return function() {
- N(W);
- };
- }, G = function(W) {
- N(W.data);
- }, w = function(W) {
- n.postMessage(v(W), e.protocol + "//" + e.host);
- };
- Y && R || (Y = function(W) {
- m(arguments.length, 1);
- var y = o(W) ? W : S(W), f = b(arguments, 1);
- return V[++K] = function() {
- a(y, void 0, f);
- }, A(K), K;
- }, R = function(W) {
- delete V[W];
- }, p ? A = function(W) {
- X.nextTick(B(W));
- } : H && H.now ? A = function(W) {
- H.now(B(W));
- } : z && !Z ? (l = (s = new z()).port2, s.port1.onmessage = G, A = d(l.postMessage, l)) : n.addEventListener && o(n.postMessage) && !n.importScripts && e && e.protocol !== "file:" && !r(w) ? (A = w, n.addEventListener("message", G, !1)) : A = "onreadystatechange" in u("script") ? function(W) {
- h.appendChild(u("script")).onreadystatechange = function() {
- h.removeChild(this), N(W);
- };
- } : function(W) {
- setTimeout(B(W), 0);
- }), C.exports = { set: Y, clear: R };
- }, { "../internals/array-slice": 231, "../internals/document-create-element": 249, "../internals/engine-is-ios": 253, "../internals/engine-is-node": 254, "../internals/fails": 260, "../internals/function-apply": 261, "../internals/function-bind-context": 262, "../internals/global": 274, "../internals/has-own-property": 275, "../internals/html": 278, "../internals/is-callable": 285, "../internals/validate-arguments-length": 353 }], 340: [function(g, C, i) {
- var e = g("../internals/to-integer-or-infinity"), A = Math.max, s = Math.min;
- C.exports = function(l, n) {
- var a = e(l);
- return a < 0 ? A(a + n, 0) : s(a, n);
- };
- }, { "../internals/to-integer-or-infinity": 342 }], 341: [function(g, C, i) {
- var e = g("../internals/indexed-object"), A = g("../internals/require-object-coercible");
- C.exports = function(s) {
- return e(A(s));
- };
- }, { "../internals/indexed-object": 280, "../internals/require-object-coercible": 329 }], 342: [function(g, C, i) {
- var e = g("../internals/math-trunc");
- C.exports = function(A) {
- var s = +A;
- return s != s || s === 0 ? 0 : e(s);
- };
- }, { "../internals/math-trunc": 301 }], 343: [function(g, C, i) {
- var e = g("../internals/to-integer-or-infinity"), A = Math.min;
- C.exports = function(s) {
- return s > 0 ? A(e(s), 9007199254740991) : 0;
- };
- }, { "../internals/to-integer-or-infinity": 342 }], 344: [function(g, C, i) {
- var e = g("../internals/require-object-coercible"), A = Object;
- C.exports = function(s) {
- return A(e(s));
- };
- }, { "../internals/require-object-coercible": 329 }], 345: [function(g, C, i) {
- var e = g("../internals/function-call"), A = g("../internals/is-object"), s = g("../internals/is-symbol"), l = g("../internals/get-method"), n = g("../internals/ordinary-to-primitive"), a = g("../internals/well-known-symbol"), d = TypeError, o = a("toPrimitive");
- C.exports = function(c, r) {
- if (!A(c) || s(c)) return c;
- var h, b = l(c, o);
- if (b) {
- if (r === void 0 && (r = "default"), h = e(b, c, r), !A(h) || s(h)) return h;
- throw new d("Can't convert object to primitive value");
- }
- return r === void 0 && (r = "number"), n(c, r);
- };
- }, { "../internals/function-call": 264, "../internals/get-method": 273, "../internals/is-object": 289, "../internals/is-symbol": 292, "../internals/ordinary-to-primitive": 320, "../internals/well-known-symbol": 357 }], 346: [function(g, C, i) {
- var e = g("../internals/to-primitive"), A = g("../internals/is-symbol");
- C.exports = function(s) {
- var l = e(s, "string");
- return A(l) ? l : l + "";
- };
- }, { "../internals/is-symbol": 292, "../internals/to-primitive": 345 }], 347: [function(g, C, i) {
- var e = {};
- e[g("../internals/well-known-symbol")("toStringTag")] = "z", C.exports = String(e) === "[object z]";
- }, { "../internals/well-known-symbol": 357 }], 348: [function(g, C, i) {
- var e = g("../internals/classof"), A = String;
- C.exports = function(s) {
- if (e(s) === "Symbol") throw new TypeError("Cannot convert a Symbol value to a string");
- return A(s);
- };
- }, { "../internals/classof": 236 }], 349: [function(g, C, i) {
- var e = String;
- C.exports = function(A) {
- try {
- return e(A);
- } catch {
- return "Object";
- }
- };
- }, {}], 350: [function(g, C, i) {
- var e = g("../internals/function-uncurry-this"), A = 0, s = Math.random(), l = e(1 .toString);
- C.exports = function(n) {
- return "Symbol(" + (n === void 0 ? "" : n) + ")_" + l(++A + s, 36);
- };
- }, { "../internals/function-uncurry-this": 268 }], 351: [function(g, C, i) {
- var e = g("../internals/symbol-constructor-detection");
- C.exports = e && !Symbol.sham && typeof Symbol.iterator == "symbol";
- }, { "../internals/symbol-constructor-detection": 336 }], 352: [function(g, C, i) {
- var e = g("../internals/descriptors"), A = g("../internals/fails");
- C.exports = e && A(function() {
- return Object.defineProperty(function() {
- }, "prototype", { value: 42, writable: !1 }).prototype !== 42;
- });
- }, { "../internals/descriptors": 247, "../internals/fails": 260 }], 353: [function(g, C, i) {
- var e = TypeError;
- C.exports = function(A, s) {
- if (A < s) throw new e("Not enough arguments");
- return A;
- };
- }, {}], 354: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/is-callable"), s = e.WeakMap;
- C.exports = A(s) && /native code/.test(String(s));
- }, { "../internals/global": 274, "../internals/is-callable": 285 }], 355: [function(g, C, i) {
- var e = g("../internals/path"), A = g("../internals/has-own-property"), s = g("../internals/well-known-symbol-wrapped"), l = g("../internals/object-define-property").f;
- C.exports = function(n) {
- var a = e.Symbol || (e.Symbol = {});
- A(a, n) || l(a, n, { value: s.f(n) });
- };
- }, { "../internals/has-own-property": 275, "../internals/object-define-property": 308, "../internals/path": 322, "../internals/well-known-symbol-wrapped": 356 }], 356: [function(g, C, i) {
- var e = g("../internals/well-known-symbol");
- i.f = e;
- }, { "../internals/well-known-symbol": 357 }], 357: [function(g, C, i) {
- var e = g("../internals/global"), A = g("../internals/shared"), s = g("../internals/has-own-property"), l = g("../internals/uid"), n = g("../internals/symbol-constructor-detection"), a = g("../internals/use-symbol-as-uid"), d = e.Symbol, o = A("wks"), c = a ? d.for || d : d && d.withoutSetter || l;
- C.exports = function(r) {
- return s(o, r) || (o[r] = n && s(d, r) ? d[r] : c("Symbol." + r)), o[r];
- };
- }, { "../internals/global": 274, "../internals/has-own-property": 275, "../internals/shared": 334, "../internals/symbol-constructor-detection": 336, "../internals/uid": 350, "../internals/use-symbol-as-uid": 351 }], 358: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/array-iteration").findIndex, s = g("../internals/add-to-unscopables"), l = !0;
- "findIndex" in [] && Array(1).findIndex(function() {
- l = !1;
- }), e({ target: "Array", proto: !0, forced: l }, { findIndex: function(n) {
- return A(this, n, arguments.length > 1 ? arguments[1] : void 0);
- } }), s("findIndex");
- }, { "../internals/add-to-unscopables": 225, "../internals/array-iteration": 229, "../internals/export": 259 }], 359: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/array-iteration").find, s = g("../internals/add-to-unscopables"), l = !0;
- "find" in [] && Array(1).find(function() {
- l = !1;
- }), e({ target: "Array", proto: !0, forced: l }, { find: function(n) {
- return A(this, n, arguments.length > 1 ? arguments[1] : void 0);
- } }), s("find");
- }, { "../internals/add-to-unscopables": 225, "../internals/array-iteration": 229, "../internals/export": 259 }], 360: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/array-includes").includes, s = g("../internals/fails"), l = g("../internals/add-to-unscopables");
- e({ target: "Array", proto: !0, forced: s(function() {
- return !Array(1).includes();
- }) }, { includes: function(n) {
- return A(this, n, arguments.length > 1 ? arguments[1] : void 0);
- } }), l("includes");
- }, { "../internals/add-to-unscopables": 225, "../internals/array-includes": 228, "../internals/export": 259, "../internals/fails": 260 }], 361: [function(g, C, i) {
- var e = g("../internals/to-indexed-object"), A = g("../internals/add-to-unscopables"), s = g("../internals/iterators"), l = g("../internals/internal-state"), n = g("../internals/object-define-property").f, a = g("../internals/iterator-define"), d = g("../internals/create-iter-result-object"), o = g("../internals/is-pure"), c = g("../internals/descriptors"), r = l.set, h = l.getterFor("Array Iterator");
- C.exports = a(Array, "Array", function(u, m) {
- r(this, { type: "Array Iterator", target: e(u), index: 0, kind: m });
- }, function() {
- var u = h(this), m = u.target, Z = u.kind, p = u.index++;
- if (!m || p >= m.length) return u.target = void 0, d(void 0, !0);
- switch (Z) {
- case "keys":
- return d(p, !1);
- case "values":
- return d(m[p], !1);
- }
- return d([p, m[p]], !1);
- }, "values");
- var b = s.Arguments = s.Array;
- if (A("keys"), A("values"), A("entries"), !o && c && b.name !== "values") try {
- n(b, "name", { value: "values" });
- } catch {
- }
- }, { "../internals/add-to-unscopables": 225, "../internals/create-iter-result-object": 240, "../internals/descriptors": 247, "../internals/internal-state": 282, "../internals/is-pure": 290, "../internals/iterator-define": 296, "../internals/iterators": 298, "../internals/object-define-property": 308, "../internals/to-indexed-object": 341 }], 362: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/get-built-in"), s = g("../internals/function-apply"), l = g("../internals/function-call"), n = g("../internals/function-uncurry-this"), a = g("../internals/fails"), d = g("../internals/is-callable"), o = g("../internals/is-symbol"), c = g("../internals/array-slice"), r = g("../internals/get-json-replacer-function"), h = g("../internals/symbol-constructor-detection"), b = String, u = A("JSON", "stringify"), m = n(/./.exec), Z = n("".charAt), p = n("".charCodeAt), Y = n("".replace), R = n(1 .toString), X = /[\uD800-\uDFFF]/g, H = /^[\uD800-\uDBFF]$/, S = /^[\uDC00-\uDFFF]$/, z = !h || a(function() {
- var N = A("Symbol")("stringify detection");
- return u([N]) !== "[null]" || u({ a: N }) !== "{}" || u(Object(N)) !== "{}";
- }), v = a(function() {
- return u("\uDF06\uD834") !== '"\\udf06\\ud834"' || u("\uDEAD") !== '"\\udead"';
- }), K = function(N, B) {
- var G = c(arguments), w = r(B);
- if (d(w) || N !== void 0 && !o(N)) return G[1] = function(W, y) {
- if (d(w) && (y = l(w, this, b(W), y)), !o(y)) return y;
- }, s(u, null, G);
- }, V = function(N, B, G) {
- var w = Z(G, B - 1), W = Z(G, B + 1);
- return m(H, N) && !m(S, W) || m(S, N) && !m(H, w) ? "\\u" + R(p(N, 0), 16) : N;
- };
- u && e({ target: "JSON", stat: !0, arity: 3, forced: z || v }, { stringify: function(N, B, G) {
- var w = c(arguments), W = s(z ? K : u, null, w);
- return v && typeof W == "string" ? Y(W, X, V) : W;
- } });
- }, { "../internals/array-slice": 231, "../internals/export": 259, "../internals/fails": 260, "../internals/function-apply": 261, "../internals/function-call": 264, "../internals/function-uncurry-this": 268, "../internals/get-built-in": 269, "../internals/get-json-replacer-function": 272, "../internals/is-callable": 285, "../internals/is-symbol": 292, "../internals/symbol-constructor-detection": 336 }], 363: [function(g, C, i) {
- g("../internals/export")({ target: "Number", stat: !0 }, { isNaN: function(e) {
- return e != e;
- } });
- }, { "../internals/export": 259 }], 364: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/object-assign");
- e({ target: "Object", stat: !0, arity: 2, forced: Object.assign !== A }, { assign: A });
- }, { "../internals/export": 259, "../internals/object-assign": 305 }], 365: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/symbol-constructor-detection"), s = g("../internals/fails"), l = g("../internals/object-get-own-property-symbols"), n = g("../internals/to-object");
- e({ target: "Object", stat: !0, forced: !A || s(function() {
- l.f(1);
- }) }, { getOwnPropertySymbols: function(a) {
- var d = l.f;
- return d ? d(n(a)) : [];
- } });
- }, { "../internals/export": 259, "../internals/fails": 260, "../internals/object-get-own-property-symbols": 312, "../internals/symbol-constructor-detection": 336, "../internals/to-object": 344 }], 366: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/to-object"), s = g("../internals/object-keys");
- e({ target: "Object", stat: !0, forced: g("../internals/fails")(function() {
- s(1);
- }) }, { keys: function(l) {
- return s(A(l));
- } });
- }, { "../internals/export": 259, "../internals/fails": 260, "../internals/object-keys": 316, "../internals/to-object": 344 }], 367: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/object-to-array").values;
- e({ target: "Object", stat: !0 }, { values: function(s) {
- return A(s);
- } });
- }, { "../internals/export": 259, "../internals/object-to-array": 319 }], 368: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/a-callable"), l = g("../internals/new-promise-capability"), n = g("../internals/perform"), a = g("../internals/iterate");
- e({ target: "Promise", stat: !0, forced: g("../internals/promise-statics-incorrect-iteration") }, { all: function(d) {
- var o = this, c = l.f(o), r = c.resolve, h = c.reject, b = n(function() {
- var u = s(o.resolve), m = [], Z = 0, p = 1;
- a(d, function(Y) {
- var R = Z++, X = !1;
- p++, A(u, o, Y).then(function(H) {
- X || (X = !0, m[R] = H, --p || r(m));
- }, h);
- }), --p || r(m);
- });
- return b.error && h(b.value), c.promise;
- } });
- }, { "../internals/a-callable": 222, "../internals/export": 259, "../internals/function-call": 264, "../internals/iterate": 293, "../internals/new-promise-capability": 303, "../internals/perform": 323, "../internals/promise-statics-incorrect-iteration": 327 }], 369: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/is-pure"), s = g("../internals/promise-constructor-detection").CONSTRUCTOR, l = g("../internals/promise-native-constructor"), n = g("../internals/get-built-in"), a = g("../internals/is-callable"), d = g("../internals/define-built-in"), o = l && l.prototype;
- if (e({ target: "Promise", proto: !0, forced: s, real: !0 }, { catch: function(r) {
- return this.then(void 0, r);
- } }), !A && a(l)) {
- var c = n("Promise").prototype.catch;
- o.catch !== c && d(o, "catch", c, { unsafe: !0 });
- }
- }, { "../internals/define-built-in": 245, "../internals/export": 259, "../internals/get-built-in": 269, "../internals/is-callable": 285, "../internals/is-pure": 290, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325 }], 370: [function(g, C, i) {
- var e, A, s, l = g("../internals/export"), n = g("../internals/is-pure"), a = g("../internals/engine-is-node"), d = g("../internals/global"), o = g("../internals/function-call"), c = g("../internals/define-built-in"), r = g("../internals/object-set-prototype-of"), h = g("../internals/set-to-string-tag"), b = g("../internals/set-species"), u = g("../internals/a-callable"), m = g("../internals/is-callable"), Z = g("../internals/is-object"), p = g("../internals/an-instance"), Y = g("../internals/species-constructor"), R = g("../internals/task").set, X = g("../internals/microtask"), H = g("../internals/host-report-errors"), S = g("../internals/perform"), z = g("../internals/queue"), v = g("../internals/internal-state"), K = g("../internals/promise-native-constructor"), V = g("../internals/promise-constructor-detection"), N = g("../internals/new-promise-capability"), B = V.CONSTRUCTOR, G = V.REJECTION_EVENT, w = V.SUBCLASSING, W = v.getterFor("Promise"), y = v.set, f = K && K.prototype, D = K, F = f, T = d.TypeError, Q = d.document, P = d.process, L = N.f, E = L, J = !!(Q && Q.createEvent && d.dispatchEvent), k = function(gg) {
- var lg;
- return !(!Z(gg) || !m(lg = gg.then)) && lg;
- }, j = function(gg, lg) {
- var ng, sg, og, cg = lg.value, rg = lg.state === 1, dg = rg ? gg.ok : gg.fail, Bg = gg.resolve, Zg = gg.reject, Xg = gg.domain;
- try {
- dg ? (rg || (lg.rejection === 2 && Ag(lg), lg.rejection = 1), dg === !0 ? ng = cg : (Xg && Xg.enter(), ng = dg(cg), Xg && (Xg.exit(), og = !0)), ng === gg.promise ? Zg(new T("Promise-chain cycle")) : (sg = k(ng)) ? o(sg, ng, Bg, Zg) : Bg(ng)) : Zg(cg);
- } catch (Kg) {
- Xg && !og && Xg.exit(), Zg(Kg);
- }
- }, q = function(gg, lg) {
- gg.notified || (gg.notified = !0, X(function() {
- for (var ng, sg = gg.reactions; ng = sg.get(); ) j(ng, gg);
- gg.notified = !1, lg && !gg.rejection && Ig(gg);
- }));
- }, Cg = function(gg, lg, ng) {
- var sg, og;
- J ? ((sg = Q.createEvent("Event")).promise = lg, sg.reason = ng, sg.initEvent(gg, !1, !0), d.dispatchEvent(sg)) : sg = { promise: lg, reason: ng }, !G && (og = d["on" + gg]) ? og(sg) : gg === "unhandledrejection" && H("Unhandled promise rejection", ng);
- }, Ig = function(gg) {
- o(R, d, function() {
- var lg, ng = gg.facade, sg = gg.value;
- if (x(gg) && (lg = S(function() {
- a ? P.emit("unhandledRejection", sg, ng) : Cg("unhandledrejection", ng, sg);
- }), gg.rejection = a || x(gg) ? 2 : 1, lg.error)) throw lg.value;
- });
- }, x = function(gg) {
- return gg.rejection !== 1 && !gg.parent;
- }, Ag = function(gg) {
- o(R, d, function() {
- var lg = gg.facade;
- a ? P.emit("rejectionHandled", lg) : Cg("rejectionhandled", lg, gg.value);
- });
- }, eg = function(gg, lg, ng) {
- return function(sg) {
- gg(lg, sg, ng);
- };
- }, O = function(gg, lg, ng) {
- gg.done || (gg.done = !0, ng && (gg = ng), gg.value = lg, gg.state = 2, q(gg, !0));
- }, _ = function(gg, lg, ng) {
- if (!gg.done) {
- gg.done = !0, ng && (gg = ng);
- try {
- if (gg.facade === lg) throw new T("Promise can't be resolved itself");
- var sg = k(lg);
- sg ? X(function() {
- var og = { done: !1 };
- try {
- o(sg, lg, eg(_, og, gg), eg(O, og, gg));
- } catch (cg) {
- O(og, cg, gg);
- }
- }) : (gg.value = lg, gg.state = 1, q(gg, !1));
- } catch (og) {
- O({ done: !1 }, og, gg);
- }
- }
- };
- if (B && (F = (D = function(gg) {
- p(this, F), u(gg), o(e, this);
- var lg = W(this);
- try {
- gg(eg(_, lg), eg(O, lg));
- } catch (ng) {
- O(lg, ng);
- }
- }).prototype, (e = function(gg) {
- y(this, { type: "Promise", done: !1, notified: !1, parent: !1, reactions: new z(), rejection: !1, state: 0, value: void 0 });
- }).prototype = c(F, "then", function(gg, lg) {
- var ng = W(this), sg = L(Y(this, D));
- return ng.parent = !0, sg.ok = !m(gg) || gg, sg.fail = m(lg) && lg, sg.domain = a ? P.domain : void 0, ng.state === 0 ? ng.reactions.add(sg) : X(function() {
- j(sg, ng);
- }), sg.promise;
- }), A = function() {
- var gg = new e(), lg = W(gg);
- this.promise = gg, this.resolve = eg(_, lg), this.reject = eg(O, lg);
- }, N.f = L = function(gg) {
- return gg === D || gg === void 0 ? new A(gg) : E(gg);
- }, !n && m(K) && f !== Object.prototype)) {
- s = f.then, w || c(f, "then", function(gg, lg) {
- var ng = this;
- return new D(function(sg, og) {
- o(s, ng, sg, og);
- }).then(gg, lg);
- }, { unsafe: !0 });
- try {
- delete f.constructor;
- } catch {
- }
- r && r(f, F);
- }
- l({ global: !0, constructor: !0, wrap: !0, forced: B }, { Promise: D }), h(D, "Promise", !1, !0), b("Promise");
- }, { "../internals/a-callable": 222, "../internals/an-instance": 226, "../internals/define-built-in": 245, "../internals/engine-is-node": 254, "../internals/export": 259, "../internals/function-call": 264, "../internals/global": 274, "../internals/host-report-errors": 277, "../internals/internal-state": 282, "../internals/is-callable": 285, "../internals/is-object": 289, "../internals/is-pure": 290, "../internals/microtask": 302, "../internals/new-promise-capability": 303, "../internals/object-set-prototype-of": 318, "../internals/perform": 323, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325, "../internals/queue": 328, "../internals/set-species": 330, "../internals/set-to-string-tag": 331, "../internals/species-constructor": 335, "../internals/task": 339 }], 371: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/is-pure"), s = g("../internals/promise-native-constructor"), l = g("../internals/fails"), n = g("../internals/get-built-in"), a = g("../internals/is-callable"), d = g("../internals/species-constructor"), o = g("../internals/promise-resolve"), c = g("../internals/define-built-in"), r = s && s.prototype;
- if (e({ target: "Promise", proto: !0, real: !0, forced: !!s && l(function() {
- r.finally.call({ then: function() {
- } }, function() {
- });
- }) }, { finally: function(b) {
- var u = d(this, n("Promise")), m = a(b);
- return this.then(m ? function(Z) {
- return o(u, b()).then(function() {
- return Z;
- });
- } : b, m ? function(Z) {
- return o(u, b()).then(function() {
- throw Z;
- });
- } : b);
- } }), !A && a(s)) {
- var h = n("Promise").prototype.finally;
- r.finally !== h && c(r, "finally", h, { unsafe: !0 });
- }
- }, { "../internals/define-built-in": 245, "../internals/export": 259, "../internals/fails": 260, "../internals/get-built-in": 269, "../internals/is-callable": 285, "../internals/is-pure": 290, "../internals/promise-native-constructor": 325, "../internals/promise-resolve": 326, "../internals/species-constructor": 335 }], 372: [function(g, C, i) {
- g("../modules/es.promise.constructor"), g("../modules/es.promise.all"), g("../modules/es.promise.catch"), g("../modules/es.promise.race"), g("../modules/es.promise.reject"), g("../modules/es.promise.resolve");
- }, { "../modules/es.promise.all": 368, "../modules/es.promise.catch": 369, "../modules/es.promise.constructor": 370, "../modules/es.promise.race": 373, "../modules/es.promise.reject": 374, "../modules/es.promise.resolve": 375 }], 373: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/a-callable"), l = g("../internals/new-promise-capability"), n = g("../internals/perform"), a = g("../internals/iterate");
- e({ target: "Promise", stat: !0, forced: g("../internals/promise-statics-incorrect-iteration") }, { race: function(d) {
- var o = this, c = l.f(o), r = c.reject, h = n(function() {
- var b = s(o.resolve);
- a(d, function(u) {
- A(b, o, u).then(c.resolve, r);
- });
- });
- return h.error && r(h.value), c.promise;
- } });
- }, { "../internals/a-callable": 222, "../internals/export": 259, "../internals/function-call": 264, "../internals/iterate": 293, "../internals/new-promise-capability": 303, "../internals/perform": 323, "../internals/promise-statics-incorrect-iteration": 327 }], 374: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/new-promise-capability");
- e({ target: "Promise", stat: !0, forced: g("../internals/promise-constructor-detection").CONSTRUCTOR }, { reject: function(l) {
- var n = s.f(this);
- return A(n.reject, void 0, l), n.promise;
- } });
- }, { "../internals/export": 259, "../internals/function-call": 264, "../internals/new-promise-capability": 303, "../internals/promise-constructor-detection": 324 }], 375: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/get-built-in"), s = g("../internals/is-pure"), l = g("../internals/promise-native-constructor"), n = g("../internals/promise-constructor-detection").CONSTRUCTOR, a = g("../internals/promise-resolve"), d = A("Promise"), o = s && !n;
- e({ target: "Promise", stat: !0, forced: s || n }, { resolve: function(c) {
- return a(o && this === d ? l : this, c);
- } });
- }, { "../internals/export": 259, "../internals/get-built-in": 269, "../internals/is-pure": 290, "../internals/promise-constructor-detection": 324, "../internals/promise-native-constructor": 325, "../internals/promise-resolve": 326 }], 376: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/function-uncurry-this"), s = g("../internals/to-absolute-index"), l = RangeError, n = String.fromCharCode, a = String.fromCodePoint, d = A([].join);
- e({ target: "String", stat: !0, arity: 1, forced: !!a && a.length !== 1 }, { fromCodePoint: function(o) {
- for (var c, r = [], h = arguments.length, b = 0; h > b; ) {
- if (c = +arguments[b++], s(c, 1114111) !== c) throw new l(c + " is not a valid code point");
- r[b] = c < 65536 ? n(c) : n(55296 + ((c -= 65536) >> 10), c % 1024 + 56320);
- }
- return d(r, "");
- } });
- }, { "../internals/export": 259, "../internals/function-uncurry-this": 268, "../internals/to-absolute-index": 340 }], 377: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/function-uncurry-this"), s = g("../internals/not-a-regexp"), l = g("../internals/require-object-coercible"), n = g("../internals/to-string"), a = g("../internals/correct-is-regexp-logic"), d = A("".indexOf);
- e({ target: "String", proto: !0, forced: !a("includes") }, { includes: function(o) {
- return !!~d(n(l(this)), n(s(o)), arguments.length > 1 ? arguments[1] : void 0);
- } });
- }, { "../internals/correct-is-regexp-logic": 238, "../internals/export": 259, "../internals/function-uncurry-this": 268, "../internals/not-a-regexp": 304, "../internals/require-object-coercible": 329, "../internals/to-string": 348 }], 378: [function(g, C, i) {
- g("../internals/well-known-symbol-define")("asyncIterator");
- }, { "../internals/well-known-symbol-define": 355 }], 379: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/global"), s = g("../internals/function-call"), l = g("../internals/function-uncurry-this"), n = g("../internals/is-pure"), a = g("../internals/descriptors"), d = g("../internals/symbol-constructor-detection"), o = g("../internals/fails"), c = g("../internals/has-own-property"), r = g("../internals/object-is-prototype-of"), h = g("../internals/an-object"), b = g("../internals/to-indexed-object"), u = g("../internals/to-property-key"), m = g("../internals/to-string"), Z = g("../internals/create-property-descriptor"), p = g("../internals/object-create"), Y = g("../internals/object-keys"), R = g("../internals/object-get-own-property-names"), X = g("../internals/object-get-own-property-names-external"), H = g("../internals/object-get-own-property-symbols"), S = g("../internals/object-get-own-property-descriptor"), z = g("../internals/object-define-property"), v = g("../internals/object-define-properties"), K = g("../internals/object-property-is-enumerable"), V = g("../internals/define-built-in"), N = g("../internals/define-built-in-accessor"), B = g("../internals/shared"), G = g("../internals/shared-key"), w = g("../internals/hidden-keys"), W = g("../internals/uid"), y = g("../internals/well-known-symbol"), f = g("../internals/well-known-symbol-wrapped"), D = g("../internals/well-known-symbol-define"), F = g("../internals/symbol-define-to-primitive"), T = g("../internals/set-to-string-tag"), Q = g("../internals/internal-state"), P = g("../internals/array-iteration").forEach, L = G("hidden"), E = Q.set, J = Q.getterFor("Symbol"), k = Object.prototype, j = A.Symbol, q = j && j.prototype, Cg = A.RangeError, Ig = A.TypeError, x = A.QObject, Ag = S.f, eg = z.f, O = X.f, _ = K.f, gg = l([].push), lg = B("symbols"), ng = B("op-symbols"), sg = B("wks"), og = !x || !x.prototype || !x.prototype.findChild, cg = function(Ng, wg, fg) {
- var Jg = Ag(k, wg);
- Jg && delete k[wg], eg(Ng, wg, fg), Jg && Ng !== k && eg(k, wg, Jg);
- }, rg = a && o(function() {
- return p(eg({}, "a", { get: function() {
- return eg(this, "a", { value: 7 }).a;
- } })).a !== 7;
- }) ? cg : eg, dg = function(Ng, wg) {
- var fg = lg[Ng] = p(q);
- return E(fg, { type: "Symbol", tag: Ng, description: wg }), a || (fg.description = wg), fg;
- }, Bg = function(Ng, wg, fg) {
- Ng === k && Bg(ng, wg, fg), h(Ng);
- var Jg = u(wg);
- return h(fg), c(lg, Jg) ? (fg.enumerable ? (c(Ng, L) && Ng[L][Jg] && (Ng[L][Jg] = !1), fg = p(fg, { enumerable: Z(0, !1) })) : (c(Ng, L) || eg(Ng, L, Z(1, {})), Ng[L][Jg] = !0), rg(Ng, Jg, fg)) : eg(Ng, Jg, fg);
- }, Zg = function(Ng, wg) {
- h(Ng);
- var fg = b(wg), Jg = Y(fg).concat(Wg(fg));
- return P(Jg, function(zg) {
- a && !s(Xg, fg, zg) || Bg(Ng, zg, fg[zg]);
- }), Ng;
- }, Xg = function(Ng) {
- var wg = u(Ng), fg = s(_, this, wg);
- return !(this === k && c(lg, wg) && !c(ng, wg)) && (!(fg || !c(this, wg) || !c(lg, wg) || c(this, L) && this[L][wg]) || fg);
- }, Kg = function(Ng, wg) {
- var fg = b(Ng), Jg = u(wg);
- if (fg !== k || !c(lg, Jg) || c(ng, Jg)) {
- var zg = Ag(fg, Jg);
- return !zg || !c(lg, Jg) || c(fg, L) && fg[L][Jg] || (zg.enumerable = !0), zg;
- }
- }, kg = function(Ng) {
- var wg = O(b(Ng)), fg = [];
- return P(wg, function(Jg) {
- c(lg, Jg) || c(w, Jg) || gg(fg, Jg);
- }), fg;
- }, Wg = function(Ng) {
- var wg = Ng === k, fg = O(wg ? ng : b(Ng)), Jg = [];
- return P(fg, function(zg) {
- !c(lg, zg) || wg && !c(k, zg) || gg(Jg, lg[zg]);
- }), Jg;
- };
- d || (V(q = (j = function() {
- if (r(q, this)) throw new Ig("Symbol is not a constructor");
- var Ng = arguments.length && arguments[0] !== void 0 ? m(arguments[0]) : void 0, wg = W(Ng), fg = function(Jg) {
- this === k && s(fg, ng, Jg), c(this, L) && c(this[L], wg) && (this[L][wg] = !1);
- var zg = Z(1, Jg);
- try {
- rg(this, wg, zg);
- } catch (cI) {
- if (!(cI instanceof Cg)) throw cI;
- cg(this, wg, zg);
- }
- };
- return a && og && rg(k, wg, { configurable: !0, set: fg }), dg(wg, Ng);
- }).prototype, "toString", function() {
- return J(this).tag;
- }), V(j, "withoutSetter", function(Ng) {
- return dg(W(Ng), Ng);
- }), K.f = Xg, z.f = Bg, v.f = Zg, S.f = Kg, R.f = X.f = kg, H.f = Wg, f.f = function(Ng) {
- return dg(y(Ng), Ng);
- }, a && (N(q, "description", { configurable: !0, get: function() {
- return J(this).description;
- } }), n || V(k, "propertyIsEnumerable", Xg, { unsafe: !0 }))), e({ global: !0, constructor: !0, wrap: !0, forced: !d, sham: !d }, { Symbol: j }), P(Y(sg), function(Ng) {
- D(Ng);
- }), e({ target: "Symbol", stat: !0, forced: !d }, { useSetter: function() {
- og = !0;
- }, useSimple: function() {
- og = !1;
- } }), e({ target: "Object", stat: !0, forced: !d, sham: !a }, { create: function(Ng, wg) {
- return wg === void 0 ? p(Ng) : Zg(p(Ng), wg);
- }, defineProperty: Bg, defineProperties: Zg, getOwnPropertyDescriptor: Kg }), e({ target: "Object", stat: !0, forced: !d }, { getOwnPropertyNames: kg }), F(), T(j, "Symbol"), w[L] = !0;
- }, { "../internals/an-object": 227, "../internals/array-iteration": 229, "../internals/create-property-descriptor": 242, "../internals/define-built-in": 245, "../internals/define-built-in-accessor": 244, "../internals/descriptors": 247, "../internals/export": 259, "../internals/fails": 260, "../internals/function-call": 264, "../internals/function-uncurry-this": 268, "../internals/global": 274, "../internals/has-own-property": 275, "../internals/hidden-keys": 276, "../internals/internal-state": 282, "../internals/is-pure": 290, "../internals/object-create": 306, "../internals/object-define-properties": 307, "../internals/object-define-property": 308, "../internals/object-get-own-property-descriptor": 309, "../internals/object-get-own-property-names": 311, "../internals/object-get-own-property-names-external": 310, "../internals/object-get-own-property-symbols": 312, "../internals/object-is-prototype-of": 314, "../internals/object-keys": 316, "../internals/object-property-is-enumerable": 317, "../internals/set-to-string-tag": 331, "../internals/shared": 334, "../internals/shared-key": 332, "../internals/symbol-constructor-detection": 336, "../internals/symbol-define-to-primitive": 337, "../internals/to-indexed-object": 341, "../internals/to-property-key": 346, "../internals/to-string": 348, "../internals/uid": 350, "../internals/well-known-symbol": 357, "../internals/well-known-symbol-define": 355, "../internals/well-known-symbol-wrapped": 356 }], 380: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/get-built-in"), s = g("../internals/has-own-property"), l = g("../internals/to-string"), n = g("../internals/shared"), a = g("../internals/symbol-registry-detection"), d = n("string-to-symbol-registry"), o = n("symbol-to-string-registry");
- e({ target: "Symbol", stat: !0, forced: !a }, { for: function(c) {
- var r = l(c);
- if (s(d, r)) return d[r];
- var h = A("Symbol")(r);
- return d[r] = h, o[h] = r, h;
- } });
- }, { "../internals/export": 259, "../internals/get-built-in": 269, "../internals/has-own-property": 275, "../internals/shared": 334, "../internals/symbol-registry-detection": 338, "../internals/to-string": 348 }], 381: [function(g, C, i) {
- g("../modules/es.symbol.constructor"), g("../modules/es.symbol.for"), g("../modules/es.symbol.key-for"), g("../modules/es.json.stringify"), g("../modules/es.object.get-own-property-symbols");
- }, { "../modules/es.json.stringify": 362, "../modules/es.object.get-own-property-symbols": 365, "../modules/es.symbol.constructor": 379, "../modules/es.symbol.for": 380, "../modules/es.symbol.key-for": 382 }], 382: [function(g, C, i) {
- var e = g("../internals/export"), A = g("../internals/has-own-property"), s = g("../internals/is-symbol"), l = g("../internals/try-to-string"), n = g("../internals/shared"), a = g("../internals/symbol-registry-detection"), d = n("symbol-to-string-registry");
- e({ target: "Symbol", stat: !0, forced: !a }, { keyFor: function(o) {
- if (!s(o)) throw new TypeError(l(o) + " is not a symbol");
- if (A(d, o)) return d[o];
- } });
- }, { "../internals/export": 259, "../internals/has-own-property": 275, "../internals/is-symbol": 292, "../internals/shared": 334, "../internals/symbol-registry-detection": 338, "../internals/try-to-string": 349 }], 383: [function(g, C, i) {
- function e(A) {
- return Object.prototype.toString.call(A);
- }
- i.isArray = function(A) {
- return Array.isArray ? Array.isArray(A) : e(A) === "[object Array]";
- }, i.isBoolean = function(A) {
- return typeof A == "boolean";
- }, i.isNull = function(A) {
- return A === null;
- }, i.isNullOrUndefined = function(A) {
- return A == null;
- }, i.isNumber = function(A) {
- return typeof A == "number";
- }, i.isString = function(A) {
- return typeof A == "string";
- }, i.isSymbol = function(A) {
- return typeof A == "symbol";
- }, i.isUndefined = function(A) {
- return A === void 0;
- }, i.isRegExp = function(A) {
- return e(A) === "[object RegExp]";
- }, i.isObject = function(A) {
- return typeof A == "object" && A !== null;
- }, i.isDate = function(A) {
- return e(A) === "[object Date]";
- }, i.isError = function(A) {
- return e(A) === "[object Error]" || A instanceof Error;
- }, i.isFunction = function(A) {
- return typeof A == "function";
- }, i.isPrimitive = function(A) {
- return A === null || typeof A == "boolean" || typeof A == "number" || typeof A == "string" || typeof A == "symbol" || A === void 0;
- }, i.isBuffer = g("buffer").Buffer.isBuffer;
- }, { buffer: 220 }], 384: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = g("elliptic"), s = g("bn.js");
- C.exports = function(d) {
- return new n(d);
- };
- var l = { secp256k1: { name: "secp256k1", byteLength: 32 }, secp224r1: { name: "p224", byteLength: 28 }, prime256v1: { name: "p256", byteLength: 32 }, prime192v1: { name: "p192", byteLength: 24 }, ed25519: { name: "ed25519", byteLength: 32 }, secp384r1: { name: "p384", byteLength: 48 }, secp521r1: { name: "p521", byteLength: 66 } };
- function n(d) {
- this.curveType = l[d], this.curveType || (this.curveType = { name: d }), this.curve = new A.ec(this.curveType.name), this.keys = void 0;
- }
- function a(d, o, c) {
- Array.isArray(d) || (d = d.toArray());
- var r = new e(d);
- if (c && r.length < c) {
- var h = new e(c - r.length);
- h.fill(0), r = e.concat([h, r]);
- }
- return o ? r.toString(o) : r;
- }
- l.p224 = l.secp224r1, l.p256 = l.secp256r1 = l.prime256v1, l.p192 = l.secp192r1 = l.prime192v1, l.p384 = l.secp384r1, l.p521 = l.secp521r1, n.prototype.generateKeys = function(d, o) {
- return this.keys = this.curve.genKeyPair(), this.getPublicKey(d, o);
- }, n.prototype.computeSecret = function(d, o, c) {
- return o = o || "utf8", e.isBuffer(d) || (d = new e(d, o)), a(this.curve.keyFromPublic(d).getPublic().mul(this.keys.getPrivate()).getX(), c, this.curveType.byteLength);
- }, n.prototype.getPublicKey = function(d, o) {
- var c = this.keys.getPublic(o === "compressed", !0);
- return o === "hybrid" && (c[c.length - 1] % 2 ? c[0] = 7 : c[0] = 6), a(c, d);
- }, n.prototype.getPrivateKey = function(d) {
- return a(this.keys.getPrivate(), d);
- }, n.prototype.setPublicKey = function(d, o) {
- return o = o || "utf8", e.isBuffer(d) || (d = new e(d, o)), this.keys._importPublic(d), this;
- }, n.prototype.setPrivateKey = function(d, o) {
- o = o || "utf8", e.isBuffer(d) || (d = new e(d, o));
- var c = new s(d);
- return c = c.toString(16), this.keys = this.curve.genKeyPair(), this.keys._importPrivate(c), this;
- };
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { "bn.js": 385, buffer: 220, elliptic: 405 }], 385: [function(g, C, i) {
- arguments[4][184][0].apply(i, arguments);
- }, { buffer: 188, dup: 184 }], 386: [function(g, C, i) {
- var e = g("inherits"), A = g("md5.js"), s = g("ripemd160"), l = g("sha.js"), n = g("cipher-base");
- function a(d) {
- n.call(this, "digest"), this._hash = d;
- }
- e(a, n), a.prototype._update = function(d) {
- this._hash.update(d);
- }, a.prototype._final = function() {
- return this._hash.digest();
- }, C.exports = function(d) {
- return (d = d.toLowerCase()) === "md5" ? new A() : d === "rmd160" || d === "ripemd160" ? new s() : new a(l(d));
- };
- }, { "cipher-base": 221, inherits: 440, "md5.js": 450, ripemd160: 493, "sha.js": 498 }], 387: [function(g, C, i) {
- var e = g("md5.js");
- C.exports = function(A) {
- return new e().update(A).digest();
- };
- }, { "md5.js": 450 }], 388: [function(g, C, i) {
- var e = g("inherits"), A = g("./legacy"), s = g("cipher-base"), l = g("safe-buffer").Buffer, n = g("create-hash/md5"), a = g("ripemd160"), d = g("sha.js"), o = l.alloc(128);
- function c(r, h) {
- s.call(this, "digest"), typeof h == "string" && (h = l.from(h));
- var b = r === "sha512" || r === "sha384" ? 128 : 64;
- this._alg = r, this._key = h, h.length > b ? h = (r === "rmd160" ? new a() : d(r)).update(h).digest() : h.length < b && (h = l.concat([h, o], b));
- for (var u = this._ipad = l.allocUnsafe(b), m = this._opad = l.allocUnsafe(b), Z = 0; Z < b; Z++) u[Z] = 54 ^ h[Z], m[Z] = 92 ^ h[Z];
- this._hash = r === "rmd160" ? new a() : d(r), this._hash.update(u);
- }
- e(c, s), c.prototype._update = function(r) {
- this._hash.update(r);
- }, c.prototype._final = function() {
- var r = this._hash.digest();
- return (this._alg === "rmd160" ? new a() : d(this._alg)).update(this._opad).update(r).digest();
- }, C.exports = function(r, h) {
- return (r = r.toLowerCase()) === "rmd160" || r === "ripemd160" ? new c("rmd160", h) : r === "md5" ? new A(n, h) : new c(r, h);
- };
- }, { "./legacy": 389, "cipher-base": 221, "create-hash/md5": 387, inherits: 440, ripemd160: 493, "safe-buffer": 494, "sha.js": 498 }], 389: [function(g, C, i) {
- var e = g("inherits"), A = g("safe-buffer").Buffer, s = g("cipher-base"), l = A.alloc(128);
- function n(a, d) {
- s.call(this, "digest"), typeof d == "string" && (d = A.from(d)), this._alg = a, this._key = d, d.length > 64 ? d = a(d) : d.length < 64 && (d = A.concat([d, l], 64));
- for (var o = this._ipad = A.allocUnsafe(64), c = this._opad = A.allocUnsafe(64), r = 0; r < 64; r++) o[r] = 54 ^ d[r], c[r] = 92 ^ d[r];
- this._hash = [o];
- }
- e(n, s), n.prototype._update = function(a) {
- this._hash.push(a);
- }, n.prototype._final = function() {
- var a = this._alg(A.concat(this._hash));
- return this._alg(A.concat([this._opad, a]));
- }, C.exports = n;
- }, { "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 390: [function(g, C, i) {
- i.randomBytes = i.rng = i.pseudoRandomBytes = i.prng = g("randombytes"), i.createHash = i.Hash = g("create-hash"), i.createHmac = i.Hmac = g("create-hmac");
- var e = g("browserify-sign/algos"), A = Object.keys(e), s = ["sha1", "sha224", "sha256", "sha384", "sha512", "md5", "rmd160"].concat(A);
- i.getHashes = function() {
- return s;
- };
- var l = g("pbkdf2");
- i.pbkdf2 = l.pbkdf2, i.pbkdf2Sync = l.pbkdf2Sync;
- var n = g("browserify-cipher");
- i.Cipher = n.Cipher, i.createCipher = n.createCipher, i.Cipheriv = n.Cipheriv, i.createCipheriv = n.createCipheriv, i.Decipher = n.Decipher, i.createDecipher = n.createDecipher, i.Decipheriv = n.Decipheriv, i.createDecipheriv = n.createDecipheriv, i.getCiphers = n.getCiphers, i.listCiphers = n.listCiphers;
- var a = g("diffie-hellman");
- i.DiffieHellmanGroup = a.DiffieHellmanGroup, i.createDiffieHellmanGroup = a.createDiffieHellmanGroup, i.getDiffieHellman = a.getDiffieHellman, i.createDiffieHellman = a.createDiffieHellman, i.DiffieHellman = a.DiffieHellman;
- var d = g("browserify-sign");
- i.createSign = d.createSign, i.Sign = d.Sign, i.createVerify = d.createVerify, i.Verify = d.Verify, i.createECDH = g("create-ecdh");
- var o = g("public-encrypt");
- i.publicEncrypt = o.publicEncrypt, i.privateEncrypt = o.privateEncrypt, i.publicDecrypt = o.publicDecrypt, i.privateDecrypt = o.privateDecrypt;
- var c = g("randomfill");
- i.randomFill = c.randomFill, i.randomFillSync = c.randomFillSync, i.createCredentials = function() {
- throw new Error(["sorry, createCredentials is not implemented yet", "we accept pull requests", "https://github.com/crypto-browserify/crypto-browserify"].join(`
- `));
- }, i.constants = { DH_CHECK_P_NOT_SAFE_PRIME: 2, DH_CHECK_P_NOT_PRIME: 1, DH_UNABLE_TO_CHECK_GENERATOR: 4, DH_NOT_SUITABLE_GENERATOR: 8, NPN_ENABLED: 1, ALPN_ENABLED: 1, RSA_PKCS1_PADDING: 1, RSA_SSLV23_PADDING: 2, RSA_NO_PADDING: 3, RSA_PKCS1_OAEP_PADDING: 4, RSA_X931_PADDING: 5, RSA_PKCS1_PSS_PADDING: 6, POINT_CONVERSION_COMPRESSED: 2, POINT_CONVERSION_UNCOMPRESSED: 4, POINT_CONVERSION_HYBRID: 6 };
- }, { "browserify-cipher": 206, "browserify-sign": 213, "browserify-sign/algos": 210, "create-ecdh": 384, "create-hash": 386, "create-hmac": 388, "diffie-hellman": 400, pbkdf2: 460, "public-encrypt": 468, randombytes: 475, randomfill: 476 }], 391: [function(g, C, i) {
- (function(e, A) {
- typeof i == "object" && C !== void 0 ? C.exports = A() : (e = typeof globalThis < "u" ? globalThis : e || self).dayjs = A();
- })(void 0, function() {
- var e = 6e4, A = 36e5, s = "millisecond", l = "second", n = "minute", a = "hour", d = "day", o = "week", c = "month", r = "quarter", h = "year", b = "date", u = "Invalid Date", m = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, Z = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, p = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(G) {
- var w = ["th", "st", "nd", "rd"], W = G % 100;
- return "[" + G + (w[(W - 20) % 10] || w[W] || w[0]) + "]";
- } }, Y = function(G, w, W) {
- var y = String(G);
- return !y || y.length >= w ? G : "" + Array(w + 1 - y.length).join(W) + G;
- }, R = { s: Y, z: function(G) {
- var w = -G.utcOffset(), W = Math.abs(w), y = Math.floor(W / 60), f = W % 60;
- return (w <= 0 ? "+" : "-") + Y(y, 2, "0") + ":" + Y(f, 2, "0");
- }, m: function G(w, W) {
- if (w.date() < W.date()) return -G(W, w);
- var y = 12 * (W.year() - w.year()) + (W.month() - w.month()), f = w.clone().add(y, c), D = W - f < 0, F = w.clone().add(y + (D ? -1 : 1), c);
- return +(-(y + (W - f) / (D ? f - F : F - f)) || 0);
- }, a: function(G) {
- return G < 0 ? Math.ceil(G) || 0 : Math.floor(G);
- }, p: function(G) {
- return { M: c, y: h, w: o, d, D: b, h: a, m: n, s: l, ms: s, Q: r }[G] || String(G || "").toLowerCase().replace(/s$/, "");
- }, u: function(G) {
- return G === void 0;
- } }, X = "en", H = {};
- H[X] = p;
- var S = "$isDayjsObject", z = function(G) {
- return G instanceof N || !(!G || !G[S]);
- }, v = function G(w, W, y) {
- var f;
- if (!w) return X;
- if (typeof w == "string") {
- var D = w.toLowerCase();
- H[D] && (f = D), W && (H[D] = W, f = D);
- var F = w.split("-");
- if (!f && F.length > 1) return G(F[0]);
- } else {
- var T = w.name;
- H[T] = w, f = T;
- }
- return !y && f && (X = f), f || !y && X;
- }, K = function(G, w) {
- if (z(G)) return G.clone();
- var W = typeof w == "object" ? w : {};
- return W.date = G, W.args = arguments, new N(W);
- }, V = R;
- V.l = v, V.i = z, V.w = function(G, w) {
- return K(G, { locale: w.$L, utc: w.$u, x: w.$x, $offset: w.$offset });
- };
- var N = function() {
- function G(W) {
- this.$L = v(W.locale, null, !0), this.parse(W), this.$x = this.$x || W.x || {}, this[S] = !0;
- }
- var w = G.prototype;
- return w.parse = function(W) {
- this.$d = function(y) {
- var f = y.date, D = y.utc;
- if (f === null) return /* @__PURE__ */ new Date(NaN);
- if (V.u(f)) return /* @__PURE__ */ new Date();
- if (f instanceof Date) return new Date(f);
- if (typeof f == "string" && !/Z$/i.test(f)) {
- var F = f.match(m);
- if (F) {
- var T = F[2] - 1 || 0, Q = (F[7] || "0").substring(0, 3);
- return D ? new Date(Date.UTC(F[1], T, F[3] || 1, F[4] || 0, F[5] || 0, F[6] || 0, Q)) : new Date(F[1], T, F[3] || 1, F[4] || 0, F[5] || 0, F[6] || 0, Q);
- }
- }
- return new Date(f);
- }(W), this.init();
- }, w.init = function() {
- var W = this.$d;
- this.$y = W.getFullYear(), this.$M = W.getMonth(), this.$D = W.getDate(), this.$W = W.getDay(), this.$H = W.getHours(), this.$m = W.getMinutes(), this.$s = W.getSeconds(), this.$ms = W.getMilliseconds();
- }, w.$utils = function() {
- return V;
- }, w.isValid = function() {
- return this.$d.toString() !== u;
- }, w.isSame = function(W, y) {
- var f = K(W);
- return this.startOf(y) <= f && f <= this.endOf(y);
- }, w.isAfter = function(W, y) {
- return K(W) < this.startOf(y);
- }, w.isBefore = function(W, y) {
- return this.endOf(y) < K(W);
- }, w.$g = function(W, y, f) {
- return V.u(W) ? this[y] : this.set(f, W);
- }, w.unix = function() {
- return Math.floor(this.valueOf() / 1e3);
- }, w.valueOf = function() {
- return this.$d.getTime();
- }, w.startOf = function(W, y) {
- var f = this, D = !!V.u(y) || y, F = V.p(W), T = function(q, Cg) {
- var Ig = V.w(f.$u ? Date.UTC(f.$y, Cg, q) : new Date(f.$y, Cg, q), f);
- return D ? Ig : Ig.endOf(d);
- }, Q = function(q, Cg) {
- return V.w(f.toDate()[q].apply(f.toDate("s"), (D ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(Cg)), f);
- }, P = this.$W, L = this.$M, E = this.$D, J = "set" + (this.$u ? "UTC" : "");
- switch (F) {
- case h:
- return D ? T(1, 0) : T(31, 11);
- case c:
- return D ? T(1, L) : T(0, L + 1);
- case o:
- var k = this.$locale().weekStart || 0, j = (P < k ? P + 7 : P) - k;
- return T(D ? E - j : E + (6 - j), L);
- case d:
- case b:
- return Q(J + "Hours", 0);
- case a:
- return Q(J + "Minutes", 1);
- case n:
- return Q(J + "Seconds", 2);
- case l:
- return Q(J + "Milliseconds", 3);
- default:
- return this.clone();
- }
- }, w.endOf = function(W) {
- return this.startOf(W, !1);
- }, w.$set = function(W, y) {
- var f, D = V.p(W), F = "set" + (this.$u ? "UTC" : ""), T = (f = {}, f[d] = F + "Date", f[b] = F + "Date", f[c] = F + "Month", f[h] = F + "FullYear", f[a] = F + "Hours", f[n] = F + "Minutes", f[l] = F + "Seconds", f[s] = F + "Milliseconds", f)[D], Q = D === d ? this.$D + (y - this.$W) : y;
- if (D === c || D === h) {
- var P = this.clone().set(b, 1);
- P.$d[T](Q), P.init(), this.$d = P.set(b, Math.min(this.$D, P.daysInMonth())).$d;
- } else T && this.$d[T](Q);
- return this.init(), this;
- }, w.set = function(W, y) {
- return this.clone().$set(W, y);
- }, w.get = function(W) {
- return this[V.p(W)]();
- }, w.add = function(W, y) {
- var f, D = this;
- W = Number(W);
- var F = V.p(y), T = function(L) {
- var E = K(D);
- return V.w(E.date(E.date() + Math.round(L * W)), D);
- };
- if (F === c) return this.set(c, this.$M + W);
- if (F === h) return this.set(h, this.$y + W);
- if (F === d) return T(1);
- if (F === o) return T(7);
- var Q = (f = {}, f[n] = e, f[a] = A, f[l] = 1e3, f)[F] || 1, P = this.$d.getTime() + W * Q;
- return V.w(P, this);
- }, w.subtract = function(W, y) {
- return this.add(-1 * W, y);
- }, w.format = function(W) {
- var y = this, f = this.$locale();
- if (!this.isValid()) return f.invalidDate || u;
- var D = W || "YYYY-MM-DDTHH:mm:ssZ", F = V.z(this), T = this.$H, Q = this.$m, P = this.$M, L = f.weekdays, E = f.months, J = f.meridiem, k = function(Cg, Ig, x, Ag) {
- return Cg && (Cg[Ig] || Cg(y, D)) || x[Ig].slice(0, Ag);
- }, j = function(Cg) {
- return V.s(T % 12 || 12, Cg, "0");
- }, q = J || function(Cg, Ig, x) {
- var Ag = Cg < 12 ? "AM" : "PM";
- return x ? Ag.toLowerCase() : Ag;
- };
- return D.replace(Z, function(Cg, Ig) {
- return Ig || function(x) {
- switch (x) {
- case "YY":
- return String(y.$y).slice(-2);
- case "YYYY":
- return V.s(y.$y, 4, "0");
- case "M":
- return P + 1;
- case "MM":
- return V.s(P + 1, 2, "0");
- case "MMM":
- return k(f.monthsShort, P, E, 3);
- case "MMMM":
- return k(E, P);
- case "D":
- return y.$D;
- case "DD":
- return V.s(y.$D, 2, "0");
- case "d":
- return String(y.$W);
- case "dd":
- return k(f.weekdaysMin, y.$W, L, 2);
- case "ddd":
- return k(f.weekdaysShort, y.$W, L, 3);
- case "dddd":
- return L[y.$W];
- case "H":
- return String(T);
- case "HH":
- return V.s(T, 2, "0");
- case "h":
- return j(1);
- case "hh":
- return j(2);
- case "a":
- return q(T, Q, !0);
- case "A":
- return q(T, Q, !1);
- case "m":
- return String(Q);
- case "mm":
- return V.s(Q, 2, "0");
- case "s":
- return String(y.$s);
- case "ss":
- return V.s(y.$s, 2, "0");
- case "SSS":
- return V.s(y.$ms, 3, "0");
- case "Z":
- return F;
- }
- return null;
- }(Cg) || F.replace(":", "");
- });
- }, w.utcOffset = function() {
- return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
- }, w.diff = function(W, y, f) {
- var D, F = this, T = V.p(y), Q = K(W), P = (Q.utcOffset() - this.utcOffset()) * e, L = this - Q, E = function() {
- return V.m(F, Q);
- };
- switch (T) {
- case h:
- D = E() / 12;
- break;
- case c:
- D = E();
- break;
- case r:
- D = E() / 3;
- break;
- case o:
- D = (L - P) / 6048e5;
- break;
- case d:
- D = (L - P) / 864e5;
- break;
- case a:
- D = L / A;
- break;
- case n:
- D = L / e;
- break;
- case l:
- D = L / 1e3;
- break;
- default:
- D = L;
- }
- return f ? D : V.a(D);
- }, w.daysInMonth = function() {
- return this.endOf(c).$D;
- }, w.$locale = function() {
- return H[this.$L];
- }, w.locale = function(W, y) {
- if (!W) return this.$L;
- var f = this.clone(), D = v(W, y, !0);
- return D && (f.$L = D), f;
- }, w.clone = function() {
- return V.w(this.$d, this);
- }, w.toDate = function() {
- return new Date(this.valueOf());
- }, w.toJSON = function() {
- return this.isValid() ? this.toISOString() : null;
- }, w.toISOString = function() {
- return this.$d.toISOString();
- }, w.toString = function() {
- return this.$d.toUTCString();
- }, G;
- }(), B = N.prototype;
- return K.prototype = B, [["$ms", s], ["$s", l], ["$m", n], ["$H", a], ["$W", d], ["$M", c], ["$y", h], ["$D", b]].forEach(function(G) {
- B[G[1]] = function(w) {
- return this.$g(w, G[0], G[1]);
- };
- }), K.extend = function(G, w) {
- return G.$i || (G(w, N, K), G.$i = !0), K;
- }, K.locale = v, K.isDayjs = z, K.unix = function(G) {
- return K(1e3 * G);
- }, K.en = H[X], K.Ls = H, K.p = {}, K;
- });
- }, {}], 392: [function(g, C, i) {
- (function(e, A) {
- typeof i == "object" && C !== void 0 ? C.exports = A() : (e = typeof globalThis < "u" ? globalThis : e || self).dayjs_plugin_customParseFormat = A();
- })(void 0, function() {
- var e = { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A" }, A = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g, s = /\d\d/, l = /\d\d?/, n = /\d*[^-_:/,()\s\d]+/, a = {}, d = function(m) {
- return (m = +m) + (m > 68 ? 1900 : 2e3);
- }, o = function(m) {
- return function(Z) {
- this[m] = +Z;
- };
- }, c = [/[+-]\d\d:?(\d\d)?|Z/, function(m) {
- (this.zone || (this.zone = {})).offset = function(Z) {
- if (!Z || Z === "Z") return 0;
- var p = Z.match(/([+-]|\d\d)/g), Y = 60 * p[1] + (+p[2] || 0);
- return Y === 0 ? 0 : p[0] === "+" ? -Y : Y;
- }(m);
- }], r = function(m) {
- var Z = a[m];
- return Z && (Z.indexOf ? Z : Z.s.concat(Z.f));
- }, h = function(m, Z) {
- var p, Y = a.meridiem;
- if (Y) {
- for (var R = 1; R <= 24; R += 1) if (m.indexOf(Y(R, 0, Z)) > -1) {
- p = R > 12;
- break;
- }
- } else p = m === (Z ? "pm" : "PM");
- return p;
- }, b = { A: [n, function(m) {
- this.afternoon = h(m, !1);
- }], a: [n, function(m) {
- this.afternoon = h(m, !0);
- }], S: [/\d/, function(m) {
- this.milliseconds = 100 * +m;
- }], SS: [s, function(m) {
- this.milliseconds = 10 * +m;
- }], SSS: [/\d{3}/, function(m) {
- this.milliseconds = +m;
- }], s: [l, o("seconds")], ss: [l, o("seconds")], m: [l, o("minutes")], mm: [l, o("minutes")], H: [l, o("hours")], h: [l, o("hours")], HH: [l, o("hours")], hh: [l, o("hours")], D: [l, o("day")], DD: [s, o("day")], Do: [n, function(m) {
- var Z = a.ordinal, p = m.match(/\d+/);
- if (this.day = p[0], Z) for (var Y = 1; Y <= 31; Y += 1) Z(Y).replace(/\[|\]/g, "") === m && (this.day = Y);
- }], M: [l, o("month")], MM: [s, o("month")], MMM: [n, function(m) {
- var Z = r("months"), p = (r("monthsShort") || Z.map(function(Y) {
- return Y.slice(0, 3);
- })).indexOf(m) + 1;
- if (p < 1) throw new Error();
- this.month = p % 12 || p;
- }], MMMM: [n, function(m) {
- var Z = r("months").indexOf(m) + 1;
- if (Z < 1) throw new Error();
- this.month = Z % 12 || Z;
- }], Y: [/[+-]?\d+/, o("year")], YY: [s, function(m) {
- this.year = d(m);
- }], YYYY: [/\d{4}/, o("year")], Z: c, ZZ: c };
- function u(m) {
- var Z, p;
- Z = m, p = a && a.formats;
- for (var Y = (m = Z.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function(K, V, N) {
- var B = N && N.toUpperCase();
- return V || p[N] || e[N] || p[B].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(G, w, W) {
- return w || W.slice(1);
- });
- })).match(A), R = Y.length, X = 0; X < R; X += 1) {
- var H = Y[X], S = b[H], z = S && S[0], v = S && S[1];
- Y[X] = v ? { regex: z, parser: v } : H.replace(/^\[|\]$/g, "");
- }
- return function(K) {
- for (var V = {}, N = 0, B = 0; N < R; N += 1) {
- var G = Y[N];
- if (typeof G == "string") B += G.length;
- else {
- var w = G.regex, W = G.parser, y = K.slice(B), f = w.exec(y)[0];
- W.call(V, f), K = K.replace(f, "");
- }
- }
- return function(D) {
- var F = D.afternoon;
- if (F !== void 0) {
- var T = D.hours;
- F ? T < 12 && (D.hours += 12) : T === 12 && (D.hours = 0), delete D.afternoon;
- }
- }(V), V;
- };
- }
- return function(m, Z, p) {
- p.p.customParseFormat = !0, m && m.parseTwoDigitYear && (d = m.parseTwoDigitYear);
- var Y = Z.prototype, R = Y.parse;
- Y.parse = function(X) {
- var H = X.date, S = X.utc, z = X.args;
- this.$u = S;
- var v = z[1];
- if (typeof v == "string") {
- var K = z[2] === !0, V = z[3] === !0, N = K || V, B = z[2];
- V && (B = z[2]), a = this.$locale(), !K && B && (a = p.Ls[B]), this.$d = function(y, f, D) {
- try {
- if (["x", "X"].indexOf(f) > -1) return new Date((f === "X" ? 1e3 : 1) * y);
- var F = u(f)(y), T = F.year, Q = F.month, P = F.day, L = F.hours, E = F.minutes, J = F.seconds, k = F.milliseconds, j = F.zone, q = /* @__PURE__ */ new Date(), Cg = P || (T || Q ? 1 : q.getDate()), Ig = T || q.getFullYear(), x = 0;
- T && !Q || (x = Q > 0 ? Q - 1 : q.getMonth());
- var Ag = L || 0, eg = E || 0, O = J || 0, _ = k || 0;
- return j ? new Date(Date.UTC(Ig, x, Cg, Ag, eg, O, _ + 60 * j.offset * 1e3)) : D ? new Date(Date.UTC(Ig, x, Cg, Ag, eg, O, _)) : new Date(Ig, x, Cg, Ag, eg, O, _);
- } catch {
- return /* @__PURE__ */ new Date("");
- }
- }(H, v, S), this.init(), B && B !== !0 && (this.$L = this.locale(B).$L), N && H != this.format(v) && (this.$d = /* @__PURE__ */ new Date("")), a = {};
- } else if (v instanceof Array) for (var G = v.length, w = 1; w <= G; w += 1) {
- z[1] = v[w - 1];
- var W = p.apply(this, z);
- if (W.isValid()) {
- this.$d = W.$d, this.$L = W.$L, this.init();
- break;
- }
- w === G && (this.$d = /* @__PURE__ */ new Date(""));
- }
- else R.call(this, X);
- };
- };
- });
- }, {}], 393: [function(g, C, i) {
- (function(e, A) {
- typeof i == "object" && C !== void 0 ? C.exports = A() : (e = typeof globalThis < "u" ? globalThis : e || self).dayjs_plugin_utc = A();
- })(void 0, function() {
- var e = "minute", A = /[+-]\d\d(?::?\d\d)?/g, s = /([+-]|\d\d)/g;
- return function(l, n, a) {
- var d = n.prototype;
- a.utc = function(m) {
- var Z = { date: m, utc: !0, args: arguments };
- return new n(Z);
- }, d.utc = function(m) {
- var Z = a(this.toDate(), { locale: this.$L, utc: !0 });
- return m ? Z.add(this.utcOffset(), e) : Z;
- }, d.local = function() {
- return a(this.toDate(), { locale: this.$L, utc: !1 });
- };
- var o = d.parse;
- d.parse = function(m) {
- m.utc && (this.$u = !0), this.$utils().u(m.$offset) || (this.$offset = m.$offset), o.call(this, m);
- };
- var c = d.init;
- d.init = function() {
- if (this.$u) {
- var m = this.$d;
- this.$y = m.getUTCFullYear(), this.$M = m.getUTCMonth(), this.$D = m.getUTCDate(), this.$W = m.getUTCDay(), this.$H = m.getUTCHours(), this.$m = m.getUTCMinutes(), this.$s = m.getUTCSeconds(), this.$ms = m.getUTCMilliseconds();
- } else c.call(this);
- };
- var r = d.utcOffset;
- d.utcOffset = function(m, Z) {
- var p = this.$utils().u;
- if (p(m)) return this.$u ? 0 : p(this.$offset) ? r.call(this) : this.$offset;
- if (typeof m == "string" && (m = function(H) {
- H === void 0 && (H = "");
- var S = H.match(A);
- if (!S) return null;
- var z = ("" + S[0]).match(s) || ["-", 0, 0], v = z[0], K = 60 * +z[1] + +z[2];
- return K === 0 ? 0 : v === "+" ? K : -K;
- }(m)) === null) return this;
- var Y = Math.abs(m) <= 16 ? 60 * m : m, R = this;
- if (Z) return R.$offset = Y, R.$u = m === 0, R;
- if (m !== 0) {
- var X = this.$u ? this.toDate().getTimezoneOffset() : -1 * this.utcOffset();
- (R = this.local().add(Y + X, e)).$offset = Y, R.$x.$localOffset = X;
- } else R = this.utc();
- return R;
- };
- var h = d.format;
- d.format = function(m) {
- var Z = m || (this.$u ? "YYYY-MM-DDTHH:mm:ss[Z]" : "");
- return h.call(this, Z);
- }, d.valueOf = function() {
- var m = this.$utils().u(this.$offset) ? 0 : this.$offset + (this.$x.$localOffset || this.$d.getTimezoneOffset());
- return this.$d.valueOf() - 6e4 * m;
- }, d.isUTC = function() {
- return !!this.$u;
- }, d.toISOString = function() {
- return this.toDate().toISOString();
- }, d.toString = function() {
- return this.toDate().toUTCString();
- };
- var b = d.toDate;
- d.toDate = function(m) {
- return m === "s" && this.$offset ? a(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate() : b.call(this);
- };
- var u = d.diff;
- d.diff = function(m, Z, p) {
- if (m && this.$u === m.$u) return u.call(this, m, Z, p);
- var Y = this.local(), R = a(m).local();
- return u.call(Y, R, Z, p);
- };
- };
- });
- }, {}], 394: [function(g, C, i) {
- i.utils = g("./des/utils"), i.Cipher = g("./des/cipher"), i.DES = g("./des/des"), i.CBC = g("./des/cbc"), i.EDE = g("./des/ede");
- }, { "./des/cbc": 395, "./des/cipher": 396, "./des/des": 397, "./des/ede": 398, "./des/utils": 399 }], 395: [function(g, C, i) {
- var e = g("minimalistic-assert"), A = g("inherits"), s = {};
- function l(n) {
- e.equal(n.length, 8, "Invalid IV length"), this.iv = new Array(8);
- for (var a = 0; a < this.iv.length; a++) this.iv[a] = n[a];
- }
- i.instantiate = function(n) {
- function a(r) {
- n.call(this, r), this._cbcInit();
- }
- A(a, n);
- for (var d = Object.keys(s), o = 0; o < d.length; o++) {
- var c = d[o];
- a.prototype[c] = s[c];
- }
- return a.create = function(r) {
- return new a(r);
- }, a;
- }, s._cbcInit = function() {
- var n = new l(this.options.iv);
- this._cbcState = n;
- }, s._update = function(n, a, d, o) {
- var c = this._cbcState, r = this.constructor.super_.prototype, h = c.iv;
- if (this.type === "encrypt") {
- for (var b = 0; b < this.blockSize; b++) h[b] ^= n[a + b];
- for (r._update.call(this, h, 0, d, o), b = 0; b < this.blockSize; b++) h[b] = d[o + b];
- } else {
- for (r._update.call(this, n, a, d, o), b = 0; b < this.blockSize; b++) d[o + b] ^= h[b];
- for (b = 0; b < this.blockSize; b++) h[b] = n[a + b];
- }
- };
- }, { inherits: 440, "minimalistic-assert": 453 }], 396: [function(g, C, i) {
- var e = g("minimalistic-assert");
- function A(s) {
- this.options = s, this.type = this.options.type, this.blockSize = 8, this._init(), this.buffer = new Array(this.blockSize), this.bufferOff = 0, this.padding = s.padding !== !1;
- }
- C.exports = A, A.prototype._init = function() {
- }, A.prototype.update = function(s) {
- return s.length === 0 ? [] : this.type === "decrypt" ? this._updateDecrypt(s) : this._updateEncrypt(s);
- }, A.prototype._buffer = function(s, l) {
- for (var n = Math.min(this.buffer.length - this.bufferOff, s.length - l), a = 0; a < n; a++) this.buffer[this.bufferOff + a] = s[l + a];
- return this.bufferOff += n, n;
- }, A.prototype._flushBuffer = function(s, l) {
- return this._update(this.buffer, 0, s, l), this.bufferOff = 0, this.blockSize;
- }, A.prototype._updateEncrypt = function(s) {
- var l = 0, n = 0, a = (this.bufferOff + s.length) / this.blockSize | 0, d = new Array(a * this.blockSize);
- this.bufferOff !== 0 && (l += this._buffer(s, l), this.bufferOff === this.buffer.length && (n += this._flushBuffer(d, n)));
- for (var o = s.length - (s.length - l) % this.blockSize; l < o; l += this.blockSize) this._update(s, l, d, n), n += this.blockSize;
- for (; l < s.length; l++, this.bufferOff++) this.buffer[this.bufferOff] = s[l];
- return d;
- }, A.prototype._updateDecrypt = function(s) {
- for (var l = 0, n = 0, a = Math.ceil((this.bufferOff + s.length) / this.blockSize) - 1, d = new Array(a * this.blockSize); a > 0; a--) l += this._buffer(s, l), n += this._flushBuffer(d, n);
- return l += this._buffer(s, l), d;
- }, A.prototype.final = function(s) {
- var l, n;
- return s && (l = this.update(s)), n = this.type === "encrypt" ? this._finalEncrypt() : this._finalDecrypt(), l ? l.concat(n) : n;
- }, A.prototype._pad = function(s, l) {
- if (l === 0) return !1;
- for (; l < s.length; ) s[l++] = 0;
- return !0;
- }, A.prototype._finalEncrypt = function() {
- if (!this._pad(this.buffer, this.bufferOff)) return [];
- var s = new Array(this.blockSize);
- return this._update(this.buffer, 0, s, 0), s;
- }, A.prototype._unpad = function(s) {
- return s;
- }, A.prototype._finalDecrypt = function() {
- e.equal(this.bufferOff, this.blockSize, "Not enough data to decrypt");
- var s = new Array(this.blockSize);
- return this._flushBuffer(s, 0), this._unpad(s);
- };
- }, { "minimalistic-assert": 453 }], 397: [function(g, C, i) {
- var e = g("minimalistic-assert"), A = g("inherits"), s = g("./utils"), l = g("./cipher");
- function n() {
- this.tmp = new Array(2), this.keys = null;
- }
- function a(o) {
- l.call(this, o);
- var c = new n();
- this._desState = c, this.deriveKeys(c, o.key);
- }
- A(a, l), C.exports = a, a.create = function(o) {
- return new a(o);
- };
- var d = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];
- a.prototype.deriveKeys = function(o, c) {
- o.keys = new Array(32), e.equal(c.length, this.blockSize, "Invalid key length");
- var r = s.readUInt32BE(c, 0), h = s.readUInt32BE(c, 4);
- s.pc1(r, h, o.tmp, 0), r = o.tmp[0], h = o.tmp[1];
- for (var b = 0; b < o.keys.length; b += 2) {
- var u = d[b >>> 1];
- r = s.r28shl(r, u), h = s.r28shl(h, u), s.pc2(r, h, o.keys, b);
- }
- }, a.prototype._update = function(o, c, r, h) {
- var b = this._desState, u = s.readUInt32BE(o, c), m = s.readUInt32BE(o, c + 4);
- s.ip(u, m, b.tmp, 0), u = b.tmp[0], m = b.tmp[1], this.type === "encrypt" ? this._encrypt(b, u, m, b.tmp, 0) : this._decrypt(b, u, m, b.tmp, 0), u = b.tmp[0], m = b.tmp[1], s.writeUInt32BE(r, u, h), s.writeUInt32BE(r, m, h + 4);
- }, a.prototype._pad = function(o, c) {
- if (this.padding === !1) return !1;
- for (var r = o.length - c, h = c; h < o.length; h++) o[h] = r;
- return !0;
- }, a.prototype._unpad = function(o) {
- if (this.padding === !1) return o;
- for (var c = o[o.length - 1], r = o.length - c; r < o.length; r++) e.equal(o[r], c);
- return o.slice(0, o.length - c);
- }, a.prototype._encrypt = function(o, c, r, h, b) {
- for (var u = c, m = r, Z = 0; Z < o.keys.length; Z += 2) {
- var p = o.keys[Z], Y = o.keys[Z + 1];
- s.expand(m, o.tmp, 0), p ^= o.tmp[0], Y ^= o.tmp[1];
- var R = s.substitute(p, Y), X = m;
- m = (u ^ s.permute(R)) >>> 0, u = X;
- }
- s.rip(m, u, h, b);
- }, a.prototype._decrypt = function(o, c, r, h, b) {
- for (var u = r, m = c, Z = o.keys.length - 2; Z >= 0; Z -= 2) {
- var p = o.keys[Z], Y = o.keys[Z + 1];
- s.expand(u, o.tmp, 0), p ^= o.tmp[0], Y ^= o.tmp[1];
- var R = s.substitute(p, Y), X = u;
- u = (m ^ s.permute(R)) >>> 0, m = X;
- }
- s.rip(u, m, h, b);
- };
- }, { "./cipher": 396, "./utils": 399, inherits: 440, "minimalistic-assert": 453 }], 398: [function(g, C, i) {
- var e = g("minimalistic-assert"), A = g("inherits"), s = g("./cipher"), l = g("./des");
- function n(d, o) {
- e.equal(o.length, 24, "Invalid key length");
- var c = o.slice(0, 8), r = o.slice(8, 16), h = o.slice(16, 24);
- this.ciphers = d === "encrypt" ? [l.create({ type: "encrypt", key: c }), l.create({ type: "decrypt", key: r }), l.create({ type: "encrypt", key: h })] : [l.create({ type: "decrypt", key: h }), l.create({ type: "encrypt", key: r }), l.create({ type: "decrypt", key: c })];
- }
- function a(d) {
- s.call(this, d);
- var o = new n(this.type, this.options.key);
- this._edeState = o;
- }
- A(a, s), C.exports = a, a.create = function(d) {
- return new a(d);
- }, a.prototype._update = function(d, o, c, r) {
- var h = this._edeState;
- h.ciphers[0]._update(d, o, c, r), h.ciphers[1]._update(c, r, c, r), h.ciphers[2]._update(c, r, c, r);
- }, a.prototype._pad = l.prototype._pad, a.prototype._unpad = l.prototype._unpad;
- }, { "./cipher": 396, "./des": 397, inherits: 440, "minimalistic-assert": 453 }], 399: [function(g, C, i) {
- i.readUInt32BE = function(l, n) {
- return (l[0 + n] << 24 | l[1 + n] << 16 | l[2 + n] << 8 | l[3 + n]) >>> 0;
- }, i.writeUInt32BE = function(l, n, a) {
- l[0 + a] = n >>> 24, l[1 + a] = n >>> 16 & 255, l[2 + a] = n >>> 8 & 255, l[3 + a] = 255 & n;
- }, i.ip = function(l, n, a, d) {
- for (var o = 0, c = 0, r = 6; r >= 0; r -= 2) {
- for (var h = 0; h <= 24; h += 8) o <<= 1, o |= n >>> h + r & 1;
- for (h = 0; h <= 24; h += 8) o <<= 1, o |= l >>> h + r & 1;
- }
- for (r = 6; r >= 0; r -= 2) {
- for (h = 1; h <= 25; h += 8) c <<= 1, c |= n >>> h + r & 1;
- for (h = 1; h <= 25; h += 8) c <<= 1, c |= l >>> h + r & 1;
- }
- a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
- }, i.rip = function(l, n, a, d) {
- for (var o = 0, c = 0, r = 0; r < 4; r++) for (var h = 24; h >= 0; h -= 8) o <<= 1, o |= n >>> h + r & 1, o <<= 1, o |= l >>> h + r & 1;
- for (r = 4; r < 8; r++) for (h = 24; h >= 0; h -= 8) c <<= 1, c |= n >>> h + r & 1, c <<= 1, c |= l >>> h + r & 1;
- a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
- }, i.pc1 = function(l, n, a, d) {
- for (var o = 0, c = 0, r = 7; r >= 5; r--) {
- for (var h = 0; h <= 24; h += 8) o <<= 1, o |= n >> h + r & 1;
- for (h = 0; h <= 24; h += 8) o <<= 1, o |= l >> h + r & 1;
- }
- for (h = 0; h <= 24; h += 8) o <<= 1, o |= n >> h + r & 1;
- for (r = 1; r <= 3; r++) {
- for (h = 0; h <= 24; h += 8) c <<= 1, c |= n >> h + r & 1;
- for (h = 0; h <= 24; h += 8) c <<= 1, c |= l >> h + r & 1;
- }
- for (h = 0; h <= 24; h += 8) c <<= 1, c |= l >> h + r & 1;
- a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
- }, i.r28shl = function(l, n) {
- return l << n & 268435455 | l >>> 28 - n;
- };
- var e = [14, 11, 17, 4, 27, 23, 25, 0, 13, 22, 7, 18, 5, 9, 16, 24, 2, 20, 12, 21, 1, 8, 15, 26, 15, 4, 25, 19, 9, 1, 26, 16, 5, 11, 23, 8, 12, 7, 17, 0, 22, 3, 10, 14, 6, 20, 27, 24];
- i.pc2 = function(l, n, a, d) {
- for (var o = 0, c = 0, r = e.length >>> 1, h = 0; h < r; h++) o <<= 1, o |= l >>> e[h] & 1;
- for (h = r; h < e.length; h++) c <<= 1, c |= n >>> e[h] & 1;
- a[d + 0] = o >>> 0, a[d + 1] = c >>> 0;
- }, i.expand = function(l, n, a) {
- var d = 0, o = 0;
- d = (1 & l) << 5 | l >>> 27;
- for (var c = 23; c >= 15; c -= 4) d <<= 6, d |= l >>> c & 63;
- for (c = 11; c >= 3; c -= 4) o |= l >>> c & 63, o <<= 6;
- o |= (31 & l) << 1 | l >>> 31, n[a + 0] = d >>> 0, n[a + 1] = o >>> 0;
- };
- var A = [14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11];
- i.substitute = function(l, n) {
- for (var a = 0, d = 0; d < 4; d++)
- a <<= 4, a |= A[64 * d + (l >>> 18 - 6 * d & 63)];
- for (d = 0; d < 4; d++)
- a <<= 4, a |= A[256 + 64 * d + (n >>> 18 - 6 * d & 63)];
- return a >>> 0;
- };
- var s = [16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7];
- i.permute = function(l) {
- for (var n = 0, a = 0; a < s.length; a++) n <<= 1, n |= l >>> s[a] & 1;
- return n >>> 0;
- }, i.padSplit = function(l, n, a) {
- for (var d = l.toString(2); d.length < n; ) d = "0" + d;
- for (var o = [], c = 0; c < n; c += a) o.push(d.slice(c, c + a));
- return o.join(" ");
- };
- }, {}], 400: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = g("./lib/generatePrime"), s = g("./lib/primes.json"), l = g("./lib/dh"), n = { binary: !0, hex: !0, base64: !0 };
- i.DiffieHellmanGroup = i.createDiffieHellmanGroup = i.getDiffieHellman = function(a) {
- var d = new e(s[a].prime, "hex"), o = new e(s[a].gen, "hex");
- return new l(d, o);
- }, i.createDiffieHellman = i.DiffieHellman = function a(d, o, c, r) {
- return e.isBuffer(o) || n[o] === void 0 ? a(d, "binary", o, c) : (o = o || "binary", r = r || "binary", c = c || new e([2]), e.isBuffer(c) || (c = new e(c, r)), typeof d == "number" ? new l(A(d, c), c, !0) : (e.isBuffer(d) || (d = new e(d, o)), new l(d, c, !0)));
- };
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { "./lib/dh": 401, "./lib/generatePrime": 402, "./lib/primes.json": 403, buffer: 220 }], 401: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = g("bn.js"), s = new (g("miller-rabin"))(), l = new A(24), n = new A(11), a = new A(10), d = new A(3), o = new A(7), c = g("./generatePrime"), r = g("randombytes");
- function h(p, Y) {
- return Y = Y || "utf8", e.isBuffer(p) || (p = new e(p, Y)), this._pub = new A(p), this;
- }
- function b(p, Y) {
- return Y = Y || "utf8", e.isBuffer(p) || (p = new e(p, Y)), this._priv = new A(p), this;
- }
- C.exports = m;
- var u = {};
- function m(p, Y, R) {
- this.setGenerator(Y), this.__prime = new A(p), this._prime = A.mont(this.__prime), this._primeLen = p.length, this._pub = void 0, this._priv = void 0, this._primeCode = void 0, R ? (this.setPublicKey = h, this.setPrivateKey = b) : this._primeCode = 8;
- }
- function Z(p, Y) {
- var R = new e(p.toArray());
- return Y ? R.toString(Y) : R;
- }
- Object.defineProperty(m.prototype, "verifyError", { enumerable: !0, get: function() {
- return typeof this._primeCode != "number" && (this._primeCode = function(p, Y) {
- var R = Y.toString("hex"), X = [R, p.toString(16)].join("_");
- if (X in u) return u[X];
- var H, S = 0;
- if (p.isEven() || !c.simpleSieve || !c.fermatTest(p) || !s.test(p)) return S += 1, S += R === "02" || R === "05" ? 8 : 4, u[X] = S, S;
- switch (s.test(p.shrn(1)) || (S += 2), R) {
- case "02":
- p.mod(l).cmp(n) && (S += 8);
- break;
- case "05":
- (H = p.mod(a)).cmp(d) && H.cmp(o) && (S += 8);
- break;
- default:
- S += 4;
- }
- return u[X] = S, S;
- }(this.__prime, this.__gen)), this._primeCode;
- } }), m.prototype.generateKeys = function() {
- return this._priv || (this._priv = new A(r(this._primeLen))), this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(), this.getPublicKey();
- }, m.prototype.computeSecret = function(p) {
- var Y = (p = (p = new A(p)).toRed(this._prime)).redPow(this._priv).fromRed(), R = new e(Y.toArray()), X = this.getPrime();
- if (R.length < X.length) {
- var H = new e(X.length - R.length);
- H.fill(0), R = e.concat([H, R]);
- }
- return R;
- }, m.prototype.getPublicKey = function(p) {
- return Z(this._pub, p);
- }, m.prototype.getPrivateKey = function(p) {
- return Z(this._priv, p);
- }, m.prototype.getPrime = function(p) {
- return Z(this.__prime, p);
- }, m.prototype.getGenerator = function(p) {
- return Z(this._gen, p);
- }, m.prototype.setGenerator = function(p, Y) {
- return Y = Y || "utf8", e.isBuffer(p) || (p = new e(p, Y)), this.__gen = p, this._gen = new A(p), this;
- };
- }).call(this);
- }).call(this, g("buffer").Buffer);
- }, { "./generatePrime": 402, "bn.js": 404, buffer: 220, "miller-rabin": 451, randombytes: 475 }], 402: [function(g, C, i) {
- var e = g("randombytes");
- C.exports = p, p.simpleSieve = m, p.fermatTest = Z;
- var A = g("bn.js"), s = new A(24), l = new (g("miller-rabin"))(), n = new A(1), a = new A(2), d = new A(5), o = (new A(16), new A(8), new A(10)), c = new A(3), r = (new A(7), new A(11)), h = new A(4), b = (new A(12), null);
- function u() {
- if (b !== null) return b;
- var Y = [];
- Y[0] = 2;
- for (var R = 1, X = 3; X < 1048576; X += 2) {
- for (var H = Math.ceil(Math.sqrt(X)), S = 0; S < R && Y[S] <= H && X % Y[S] != 0; S++) ;
- R !== S && Y[S] <= H || (Y[R++] = X);
- }
- return b = Y, Y;
- }
- function m(Y) {
- for (var R = u(), X = 0; X < R.length; X++) if (Y.modn(R[X]) === 0) return Y.cmpn(R[X]) === 0;
- return !0;
- }
- function Z(Y) {
- var R = A.mont(Y);
- return a.toRed(R).redPow(Y.subn(1)).fromRed().cmpn(1) === 0;
- }
- function p(Y, R) {
- if (Y < 16) return new A(R === 2 || R === 5 ? [140, 123] : [140, 39]);
- var X, H;
- for (R = new A(R); ; ) {
- for (X = new A(e(Math.ceil(Y / 8))); X.bitLength() > Y; ) X.ishrn(1);
- if (X.isEven() && X.iadd(n), X.testn(1) || X.iadd(a), R.cmp(a)) {
- if (!R.cmp(d)) for (; X.mod(o).cmp(c); ) X.iadd(h);
- } else for (; X.mod(s).cmp(r); ) X.iadd(h);
- if (m(H = X.shrn(1)) && m(X) && Z(H) && Z(X) && l.test(H) && l.test(X)) return X;
- }
- }
- }, { "bn.js": 404, "miller-rabin": 451, randombytes: 475 }], 403: [function(g, C, i) {
- C.exports = { modp1: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" }, modp2: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" }, modp5: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" }, modp14: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" }, modp15: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" }, modp16: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" }, modp17: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" }, modp18: { gen: "02", prime: "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" } };
- }, {}], 404: [function(g, C, i) {
- arguments[4][184][0].apply(i, arguments);
- }, { buffer: 188, dup: 184 }], 405: [function(g, C, i) {
- var e = i;
- e.version = g("../package.json").version, e.utils = g("./elliptic/utils"), e.rand = g("brorand"), e.curve = g("./elliptic/curve"), e.curves = g("./elliptic/curves"), e.ec = g("./elliptic/ec"), e.eddsa = g("./elliptic/eddsa");
- }, { "../package.json": 421, "./elliptic/curve": 408, "./elliptic/curves": 411, "./elliptic/ec": 412, "./elliptic/eddsa": 415, "./elliptic/utils": 419, brorand: 187 }], 406: [function(g, C, i) {
- var e = g("bn.js"), A = g("../utils"), s = A.getNAF, l = A.getJSF, n = A.assert;
- function a(o, c) {
- this.type = o, this.p = new e(c.p, 16), this.red = c.prime ? e.red(c.prime) : e.mont(this.p), this.zero = new e(0).toRed(this.red), this.one = new e(1).toRed(this.red), this.two = new e(2).toRed(this.red), this.n = c.n && new e(c.n, 16), this.g = c.g && this.pointFromJSON(c.g, c.gRed), this._wnafT1 = new Array(4), this._wnafT2 = new Array(4), this._wnafT3 = new Array(4), this._wnafT4 = new Array(4), this._bitLength = this.n ? this.n.bitLength() : 0;
- var r = this.n && this.p.div(this.n);
- !r || r.cmpn(100) > 0 ? this.redN = null : (this._maxwellTrick = !0, this.redN = this.n.toRed(this.red));
- }
- function d(o, c) {
- this.curve = o, this.type = c, this.precomputed = null;
- }
- C.exports = a, a.prototype.point = function() {
- throw new Error("Not implemented");
- }, a.prototype.validate = function() {
- throw new Error("Not implemented");
- }, a.prototype._fixedNafMul = function(o, c) {
- n(o.precomputed);
- var r = o._getDoubles(), h = s(c, 1, this._bitLength), b = (1 << r.step + 1) - (r.step % 2 == 0 ? 2 : 1);
- b /= 3;
- var u, m, Z = [];
- for (u = 0; u < h.length; u += r.step) {
- m = 0;
- for (var p = u + r.step - 1; p >= u; p--) m = (m << 1) + h[p];
- Z.push(m);
- }
- for (var Y = this.jpoint(null, null, null), R = this.jpoint(null, null, null), X = b; X > 0; X--) {
- for (u = 0; u < Z.length; u++) (m = Z[u]) === X ? R = R.mixedAdd(r.points[u]) : m === -X && (R = R.mixedAdd(r.points[u].neg()));
- Y = Y.add(R);
- }
- return Y.toP();
- }, a.prototype._wnafMul = function(o, c) {
- var r = 4, h = o._getNAFPoints(r);
- r = h.wnd;
- for (var b = h.points, u = s(c, r, this._bitLength), m = this.jpoint(null, null, null), Z = u.length - 1; Z >= 0; Z--) {
- for (var p = 0; Z >= 0 && u[Z] === 0; Z--) p++;
- if (Z >= 0 && p++, m = m.dblp(p), Z < 0) break;
- var Y = u[Z];
- n(Y !== 0), m = o.type === "affine" ? Y > 0 ? m.mixedAdd(b[Y - 1 >> 1]) : m.mixedAdd(b[-Y - 1 >> 1].neg()) : Y > 0 ? m.add(b[Y - 1 >> 1]) : m.add(b[-Y - 1 >> 1].neg());
- }
- return o.type === "affine" ? m.toP() : m;
- }, a.prototype._wnafMulAdd = function(o, c, r, h, b) {
- var u, m, Z, p = this._wnafT1, Y = this._wnafT2, R = this._wnafT3, X = 0;
- for (u = 0; u < h; u++) {
- var H = (Z = c[u])._getNAFPoints(o);
- p[u] = H.wnd, Y[u] = H.points;
- }
- for (u = h - 1; u >= 1; u -= 2) {
- var S = u - 1, z = u;
- if (p[S] === 1 && p[z] === 1) {
- var v = [c[S], null, null, c[z]];
- c[S].y.cmp(c[z].y) === 0 ? (v[1] = c[S].add(c[z]), v[2] = c[S].toJ().mixedAdd(c[z].neg())) : c[S].y.cmp(c[z].y.redNeg()) === 0 ? (v[1] = c[S].toJ().mixedAdd(c[z]), v[2] = c[S].add(c[z].neg())) : (v[1] = c[S].toJ().mixedAdd(c[z]), v[2] = c[S].toJ().mixedAdd(c[z].neg()));
- var K = [-3, -1, -5, -7, 0, 7, 5, 1, 3], V = l(r[S], r[z]);
- for (X = Math.max(V[0].length, X), R[S] = new Array(X), R[z] = new Array(X), m = 0; m < X; m++) {
- var N = 0 | V[0][m], B = 0 | V[1][m];
- R[S][m] = K[3 * (N + 1) + (B + 1)], R[z][m] = 0, Y[S] = v;
- }
- } else R[S] = s(r[S], p[S], this._bitLength), R[z] = s(r[z], p[z], this._bitLength), X = Math.max(R[S].length, X), X = Math.max(R[z].length, X);
- }
- var G = this.jpoint(null, null, null), w = this._wnafT4;
- for (u = X; u >= 0; u--) {
- for (var W = 0; u >= 0; ) {
- var y = !0;
- for (m = 0; m < h; m++) w[m] = 0 | R[m][u], w[m] !== 0 && (y = !1);
- if (!y) break;
- W++, u--;
- }
- if (u >= 0 && W++, G = G.dblp(W), u < 0) break;
- for (m = 0; m < h; m++) {
- var f = w[m];
- f !== 0 && (f > 0 ? Z = Y[m][f - 1 >> 1] : f < 0 && (Z = Y[m][-f - 1 >> 1].neg()), G = Z.type === "affine" ? G.mixedAdd(Z) : G.add(Z));
- }
- }
- for (u = 0; u < h; u++) Y[u] = null;
- return b ? G : G.toP();
- }, a.BasePoint = d, d.prototype.eq = function() {
- throw new Error("Not implemented");
- }, d.prototype.validate = function() {
- return this.curve.validate(this);
- }, a.prototype.decodePoint = function(o, c) {
- o = A.toArray(o, c);
- var r = this.p.byteLength();
- if ((o[0] === 4 || o[0] === 6 || o[0] === 7) && o.length - 1 == 2 * r) return o[0] === 6 ? n(o[o.length - 1] % 2 == 0) : o[0] === 7 && n(o[o.length - 1] % 2 == 1), this.point(o.slice(1, 1 + r), o.slice(1 + r, 1 + 2 * r));
- if ((o[0] === 2 || o[0] === 3) && o.length - 1 === r) return this.pointFromX(o.slice(1, 1 + r), o[0] === 3);
- throw new Error("Unknown point format");
- }, d.prototype.encodeCompressed = function(o) {
- return this.encode(o, !0);
- }, d.prototype._encode = function(o) {
- var c = this.curve.p.byteLength(), r = this.getX().toArray("be", c);
- return o ? [this.getY().isEven() ? 2 : 3].concat(r) : [4].concat(r, this.getY().toArray("be", c));
- }, d.prototype.encode = function(o, c) {
- return A.encode(this._encode(c), o);
- }, d.prototype.precompute = function(o) {
- if (this.precomputed) return this;
- var c = { doubles: null, naf: null, beta: null };
- return c.naf = this._getNAFPoints(8), c.doubles = this._getDoubles(4, o), c.beta = this._getBeta(), this.precomputed = c, this;
- }, d.prototype._hasDoubles = function(o) {
- if (!this.precomputed) return !1;
- var c = this.precomputed.doubles;
- return !!c && c.points.length >= Math.ceil((o.bitLength() + 1) / c.step);
- }, d.prototype._getDoubles = function(o, c) {
- if (this.precomputed && this.precomputed.doubles) return this.precomputed.doubles;
- for (var r = [this], h = this, b = 0; b < c; b += o) {
- for (var u = 0; u < o; u++) h = h.dbl();
- r.push(h);
- }
- return { step: o, points: r };
- }, d.prototype._getNAFPoints = function(o) {
- if (this.precomputed && this.precomputed.naf) return this.precomputed.naf;
- for (var c = [this], r = (1 << o) - 1, h = r === 1 ? null : this.dbl(), b = 1; b < r; b++) c[b] = c[b - 1].add(h);
- return { wnd: o, points: c };
- }, d.prototype._getBeta = function() {
- return null;
- }, d.prototype.dblp = function(o) {
- for (var c = this, r = 0; r < o; r++) c = c.dbl();
- return c;
- };
- }, { "../utils": 419, "bn.js": 420 }], 407: [function(g, C, i) {
- var e = g("../utils"), A = g("bn.js"), s = g("inherits"), l = g("./base"), n = e.assert;
- function a(o) {
- this.twisted = (0 | o.a) != 1, this.mOneA = this.twisted && (0 | o.a) == -1, this.extended = this.mOneA, l.call(this, "edwards", o), this.a = new A(o.a, 16).umod(this.red.m), this.a = this.a.toRed(this.red), this.c = new A(o.c, 16).toRed(this.red), this.c2 = this.c.redSqr(), this.d = new A(o.d, 16).toRed(this.red), this.dd = this.d.redAdd(this.d), n(!this.twisted || this.c.fromRed().cmpn(1) === 0), this.oneC = (0 | o.c) == 1;
- }
- function d(o, c, r, h, b) {
- l.BasePoint.call(this, o, "projective"), c === null && r === null && h === null ? (this.x = this.curve.zero, this.y = this.curve.one, this.z = this.curve.one, this.t = this.curve.zero, this.zOne = !0) : (this.x = new A(c, 16), this.y = new A(r, 16), this.z = h ? new A(h, 16) : this.curve.one, this.t = b && new A(b, 16), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.y.red || (this.y = this.y.toRed(this.curve.red)), this.z.red || (this.z = this.z.toRed(this.curve.red)), this.t && !this.t.red && (this.t = this.t.toRed(this.curve.red)), this.zOne = this.z === this.curve.one, this.curve.extended && !this.t && (this.t = this.x.redMul(this.y), this.zOne || (this.t = this.t.redMul(this.z.redInvm()))));
- }
- s(a, l), C.exports = a, a.prototype._mulA = function(o) {
- return this.mOneA ? o.redNeg() : this.a.redMul(o);
- }, a.prototype._mulC = function(o) {
- return this.oneC ? o : this.c.redMul(o);
- }, a.prototype.jpoint = function(o, c, r, h) {
- return this.point(o, c, r, h);
- }, a.prototype.pointFromX = function(o, c) {
- (o = new A(o, 16)).red || (o = o.toRed(this.red));
- var r = o.redSqr(), h = this.c2.redSub(this.a.redMul(r)), b = this.one.redSub(this.c2.redMul(this.d).redMul(r)), u = h.redMul(b.redInvm()), m = u.redSqrt();
- if (m.redSqr().redSub(u).cmp(this.zero) !== 0) throw new Error("invalid point");
- var Z = m.fromRed().isOdd();
- return (c && !Z || !c && Z) && (m = m.redNeg()), this.point(o, m);
- }, a.prototype.pointFromY = function(o, c) {
- (o = new A(o, 16)).red || (o = o.toRed(this.red));
- var r = o.redSqr(), h = r.redSub(this.c2), b = r.redMul(this.d).redMul(this.c2).redSub(this.a), u = h.redMul(b.redInvm());
- if (u.cmp(this.zero) === 0) {
- if (c) throw new Error("invalid point");
- return this.point(this.zero, o);
- }
- var m = u.redSqrt();
- if (m.redSqr().redSub(u).cmp(this.zero) !== 0) throw new Error("invalid point");
- return m.fromRed().isOdd() !== c && (m = m.redNeg()), this.point(m, o);
- }, a.prototype.validate = function(o) {
- if (o.isInfinity()) return !0;
- o.normalize();
- var c = o.x.redSqr(), r = o.y.redSqr(), h = c.redMul(this.a).redAdd(r), b = this.c2.redMul(this.one.redAdd(this.d.redMul(c).redMul(r)));
- return h.cmp(b) === 0;
- }, s(d, l.BasePoint), a.prototype.pointFromJSON = function(o) {
- return d.fromJSON(this, o);
- }, a.prototype.point = function(o, c, r, h) {
- return new d(this, o, c, r, h);
- }, d.fromJSON = function(o, c) {
- return new d(o, c[0], c[1], c[2]);
- }, d.prototype.inspect = function() {
- return this.isInfinity() ? "<EC Point Infinity>" : "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
- }, d.prototype.isInfinity = function() {
- return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
- }, d.prototype._extDbl = function() {
- var o = this.x.redSqr(), c = this.y.redSqr(), r = this.z.redSqr();
- r = r.redIAdd(r);
- var h = this.curve._mulA(o), b = this.x.redAdd(this.y).redSqr().redISub(o).redISub(c), u = h.redAdd(c), m = u.redSub(r), Z = h.redSub(c), p = b.redMul(m), Y = u.redMul(Z), R = b.redMul(Z), X = m.redMul(u);
- return this.curve.point(p, Y, X, R);
- }, d.prototype._projDbl = function() {
- var o, c, r, h, b, u, m = this.x.redAdd(this.y).redSqr(), Z = this.x.redSqr(), p = this.y.redSqr();
- if (this.curve.twisted) {
- var Y = (h = this.curve._mulA(Z)).redAdd(p);
- this.zOne ? (o = m.redSub(Z).redSub(p).redMul(Y.redSub(this.curve.two)), c = Y.redMul(h.redSub(p)), r = Y.redSqr().redSub(Y).redSub(Y)) : (b = this.z.redSqr(), u = Y.redSub(b).redISub(b), o = m.redSub(Z).redISub(p).redMul(u), c = Y.redMul(h.redSub(p)), r = Y.redMul(u));
- } else h = Z.redAdd(p), b = this.curve._mulC(this.z).redSqr(), u = h.redSub(b).redSub(b), o = this.curve._mulC(m.redISub(h)).redMul(u), c = this.curve._mulC(h).redMul(Z.redISub(p)), r = h.redMul(u);
- return this.curve.point(o, c, r);
- }, d.prototype.dbl = function() {
- return this.isInfinity() ? this : this.curve.extended ? this._extDbl() : this._projDbl();
- }, d.prototype._extAdd = function(o) {
- var c = this.y.redSub(this.x).redMul(o.y.redSub(o.x)), r = this.y.redAdd(this.x).redMul(o.y.redAdd(o.x)), h = this.t.redMul(this.curve.dd).redMul(o.t), b = this.z.redMul(o.z.redAdd(o.z)), u = r.redSub(c), m = b.redSub(h), Z = b.redAdd(h), p = r.redAdd(c), Y = u.redMul(m), R = Z.redMul(p), X = u.redMul(p), H = m.redMul(Z);
- return this.curve.point(Y, R, H, X);
- }, d.prototype._projAdd = function(o) {
- var c, r, h = this.z.redMul(o.z), b = h.redSqr(), u = this.x.redMul(o.x), m = this.y.redMul(o.y), Z = this.curve.d.redMul(u).redMul(m), p = b.redSub(Z), Y = b.redAdd(Z), R = this.x.redAdd(this.y).redMul(o.x.redAdd(o.y)).redISub(u).redISub(m), X = h.redMul(p).redMul(R);
- return this.curve.twisted ? (c = h.redMul(Y).redMul(m.redSub(this.curve._mulA(u))), r = p.redMul(Y)) : (c = h.redMul(Y).redMul(m.redSub(u)), r = this.curve._mulC(p).redMul(Y)), this.curve.point(X, c, r);
- }, d.prototype.add = function(o) {
- return this.isInfinity() ? o : o.isInfinity() ? this : this.curve.extended ? this._extAdd(o) : this._projAdd(o);
- }, d.prototype.mul = function(o) {
- return this._hasDoubles(o) ? this.curve._fixedNafMul(this, o) : this.curve._wnafMul(this, o);
- }, d.prototype.mulAdd = function(o, c, r) {
- return this.curve._wnafMulAdd(1, [this, c], [o, r], 2, !1);
- }, d.prototype.jmulAdd = function(o, c, r) {
- return this.curve._wnafMulAdd(1, [this, c], [o, r], 2, !0);
- }, d.prototype.normalize = function() {
- if (this.zOne) return this;
- var o = this.z.redInvm();
- return this.x = this.x.redMul(o), this.y = this.y.redMul(o), this.t && (this.t = this.t.redMul(o)), this.z = this.curve.one, this.zOne = !0, this;
- }, d.prototype.neg = function() {
- return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
- }, d.prototype.getX = function() {
- return this.normalize(), this.x.fromRed();
- }, d.prototype.getY = function() {
- return this.normalize(), this.y.fromRed();
- }, d.prototype.eq = function(o) {
- return this === o || this.getX().cmp(o.getX()) === 0 && this.getY().cmp(o.getY()) === 0;
- }, d.prototype.eqXToP = function(o) {
- var c = o.toRed(this.curve.red).redMul(this.z);
- if (this.x.cmp(c) === 0) return !0;
- for (var r = o.clone(), h = this.curve.redN.redMul(this.z); ; ) {
- if (r.iadd(this.curve.n), r.cmp(this.curve.p) >= 0) return !1;
- if (c.redIAdd(h), this.x.cmp(c) === 0) return !0;
- }
- }, d.prototype.toP = d.prototype.normalize, d.prototype.mixedAdd = d.prototype.add;
- }, { "../utils": 419, "./base": 406, "bn.js": 420, inherits: 440 }], 408: [function(g, C, i) {
- var e = i;
- e.base = g("./base"), e.short = g("./short"), e.mont = g("./mont"), e.edwards = g("./edwards");
- }, { "./base": 406, "./edwards": 407, "./mont": 409, "./short": 410 }], 409: [function(g, C, i) {
- var e = g("bn.js"), A = g("inherits"), s = g("./base"), l = g("../utils");
- function n(d) {
- s.call(this, "mont", d), this.a = new e(d.a, 16).toRed(this.red), this.b = new e(d.b, 16).toRed(this.red), this.i4 = new e(4).toRed(this.red).redInvm(), this.two = new e(2).toRed(this.red), this.a24 = this.i4.redMul(this.a.redAdd(this.two));
- }
- function a(d, o, c) {
- s.BasePoint.call(this, d, "projective"), o === null && c === null ? (this.x = this.curve.one, this.z = this.curve.zero) : (this.x = new e(o, 16), this.z = new e(c, 16), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.z.red || (this.z = this.z.toRed(this.curve.red)));
- }
- A(n, s), C.exports = n, n.prototype.validate = function(d) {
- var o = d.normalize().x, c = o.redSqr(), r = c.redMul(o).redAdd(c.redMul(this.a)).redAdd(o);
- return r.redSqrt().redSqr().cmp(r) === 0;
- }, A(a, s.BasePoint), n.prototype.decodePoint = function(d, o) {
- return this.point(l.toArray(d, o), 1);
- }, n.prototype.point = function(d, o) {
- return new a(this, d, o);
- }, n.prototype.pointFromJSON = function(d) {
- return a.fromJSON(this, d);
- }, a.prototype.precompute = function() {
- }, a.prototype._encode = function() {
- return this.getX().toArray("be", this.curve.p.byteLength());
- }, a.fromJSON = function(d, o) {
- return new a(d, o[0], o[1] || d.one);
- }, a.prototype.inspect = function() {
- return this.isInfinity() ? "<EC Point Infinity>" : "<EC Point x: " + this.x.fromRed().toString(16, 2) + " z: " + this.z.fromRed().toString(16, 2) + ">";
- }, a.prototype.isInfinity = function() {
- return this.z.cmpn(0) === 0;
- }, a.prototype.dbl = function() {
- var d = this.x.redAdd(this.z).redSqr(), o = this.x.redSub(this.z).redSqr(), c = d.redSub(o), r = d.redMul(o), h = c.redMul(o.redAdd(this.curve.a24.redMul(c)));
- return this.curve.point(r, h);
- }, a.prototype.add = function() {
- throw new Error("Not supported on Montgomery curve");
- }, a.prototype.diffAdd = function(d, o) {
- var c = this.x.redAdd(this.z), r = this.x.redSub(this.z), h = d.x.redAdd(d.z), b = d.x.redSub(d.z).redMul(c), u = h.redMul(r), m = o.z.redMul(b.redAdd(u).redSqr()), Z = o.x.redMul(b.redISub(u).redSqr());
- return this.curve.point(m, Z);
- }, a.prototype.mul = function(d) {
- for (var o = d.clone(), c = this, r = this.curve.point(null, null), h = []; o.cmpn(0) !== 0; o.iushrn(1)) h.push(o.andln(1));
- for (var b = h.length - 1; b >= 0; b--) h[b] === 0 ? (c = c.diffAdd(r, this), r = r.dbl()) : (r = c.diffAdd(r, this), c = c.dbl());
- return r;
- }, a.prototype.mulAdd = function() {
- throw new Error("Not supported on Montgomery curve");
- }, a.prototype.jumlAdd = function() {
- throw new Error("Not supported on Montgomery curve");
- }, a.prototype.eq = function(d) {
- return this.getX().cmp(d.getX()) === 0;
- }, a.prototype.normalize = function() {
- return this.x = this.x.redMul(this.z.redInvm()), this.z = this.curve.one, this;
- }, a.prototype.getX = function() {
- return this.normalize(), this.x.fromRed();
- };
- }, { "../utils": 419, "./base": 406, "bn.js": 420, inherits: 440 }], 410: [function(g, C, i) {
- var e = g("../utils"), A = g("bn.js"), s = g("inherits"), l = g("./base"), n = e.assert;
- function a(c) {
- l.call(this, "short", c), this.a = new A(c.a, 16).toRed(this.red), this.b = new A(c.b, 16).toRed(this.red), this.tinv = this.two.redInvm(), this.zeroA = this.a.fromRed().cmpn(0) === 0, this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0, this.endo = this._getEndomorphism(c), this._endoWnafT1 = new Array(4), this._endoWnafT2 = new Array(4);
- }
- function d(c, r, h, b) {
- l.BasePoint.call(this, c, "affine"), r === null && h === null ? (this.x = null, this.y = null, this.inf = !0) : (this.x = new A(r, 16), this.y = new A(h, 16), b && (this.x.forceRed(this.curve.red), this.y.forceRed(this.curve.red)), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.y.red || (this.y = this.y.toRed(this.curve.red)), this.inf = !1);
- }
- function o(c, r, h, b) {
- l.BasePoint.call(this, c, "jacobian"), r === null && h === null && b === null ? (this.x = this.curve.one, this.y = this.curve.one, this.z = new A(0)) : (this.x = new A(r, 16), this.y = new A(h, 16), this.z = new A(b, 16)), this.x.red || (this.x = this.x.toRed(this.curve.red)), this.y.red || (this.y = this.y.toRed(this.curve.red)), this.z.red || (this.z = this.z.toRed(this.curve.red)), this.zOne = this.z === this.curve.one;
- }
- s(a, l), C.exports = a, a.prototype._getEndomorphism = function(c) {
- if (this.zeroA && this.g && this.n && this.p.modn(3) === 1) {
- var r, h;
- if (c.beta) r = new A(c.beta, 16).toRed(this.red);
- else {
- var b = this._getEndoRoots(this.p);
- r = (r = b[0].cmp(b[1]) < 0 ? b[0] : b[1]).toRed(this.red);
- }
- if (c.lambda) h = new A(c.lambda, 16);
- else {
- var u = this._getEndoRoots(this.n);
- this.g.mul(u[0]).x.cmp(this.g.x.redMul(r)) === 0 ? h = u[0] : (h = u[1], n(this.g.mul(h).x.cmp(this.g.x.redMul(r)) === 0));
- }
- return { beta: r, lambda: h, basis: c.basis ? c.basis.map(function(m) {
- return { a: new A(m.a, 16), b: new A(m.b, 16) };
- }) : this._getEndoBasis(h) };
- }
- }, a.prototype._getEndoRoots = function(c) {
- var r = c === this.p ? this.red : A.mont(c), h = new A(2).toRed(r).redInvm(), b = h.redNeg(), u = new A(3).toRed(r).redNeg().redSqrt().redMul(h);
- return [b.redAdd(u).fromRed(), b.redSub(u).fromRed()];
- }, a.prototype._getEndoBasis = function(c) {
- for (var r, h, b, u, m, Z, p, Y, R, X = this.n.ushrn(Math.floor(this.n.bitLength() / 2)), H = c, S = this.n.clone(), z = new A(1), v = new A(0), K = new A(0), V = new A(1), N = 0; H.cmpn(0) !== 0; ) {
- var B = S.div(H);
- Y = S.sub(B.mul(H)), R = K.sub(B.mul(z));
- var G = V.sub(B.mul(v));
- if (!b && Y.cmp(X) < 0) r = p.neg(), h = z, b = Y.neg(), u = R;
- else if (b && ++N == 2) break;
- p = Y, S = H, H = Y, K = z, z = R, V = v, v = G;
- }
- m = Y.neg(), Z = R;
- var w = b.sqr().add(u.sqr());
- return m.sqr().add(Z.sqr()).cmp(w) >= 0 && (m = r, Z = h), b.negative && (b = b.neg(), u = u.neg()), m.negative && (m = m.neg(), Z = Z.neg()), [{ a: b, b: u }, { a: m, b: Z }];
- }, a.prototype._endoSplit = function(c) {
- var r = this.endo.basis, h = r[0], b = r[1], u = b.b.mul(c).divRound(this.n), m = h.b.neg().mul(c).divRound(this.n), Z = u.mul(h.a), p = m.mul(b.a), Y = u.mul(h.b), R = m.mul(b.b);
- return { k1: c.sub(Z).sub(p), k2: Y.add(R).neg() };
- }, a.prototype.pointFromX = function(c, r) {
- (c = new A(c, 16)).red || (c = c.toRed(this.red));
- var h = c.redSqr().redMul(c).redIAdd(c.redMul(this.a)).redIAdd(this.b), b = h.redSqrt();
- if (b.redSqr().redSub(h).cmp(this.zero) !== 0) throw new Error("invalid point");
- var u = b.fromRed().isOdd();
- return (r && !u || !r && u) && (b = b.redNeg()), this.point(c, b);
- }, a.prototype.validate = function(c) {
- if (c.inf) return !0;
- var r = c.x, h = c.y, b = this.a.redMul(r), u = r.redSqr().redMul(r).redIAdd(b).redIAdd(this.b);
- return h.redSqr().redISub(u).cmpn(0) === 0;
- }, a.prototype._endoWnafMulAdd = function(c, r, h) {
- for (var b = this._endoWnafT1, u = this._endoWnafT2, m = 0; m < c.length; m++) {
- var Z = this._endoSplit(r[m]), p = c[m], Y = p._getBeta();
- Z.k1.negative && (Z.k1.ineg(), p = p.neg(!0)), Z.k2.negative && (Z.k2.ineg(), Y = Y.neg(!0)), b[2 * m] = p, b[2 * m + 1] = Y, u[2 * m] = Z.k1, u[2 * m + 1] = Z.k2;
- }
- for (var R = this._wnafMulAdd(1, b, u, 2 * m, h), X = 0; X < 2 * m; X++) b[X] = null, u[X] = null;
- return R;
- }, s(d, l.BasePoint), a.prototype.point = function(c, r, h) {
- return new d(this, c, r, h);
- }, a.prototype.pointFromJSON = function(c, r) {
- return d.fromJSON(this, c, r);
- }, d.prototype._getBeta = function() {
- if (this.curve.endo) {
- var c = this.precomputed;
- if (c && c.beta) return c.beta;
- var r = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
- if (c) {
- var h = this.curve, b = function(u) {
- return h.point(u.x.redMul(h.endo.beta), u.y);
- };
- c.beta = r, r.precomputed = { beta: null, naf: c.naf && { wnd: c.naf.wnd, points: c.naf.points.map(b) }, doubles: c.doubles && { step: c.doubles.step, points: c.doubles.points.map(b) } };
- }
- return r;
- }
- }, d.prototype.toJSON = function() {
- return this.precomputed ? [this.x, this.y, this.precomputed && { doubles: this.precomputed.doubles && { step: this.precomputed.doubles.step, points: this.precomputed.doubles.points.slice(1) }, naf: this.precomputed.naf && { wnd: this.precomputed.naf.wnd, points: this.precomputed.naf.points.slice(1) } }] : [this.x, this.y];
- }, d.fromJSON = function(c, r, h) {
- typeof r == "string" && (r = JSON.parse(r));
- var b = c.point(r[0], r[1], h);
- if (!r[2]) return b;
- function u(Z) {
- return c.point(Z[0], Z[1], h);
- }
- var m = r[2];
- return b.precomputed = { beta: null, doubles: m.doubles && { step: m.doubles.step, points: [b].concat(m.doubles.points.map(u)) }, naf: m.naf && { wnd: m.naf.wnd, points: [b].concat(m.naf.points.map(u)) } }, b;
- }, d.prototype.inspect = function() {
- return this.isInfinity() ? "<EC Point Infinity>" : "<EC Point x: " + this.x.fromRed().toString(16, 2) + " y: " + this.y.fromRed().toString(16, 2) + ">";
- }, d.prototype.isInfinity = function() {
- return this.inf;
- }, d.prototype.add = function(c) {
- if (this.inf) return c;
- if (c.inf) return this;
- if (this.eq(c)) return this.dbl();
- if (this.neg().eq(c)) return this.curve.point(null, null);
- if (this.x.cmp(c.x) === 0) return this.curve.point(null, null);
- var r = this.y.redSub(c.y);
- r.cmpn(0) !== 0 && (r = r.redMul(this.x.redSub(c.x).redInvm()));
- var h = r.redSqr().redISub(this.x).redISub(c.x), b = r.redMul(this.x.redSub(h)).redISub(this.y);
- return this.curve.point(h, b);
- }, d.prototype.dbl = function() {
- if (this.inf) return this;
- var c = this.y.redAdd(this.y);
- if (c.cmpn(0) === 0) return this.curve.point(null, null);
- var r = this.curve.a, h = this.x.redSqr(), b = c.redInvm(), u = h.redAdd(h).redIAdd(h).redIAdd(r).redMul(b), m = u.redSqr().redISub(this.x.redAdd(this.x)), Z = u.redMul(this.x.redSub(m)).redISub(this.y);
- return this.curve.point(m, Z);
- }, d.prototype.getX = function() {
- return this.x.fromRed();
- }, d.prototype.getY = function() {
- return this.y.fromRed();
- }, d.prototype.mul = function(c) {
- return c = new A(c, 16), this.isInfinity() ? this : this._hasDoubles(c) ? this.curve._fixedNafMul(this, c) : this.curve.endo ? this.curve._endoWnafMulAdd([this], [c]) : this.curve._wnafMul(this, c);
- }, d.prototype.mulAdd = function(c, r, h) {
- var b = [this, r], u = [c, h];
- return this.curve.endo ? this.curve._endoWnafMulAdd(b, u) : this.curve._wnafMulAdd(1, b, u, 2);
- }, d.prototype.jmulAdd = function(c, r, h) {
- var b = [this, r], u = [c, h];
- return this.curve.endo ? this.curve._endoWnafMulAdd(b, u, !0) : this.curve._wnafMulAdd(1, b, u, 2, !0);
- }, d.prototype.eq = function(c) {
- return this === c || this.inf === c.inf && (this.inf || this.x.cmp(c.x) === 0 && this.y.cmp(c.y) === 0);
- }, d.prototype.neg = function(c) {
- if (this.inf) return this;
- var r = this.curve.point(this.x, this.y.redNeg());
- if (c && this.precomputed) {
- var h = this.precomputed, b = function(u) {
- return u.neg();
- };
- r.precomputed = { naf: h.naf && { wnd: h.naf.wnd, points: h.naf.points.map(b) }, doubles: h.doubles && { step: h.doubles.step, points: h.doubles.points.map(b) } };
- }
- return r;
- }, d.prototype.toJ = function() {
- return this.inf ? this.curve.jpoint(null, null, null) : this.curve.jpoint(this.x, this.y, this.curve.one);
- }, s(o, l.BasePoint), a.prototype.jpoint = function(c, r, h) {
- return new o(this, c, r, h);
- }, o.prototype.toP = function() {
- if (this.isInfinity()) return this.curve.point(null, null);
- var c = this.z.redInvm(), r = c.redSqr(), h = this.x.redMul(r), b = this.y.redMul(r).redMul(c);
- return this.curve.point(h, b);
- }, o.prototype.neg = function() {
- return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
- }, o.prototype.add = function(c) {
- if (this.isInfinity()) return c;
- if (c.isInfinity()) return this;
- var r = c.z.redSqr(), h = this.z.redSqr(), b = this.x.redMul(r), u = c.x.redMul(h), m = this.y.redMul(r.redMul(c.z)), Z = c.y.redMul(h.redMul(this.z)), p = b.redSub(u), Y = m.redSub(Z);
- if (p.cmpn(0) === 0) return Y.cmpn(0) !== 0 ? this.curve.jpoint(null, null, null) : this.dbl();
- var R = p.redSqr(), X = R.redMul(p), H = b.redMul(R), S = Y.redSqr().redIAdd(X).redISub(H).redISub(H), z = Y.redMul(H.redISub(S)).redISub(m.redMul(X)), v = this.z.redMul(c.z).redMul(p);
- return this.curve.jpoint(S, z, v);
- }, o.prototype.mixedAdd = function(c) {
- if (this.isInfinity()) return c.toJ();
- if (c.isInfinity()) return this;
- var r = this.z.redSqr(), h = this.x, b = c.x.redMul(r), u = this.y, m = c.y.redMul(r).redMul(this.z), Z = h.redSub(b), p = u.redSub(m);
- if (Z.cmpn(0) === 0) return p.cmpn(0) !== 0 ? this.curve.jpoint(null, null, null) : this.dbl();
- var Y = Z.redSqr(), R = Y.redMul(Z), X = h.redMul(Y), H = p.redSqr().redIAdd(R).redISub(X).redISub(X), S = p.redMul(X.redISub(H)).redISub(u.redMul(R)), z = this.z.redMul(Z);
- return this.curve.jpoint(H, S, z);
- }, o.prototype.dblp = function(c) {
- if (c === 0) return this;
- if (this.isInfinity()) return this;
- if (!c) return this.dbl();
- var r;
- if (this.curve.zeroA || this.curve.threeA) {
- var h = this;
- for (r = 0; r < c; r++) h = h.dbl();
- return h;
- }
- var b = this.curve.a, u = this.curve.tinv, m = this.x, Z = this.y, p = this.z, Y = p.redSqr().redSqr(), R = Z.redAdd(Z);
- for (r = 0; r < c; r++) {
- var X = m.redSqr(), H = R.redSqr(), S = H.redSqr(), z = X.redAdd(X).redIAdd(X).redIAdd(b.redMul(Y)), v = m.redMul(H), K = z.redSqr().redISub(v.redAdd(v)), V = v.redISub(K), N = z.redMul(V);
- N = N.redIAdd(N).redISub(S);
- var B = R.redMul(p);
- r + 1 < c && (Y = Y.redMul(S)), m = K, p = B, R = N;
- }
- return this.curve.jpoint(m, R.redMul(u), p);
- }, o.prototype.dbl = function() {
- return this.isInfinity() ? this : this.curve.zeroA ? this._zeroDbl() : this.curve.threeA ? this._threeDbl() : this._dbl();
- }, o.prototype._zeroDbl = function() {
- var c, r, h;
- if (this.zOne) {
- var b = this.x.redSqr(), u = this.y.redSqr(), m = u.redSqr(), Z = this.x.redAdd(u).redSqr().redISub(b).redISub(m);
- Z = Z.redIAdd(Z);
- var p = b.redAdd(b).redIAdd(b), Y = p.redSqr().redISub(Z).redISub(Z), R = m.redIAdd(m);
- R = (R = R.redIAdd(R)).redIAdd(R), c = Y, r = p.redMul(Z.redISub(Y)).redISub(R), h = this.y.redAdd(this.y);
- } else {
- var X = this.x.redSqr(), H = this.y.redSqr(), S = H.redSqr(), z = this.x.redAdd(H).redSqr().redISub(X).redISub(S);
- z = z.redIAdd(z);
- var v = X.redAdd(X).redIAdd(X), K = v.redSqr(), V = S.redIAdd(S);
- V = (V = V.redIAdd(V)).redIAdd(V), c = K.redISub(z).redISub(z), r = v.redMul(z.redISub(c)).redISub(V), h = (h = this.y.redMul(this.z)).redIAdd(h);
- }
- return this.curve.jpoint(c, r, h);
- }, o.prototype._threeDbl = function() {
- var c, r, h;
- if (this.zOne) {
- var b = this.x.redSqr(), u = this.y.redSqr(), m = u.redSqr(), Z = this.x.redAdd(u).redSqr().redISub(b).redISub(m);
- Z = Z.redIAdd(Z);
- var p = b.redAdd(b).redIAdd(b).redIAdd(this.curve.a), Y = p.redSqr().redISub(Z).redISub(Z);
- c = Y;
- var R = m.redIAdd(m);
- R = (R = R.redIAdd(R)).redIAdd(R), r = p.redMul(Z.redISub(Y)).redISub(R), h = this.y.redAdd(this.y);
- } else {
- var X = this.z.redSqr(), H = this.y.redSqr(), S = this.x.redMul(H), z = this.x.redSub(X).redMul(this.x.redAdd(X));
- z = z.redAdd(z).redIAdd(z);
- var v = S.redIAdd(S), K = (v = v.redIAdd(v)).redAdd(v);
- c = z.redSqr().redISub(K), h = this.y.redAdd(this.z).redSqr().redISub(H).redISub(X);
- var V = H.redSqr();
- V = (V = (V = V.redIAdd(V)).redIAdd(V)).redIAdd(V), r = z.redMul(v.redISub(c)).redISub(V);
- }
- return this.curve.jpoint(c, r, h);
- }, o.prototype._dbl = function() {
- var c = this.curve.a, r = this.x, h = this.y, b = this.z, u = b.redSqr().redSqr(), m = r.redSqr(), Z = h.redSqr(), p = m.redAdd(m).redIAdd(m).redIAdd(c.redMul(u)), Y = r.redAdd(r), R = (Y = Y.redIAdd(Y)).redMul(Z), X = p.redSqr().redISub(R.redAdd(R)), H = R.redISub(X), S = Z.redSqr();
- S = (S = (S = S.redIAdd(S)).redIAdd(S)).redIAdd(S);
- var z = p.redMul(H).redISub(S), v = h.redAdd(h).redMul(b);
- return this.curve.jpoint(X, z, v);
- }, o.prototype.trpl = function() {
- if (!this.curve.zeroA) return this.dbl().add(this);
- var c = this.x.redSqr(), r = this.y.redSqr(), h = this.z.redSqr(), b = r.redSqr(), u = c.redAdd(c).redIAdd(c), m = u.redSqr(), Z = this.x.redAdd(r).redSqr().redISub(c).redISub(b), p = (Z = (Z = (Z = Z.redIAdd(Z)).redAdd(Z).redIAdd(Z)).redISub(m)).redSqr(), Y = b.redIAdd(b);
- Y = (Y = (Y = Y.redIAdd(Y)).redIAdd(Y)).redIAdd(Y);
- var R = u.redIAdd(Z).redSqr().redISub(m).redISub(p).redISub(Y), X = r.redMul(R);
- X = (X = X.redIAdd(X)).redIAdd(X);
- var H = this.x.redMul(p).redISub(X);
- H = (H = H.redIAdd(H)).redIAdd(H);
- var S = this.y.redMul(R.redMul(Y.redISub(R)).redISub(Z.redMul(p)));
- S = (S = (S = S.redIAdd(S)).redIAdd(S)).redIAdd(S);
- var z = this.z.redAdd(Z).redSqr().redISub(h).redISub(p);
- return this.curve.jpoint(H, S, z);
- }, o.prototype.mul = function(c, r) {
- return c = new A(c, r), this.curve._wnafMul(this, c);
- }, o.prototype.eq = function(c) {
- if (c.type === "affine") return this.eq(c.toJ());
- if (this === c) return !0;
- var r = this.z.redSqr(), h = c.z.redSqr();
- if (this.x.redMul(h).redISub(c.x.redMul(r)).cmpn(0) !== 0) return !1;
- var b = r.redMul(this.z), u = h.redMul(c.z);
- return this.y.redMul(u).redISub(c.y.redMul(b)).cmpn(0) === 0;
- }, o.prototype.eqXToP = function(c) {
- var r = this.z.redSqr(), h = c.toRed(this.curve.red).redMul(r);
- if (this.x.cmp(h) === 0) return !0;
- for (var b = c.clone(), u = this.curve.redN.redMul(r); ; ) {
- if (b.iadd(this.curve.n), b.cmp(this.curve.p) >= 0) return !1;
- if (h.redIAdd(u), this.x.cmp(h) === 0) return !0;
- }
- }, o.prototype.inspect = function() {
- return this.isInfinity() ? "<EC JPoint Infinity>" : "<EC JPoint x: " + this.x.toString(16, 2) + " y: " + this.y.toString(16, 2) + " z: " + this.z.toString(16, 2) + ">";
- }, o.prototype.isInfinity = function() {
- return this.z.cmpn(0) === 0;
- };
- }, { "../utils": 419, "./base": 406, "bn.js": 420, inherits: 440 }], 411: [function(g, C, i) {
- var e, A = i, s = g("hash.js"), l = g("./curve"), n = g("./utils").assert;
- function a(o) {
- o.type === "short" ? this.curve = new l.short(o) : o.type === "edwards" ? this.curve = new l.edwards(o) : this.curve = new l.mont(o), this.g = this.curve.g, this.n = this.curve.n, this.hash = o.hash, n(this.g.validate(), "Invalid curve"), n(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
- }
- function d(o, c) {
- Object.defineProperty(A, o, { configurable: !0, enumerable: !0, get: function() {
- var r = new a(c);
- return Object.defineProperty(A, o, { configurable: !0, enumerable: !0, value: r }), r;
- } });
- }
- A.PresetCurve = a, d("p192", { type: "short", prime: "p192", p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff", a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc", b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1", n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831", hash: s.sha256, gRed: !1, g: ["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012", "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"] }), d("p224", { type: "short", prime: "p224", p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001", a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe", b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4", n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d", hash: s.sha256, gRed: !1, g: ["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21", "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"] }), d("p256", { type: "short", prime: null, p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff", a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc", b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b", n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551", hash: s.sha256, gRed: !1, g: ["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296", "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"] }), d("p384", { type: "short", prime: null, p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff", a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc", b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef", n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973", hash: s.sha384, gRed: !1, g: ["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7", "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"] }), d("p521", { type: "short", prime: null, p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff", a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc", b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00", n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409", hash: s.sha512, gRed: !1, g: ["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66", "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"] }), d("curve25519", { type: "mont", prime: "p25519", p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", a: "76d06", b: "1", n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", hash: s.sha256, gRed: !1, g: ["9"] }), d("ed25519", { type: "edwards", prime: "p25519", p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", a: "-1", c: "1", d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3", n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", hash: s.sha256, gRed: !1, g: ["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a", "6666666666666666666666666666666666666666666666666666666666666658"] });
- try {
- e = g("./precomputed/secp256k1");
- } catch {
- e = void 0;
- }
- d("secp256k1", { type: "short", prime: "k256", p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f", a: "0", b: "7", n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141", h: "1", hash: s.sha256, beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee", lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72", basis: [{ a: "3086d221a7d46bcde86c90e49284eb15", b: "-e4437ed6010e88286f547fa90abfe4c3" }, { a: "114ca50f7a8e2f3f657c1108d9d44cfd8", b: "3086d221a7d46bcde86c90e49284eb15" }], gRed: !1, g: ["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", e] });
- }, { "./curve": 408, "./precomputed/secp256k1": 418, "./utils": 419, "hash.js": 426 }], 412: [function(g, C, i) {
- var e = g("bn.js"), A = g("hmac-drbg"), s = g("../utils"), l = g("../curves"), n = g("brorand"), a = s.assert, d = g("./key"), o = g("./signature");
- function c(r) {
- if (!(this instanceof c)) return new c(r);
- typeof r == "string" && (a(Object.prototype.hasOwnProperty.call(l, r), "Unknown curve " + r), r = l[r]), r instanceof l.PresetCurve && (r = { curve: r }), this.curve = r.curve.curve, this.n = this.curve.n, this.nh = this.n.ushrn(1), this.g = this.curve.g, this.g = r.curve.g, this.g.precompute(r.curve.n.bitLength() + 1), this.hash = r.hash || r.curve.hash;
- }
- C.exports = c, c.prototype.keyPair = function(r) {
- return new d(this, r);
- }, c.prototype.keyFromPrivate = function(r, h) {
- return d.fromPrivate(this, r, h);
- }, c.prototype.keyFromPublic = function(r, h) {
- return d.fromPublic(this, r, h);
- }, c.prototype.genKeyPair = function(r) {
- r || (r = {});
- for (var h = new A({ hash: this.hash, pers: r.pers, persEnc: r.persEnc || "utf8", entropy: r.entropy || n(this.hash.hmacStrength), entropyEnc: r.entropy && r.entropyEnc || "utf8", nonce: this.n.toArray() }), b = this.n.byteLength(), u = this.n.sub(new e(2)); ; ) {
- var m = new e(h.generate(b));
- if (!(m.cmp(u) > 0)) return m.iaddn(1), this.keyFromPrivate(m);
- }
- }, c.prototype._truncateToN = function(r, h) {
- var b = 8 * r.byteLength() - this.n.bitLength();
- return b > 0 && (r = r.ushrn(b)), !h && r.cmp(this.n) >= 0 ? r.sub(this.n) : r;
- }, c.prototype.sign = function(r, h, b, u) {
- typeof b == "object" && (u = b, b = null), u || (u = {}), h = this.keyFromPrivate(h, b), r = this._truncateToN(new e(r, 16));
- for (var m = this.n.byteLength(), Z = h.getPrivate().toArray("be", m), p = r.toArray("be", m), Y = new A({ hash: this.hash, entropy: Z, nonce: p, pers: u.pers, persEnc: u.persEnc || "utf8" }), R = this.n.sub(new e(1)), X = 0; ; X++) {
- var H = u.k ? u.k(X) : new e(Y.generate(this.n.byteLength()));
- if (!((H = this._truncateToN(H, !0)).cmpn(1) <= 0 || H.cmp(R) >= 0)) {
- var S = this.g.mul(H);
- if (!S.isInfinity()) {
- var z = S.getX(), v = z.umod(this.n);
- if (v.cmpn(0) !== 0) {
- var K = H.invm(this.n).mul(v.mul(h.getPrivate()).iadd(r));
- if ((K = K.umod(this.n)).cmpn(0) !== 0) {
- var V = (S.getY().isOdd() ? 1 : 0) | (z.cmp(v) !== 0 ? 2 : 0);
- return u.canonical && K.cmp(this.nh) > 0 && (K = this.n.sub(K), V ^= 1), new o({ r: v, s: K, recoveryParam: V });
- }
- }
- }
- }
- }
- }, c.prototype.verify = function(r, h, b, u) {
- r = this._truncateToN(new e(r, 16)), b = this.keyFromPublic(b, u);
- var m = (h = new o(h, "hex")).r, Z = h.s;
- if (m.cmpn(1) < 0 || m.cmp(this.n) >= 0 || Z.cmpn(1) < 0 || Z.cmp(this.n) >= 0) return !1;
- var p, Y = Z.invm(this.n), R = Y.mul(r).umod(this.n), X = Y.mul(m).umod(this.n);
- return this.curve._maxwellTrick ? !(p = this.g.jmulAdd(R, b.getPublic(), X)).isInfinity() && p.eqXToP(m) : !(p = this.g.mulAdd(R, b.getPublic(), X)).isInfinity() && p.getX().umod(this.n).cmp(m) === 0;
- }, c.prototype.recoverPubKey = function(r, h, b, u) {
- a((3 & b) === b, "The recovery param is more than two bits"), h = new o(h, u);
- var m = this.n, Z = new e(r), p = h.r, Y = h.s, R = 1 & b, X = b >> 1;
- if (p.cmp(this.curve.p.umod(this.curve.n)) >= 0 && X) throw new Error("Unable to find sencond key candinate");
- p = X ? this.curve.pointFromX(p.add(this.curve.n), R) : this.curve.pointFromX(p, R);
- var H = h.r.invm(m), S = m.sub(Z).mul(H).umod(m), z = Y.mul(H).umod(m);
- return this.g.mulAdd(S, p, z);
- }, c.prototype.getKeyRecoveryParam = function(r, h, b, u) {
- if ((h = new o(h, u)).recoveryParam !== null) return h.recoveryParam;
- for (var m = 0; m < 4; m++) {
- var Z;
- try {
- Z = this.recoverPubKey(r, h, m);
- } catch {
- continue;
- }
- if (Z.eq(b)) return m;
- }
- throw new Error("Unable to find valid recovery factor");
- };
- }, { "../curves": 411, "../utils": 419, "./key": 413, "./signature": 414, "bn.js": 420, brorand: 187, "hmac-drbg": 438 }], 413: [function(g, C, i) {
- var e = g("bn.js"), A = g("../utils").assert;
- function s(l, n) {
- this.ec = l, this.priv = null, this.pub = null, n.priv && this._importPrivate(n.priv, n.privEnc), n.pub && this._importPublic(n.pub, n.pubEnc);
- }
- C.exports = s, s.fromPublic = function(l, n, a) {
- return n instanceof s ? n : new s(l, { pub: n, pubEnc: a });
- }, s.fromPrivate = function(l, n, a) {
- return n instanceof s ? n : new s(l, { priv: n, privEnc: a });
- }, s.prototype.validate = function() {
- var l = this.getPublic();
- return l.isInfinity() ? { result: !1, reason: "Invalid public key" } : l.validate() ? l.mul(this.ec.curve.n).isInfinity() ? { result: !0, reason: null } : { result: !1, reason: "Public key * N != O" } : { result: !1, reason: "Public key is not a point" };
- }, s.prototype.getPublic = function(l, n) {
- return typeof l == "string" && (n = l, l = null), this.pub || (this.pub = this.ec.g.mul(this.priv)), n ? this.pub.encode(n, l) : this.pub;
- }, s.prototype.getPrivate = function(l) {
- return l === "hex" ? this.priv.toString(16, 2) : this.priv;
- }, s.prototype._importPrivate = function(l, n) {
- this.priv = new e(l, n || 16), this.priv = this.priv.umod(this.ec.curve.n);
- }, s.prototype._importPublic = function(l, n) {
- if (l.x || l.y) return this.ec.curve.type === "mont" ? A(l.x, "Need x coordinate") : this.ec.curve.type !== "short" && this.ec.curve.type !== "edwards" || A(l.x && l.y, "Need both x and y coordinate"), void (this.pub = this.ec.curve.point(l.x, l.y));
- this.pub = this.ec.curve.decodePoint(l, n);
- }, s.prototype.derive = function(l) {
- return l.validate() || A(l.validate(), "public point not validated"), l.mul(this.priv).getX();
- }, s.prototype.sign = function(l, n, a) {
- return this.ec.sign(l, this, n, a);
- }, s.prototype.verify = function(l, n) {
- return this.ec.verify(l, n, this);
- }, s.prototype.inspect = function() {
- return "<Key priv: " + (this.priv && this.priv.toString(16, 2)) + " pub: " + (this.pub && this.pub.inspect()) + " >";
- };
- }, { "../utils": 419, "bn.js": 420 }], 414: [function(g, C, i) {
- var e = g("bn.js"), A = g("../utils"), s = A.assert;
- function l(c, r) {
- if (c instanceof l) return c;
- this._importDER(c, r) || (s(c.r && c.s, "Signature without r or s"), this.r = new e(c.r, 16), this.s = new e(c.s, 16), c.recoveryParam === void 0 ? this.recoveryParam = null : this.recoveryParam = c.recoveryParam);
- }
- function n() {
- this.place = 0;
- }
- function a(c, r) {
- var h = c[r.place++];
- if (!(128 & h)) return h;
- var b = 15 & h;
- if (b === 0 || b > 4) return !1;
- for (var u = 0, m = 0, Z = r.place; m < b; m++, Z++) u <<= 8, u |= c[Z], u >>>= 0;
- return !(u <= 127) && (r.place = Z, u);
- }
- function d(c) {
- for (var r = 0, h = c.length - 1; !c[r] && !(128 & c[r + 1]) && r < h; ) r++;
- return r === 0 ? c : c.slice(r);
- }
- function o(c, r) {
- if (r < 128) c.push(r);
- else {
- var h = 1 + (Math.log(r) / Math.LN2 >>> 3);
- for (c.push(128 | h); --h; ) c.push(r >>> (h << 3) & 255);
- c.push(r);
- }
- }
- C.exports = l, l.prototype._importDER = function(c, r) {
- c = A.toArray(c, r);
- var h = new n();
- if (c[h.place++] !== 48) return !1;
- var b = a(c, h);
- if (b === !1 || b + h.place !== c.length || c[h.place++] !== 2) return !1;
- var u = a(c, h);
- if (u === !1) return !1;
- var m = c.slice(h.place, u + h.place);
- if (h.place += u, c[h.place++] !== 2) return !1;
- var Z = a(c, h);
- if (Z === !1 || c.length !== Z + h.place) return !1;
- var p = c.slice(h.place, Z + h.place);
- if (m[0] === 0) {
- if (!(128 & m[1])) return !1;
- m = m.slice(1);
- }
- if (p[0] === 0) {
- if (!(128 & p[1])) return !1;
- p = p.slice(1);
- }
- return this.r = new e(m), this.s = new e(p), this.recoveryParam = null, !0;
- }, l.prototype.toDER = function(c) {
- var r = this.r.toArray(), h = this.s.toArray();
- for (128 & r[0] && (r = [0].concat(r)), 128 & h[0] && (h = [0].concat(h)), r = d(r), h = d(h); !(h[0] || 128 & h[1]); ) h = h.slice(1);
- var b = [2];
- o(b, r.length), (b = b.concat(r)).push(2), o(b, h.length);
- var u = b.concat(h), m = [48];
- return o(m, u.length), m = m.concat(u), A.encode(m, c);
- };
- }, { "../utils": 419, "bn.js": 420 }], 415: [function(g, C, i) {
- var e = g("hash.js"), A = g("../curves"), s = g("../utils"), l = s.assert, n = s.parseBytes, a = g("./key"), d = g("./signature");
- function o(c) {
- if (l(c === "ed25519", "only tested with ed25519 so far"), !(this instanceof o)) return new o(c);
- c = A[c].curve, this.curve = c, this.g = c.g, this.g.precompute(c.n.bitLength() + 1), this.pointClass = c.point().constructor, this.encodingLength = Math.ceil(c.n.bitLength() / 8), this.hash = e.sha512;
- }
- C.exports = o, o.prototype.sign = function(c, r) {
- c = n(c);
- var h = this.keyFromSecret(r), b = this.hashInt(h.messagePrefix(), c), u = this.g.mul(b), m = this.encodePoint(u), Z = this.hashInt(m, h.pubBytes(), c).mul(h.priv()), p = b.add(Z).umod(this.curve.n);
- return this.makeSignature({ R: u, S: p, Rencoded: m });
- }, o.prototype.verify = function(c, r, h) {
- c = n(c), r = this.makeSignature(r);
- var b = this.keyFromPublic(h), u = this.hashInt(r.Rencoded(), b.pubBytes(), c), m = this.g.mul(r.S());
- return r.R().add(b.pub().mul(u)).eq(m);
- }, o.prototype.hashInt = function() {
- for (var c = this.hash(), r = 0; r < arguments.length; r++) c.update(arguments[r]);
- return s.intFromLE(c.digest()).umod(this.curve.n);
- }, o.prototype.keyFromPublic = function(c) {
- return a.fromPublic(this, c);
- }, o.prototype.keyFromSecret = function(c) {
- return a.fromSecret(this, c);
- }, o.prototype.makeSignature = function(c) {
- return c instanceof d ? c : new d(this, c);
- }, o.prototype.encodePoint = function(c) {
- var r = c.getY().toArray("le", this.encodingLength);
- return r[this.encodingLength - 1] |= c.getX().isOdd() ? 128 : 0, r;
- }, o.prototype.decodePoint = function(c) {
- var r = (c = s.parseBytes(c)).length - 1, h = c.slice(0, r).concat(-129 & c[r]), b = (128 & c[r]) != 0, u = s.intFromLE(h);
- return this.curve.pointFromY(u, b);
- }, o.prototype.encodeInt = function(c) {
- return c.toArray("le", this.encodingLength);
- }, o.prototype.decodeInt = function(c) {
- return s.intFromLE(c);
- }, o.prototype.isPoint = function(c) {
- return c instanceof this.pointClass;
- };
- }, { "../curves": 411, "../utils": 419, "./key": 416, "./signature": 417, "hash.js": 426 }], 416: [function(g, C, i) {
- var e = g("../utils"), A = e.assert, s = e.parseBytes, l = e.cachedProperty;
- function n(a, d) {
- this.eddsa = a, this._secret = s(d.secret), a.isPoint(d.pub) ? this._pub = d.pub : this._pubBytes = s(d.pub);
- }
- n.fromPublic = function(a, d) {
- return d instanceof n ? d : new n(a, { pub: d });
- }, n.fromSecret = function(a, d) {
- return d instanceof n ? d : new n(a, { secret: d });
- }, n.prototype.secret = function() {
- return this._secret;
- }, l(n, "pubBytes", function() {
- return this.eddsa.encodePoint(this.pub());
- }), l(n, "pub", function() {
- return this._pubBytes ? this.eddsa.decodePoint(this._pubBytes) : this.eddsa.g.mul(this.priv());
- }), l(n, "privBytes", function() {
- var a = this.eddsa, d = this.hash(), o = a.encodingLength - 1, c = d.slice(0, a.encodingLength);
- return c[0] &= 248, c[o] &= 127, c[o] |= 64, c;
- }), l(n, "priv", function() {
- return this.eddsa.decodeInt(this.privBytes());
- }), l(n, "hash", function() {
- return this.eddsa.hash().update(this.secret()).digest();
- }), l(n, "messagePrefix", function() {
- return this.hash().slice(this.eddsa.encodingLength);
- }), n.prototype.sign = function(a) {
- return A(this._secret, "KeyPair can only verify"), this.eddsa.sign(a, this);
- }, n.prototype.verify = function(a, d) {
- return this.eddsa.verify(a, d, this);
- }, n.prototype.getSecret = function(a) {
- return A(this._secret, "KeyPair is public only"), e.encode(this.secret(), a);
- }, n.prototype.getPublic = function(a) {
- return e.encode(this.pubBytes(), a);
- }, C.exports = n;
- }, { "../utils": 419 }], 417: [function(g, C, i) {
- var e = g("bn.js"), A = g("../utils"), s = A.assert, l = A.cachedProperty, n = A.parseBytes;
- function a(d, o) {
- this.eddsa = d, typeof o != "object" && (o = n(o)), Array.isArray(o) && (o = { R: o.slice(0, d.encodingLength), S: o.slice(d.encodingLength) }), s(o.R && o.S, "Signature without R or S"), d.isPoint(o.R) && (this._R = o.R), o.S instanceof e && (this._S = o.S), this._Rencoded = Array.isArray(o.R) ? o.R : o.Rencoded, this._Sencoded = Array.isArray(o.S) ? o.S : o.Sencoded;
- }
- l(a, "S", function() {
- return this.eddsa.decodeInt(this.Sencoded());
- }), l(a, "R", function() {
- return this.eddsa.decodePoint(this.Rencoded());
- }), l(a, "Rencoded", function() {
- return this.eddsa.encodePoint(this.R());
- }), l(a, "Sencoded", function() {
- return this.eddsa.encodeInt(this.S());
- }), a.prototype.toBytes = function() {
- return this.Rencoded().concat(this.Sencoded());
- }, a.prototype.toHex = function() {
- return A.encode(this.toBytes(), "hex").toUpperCase();
- }, C.exports = a;
- }, { "../utils": 419, "bn.js": 420 }], 418: [function(g, C, i) {
- C.exports = { doubles: { step: 4, points: [["e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a", "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"], ["8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"], ["175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739", "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"], ["363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640", "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"], ["8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c", "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"], ["723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda", "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"], ["eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa", "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"], ["100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0", "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"], ["e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d", "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"], ["feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d", "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"], ["da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1", "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"], ["53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0", "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"], ["8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047", "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"], ["385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862", "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"], ["6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7", "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"], ["3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd", "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"], ["85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83", "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"], ["948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a", "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"], ["6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8", "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"], ["e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d", "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"], ["e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725", "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"], ["213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754", "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"], ["4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c", "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"], ["fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6", "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"], ["76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39", "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"], ["c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891", "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"], ["d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b", "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"], ["b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03", "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"], ["e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d", "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"], ["a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070", "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"], ["90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4", "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"], ["8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da", "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"], ["e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11", "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"], ["8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e", "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"], ["e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41", "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"], ["b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef", "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"], ["d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8", "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"], ["324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d", "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"], ["4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96", "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"], ["9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd", "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"], ["6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5", "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"], ["a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266", "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"], ["7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71", "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"], ["928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac", "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"], ["85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751", "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"], ["ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e", "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"], ["827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241", "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"], ["eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3", "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"], ["e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f", "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"], ["1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19", "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"], ["146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be", "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"], ["fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9", "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"], ["da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2", "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"], ["a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13", "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"], ["174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c", "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"], ["959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba", "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"], ["d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151", "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"], ["64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073", "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"], ["8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458", "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"], ["13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b", "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"], ["bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366", "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"], ["8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa", "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"], ["8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0", "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"], ["dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787", "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"], ["f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e", "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"]] }, naf: { wnd: 7, points: [["f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9", "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"], ["2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4", "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"], ["5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc", "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"], ["acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe", "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"], ["774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb", "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"], ["f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8", "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"], ["d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e", "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"], ["defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34", "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"], ["2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c", "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"], ["352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5", "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"], ["2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f", "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"], ["9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714", "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"], ["daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729", "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"], ["c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db", "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"], ["6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4", "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"], ["1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5", "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"], ["605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479", "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"], ["62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d", "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"], ["80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f", "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"], ["7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb", "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"], ["d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9", "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"], ["49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963", "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"], ["77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74", "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"], ["f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530", "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"], ["463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b", "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"], ["f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247", "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"], ["caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1", "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"], ["2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120", "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"], ["7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435", "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"], ["754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18", "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"], ["e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8", "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"], ["186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb", "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"], ["df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f", "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"], ["5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143", "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"], ["290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba", "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"], ["af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45", "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"], ["766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a", "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"], ["59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e", "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"], ["f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8", "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"], ["7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c", "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"], ["948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519", "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"], ["7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab", "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"], ["3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca", "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"], ["d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf", "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"], ["1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610", "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"], ["733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4", "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"], ["15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c", "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"], ["a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940", "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"], ["e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980", "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"], ["311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3", "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"], ["34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf", "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"], ["f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63", "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"], ["d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448", "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"], ["32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf", "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"], ["7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5", "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"], ["ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6", "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"], ["16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5", "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"], ["eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99", "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"], ["78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51", "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"], ["494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5", "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"], ["a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5", "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"], ["c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997", "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"], ["841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881", "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"], ["5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5", "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"], ["36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66", "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"], ["336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726", "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"], ["8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede", "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"], ["1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94", "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"], ["85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31", "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"], ["29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51", "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"], ["a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252", "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"], ["4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5", "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"], ["d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b", "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"], ["ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4", "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"], ["af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f", "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"], ["e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889", "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"], ["591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246", "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"], ["11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984", "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"], ["3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a", "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"], ["cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030", "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"], ["c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197", "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"], ["c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593", "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"], ["a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef", "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"], ["347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38", "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"], ["da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a", "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"], ["c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111", "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"], ["4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502", "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"], ["3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea", "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"], ["cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26", "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"], ["b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986", "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"], ["d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e", "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"], ["48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4", "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"], ["dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda", "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"], ["6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859", "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"], ["e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f", "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"], ["eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c", "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"], ["13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942", "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"], ["ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a", "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"], ["b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80", "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"], ["ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d", "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"], ["8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1", "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"], ["52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63", "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"], ["e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352", "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"], ["7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193", "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"], ["5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00", "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"], ["32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58", "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"], ["e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7", "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"], ["8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8", "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"], ["4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e", "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"], ["3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d", "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"], ["674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b", "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"], ["d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f", "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"], ["30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6", "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"], ["be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297", "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"], ["93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a", "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"], ["b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c", "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"], ["d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52", "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"], ["d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb", "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"], ["463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065", "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"], ["7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917", "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"], ["74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9", "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"], ["30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3", "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"], ["9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57", "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"], ["176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66", "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"], ["75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8", "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"], ["809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721", "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"], ["1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180", "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"]] } };
- }, {}], 419: [function(g, C, i) {
- var e = i, A = g("bn.js"), s = g("minimalistic-assert"), l = g("minimalistic-crypto-utils");
- e.assert = s, e.toArray = l.toArray, e.zero2 = l.zero2, e.toHex = l.toHex, e.encode = l.encode, e.getNAF = function(n, a, d) {
- var o = new Array(Math.max(n.bitLength(), d) + 1);
- o.fill(0);
- for (var c = 1 << a + 1, r = n.clone(), h = 0; h < o.length; h++) {
- var b, u = r.andln(c - 1);
- r.isOdd() ? (b = u > (c >> 1) - 1 ? (c >> 1) - u : u, r.isubn(b)) : b = 0, o[h] = b, r.iushrn(1);
- }
- return o;
- }, e.getJSF = function(n, a) {
- var d = [[], []];
- n = n.clone(), a = a.clone();
- for (var o, c = 0, r = 0; n.cmpn(-c) > 0 || a.cmpn(-r) > 0; ) {
- var h, b, u = n.andln(3) + c & 3, m = a.andln(3) + r & 3;
- u === 3 && (u = -1), m === 3 && (m = -1), h = (1 & u) == 0 ? 0 : (o = n.andln(7) + c & 7) !== 3 && o !== 5 || m !== 2 ? u : -u, d[0].push(h), b = (1 & m) == 0 ? 0 : (o = a.andln(7) + r & 7) !== 3 && o !== 5 || u !== 2 ? m : -m, d[1].push(b), 2 * c === h + 1 && (c = 1 - c), 2 * r === b + 1 && (r = 1 - r), n.iushrn(1), a.iushrn(1);
- }
- return d;
- }, e.cachedProperty = function(n, a, d) {
- var o = "_" + a;
- n.prototype[a] = function() {
- return this[o] !== void 0 ? this[o] : this[o] = d.call(this);
- };
- }, e.parseBytes = function(n) {
- return typeof n == "string" ? e.toArray(n, "hex") : n;
- }, e.intFromLE = function(n) {
- return new A(n, "hex", "le");
- };
- }, { "bn.js": 420, "minimalistic-assert": 453, "minimalistic-crypto-utils": 454 }], 420: [function(g, C, i) {
- arguments[4][184][0].apply(i, arguments);
- }, { buffer: 188, dup: 184 }], 421: [function(g, C, i) {
- C.exports = { name: "elliptic", version: "6.5.4", description: "EC cryptography", main: "lib/elliptic.js", files: ["lib"], scripts: { lint: "eslint lib test", "lint:fix": "npm run lint -- --fix", unit: "istanbul test _mocha --reporter=spec test/index.js", test: "npm run lint && npm run unit", version: "grunt dist && git add dist/" }, repository: { type: "git", url: "git@github.com:indutny/elliptic" }, keywords: ["EC", "Elliptic", "curve", "Cryptography"], author: "Fedor Indutny <fedor@indutny.com>", license: "MIT", bugs: { url: "https://github.com/indutny/elliptic/issues" }, homepage: "https://github.com/indutny/elliptic", devDependencies: { brfs: "^2.0.2", coveralls: "^3.1.0", eslint: "^7.6.0", grunt: "^1.2.1", "grunt-browserify": "^5.3.0", "grunt-cli": "^1.3.2", "grunt-contrib-connect": "^3.0.0", "grunt-contrib-copy": "^1.0.0", "grunt-contrib-uglify": "^5.0.0", "grunt-mocha-istanbul": "^5.0.2", "grunt-saucelabs": "^9.0.1", istanbul: "^0.4.5", mocha: "^8.0.1" }, dependencies: { "bn.js": "^4.11.9", brorand: "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", inherits: "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } };
- }, {}], 422: [function(g, C, i) {
- var e = Object.create || function(H) {
- var S = function() {
- };
- return S.prototype = H, new S();
- }, A = Object.keys || function(H) {
- var S = [];
- for (var z in H) Object.prototype.hasOwnProperty.call(H, z) && S.push(z);
- return z;
- }, s = Function.prototype.bind || function(H) {
- var S = this;
- return function() {
- return S.apply(H, arguments);
- };
- };
- function l() {
- this._events && Object.prototype.hasOwnProperty.call(this, "_events") || (this._events = e(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;
- }
- C.exports = l, l.EventEmitter = l, l.prototype._events = void 0, l.prototype._maxListeners = void 0;
- var n, a = 10;
- try {
- var d = {};
- Object.defineProperty && Object.defineProperty(d, "x", { value: 0 }), n = d.x === 0;
- } catch {
- n = !1;
- }
- function o(H) {
- return H._maxListeners === void 0 ? l.defaultMaxListeners : H._maxListeners;
- }
- function c(H, S, z) {
- if (S) H.call(z);
- else for (var v = H.length, K = X(H, v), V = 0; V < v; ++V) K[V].call(z);
- }
- function r(H, S, z, v) {
- if (S) H.call(z, v);
- else for (var K = H.length, V = X(H, K), N = 0; N < K; ++N) V[N].call(z, v);
- }
- function h(H, S, z, v, K) {
- if (S) H.call(z, v, K);
- else for (var V = H.length, N = X(H, V), B = 0; B < V; ++B) N[B].call(z, v, K);
- }
- function b(H, S, z, v, K, V) {
- if (S) H.call(z, v, K, V);
- else for (var N = H.length, B = X(H, N), G = 0; G < N; ++G) B[G].call(z, v, K, V);
- }
- function u(H, S, z, v) {
- if (S) H.apply(z, v);
- else for (var K = H.length, V = X(H, K), N = 0; N < K; ++N) V[N].apply(z, v);
- }
- function m(H, S, z, v) {
- var K, V, N;
- if (typeof z != "function") throw new TypeError('"listener" argument must be a function');
- if ((V = H._events) ? (V.newListener && (H.emit("newListener", S, z.listener ? z.listener : z), V = H._events), N = V[S]) : (V = H._events = e(null), H._eventsCount = 0), N) {
- if (typeof N == "function" ? N = V[S] = v ? [z, N] : [N, z] : v ? N.unshift(z) : N.push(z), !N.warned && (K = o(H)) && K > 0 && N.length > K) {
- N.warned = !0;
- var B = new Error("Possible EventEmitter memory leak detected. " + N.length + ' "' + String(S) + '" listeners added. Use emitter.setMaxListeners() to increase limit.');
- B.name = "MaxListenersExceededWarning", B.emitter = H, B.type = S, B.count = N.length, typeof console == "object" && console.warn && console.warn("%s: %s", B.name, B.message);
- }
- } else N = V[S] = z, ++H._eventsCount;
- return H;
- }
- function Z() {
- if (!this.fired) switch (this.target.removeListener(this.type, this.wrapFn), this.fired = !0, arguments.length) {
- case 0:
- return this.listener.call(this.target);
- case 1:
- return this.listener.call(this.target, arguments[0]);
- case 2:
- return this.listener.call(this.target, arguments[0], arguments[1]);
- case 3:
- return this.listener.call(this.target, arguments[0], arguments[1], arguments[2]);
- default:
- for (var H = new Array(arguments.length), S = 0; S < H.length; ++S) H[S] = arguments[S];
- this.listener.apply(this.target, H);
- }
- }
- function p(H, S, z) {
- var v = { fired: !1, wrapFn: void 0, target: H, type: S, listener: z }, K = s.call(Z, v);
- return K.listener = z, v.wrapFn = K, K;
- }
- function Y(H, S, z) {
- var v = H._events;
- if (!v) return [];
- var K = v[S];
- return K ? typeof K == "function" ? z ? [K.listener || K] : [K] : z ? function(V) {
- for (var N = new Array(V.length), B = 0; B < N.length; ++B) N[B] = V[B].listener || V[B];
- return N;
- }(K) : X(K, K.length) : [];
- }
- function R(H) {
- var S = this._events;
- if (S) {
- var z = S[H];
- if (typeof z == "function") return 1;
- if (z) return z.length;
- }
- return 0;
- }
- function X(H, S) {
- for (var z = new Array(S), v = 0; v < S; ++v) z[v] = H[v];
- return z;
- }
- n ? Object.defineProperty(l, "defaultMaxListeners", { enumerable: !0, get: function() {
- return a;
- }, set: function(H) {
- if (typeof H != "number" || H < 0 || H != H) throw new TypeError('"defaultMaxListeners" must be a positive number');
- a = H;
- } }) : l.defaultMaxListeners = a, l.prototype.setMaxListeners = function(H) {
- if (typeof H != "number" || H < 0 || isNaN(H)) throw new TypeError('"n" argument must be a positive number');
- return this._maxListeners = H, this;
- }, l.prototype.getMaxListeners = function() {
- return o(this);
- }, l.prototype.emit = function(H) {
- var S, z, v, K, V, N, B = H === "error";
- if (N = this._events) B = B && N.error == null;
- else if (!B) return !1;
- if (B) {
- if (arguments.length > 1 && (S = arguments[1]), S instanceof Error) throw S;
- var G = new Error('Unhandled "error" event. (' + S + ")");
- throw G.context = S, G;
- }
- if (!(z = N[H])) return !1;
- var w = typeof z == "function";
- switch (v = arguments.length) {
- case 1:
- c(z, w, this);
- break;
- case 2:
- r(z, w, this, arguments[1]);
- break;
- case 3:
- h(z, w, this, arguments[1], arguments[2]);
- break;
- case 4:
- b(z, w, this, arguments[1], arguments[2], arguments[3]);
- break;
- default:
- for (K = new Array(v - 1), V = 1; V < v; V++) K[V - 1] = arguments[V];
- u(z, w, this, K);
- }
- return !0;
- }, l.prototype.addListener = function(H, S) {
- return m(this, H, S, !1);
- }, l.prototype.on = l.prototype.addListener, l.prototype.prependListener = function(H, S) {
- return m(this, H, S, !0);
- }, l.prototype.once = function(H, S) {
- if (typeof S != "function") throw new TypeError('"listener" argument must be a function');
- return this.on(H, p(this, H, S)), this;
- }, l.prototype.prependOnceListener = function(H, S) {
- if (typeof S != "function") throw new TypeError('"listener" argument must be a function');
- return this.prependListener(H, p(this, H, S)), this;
- }, l.prototype.removeListener = function(H, S) {
- var z, v, K, V, N;
- if (typeof S != "function") throw new TypeError('"listener" argument must be a function');
- if (!(v = this._events)) return this;
- if (!(z = v[H])) return this;
- if (z === S || z.listener === S) --this._eventsCount == 0 ? this._events = e(null) : (delete v[H], v.removeListener && this.emit("removeListener", H, z.listener || S));
- else if (typeof z != "function") {
- for (K = -1, V = z.length - 1; V >= 0; V--) if (z[V] === S || z[V].listener === S) {
- N = z[V].listener, K = V;
- break;
- }
- if (K < 0) return this;
- K === 0 ? z.shift() : function(B, G) {
- for (var w = G, W = w + 1, y = B.length; W < y; w += 1, W += 1) B[w] = B[W];
- B.pop();
- }(z, K), z.length === 1 && (v[H] = z[0]), v.removeListener && this.emit("removeListener", H, N || S);
- }
- return this;
- }, l.prototype.removeAllListeners = function(H) {
- var S, z, v;
- if (!(z = this._events)) return this;
- if (!z.removeListener) return arguments.length === 0 ? (this._events = e(null), this._eventsCount = 0) : z[H] && (--this._eventsCount == 0 ? this._events = e(null) : delete z[H]), this;
- if (arguments.length === 0) {
- var K, V = A(z);
- for (v = 0; v < V.length; ++v) (K = V[v]) !== "removeListener" && this.removeAllListeners(K);
- return this.removeAllListeners("removeListener"), this._events = e(null), this._eventsCount = 0, this;
- }
- if (typeof (S = z[H]) == "function") this.removeListener(H, S);
- else if (S) for (v = S.length - 1; v >= 0; v--) this.removeListener(H, S[v]);
- return this;
- }, l.prototype.listeners = function(H) {
- return Y(this, H, !0);
- }, l.prototype.rawListeners = function(H) {
- return Y(this, H, !1);
- }, l.listenerCount = function(H, S) {
- return typeof H.listenerCount == "function" ? H.listenerCount(S) : R.call(H, S);
- }, l.prototype.listenerCount = R, l.prototype.eventNames = function() {
- return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
- };
- }, {}], 423: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("md5.js");
- C.exports = function(s, l, n, a) {
- if (e.isBuffer(s) || (s = e.from(s, "binary")), l && (e.isBuffer(l) || (l = e.from(l, "binary")), l.length !== 8)) throw new RangeError("salt should be Buffer with 8 byte length");
- for (var d = n / 8, o = e.alloc(d), c = e.alloc(a || 0), r = e.alloc(0); d > 0 || a > 0; ) {
- var h = new A();
- h.update(r), h.update(s), l && h.update(l), r = h.digest();
- var b = 0;
- if (d > 0) {
- var u = o.length - d;
- b = Math.min(d, r.length), r.copy(o, u, 0, b), d -= b;
- }
- if (b < r.length && a > 0) {
- var m = c.length - a, Z = Math.min(a, r.length - b);
- r.copy(c, m, b, b + Z), a -= Z;
- }
- }
- return r.fill(0), { key: o, iv: c };
- };
- }, { "md5.js": 450, "safe-buffer": 494 }], 424: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvParserStream = i.ParserOptions = i.parseFile = i.parseStream = i.parseString = i.parse = i.FormatterOptions = i.CsvFormatterStream = i.writeToPath = i.writeToString = i.writeToBuffer = i.writeToStream = i.write = i.format = void 0;
- var e = g("@fast-csv/format");
- Object.defineProperty(i, "format", { enumerable: !0, get: function() {
- return e.format;
- } }), Object.defineProperty(i, "write", { enumerable: !0, get: function() {
- return e.write;
- } }), Object.defineProperty(i, "writeToStream", { enumerable: !0, get: function() {
- return e.writeToStream;
- } }), Object.defineProperty(i, "writeToBuffer", { enumerable: !0, get: function() {
- return e.writeToBuffer;
- } }), Object.defineProperty(i, "writeToString", { enumerable: !0, get: function() {
- return e.writeToString;
- } }), Object.defineProperty(i, "writeToPath", { enumerable: !0, get: function() {
- return e.writeToPath;
- } }), Object.defineProperty(i, "CsvFormatterStream", { enumerable: !0, get: function() {
- return e.CsvFormatterStream;
- } }), Object.defineProperty(i, "FormatterOptions", { enumerable: !0, get: function() {
- return e.FormatterOptions;
- } });
- var A = g("@fast-csv/parse");
- Object.defineProperty(i, "parse", { enumerable: !0, get: function() {
- return A.parse;
- } }), Object.defineProperty(i, "parseString", { enumerable: !0, get: function() {
- return A.parseString;
- } }), Object.defineProperty(i, "parseStream", { enumerable: !0, get: function() {
- return A.parseStream;
- } }), Object.defineProperty(i, "parseFile", { enumerable: !0, get: function() {
- return A.parseFile;
- } }), Object.defineProperty(i, "ParserOptions", { enumerable: !0, get: function() {
- return A.ParserOptions;
- } }), Object.defineProperty(i, "CsvParserStream", { enumerable: !0, get: function() {
- return A.CsvParserStream;
- } });
- }, { "@fast-csv/format": 151, "@fast-csv/parse": 155 }], 425: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("readable-stream").Transform;
- function s(l) {
- A.call(this), this._block = e.allocUnsafe(l), this._blockSize = l, this._blockOffset = 0, this._length = [0, 0, 0, 0], this._finalized = !1;
- }
- g("inherits")(s, A), s.prototype._transform = function(l, n, a) {
- var d = null;
- try {
- this.update(l, n);
- } catch (o) {
- d = o;
- }
- a(d);
- }, s.prototype._flush = function(l) {
- var n = null;
- try {
- this.push(this.digest());
- } catch (a) {
- n = a;
- }
- l(n);
- }, s.prototype.update = function(l, n) {
- if (function(h, b) {
- if (!e.isBuffer(h) && typeof h != "string") throw new TypeError(b + " must be a string or a buffer");
- }(l, "Data"), this._finalized) throw new Error("Digest already called");
- e.isBuffer(l) || (l = e.from(l, n));
- for (var a = this._block, d = 0; this._blockOffset + l.length - d >= this._blockSize; ) {
- for (var o = this._blockOffset; o < this._blockSize; ) a[o++] = l[d++];
- this._update(), this._blockOffset = 0;
- }
- for (; d < l.length; ) a[this._blockOffset++] = l[d++];
- for (var c = 0, r = 8 * l.length; r > 0; ++c) this._length[c] += r, (r = this._length[c] / 4294967296 | 0) > 0 && (this._length[c] -= 4294967296 * r);
- return this;
- }, s.prototype._update = function() {
- throw new Error("_update is not implemented");
- }, s.prototype.digest = function(l) {
- if (this._finalized) throw new Error("Digest already called");
- this._finalized = !0;
- var n = this._digest();
- l !== void 0 && (n = n.toString(l)), this._block.fill(0), this._blockOffset = 0;
- for (var a = 0; a < 4; ++a) this._length[a] = 0;
- return n;
- }, s.prototype._digest = function() {
- throw new Error("_digest is not implemented");
- }, C.exports = s;
- }, { inherits: 440, "readable-stream": 491, "safe-buffer": 494 }], 426: [function(g, C, i) {
- var e = i;
- e.utils = g("./hash/utils"), e.common = g("./hash/common"), e.sha = g("./hash/sha"), e.ripemd = g("./hash/ripemd"), e.hmac = g("./hash/hmac"), e.sha1 = e.sha.sha1, e.sha256 = e.sha.sha256, e.sha224 = e.sha.sha224, e.sha384 = e.sha.sha384, e.sha512 = e.sha.sha512, e.ripemd160 = e.ripemd.ripemd160;
- }, { "./hash/common": 427, "./hash/hmac": 428, "./hash/ripemd": 429, "./hash/sha": 430, "./hash/utils": 437 }], 427: [function(g, C, i) {
- var e = g("./utils"), A = g("minimalistic-assert");
- function s() {
- this.pending = null, this.pendingTotal = 0, this.blockSize = this.constructor.blockSize, this.outSize = this.constructor.outSize, this.hmacStrength = this.constructor.hmacStrength, this.padLength = this.constructor.padLength / 8, this.endian = "big", this._delta8 = this.blockSize / 8, this._delta32 = this.blockSize / 32;
- }
- i.BlockHash = s, s.prototype.update = function(l, n) {
- if (l = e.toArray(l, n), this.pending ? this.pending = this.pending.concat(l) : this.pending = l, this.pendingTotal += l.length, this.pending.length >= this._delta8) {
- var a = (l = this.pending).length % this._delta8;
- this.pending = l.slice(l.length - a, l.length), this.pending.length === 0 && (this.pending = null), l = e.join32(l, 0, l.length - a, this.endian);
- for (var d = 0; d < l.length; d += this._delta32) this._update(l, d, d + this._delta32);
- }
- return this;
- }, s.prototype.digest = function(l) {
- return this.update(this._pad()), A(this.pending === null), this._digest(l);
- }, s.prototype._pad = function() {
- var l = this.pendingTotal, n = this._delta8, a = n - (l + this.padLength) % n, d = new Array(a + this.padLength);
- d[0] = 128;
- for (var o = 1; o < a; o++) d[o] = 0;
- if (l <<= 3, this.endian === "big") {
- for (var c = 8; c < this.padLength; c++) d[o++] = 0;
- d[o++] = 0, d[o++] = 0, d[o++] = 0, d[o++] = 0, d[o++] = l >>> 24 & 255, d[o++] = l >>> 16 & 255, d[o++] = l >>> 8 & 255, d[o++] = 255 & l;
- } else for (d[o++] = 255 & l, d[o++] = l >>> 8 & 255, d[o++] = l >>> 16 & 255, d[o++] = l >>> 24 & 255, d[o++] = 0, d[o++] = 0, d[o++] = 0, d[o++] = 0, c = 8; c < this.padLength; c++) d[o++] = 0;
- return d;
- };
- }, { "./utils": 437, "minimalistic-assert": 453 }], 428: [function(g, C, i) {
- var e = g("./utils"), A = g("minimalistic-assert");
- function s(l, n, a) {
- if (!(this instanceof s)) return new s(l, n, a);
- this.Hash = l, this.blockSize = l.blockSize / 8, this.outSize = l.outSize / 8, this.inner = null, this.outer = null, this._init(e.toArray(n, a));
- }
- C.exports = s, s.prototype._init = function(l) {
- l.length > this.blockSize && (l = new this.Hash().update(l).digest()), A(l.length <= this.blockSize);
- for (var n = l.length; n < this.blockSize; n++) l.push(0);
- for (n = 0; n < l.length; n++) l[n] ^= 54;
- for (this.inner = new this.Hash().update(l), n = 0; n < l.length; n++) l[n] ^= 106;
- this.outer = new this.Hash().update(l);
- }, s.prototype.update = function(l, n) {
- return this.inner.update(l, n), this;
- }, s.prototype.digest = function(l) {
- return this.outer.update(this.inner.digest()), this.outer.digest(l);
- };
- }, { "./utils": 437, "minimalistic-assert": 453 }], 429: [function(g, C, i) {
- var e = g("./utils"), A = g("./common"), s = e.rotl32, l = e.sum32, n = e.sum32_3, a = e.sum32_4, d = A.BlockHash;
- function o() {
- if (!(this instanceof o)) return new o();
- d.call(this), this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520], this.endian = "little";
- }
- function c(p, Y, R, X) {
- return p <= 15 ? Y ^ R ^ X : p <= 31 ? Y & R | ~Y & X : p <= 47 ? (Y | ~R) ^ X : p <= 63 ? Y & X | R & ~X : Y ^ (R | ~X);
- }
- function r(p) {
- return p <= 15 ? 0 : p <= 31 ? 1518500249 : p <= 47 ? 1859775393 : p <= 63 ? 2400959708 : 2840853838;
- }
- function h(p) {
- return p <= 15 ? 1352829926 : p <= 31 ? 1548603684 : p <= 47 ? 1836072691 : p <= 63 ? 2053994217 : 0;
- }
- e.inherits(o, d), i.ripemd160 = o, o.blockSize = 512, o.outSize = 160, o.hmacStrength = 192, o.padLength = 64, o.prototype._update = function(p, Y) {
- for (var R = this.h[0], X = this.h[1], H = this.h[2], S = this.h[3], z = this.h[4], v = R, K = X, V = H, N = S, B = z, G = 0; G < 80; G++) {
- var w = l(s(a(R, c(G, X, H, S), p[b[G] + Y], r(G)), m[G]), z);
- R = z, z = S, S = s(H, 10), H = X, X = w, w = l(s(a(v, c(79 - G, K, V, N), p[u[G] + Y], h(G)), Z[G]), B), v = B, B = N, N = s(V, 10), V = K, K = w;
- }
- w = n(this.h[1], H, N), this.h[1] = n(this.h[2], S, B), this.h[2] = n(this.h[3], z, v), this.h[3] = n(this.h[4], R, K), this.h[4] = n(this.h[0], X, V), this.h[0] = w;
- }, o.prototype._digest = function(p) {
- return p === "hex" ? e.toHex32(this.h, "little") : e.split32(this.h, "little");
- };
- var b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], u = [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11], m = [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], Z = [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11];
- }, { "./common": 427, "./utils": 437 }], 430: [function(g, C, i) {
- i.sha1 = g("./sha/1"), i.sha224 = g("./sha/224"), i.sha256 = g("./sha/256"), i.sha384 = g("./sha/384"), i.sha512 = g("./sha/512");
- }, { "./sha/1": 431, "./sha/224": 432, "./sha/256": 433, "./sha/384": 434, "./sha/512": 435 }], 431: [function(g, C, i) {
- var e = g("../utils"), A = g("../common"), s = g("./common"), l = e.rotl32, n = e.sum32, a = e.sum32_5, d = s.ft_1, o = A.BlockHash, c = [1518500249, 1859775393, 2400959708, 3395469782];
- function r() {
- if (!(this instanceof r)) return new r();
- o.call(this), this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520], this.W = new Array(80);
- }
- e.inherits(r, o), C.exports = r, r.blockSize = 512, r.outSize = 160, r.hmacStrength = 80, r.padLength = 64, r.prototype._update = function(h, b) {
- for (var u = this.W, m = 0; m < 16; m++) u[m] = h[b + m];
- for (; m < u.length; m++) u[m] = l(u[m - 3] ^ u[m - 8] ^ u[m - 14] ^ u[m - 16], 1);
- var Z = this.h[0], p = this.h[1], Y = this.h[2], R = this.h[3], X = this.h[4];
- for (m = 0; m < u.length; m++) {
- var H = ~~(m / 20), S = a(l(Z, 5), d(H, p, Y, R), X, u[m], c[H]);
- X = R, R = Y, Y = l(p, 30), p = Z, Z = S;
- }
- this.h[0] = n(this.h[0], Z), this.h[1] = n(this.h[1], p), this.h[2] = n(this.h[2], Y), this.h[3] = n(this.h[3], R), this.h[4] = n(this.h[4], X);
- }, r.prototype._digest = function(h) {
- return h === "hex" ? e.toHex32(this.h, "big") : e.split32(this.h, "big");
- };
- }, { "../common": 427, "../utils": 437, "./common": 436 }], 432: [function(g, C, i) {
- var e = g("../utils"), A = g("./256");
- function s() {
- if (!(this instanceof s)) return new s();
- A.call(this), this.h = [3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428];
- }
- e.inherits(s, A), C.exports = s, s.blockSize = 512, s.outSize = 224, s.hmacStrength = 192, s.padLength = 64, s.prototype._digest = function(l) {
- return l === "hex" ? e.toHex32(this.h.slice(0, 7), "big") : e.split32(this.h.slice(0, 7), "big");
- };
- }, { "../utils": 437, "./256": 433 }], 433: [function(g, C, i) {
- var e = g("../utils"), A = g("../common"), s = g("./common"), l = g("minimalistic-assert"), n = e.sum32, a = e.sum32_4, d = e.sum32_5, o = s.ch32, c = s.maj32, r = s.s0_256, h = s.s1_256, b = s.g0_256, u = s.g1_256, m = A.BlockHash, Z = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298];
- function p() {
- if (!(this instanceof p)) return new p();
- m.call(this), this.h = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225], this.k = Z, this.W = new Array(64);
- }
- e.inherits(p, m), C.exports = p, p.blockSize = 512, p.outSize = 256, p.hmacStrength = 192, p.padLength = 64, p.prototype._update = function(Y, R) {
- for (var X = this.W, H = 0; H < 16; H++) X[H] = Y[R + H];
- for (; H < X.length; H++) X[H] = a(u(X[H - 2]), X[H - 7], b(X[H - 15]), X[H - 16]);
- var S = this.h[0], z = this.h[1], v = this.h[2], K = this.h[3], V = this.h[4], N = this.h[5], B = this.h[6], G = this.h[7];
- for (l(this.k.length === X.length), H = 0; H < X.length; H++) {
- var w = d(G, h(V), o(V, N, B), this.k[H], X[H]), W = n(r(S), c(S, z, v));
- G = B, B = N, N = V, V = n(K, w), K = v, v = z, z = S, S = n(w, W);
- }
- this.h[0] = n(this.h[0], S), this.h[1] = n(this.h[1], z), this.h[2] = n(this.h[2], v), this.h[3] = n(this.h[3], K), this.h[4] = n(this.h[4], V), this.h[5] = n(this.h[5], N), this.h[6] = n(this.h[6], B), this.h[7] = n(this.h[7], G);
- }, p.prototype._digest = function(Y) {
- return Y === "hex" ? e.toHex32(this.h, "big") : e.split32(this.h, "big");
- };
- }, { "../common": 427, "../utils": 437, "./common": 436, "minimalistic-assert": 453 }], 434: [function(g, C, i) {
- var e = g("../utils"), A = g("./512");
- function s() {
- if (!(this instanceof s)) return new s();
- A.call(this), this.h = [3418070365, 3238371032, 1654270250, 914150663, 2438529370, 812702999, 355462360, 4144912697, 1731405415, 4290775857, 2394180231, 1750603025, 3675008525, 1694076839, 1203062813, 3204075428];
- }
- e.inherits(s, A), C.exports = s, s.blockSize = 1024, s.outSize = 384, s.hmacStrength = 192, s.padLength = 128, s.prototype._digest = function(l) {
- return l === "hex" ? e.toHex32(this.h.slice(0, 12), "big") : e.split32(this.h.slice(0, 12), "big");
- };
- }, { "../utils": 437, "./512": 435 }], 435: [function(g, C, i) {
- var e = g("../utils"), A = g("../common"), s = g("minimalistic-assert"), l = e.rotr64_hi, n = e.rotr64_lo, a = e.shr64_hi, d = e.shr64_lo, o = e.sum64, c = e.sum64_hi, r = e.sum64_lo, h = e.sum64_4_hi, b = e.sum64_4_lo, u = e.sum64_5_hi, m = e.sum64_5_lo, Z = A.BlockHash, p = [1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591];
- function Y() {
- if (!(this instanceof Y)) return new Y();
- Z.call(this), this.h = [1779033703, 4089235720, 3144134277, 2227873595, 1013904242, 4271175723, 2773480762, 1595750129, 1359893119, 2917565137, 2600822924, 725511199, 528734635, 4215389547, 1541459225, 327033209], this.k = p, this.W = new Array(160);
- }
- function R(W, y, f, D, F) {
- var T = W & f ^ ~W & F;
- return T < 0 && (T += 4294967296), T;
- }
- function X(W, y, f, D, F, T) {
- var Q = y & D ^ ~y & T;
- return Q < 0 && (Q += 4294967296), Q;
- }
- function H(W, y, f, D, F) {
- var T = W & f ^ W & F ^ f & F;
- return T < 0 && (T += 4294967296), T;
- }
- function S(W, y, f, D, F, T) {
- var Q = y & D ^ y & T ^ D & T;
- return Q < 0 && (Q += 4294967296), Q;
- }
- function z(W, y) {
- var f = l(W, y, 28) ^ l(y, W, 2) ^ l(y, W, 7);
- return f < 0 && (f += 4294967296), f;
- }
- function v(W, y) {
- var f = n(W, y, 28) ^ n(y, W, 2) ^ n(y, W, 7);
- return f < 0 && (f += 4294967296), f;
- }
- function K(W, y) {
- var f = l(W, y, 14) ^ l(W, y, 18) ^ l(y, W, 9);
- return f < 0 && (f += 4294967296), f;
- }
- function V(W, y) {
- var f = n(W, y, 14) ^ n(W, y, 18) ^ n(y, W, 9);
- return f < 0 && (f += 4294967296), f;
- }
- function N(W, y) {
- var f = l(W, y, 1) ^ l(W, y, 8) ^ a(W, y, 7);
- return f < 0 && (f += 4294967296), f;
- }
- function B(W, y) {
- var f = n(W, y, 1) ^ n(W, y, 8) ^ d(W, y, 7);
- return f < 0 && (f += 4294967296), f;
- }
- function G(W, y) {
- var f = l(W, y, 19) ^ l(y, W, 29) ^ a(W, y, 6);
- return f < 0 && (f += 4294967296), f;
- }
- function w(W, y) {
- var f = n(W, y, 19) ^ n(y, W, 29) ^ d(W, y, 6);
- return f < 0 && (f += 4294967296), f;
- }
- e.inherits(Y, Z), C.exports = Y, Y.blockSize = 1024, Y.outSize = 512, Y.hmacStrength = 192, Y.padLength = 128, Y.prototype._prepareBlock = function(W, y) {
- for (var f = this.W, D = 0; D < 32; D++) f[D] = W[y + D];
- for (; D < f.length; D += 2) {
- var F = G(f[D - 4], f[D - 3]), T = w(f[D - 4], f[D - 3]), Q = f[D - 14], P = f[D - 13], L = N(f[D - 30], f[D - 29]), E = B(f[D - 30], f[D - 29]), J = f[D - 32], k = f[D - 31];
- f[D] = h(F, T, Q, P, L, E, J, k), f[D + 1] = b(F, T, Q, P, L, E, J, k);
- }
- }, Y.prototype._update = function(W, y) {
- this._prepareBlock(W, y);
- var f = this.W, D = this.h[0], F = this.h[1], T = this.h[2], Q = this.h[3], P = this.h[4], L = this.h[5], E = this.h[6], J = this.h[7], k = this.h[8], j = this.h[9], q = this.h[10], Cg = this.h[11], Ig = this.h[12], x = this.h[13], Ag = this.h[14], eg = this.h[15];
- s(this.k.length === f.length);
- for (var O = 0; O < f.length; O += 2) {
- var _ = Ag, gg = eg, lg = K(k, j), ng = V(k, j), sg = R(k, j, q, Cg, Ig), og = X(k, j, q, Cg, Ig, x), cg = this.k[O], rg = this.k[O + 1], dg = f[O], Bg = f[O + 1], Zg = u(_, gg, lg, ng, sg, og, cg, rg, dg, Bg), Xg = m(_, gg, lg, ng, sg, og, cg, rg, dg, Bg);
- _ = z(D, F), gg = v(D, F), lg = H(D, F, T, Q, P), ng = S(D, F, T, Q, P, L);
- var Kg = c(_, gg, lg, ng), kg = r(_, gg, lg, ng);
- Ag = Ig, eg = x, Ig = q, x = Cg, q = k, Cg = j, k = c(E, J, Zg, Xg), j = r(J, J, Zg, Xg), E = P, J = L, P = T, L = Q, T = D, Q = F, D = c(Zg, Xg, Kg, kg), F = r(Zg, Xg, Kg, kg);
- }
- o(this.h, 0, D, F), o(this.h, 2, T, Q), o(this.h, 4, P, L), o(this.h, 6, E, J), o(this.h, 8, k, j), o(this.h, 10, q, Cg), o(this.h, 12, Ig, x), o(this.h, 14, Ag, eg);
- }, Y.prototype._digest = function(W) {
- return W === "hex" ? e.toHex32(this.h, "big") : e.split32(this.h, "big");
- };
- }, { "../common": 427, "../utils": 437, "minimalistic-assert": 453 }], 436: [function(g, C, i) {
- var e = g("../utils").rotr32;
- function A(n, a, d) {
- return n & a ^ ~n & d;
- }
- function s(n, a, d) {
- return n & a ^ n & d ^ a & d;
- }
- function l(n, a, d) {
- return n ^ a ^ d;
- }
- i.ft_1 = function(n, a, d, o) {
- return n === 0 ? A(a, d, o) : n === 1 || n === 3 ? l(a, d, o) : n === 2 ? s(a, d, o) : void 0;
- }, i.ch32 = A, i.maj32 = s, i.p32 = l, i.s0_256 = function(n) {
- return e(n, 2) ^ e(n, 13) ^ e(n, 22);
- }, i.s1_256 = function(n) {
- return e(n, 6) ^ e(n, 11) ^ e(n, 25);
- }, i.g0_256 = function(n) {
- return e(n, 7) ^ e(n, 18) ^ n >>> 3;
- }, i.g1_256 = function(n) {
- return e(n, 17) ^ e(n, 19) ^ n >>> 10;
- };
- }, { "../utils": 437 }], 437: [function(g, C, i) {
- var e = g("minimalistic-assert"), A = g("inherits");
- function s(d, o) {
- return (64512 & d.charCodeAt(o)) == 55296 && !(o < 0 || o + 1 >= d.length) && (64512 & d.charCodeAt(o + 1)) == 56320;
- }
- function l(d) {
- return (d >>> 24 | d >>> 8 & 65280 | d << 8 & 16711680 | (255 & d) << 24) >>> 0;
- }
- function n(d) {
- return d.length === 1 ? "0" + d : d;
- }
- function a(d) {
- return d.length === 7 ? "0" + d : d.length === 6 ? "00" + d : d.length === 5 ? "000" + d : d.length === 4 ? "0000" + d : d.length === 3 ? "00000" + d : d.length === 2 ? "000000" + d : d.length === 1 ? "0000000" + d : d;
- }
- i.inherits = A, i.toArray = function(d, o) {
- if (Array.isArray(d)) return d.slice();
- if (!d) return [];
- var c = [];
- if (typeof d == "string") if (o) {
- if (o === "hex") for ((d = d.replace(/[^a-z0-9]+/gi, "")).length % 2 != 0 && (d = "0" + d), h = 0; h < d.length; h += 2) c.push(parseInt(d[h] + d[h + 1], 16));
- } else for (var r = 0, h = 0; h < d.length; h++) {
- var b = d.charCodeAt(h);
- b < 128 ? c[r++] = b : b < 2048 ? (c[r++] = b >> 6 | 192, c[r++] = 63 & b | 128) : s(d, h) ? (b = 65536 + ((1023 & b) << 10) + (1023 & d.charCodeAt(++h)), c[r++] = b >> 18 | 240, c[r++] = b >> 12 & 63 | 128, c[r++] = b >> 6 & 63 | 128, c[r++] = 63 & b | 128) : (c[r++] = b >> 12 | 224, c[r++] = b >> 6 & 63 | 128, c[r++] = 63 & b | 128);
- }
- else for (h = 0; h < d.length; h++) c[h] = 0 | d[h];
- return c;
- }, i.toHex = function(d) {
- for (var o = "", c = 0; c < d.length; c++) o += n(d[c].toString(16));
- return o;
- }, i.htonl = l, i.toHex32 = function(d, o) {
- for (var c = "", r = 0; r < d.length; r++) {
- var h = d[r];
- o === "little" && (h = l(h)), c += a(h.toString(16));
- }
- return c;
- }, i.zero2 = n, i.zero8 = a, i.join32 = function(d, o, c, r) {
- var h = c - o;
- e(h % 4 == 0);
- for (var b = new Array(h / 4), u = 0, m = o; u < b.length; u++, m += 4) {
- var Z;
- Z = r === "big" ? d[m] << 24 | d[m + 1] << 16 | d[m + 2] << 8 | d[m + 3] : d[m + 3] << 24 | d[m + 2] << 16 | d[m + 1] << 8 | d[m], b[u] = Z >>> 0;
- }
- return b;
- }, i.split32 = function(d, o) {
- for (var c = new Array(4 * d.length), r = 0, h = 0; r < d.length; r++, h += 4) {
- var b = d[r];
- o === "big" ? (c[h] = b >>> 24, c[h + 1] = b >>> 16 & 255, c[h + 2] = b >>> 8 & 255, c[h + 3] = 255 & b) : (c[h + 3] = b >>> 24, c[h + 2] = b >>> 16 & 255, c[h + 1] = b >>> 8 & 255, c[h] = 255 & b);
- }
- return c;
- }, i.rotr32 = function(d, o) {
- return d >>> o | d << 32 - o;
- }, i.rotl32 = function(d, o) {
- return d << o | d >>> 32 - o;
- }, i.sum32 = function(d, o) {
- return d + o >>> 0;
- }, i.sum32_3 = function(d, o, c) {
- return d + o + c >>> 0;
- }, i.sum32_4 = function(d, o, c, r) {
- return d + o + c + r >>> 0;
- }, i.sum32_5 = function(d, o, c, r, h) {
- return d + o + c + r + h >>> 0;
- }, i.sum64 = function(d, o, c, r) {
- var h = d[o], b = r + d[o + 1] >>> 0, u = (b < r ? 1 : 0) + c + h;
- d[o] = u >>> 0, d[o + 1] = b;
- }, i.sum64_hi = function(d, o, c, r) {
- return (o + r >>> 0 < o ? 1 : 0) + d + c >>> 0;
- }, i.sum64_lo = function(d, o, c, r) {
- return o + r >>> 0;
- }, i.sum64_4_hi = function(d, o, c, r, h, b, u, m) {
- var Z = 0, p = o;
- return Z += (p = p + r >>> 0) < o ? 1 : 0, Z += (p = p + b >>> 0) < b ? 1 : 0, d + c + h + u + (Z += (p = p + m >>> 0) < m ? 1 : 0) >>> 0;
- }, i.sum64_4_lo = function(d, o, c, r, h, b, u, m) {
- return o + r + b + m >>> 0;
- }, i.sum64_5_hi = function(d, o, c, r, h, b, u, m, Z, p) {
- var Y = 0, R = o;
- return Y += (R = R + r >>> 0) < o ? 1 : 0, Y += (R = R + b >>> 0) < b ? 1 : 0, Y += (R = R + m >>> 0) < m ? 1 : 0, d + c + h + u + Z + (Y += (R = R + p >>> 0) < p ? 1 : 0) >>> 0;
- }, i.sum64_5_lo = function(d, o, c, r, h, b, u, m, Z, p) {
- return o + r + b + m + p >>> 0;
- }, i.rotr64_hi = function(d, o, c) {
- return (o << 32 - c | d >>> c) >>> 0;
- }, i.rotr64_lo = function(d, o, c) {
- return (d << 32 - c | o >>> c) >>> 0;
- }, i.shr64_hi = function(d, o, c) {
- return d >>> c;
- }, i.shr64_lo = function(d, o, c) {
- return (d << 32 - c | o >>> c) >>> 0;
- };
- }, { inherits: 440, "minimalistic-assert": 453 }], 438: [function(g, C, i) {
- var e = g("hash.js"), A = g("minimalistic-crypto-utils"), s = g("minimalistic-assert");
- function l(n) {
- if (!(this instanceof l)) return new l(n);
- this.hash = n.hash, this.predResist = !!n.predResist, this.outLen = this.hash.outSize, this.minEntropy = n.minEntropy || this.hash.hmacStrength, this._reseed = null, this.reseedInterval = null, this.K = null, this.V = null;
- var a = A.toArray(n.entropy, n.entropyEnc || "hex"), d = A.toArray(n.nonce, n.nonceEnc || "hex"), o = A.toArray(n.pers, n.persEnc || "hex");
- s(a.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits"), this._init(a, d, o);
- }
- C.exports = l, l.prototype._init = function(n, a, d) {
- var o = n.concat(a).concat(d);
- this.K = new Array(this.outLen / 8), this.V = new Array(this.outLen / 8);
- for (var c = 0; c < this.V.length; c++) this.K[c] = 0, this.V[c] = 1;
- this._update(o), this._reseed = 1, this.reseedInterval = 281474976710656;
- }, l.prototype._hmac = function() {
- return new e.hmac(this.hash, this.K);
- }, l.prototype._update = function(n) {
- var a = this._hmac().update(this.V).update([0]);
- n && (a = a.update(n)), this.K = a.digest(), this.V = this._hmac().update(this.V).digest(), n && (this.K = this._hmac().update(this.V).update([1]).update(n).digest(), this.V = this._hmac().update(this.V).digest());
- }, l.prototype.reseed = function(n, a, d, o) {
- typeof a != "string" && (o = d, d = a, a = null), n = A.toArray(n, a), d = A.toArray(d, o), s(n.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits"), this._update(n.concat(d || [])), this._reseed = 1;
- }, l.prototype.generate = function(n, a, d, o) {
- if (this._reseed > this.reseedInterval) throw new Error("Reseed is required");
- typeof a != "string" && (o = d, d = a, a = null), d && (d = A.toArray(d, o || "hex"), this._update(d));
- for (var c = []; c.length < n; ) this.V = this._hmac().update(this.V).digest(), c = c.concat(this.V);
- var r = c.slice(0, n);
- return this._update(d), this._reseed++, A.encode(r, a);
- };
- }, { "hash.js": 426, "minimalistic-assert": 453, "minimalistic-crypto-utils": 454 }], 439: [function(g, C, i) {
- /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
- i.read = function(e, A, s, l, n) {
- var a, d, o = 8 * n - l - 1, c = (1 << o) - 1, r = c >> 1, h = -7, b = s ? n - 1 : 0, u = s ? -1 : 1, m = e[A + b];
- for (b += u, a = m & (1 << -h) - 1, m >>= -h, h += o; h > 0; a = 256 * a + e[A + b], b += u, h -= 8) ;
- for (d = a & (1 << -h) - 1, a >>= -h, h += l; h > 0; d = 256 * d + e[A + b], b += u, h -= 8) ;
- if (a === 0) a = 1 - r;
- else {
- if (a === c) return d ? NaN : 1 / 0 * (m ? -1 : 1);
- d += Math.pow(2, l), a -= r;
- }
- return (m ? -1 : 1) * d * Math.pow(2, a - l);
- }, i.write = function(e, A, s, l, n, a) {
- var d, o, c, r = 8 * a - n - 1, h = (1 << r) - 1, b = h >> 1, u = n === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0, m = l ? 0 : a - 1, Z = l ? 1 : -1, p = A < 0 || A === 0 && 1 / A < 0 ? 1 : 0;
- for (A = Math.abs(A), isNaN(A) || A === 1 / 0 ? (o = isNaN(A) ? 1 : 0, d = h) : (d = Math.floor(Math.log(A) / Math.LN2), A * (c = Math.pow(2, -d)) < 1 && (d--, c *= 2), (A += d + b >= 1 ? u / c : u * Math.pow(2, 1 - b)) * c >= 2 && (d++, c /= 2), d + b >= h ? (o = 0, d = h) : d + b >= 1 ? (o = (A * c - 1) * Math.pow(2, n), d += b) : (o = A * Math.pow(2, b - 1) * Math.pow(2, n), d = 0)); n >= 8; e[s + m] = 255 & o, m += Z, o /= 256, n -= 8) ;
- for (d = d << n | o, r += n; r > 0; e[s + m] = 255 & d, m += Z, d /= 256, r -= 8) ;
- e[s + m - Z] |= 128 * p;
- };
- }, {}], 440: [function(g, C, i) {
- typeof Object.create == "function" ? C.exports = function(e, A) {
- A && (e.super_ = A, e.prototype = Object.create(A.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } }));
- } : C.exports = function(e, A) {
- if (A) {
- e.super_ = A;
- var s = function() {
- };
- s.prototype = A.prototype, e.prototype = new s(), e.prototype.constructor = e;
- }
- };
- }, {}], 441: [function(g, C, i) {
- (function(e, A, s, l, n, a, d, o) {
- (function() {
- /*!
-
- JSZip v3.10.1 - A JavaScript class for generating and reading zip files
- <http://stuartk.com/jszip>
-
- (c) 2009-2016 Stuart Knightley <stuart [at] stuartk.com>
- Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.
-
- JSZip uses the library pako released under the MIT license :
- https://github.com/nodeca/pako/blob/main/LICENSE
- */
- (function(c) {
- typeof i == "object" && C !== void 0 ? C.exports = c() : (typeof window < "u" ? window : A !== void 0 ? A : typeof self < "u" ? self : this).JSZip = c();
- })(function() {
- return function c(r, h, b) {
- function u(p, Y) {
- if (!h[p]) {
- if (!r[p]) {
- var R = typeof g == "function" && g;
- if (!Y && R) return R(p, !0);
- if (m) return m(p, !0);
- var X = new Error("Cannot find module '" + p + "'");
- throw X.code = "MODULE_NOT_FOUND", X;
- }
- var H = h[p] = { exports: {} };
- r[p][0].call(H.exports, function(S) {
- return u(r[p][1][S] || S);
- }, H, H.exports, c, r, h, b);
- }
- return h[p].exports;
- }
- for (var m = typeof g == "function" && g, Z = 0; Z < b.length; Z++) u(b[Z]);
- return u;
- }({ 1: [function(c, r, h) {
- var b = c("./utils"), u = c("./support"), m = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- h.encode = function(Z) {
- for (var p, Y, R, X, H, S, z, v = [], K = 0, V = Z.length, N = V, B = b.getTypeOf(Z) !== "string"; K < Z.length; ) N = V - K, R = B ? (p = Z[K++], Y = K < V ? Z[K++] : 0, K < V ? Z[K++] : 0) : (p = Z.charCodeAt(K++), Y = K < V ? Z.charCodeAt(K++) : 0, K < V ? Z.charCodeAt(K++) : 0), X = p >> 2, H = (3 & p) << 4 | Y >> 4, S = 1 < N ? (15 & Y) << 2 | R >> 6 : 64, z = 2 < N ? 63 & R : 64, v.push(m.charAt(X) + m.charAt(H) + m.charAt(S) + m.charAt(z));
- return v.join("");
- }, h.decode = function(Z) {
- var p, Y, R, X, H, S, z = 0, v = 0, K = "data:";
- if (Z.substr(0, K.length) === K) throw new Error("Invalid base64 input, it looks like a data url.");
- var V, N = 3 * (Z = Z.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
- if (Z.charAt(Z.length - 1) === m.charAt(64) && N--, Z.charAt(Z.length - 2) === m.charAt(64) && N--, N % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
- for (V = u.uint8array ? new Uint8Array(0 | N) : new Array(0 | N); z < Z.length; ) p = m.indexOf(Z.charAt(z++)) << 2 | (X = m.indexOf(Z.charAt(z++))) >> 4, Y = (15 & X) << 4 | (H = m.indexOf(Z.charAt(z++))) >> 2, R = (3 & H) << 6 | (S = m.indexOf(Z.charAt(z++))), V[v++] = p, H !== 64 && (V[v++] = Y), S !== 64 && (V[v++] = R);
- return V;
- };
- }, { "./support": 30, "./utils": 32 }], 2: [function(c, r, h) {
- var b = c("./external"), u = c("./stream/DataWorker"), m = c("./stream/Crc32Probe"), Z = c("./stream/DataLengthProbe");
- function p(Y, R, X, H, S) {
- this.compressedSize = Y, this.uncompressedSize = R, this.crc32 = X, this.compression = H, this.compressedContent = S;
- }
- p.prototype = { getContentWorker: function() {
- var Y = new u(b.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new Z("data_length")), R = this;
- return Y.on("end", function() {
- if (this.streamInfo.data_length !== R.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
- }), Y;
- }, getCompressedWorker: function() {
- return new u(b.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
- } }, p.createWorkerFrom = function(Y, R, X) {
- return Y.pipe(new m()).pipe(new Z("uncompressedSize")).pipe(R.compressWorker(X)).pipe(new Z("compressedSize")).withStreamInfo("compression", R);
- }, r.exports = p;
- }, { "./external": 6, "./stream/Crc32Probe": 25, "./stream/DataLengthProbe": 26, "./stream/DataWorker": 27 }], 3: [function(c, r, h) {
- var b = c("./stream/GenericWorker");
- h.STORE = { magic: "\0\0", compressWorker: function() {
- return new b("STORE compression");
- }, uncompressWorker: function() {
- return new b("STORE decompression");
- } }, h.DEFLATE = c("./flate");
- }, { "./flate": 7, "./stream/GenericWorker": 28 }], 4: [function(c, r, h) {
- var b = c("./utils"), u = function() {
- for (var m, Z = [], p = 0; p < 256; p++) {
- m = p;
- for (var Y = 0; Y < 8; Y++) m = 1 & m ? 3988292384 ^ m >>> 1 : m >>> 1;
- Z[p] = m;
- }
- return Z;
- }();
- r.exports = function(m, Z) {
- return m !== void 0 && m.length ? b.getTypeOf(m) !== "string" ? function(p, Y, R, X) {
- var H = u, S = 0 + R;
- p ^= -1;
- for (var z = 0; z < S; z++) p = p >>> 8 ^ H[255 & (p ^ Y[z])];
- return -1 ^ p;
- }(0 | Z, m, m.length) : function(p, Y, R, X) {
- var H = u, S = 0 + R;
- p ^= -1;
- for (var z = 0; z < S; z++) p = p >>> 8 ^ H[255 & (p ^ Y.charCodeAt(z))];
- return -1 ^ p;
- }(0 | Z, m, m.length) : 0;
- };
- }, { "./utils": 32 }], 5: [function(c, r, h) {
- h.base64 = !1, h.binary = !1, h.dir = !1, h.createFolders = !0, h.date = null, h.compression = null, h.compressionOptions = null, h.comment = null, h.unixPermissions = null, h.dosPermissions = null;
- }, {}], 6: [function(c, r, h) {
- var b;
- b = typeof Promise < "u" ? Promise : c("lie"), r.exports = { Promise: b };
- }, { lie: 37 }], 7: [function(c, r, h) {
- var b = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", u = c("pako"), m = c("./utils"), Z = c("./stream/GenericWorker"), p = b ? "uint8array" : "array";
- function Y(R, X) {
- Z.call(this, "FlateWorker/" + R), this._pako = null, this._pakoAction = R, this._pakoOptions = X, this.meta = {};
- }
- h.magic = "\b\0", m.inherits(Y, Z), Y.prototype.processChunk = function(R) {
- this.meta = R.meta, this._pako === null && this._createPako(), this._pako.push(m.transformTo(p, R.data), !1);
- }, Y.prototype.flush = function() {
- Z.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
- }, Y.prototype.cleanUp = function() {
- Z.prototype.cleanUp.call(this), this._pako = null;
- }, Y.prototype._createPako = function() {
- this._pako = new u[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
- var R = this;
- this._pako.onData = function(X) {
- R.push({ data: X, meta: R.meta });
- };
- }, h.compressWorker = function(R) {
- return new Y("Deflate", R);
- }, h.uncompressWorker = function() {
- return new Y("Inflate", {});
- };
- }, { "./stream/GenericWorker": 28, "./utils": 32, pako: 38 }], 8: [function(c, r, h) {
- function b(H, S) {
- var z, v = "";
- for (z = 0; z < S; z++) v += String.fromCharCode(255 & H), H >>>= 8;
- return v;
- }
- function u(H, S, z, v, K, V) {
- var N, B, G = H.file, w = H.compression, W = V !== p.utf8encode, y = m.transformTo("string", V(G.name)), f = m.transformTo("string", p.utf8encode(G.name)), D = G.comment, F = m.transformTo("string", V(D)), T = m.transformTo("string", p.utf8encode(D)), Q = f.length !== G.name.length, P = T.length !== D.length, L = "", E = "", J = "", k = G.dir, j = G.date, q = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
- S && !z || (q.crc32 = H.crc32, q.compressedSize = H.compressedSize, q.uncompressedSize = H.uncompressedSize);
- var Cg = 0;
- S && (Cg |= 8), W || !Q && !P || (Cg |= 2048);
- var Ig = 0, x = 0;
- k && (Ig |= 16), K === "UNIX" ? (x = 798, Ig |= function(eg, O) {
- var _ = eg;
- return eg || (_ = O ? 16893 : 33204), (65535 & _) << 16;
- }(G.unixPermissions, k)) : (x = 20, Ig |= function(eg) {
- return 63 & (eg || 0);
- }(G.dosPermissions)), N = j.getUTCHours(), N <<= 6, N |= j.getUTCMinutes(), N <<= 5, N |= j.getUTCSeconds() / 2, B = j.getUTCFullYear() - 1980, B <<= 4, B |= j.getUTCMonth() + 1, B <<= 5, B |= j.getUTCDate(), Q && (E = b(1, 1) + b(Y(y), 4) + f, L += "up" + b(E.length, 2) + E), P && (J = b(1, 1) + b(Y(F), 4) + T, L += "uc" + b(J.length, 2) + J);
- var Ag = "";
- return Ag += `
- \0`, Ag += b(Cg, 2), Ag += w.magic, Ag += b(N, 2), Ag += b(B, 2), Ag += b(q.crc32, 4), Ag += b(q.compressedSize, 4), Ag += b(q.uncompressedSize, 4), Ag += b(y.length, 2), Ag += b(L.length, 2), { fileRecord: R.LOCAL_FILE_HEADER + Ag + y + L, dirRecord: R.CENTRAL_FILE_HEADER + b(x, 2) + Ag + b(F.length, 2) + "\0\0\0\0" + b(Ig, 4) + b(v, 4) + y + L + F };
- }
- var m = c("../utils"), Z = c("../stream/GenericWorker"), p = c("../utf8"), Y = c("../crc32"), R = c("../signature");
- function X(H, S, z, v) {
- Z.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = S, this.zipPlatform = z, this.encodeFileName = v, this.streamFiles = H, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
- }
- m.inherits(X, Z), X.prototype.push = function(H) {
- var S = H.meta.percent || 0, z = this.entriesCount, v = this._sources.length;
- this.accumulate ? this.contentBuffer.push(H) : (this.bytesWritten += H.data.length, Z.prototype.push.call(this, { data: H.data, meta: { currentFile: this.currentFile, percent: z ? (S + 100 * (z - v - 1)) / z : 100 } }));
- }, X.prototype.openedSource = function(H) {
- this.currentSourceOffset = this.bytesWritten, this.currentFile = H.file.name;
- var S = this.streamFiles && !H.file.dir;
- if (S) {
- var z = u(H, S, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
- this.push({ data: z.fileRecord, meta: { percent: 0 } });
- } else this.accumulate = !0;
- }, X.prototype.closedSource = function(H) {
- this.accumulate = !1;
- var S = this.streamFiles && !H.file.dir, z = u(H, S, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
- if (this.dirRecords.push(z.dirRecord), S) this.push({ data: function(v) {
- return R.DATA_DESCRIPTOR + b(v.crc32, 4) + b(v.compressedSize, 4) + b(v.uncompressedSize, 4);
- }(H), meta: { percent: 100 } });
- else for (this.push({ data: z.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
- this.currentFile = null;
- }, X.prototype.flush = function() {
- for (var H = this.bytesWritten, S = 0; S < this.dirRecords.length; S++) this.push({ data: this.dirRecords[S], meta: { percent: 100 } });
- var z = this.bytesWritten - H, v = function(K, V, N, B, G) {
- var w = m.transformTo("string", G(B));
- return R.CENTRAL_DIRECTORY_END + "\0\0\0\0" + b(K, 2) + b(K, 2) + b(V, 4) + b(N, 4) + b(w.length, 2) + w;
- }(this.dirRecords.length, z, H, this.zipComment, this.encodeFileName);
- this.push({ data: v, meta: { percent: 100 } });
- }, X.prototype.prepareNextSource = function() {
- this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
- }, X.prototype.registerPrevious = function(H) {
- this._sources.push(H);
- var S = this;
- return H.on("data", function(z) {
- S.processChunk(z);
- }), H.on("end", function() {
- S.closedSource(S.previous.streamInfo), S._sources.length ? S.prepareNextSource() : S.end();
- }), H.on("error", function(z) {
- S.error(z);
- }), this;
- }, X.prototype.resume = function() {
- return !!Z.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
- }, X.prototype.error = function(H) {
- var S = this._sources;
- if (!Z.prototype.error.call(this, H)) return !1;
- for (var z = 0; z < S.length; z++) try {
- S[z].error(H);
- } catch {
- }
- return !0;
- }, X.prototype.lock = function() {
- Z.prototype.lock.call(this);
- for (var H = this._sources, S = 0; S < H.length; S++) H[S].lock();
- }, r.exports = X;
- }, { "../crc32": 4, "../signature": 23, "../stream/GenericWorker": 28, "../utf8": 31, "../utils": 32 }], 9: [function(c, r, h) {
- var b = c("../compressions"), u = c("./ZipFileWorker");
- h.generateWorker = function(m, Z, p) {
- var Y = new u(Z.streamFiles, p, Z.platform, Z.encodeFileName), R = 0;
- try {
- m.forEach(function(X, H) {
- R++;
- var S = function(V, N) {
- var B = V || N, G = b[B];
- if (!G) throw new Error(B + " is not a valid compression method !");
- return G;
- }(H.options.compression, Z.compression), z = H.options.compressionOptions || Z.compressionOptions || {}, v = H.dir, K = H.date;
- H._compressWorker(S, z).withStreamInfo("file", { name: X, dir: v, date: K, comment: H.comment || "", unixPermissions: H.unixPermissions, dosPermissions: H.dosPermissions }).pipe(Y);
- }), Y.entriesCount = R;
- } catch (X) {
- Y.error(X);
- }
- return Y;
- };
- }, { "../compressions": 3, "./ZipFileWorker": 8 }], 10: [function(c, r, h) {
- function b() {
- if (!(this instanceof b)) return new b();
- if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
- this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
- var u = new b();
- for (var m in this) typeof this[m] != "function" && (u[m] = this[m]);
- return u;
- };
- }
- (b.prototype = c("./object")).loadAsync = c("./load"), b.support = c("./support"), b.defaults = c("./defaults"), b.version = "3.10.1", b.loadAsync = function(u, m) {
- return new b().loadAsync(u, m);
- }, b.external = c("./external"), r.exports = b;
- }, { "./defaults": 5, "./external": 6, "./load": 11, "./object": 15, "./support": 30 }], 11: [function(c, r, h) {
- var b = c("./utils"), u = c("./external"), m = c("./utf8"), Z = c("./zipEntries"), p = c("./stream/Crc32Probe"), Y = c("./nodejsUtils");
- function R(X) {
- return new u.Promise(function(H, S) {
- var z = X.decompressed.getContentWorker().pipe(new p());
- z.on("error", function(v) {
- S(v);
- }).on("end", function() {
- z.streamInfo.crc32 !== X.decompressed.crc32 ? S(new Error("Corrupted zip : CRC32 mismatch")) : H();
- }).resume();
- });
- }
- r.exports = function(X, H) {
- var S = this;
- return H = b.extend(H || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: m.utf8decode }), Y.isNode && Y.isStream(X) ? u.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : b.prepareContent("the loaded zip file", X, !0, H.optimizedBinaryString, H.base64).then(function(z) {
- var v = new Z(H);
- return v.load(z), v;
- }).then(function(z) {
- var v = [u.Promise.resolve(z)], K = z.files;
- if (H.checkCRC32) for (var V = 0; V < K.length; V++) v.push(R(K[V]));
- return u.Promise.all(v);
- }).then(function(z) {
- for (var v = z.shift(), K = v.files, V = 0; V < K.length; V++) {
- var N = K[V], B = N.fileNameStr, G = b.resolve(N.fileNameStr);
- S.file(G, N.decompressed, { binary: !0, optimizedBinaryString: !0, date: N.date, dir: N.dir, comment: N.fileCommentStr.length ? N.fileCommentStr : null, unixPermissions: N.unixPermissions, dosPermissions: N.dosPermissions, createFolders: H.createFolders }), N.dir || (S.file(G).unsafeOriginalName = B);
- }
- return v.zipComment.length && (S.comment = v.zipComment), S;
- });
- };
- }, { "./external": 6, "./nodejsUtils": 14, "./stream/Crc32Probe": 25, "./utf8": 31, "./utils": 32, "./zipEntries": 33 }], 12: [function(c, r, h) {
- var b = c("../utils"), u = c("../stream/GenericWorker");
- function m(Z, p) {
- u.call(this, "Nodejs stream input adapter for " + Z), this._upstreamEnded = !1, this._bindStream(p);
- }
- b.inherits(m, u), m.prototype._bindStream = function(Z) {
- var p = this;
- (this._stream = Z).pause(), Z.on("data", function(Y) {
- p.push({ data: Y, meta: { percent: 0 } });
- }).on("error", function(Y) {
- p.isPaused ? this.generatedError = Y : p.error(Y);
- }).on("end", function() {
- p.isPaused ? p._upstreamEnded = !0 : p.end();
- });
- }, m.prototype.pause = function() {
- return !!u.prototype.pause.call(this) && (this._stream.pause(), !0);
- }, m.prototype.resume = function() {
- return !!u.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
- }, r.exports = m;
- }, { "../stream/GenericWorker": 28, "../utils": 32 }], 13: [function(c, r, h) {
- var b = c("readable-stream").Readable;
- function u(m, Z, p) {
- b.call(this, Z), this._helper = m;
- var Y = this;
- m.on("data", function(R, X) {
- Y.push(R) || Y._helper.pause(), p && p(X);
- }).on("error", function(R) {
- Y.emit("error", R);
- }).on("end", function() {
- Y.push(null);
- });
- }
- c("../utils").inherits(u, b), u.prototype._read = function() {
- this._helper.resume();
- }, r.exports = u;
- }, { "../utils": 32, "readable-stream": 16 }], 14: [function(c, r, h) {
- r.exports = { isNode: s !== void 0, newBufferFrom: function(b, u) {
- if (s.from && s.from !== Uint8Array.from) return s.from(b, u);
- if (typeof b == "number") throw new Error('The "data" argument must not be a number');
- return new s(b, u);
- }, allocBuffer: function(b) {
- if (s.alloc) return s.alloc(b);
- var u = new s(b);
- return u.fill(0), u;
- }, isBuffer: function(b) {
- return s.isBuffer(b);
- }, isStream: function(b) {
- return b && typeof b.on == "function" && typeof b.pause == "function" && typeof b.resume == "function";
- } };
- }, {}], 15: [function(c, r, h) {
- function b(G, w, W) {
- var y, f = m.getTypeOf(w), D = m.extend(W || {}, Y);
- D.date = D.date || /* @__PURE__ */ new Date(), D.compression !== null && (D.compression = D.compression.toUpperCase()), typeof D.unixPermissions == "string" && (D.unixPermissions = parseInt(D.unixPermissions, 8)), D.unixPermissions && 16384 & D.unixPermissions && (D.dir = !0), D.dosPermissions && 16 & D.dosPermissions && (D.dir = !0), D.dir && (G = K(G)), D.createFolders && (y = v(G)) && V.call(this, y, !0);
- var F = f === "string" && D.binary === !1 && D.base64 === !1;
- W && W.binary !== void 0 || (D.binary = !F), (w instanceof R && w.uncompressedSize === 0 || D.dir || !w || w.length === 0) && (D.base64 = !1, D.binary = !0, w = "", D.compression = "STORE", f = "string");
- var T;
- T = w instanceof R || w instanceof Z ? w : S.isNode && S.isStream(w) ? new z(G, w) : m.prepareContent(G, w, D.binary, D.optimizedBinaryString, D.base64);
- var Q = new X(G, T, D);
- this.files[G] = Q;
- }
- var u = c("./utf8"), m = c("./utils"), Z = c("./stream/GenericWorker"), p = c("./stream/StreamHelper"), Y = c("./defaults"), R = c("./compressedObject"), X = c("./zipObject"), H = c("./generate"), S = c("./nodejsUtils"), z = c("./nodejs/NodejsStreamInputAdapter"), v = function(G) {
- G.slice(-1) === "/" && (G = G.substring(0, G.length - 1));
- var w = G.lastIndexOf("/");
- return 0 < w ? G.substring(0, w) : "";
- }, K = function(G) {
- return G.slice(-1) !== "/" && (G += "/"), G;
- }, V = function(G, w) {
- return w = w !== void 0 ? w : Y.createFolders, G = K(G), this.files[G] || b.call(this, G, null, { dir: !0, createFolders: w }), this.files[G];
- };
- function N(G) {
- return Object.prototype.toString.call(G) === "[object RegExp]";
- }
- var B = { load: function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, forEach: function(G) {
- var w, W, y;
- for (w in this.files) y = this.files[w], (W = w.slice(this.root.length, w.length)) && w.slice(0, this.root.length) === this.root && G(W, y);
- }, filter: function(G) {
- var w = [];
- return this.forEach(function(W, y) {
- G(W, y) && w.push(y);
- }), w;
- }, file: function(G, w, W) {
- if (arguments.length !== 1) return G = this.root + G, b.call(this, G, w, W), this;
- if (N(G)) {
- var y = G;
- return this.filter(function(D, F) {
- return !F.dir && y.test(D);
- });
- }
- var f = this.files[this.root + G];
- return f && !f.dir ? f : null;
- }, folder: function(G) {
- if (!G) return this;
- if (N(G)) return this.filter(function(f, D) {
- return D.dir && G.test(f);
- });
- var w = this.root + G, W = V.call(this, w), y = this.clone();
- return y.root = W.name, y;
- }, remove: function(G) {
- G = this.root + G;
- var w = this.files[G];
- if (w || (G.slice(-1) !== "/" && (G += "/"), w = this.files[G]), w && !w.dir) delete this.files[G];
- else for (var W = this.filter(function(f, D) {
- return D.name.slice(0, G.length) === G;
- }), y = 0; y < W.length; y++) delete this.files[W[y].name];
- return this;
- }, generate: function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, generateInternalStream: function(G) {
- var w, W = {};
- try {
- if ((W = m.extend(G || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: u.utf8encode })).type = W.type.toLowerCase(), W.compression = W.compression.toUpperCase(), W.type === "binarystring" && (W.type = "string"), !W.type) throw new Error("No output type specified.");
- m.checkSupport(W.type), W.platform !== "darwin" && W.platform !== "freebsd" && W.platform !== "linux" && W.platform !== "sunos" || (W.platform = "UNIX"), W.platform === "win32" && (W.platform = "DOS");
- var y = W.comment || this.comment || "";
- w = H.generateWorker(this, W, y);
- } catch (f) {
- (w = new Z("error")).error(f);
- }
- return new p(w, W.type || "string", W.mimeType);
- }, generateAsync: function(G, w) {
- return this.generateInternalStream(G).accumulate(w);
- }, generateNodeStream: function(G, w) {
- return (G = G || {}).type || (G.type = "nodebuffer"), this.generateInternalStream(G).toNodejsStream(w);
- } };
- r.exports = B;
- }, { "./compressedObject": 2, "./defaults": 5, "./generate": 9, "./nodejs/NodejsStreamInputAdapter": 12, "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31, "./utils": 32, "./zipObject": 35 }], 16: [function(c, r, h) {
- r.exports = c("stream");
- }, { stream: void 0 }], 17: [function(c, r, h) {
- var b = c("./DataReader");
- function u(m) {
- b.call(this, m);
- for (var Z = 0; Z < this.data.length; Z++) m[Z] = 255 & m[Z];
- }
- c("../utils").inherits(u, b), u.prototype.byteAt = function(m) {
- return this.data[this.zero + m];
- }, u.prototype.lastIndexOfSignature = function(m) {
- for (var Z = m.charCodeAt(0), p = m.charCodeAt(1), Y = m.charCodeAt(2), R = m.charCodeAt(3), X = this.length - 4; 0 <= X; --X) if (this.data[X] === Z && this.data[X + 1] === p && this.data[X + 2] === Y && this.data[X + 3] === R) return X - this.zero;
- return -1;
- }, u.prototype.readAndCheckSignature = function(m) {
- var Z = m.charCodeAt(0), p = m.charCodeAt(1), Y = m.charCodeAt(2), R = m.charCodeAt(3), X = this.readData(4);
- return Z === X[0] && p === X[1] && Y === X[2] && R === X[3];
- }, u.prototype.readData = function(m) {
- if (this.checkOffset(m), m === 0) return [];
- var Z = this.data.slice(this.zero + this.index, this.zero + this.index + m);
- return this.index += m, Z;
- }, r.exports = u;
- }, { "../utils": 32, "./DataReader": 18 }], 18: [function(c, r, h) {
- var b = c("../utils");
- function u(m) {
- this.data = m, this.length = m.length, this.index = 0, this.zero = 0;
- }
- u.prototype = { checkOffset: function(m) {
- this.checkIndex(this.index + m);
- }, checkIndex: function(m) {
- if (this.length < this.zero + m || m < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + m + "). Corrupted zip ?");
- }, setIndex: function(m) {
- this.checkIndex(m), this.index = m;
- }, skip: function(m) {
- this.setIndex(this.index + m);
- }, byteAt: function() {
- }, readInt: function(m) {
- var Z, p = 0;
- for (this.checkOffset(m), Z = this.index + m - 1; Z >= this.index; Z--) p = (p << 8) + this.byteAt(Z);
- return this.index += m, p;
- }, readString: function(m) {
- return b.transformTo("string", this.readData(m));
- }, readData: function() {
- }, lastIndexOfSignature: function() {
- }, readAndCheckSignature: function() {
- }, readDate: function() {
- var m = this.readInt(4);
- return new Date(Date.UTC(1980 + (m >> 25 & 127), (m >> 21 & 15) - 1, m >> 16 & 31, m >> 11 & 31, m >> 5 & 63, (31 & m) << 1));
- } }, r.exports = u;
- }, { "../utils": 32 }], 19: [function(c, r, h) {
- var b = c("./Uint8ArrayReader");
- function u(m) {
- b.call(this, m);
- }
- c("../utils").inherits(u, b), u.prototype.readData = function(m) {
- this.checkOffset(m);
- var Z = this.data.slice(this.zero + this.index, this.zero + this.index + m);
- return this.index += m, Z;
- }, r.exports = u;
- }, { "../utils": 32, "./Uint8ArrayReader": 21 }], 20: [function(c, r, h) {
- var b = c("./DataReader");
- function u(m) {
- b.call(this, m);
- }
- c("../utils").inherits(u, b), u.prototype.byteAt = function(m) {
- return this.data.charCodeAt(this.zero + m);
- }, u.prototype.lastIndexOfSignature = function(m) {
- return this.data.lastIndexOf(m) - this.zero;
- }, u.prototype.readAndCheckSignature = function(m) {
- return m === this.readData(4);
- }, u.prototype.readData = function(m) {
- this.checkOffset(m);
- var Z = this.data.slice(this.zero + this.index, this.zero + this.index + m);
- return this.index += m, Z;
- }, r.exports = u;
- }, { "../utils": 32, "./DataReader": 18 }], 21: [function(c, r, h) {
- var b = c("./ArrayReader");
- function u(m) {
- b.call(this, m);
- }
- c("../utils").inherits(u, b), u.prototype.readData = function(m) {
- if (this.checkOffset(m), m === 0) return new Uint8Array(0);
- var Z = this.data.subarray(this.zero + this.index, this.zero + this.index + m);
- return this.index += m, Z;
- }, r.exports = u;
- }, { "../utils": 32, "./ArrayReader": 17 }], 22: [function(c, r, h) {
- var b = c("../utils"), u = c("../support"), m = c("./ArrayReader"), Z = c("./StringReader"), p = c("./NodeBufferReader"), Y = c("./Uint8ArrayReader");
- r.exports = function(R) {
- var X = b.getTypeOf(R);
- return b.checkSupport(X), X !== "string" || u.uint8array ? X === "nodebuffer" ? new p(R) : u.uint8array ? new Y(b.transformTo("uint8array", R)) : new m(b.transformTo("array", R)) : new Z(R);
- };
- }, { "../support": 30, "../utils": 32, "./ArrayReader": 17, "./NodeBufferReader": 19, "./StringReader": 20, "./Uint8ArrayReader": 21 }], 23: [function(c, r, h) {
- h.LOCAL_FILE_HEADER = "PK", h.CENTRAL_FILE_HEADER = "PK", h.CENTRAL_DIRECTORY_END = "PK", h.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x07", h.ZIP64_CENTRAL_DIRECTORY_END = "PK", h.DATA_DESCRIPTOR = "PK\x07\b";
- }, {}], 24: [function(c, r, h) {
- var b = c("./GenericWorker"), u = c("../utils");
- function m(Z) {
- b.call(this, "ConvertWorker to " + Z), this.destType = Z;
- }
- u.inherits(m, b), m.prototype.processChunk = function(Z) {
- this.push({ data: u.transformTo(this.destType, Z.data), meta: Z.meta });
- }, r.exports = m;
- }, { "../utils": 32, "./GenericWorker": 28 }], 25: [function(c, r, h) {
- var b = c("./GenericWorker"), u = c("../crc32");
- function m() {
- b.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
- }
- c("../utils").inherits(m, b), m.prototype.processChunk = function(Z) {
- this.streamInfo.crc32 = u(Z.data, this.streamInfo.crc32 || 0), this.push(Z);
- }, r.exports = m;
- }, { "../crc32": 4, "../utils": 32, "./GenericWorker": 28 }], 26: [function(c, r, h) {
- var b = c("../utils"), u = c("./GenericWorker");
- function m(Z) {
- u.call(this, "DataLengthProbe for " + Z), this.propName = Z, this.withStreamInfo(Z, 0);
- }
- b.inherits(m, u), m.prototype.processChunk = function(Z) {
- if (Z) {
- var p = this.streamInfo[this.propName] || 0;
- this.streamInfo[this.propName] = p + Z.data.length;
- }
- u.prototype.processChunk.call(this, Z);
- }, r.exports = m;
- }, { "../utils": 32, "./GenericWorker": 28 }], 27: [function(c, r, h) {
- var b = c("../utils"), u = c("./GenericWorker");
- function m(Z) {
- u.call(this, "DataWorker");
- var p = this;
- this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, Z.then(function(Y) {
- p.dataIsReady = !0, p.data = Y, p.max = Y && Y.length || 0, p.type = b.getTypeOf(Y), p.isPaused || p._tickAndRepeat();
- }, function(Y) {
- p.error(Y);
- });
- }
- b.inherits(m, u), m.prototype.cleanUp = function() {
- u.prototype.cleanUp.call(this), this.data = null;
- }, m.prototype.resume = function() {
- return !!u.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, b.delay(this._tickAndRepeat, [], this)), !0);
- }, m.prototype._tickAndRepeat = function() {
- this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (b.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
- }, m.prototype._tick = function() {
- if (this.isPaused || this.isFinished) return !1;
- var Z = null, p = Math.min(this.max, this.index + 16384);
- if (this.index >= this.max) return this.end();
- switch (this.type) {
- case "string":
- Z = this.data.substring(this.index, p);
- break;
- case "uint8array":
- Z = this.data.subarray(this.index, p);
- break;
- case "array":
- case "nodebuffer":
- Z = this.data.slice(this.index, p);
- }
- return this.index = p, this.push({ data: Z, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
- }, r.exports = m;
- }, { "../utils": 32, "./GenericWorker": 28 }], 28: [function(c, r, h) {
- function b(u) {
- this.name = u || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
- }
- b.prototype = { push: function(u) {
- this.emit("data", u);
- }, end: function() {
- if (this.isFinished) return !1;
- this.flush();
- try {
- this.emit("end"), this.cleanUp(), this.isFinished = !0;
- } catch (u) {
- this.emit("error", u);
- }
- return !0;
- }, error: function(u) {
- return !this.isFinished && (this.isPaused ? this.generatedError = u : (this.isFinished = !0, this.emit("error", u), this.previous && this.previous.error(u), this.cleanUp()), !0);
- }, on: function(u, m) {
- return this._listeners[u].push(m), this;
- }, cleanUp: function() {
- this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
- }, emit: function(u, m) {
- if (this._listeners[u]) for (var Z = 0; Z < this._listeners[u].length; Z++) this._listeners[u][Z].call(this, m);
- }, pipe: function(u) {
- return u.registerPrevious(this);
- }, registerPrevious: function(u) {
- if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
- this.streamInfo = u.streamInfo, this.mergeStreamInfo(), this.previous = u;
- var m = this;
- return u.on("data", function(Z) {
- m.processChunk(Z);
- }), u.on("end", function() {
- m.end();
- }), u.on("error", function(Z) {
- m.error(Z);
- }), this;
- }, pause: function() {
- return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
- }, resume: function() {
- if (!this.isPaused || this.isFinished) return !1;
- var u = this.isPaused = !1;
- return this.generatedError && (this.error(this.generatedError), u = !0), this.previous && this.previous.resume(), !u;
- }, flush: function() {
- }, processChunk: function(u) {
- this.push(u);
- }, withStreamInfo: function(u, m) {
- return this.extraStreamInfo[u] = m, this.mergeStreamInfo(), this;
- }, mergeStreamInfo: function() {
- for (var u in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, u) && (this.streamInfo[u] = this.extraStreamInfo[u]);
- }, lock: function() {
- if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
- this.isLocked = !0, this.previous && this.previous.lock();
- }, toString: function() {
- var u = "Worker " + this.name;
- return this.previous ? this.previous + " -> " + u : u;
- } }, r.exports = b;
- }, {}], 29: [function(c, r, h) {
- var b = c("../utils"), u = c("./ConvertWorker"), m = c("./GenericWorker"), Z = c("../base64"), p = c("../support"), Y = c("../external"), R = null;
- if (p.nodestream) try {
- R = c("../nodejs/NodejsStreamOutputAdapter");
- } catch {
- }
- function X(H, S, z) {
- var v = S;
- switch (S) {
- case "blob":
- case "arraybuffer":
- v = "uint8array";
- break;
- case "base64":
- v = "string";
- }
- try {
- this._internalType = v, this._outputType = S, this._mimeType = z, b.checkSupport(v), this._worker = H.pipe(new u(v)), H.lock();
- } catch (K) {
- this._worker = new m("error"), this._worker.error(K);
- }
- }
- X.prototype = { accumulate: function(H) {
- return function(S, z) {
- return new Y.Promise(function(v, K) {
- var V = [], N = S._internalType, B = S._outputType, G = S._mimeType;
- S.on("data", function(w, W) {
- V.push(w), z && z(W);
- }).on("error", function(w) {
- V = [], K(w);
- }).on("end", function() {
- try {
- var w = function(W, y, f) {
- switch (W) {
- case "blob":
- return b.newBlob(b.transformTo("arraybuffer", y), f);
- case "base64":
- return Z.encode(y);
- default:
- return b.transformTo(W, y);
- }
- }(B, function(W, y) {
- var f, D = 0, F = null, T = 0;
- for (f = 0; f < y.length; f++) T += y[f].length;
- switch (W) {
- case "string":
- return y.join("");
- case "array":
- return Array.prototype.concat.apply([], y);
- case "uint8array":
- for (F = new Uint8Array(T), f = 0; f < y.length; f++) F.set(y[f], D), D += y[f].length;
- return F;
- case "nodebuffer":
- return s.concat(y);
- default:
- throw new Error("concat : unsupported type '" + W + "'");
- }
- }(N, V), G);
- v(w);
- } catch (W) {
- K(W);
- }
- V = [];
- }).resume();
- });
- }(this, H);
- }, on: function(H, S) {
- var z = this;
- return H === "data" ? this._worker.on(H, function(v) {
- S.call(z, v.data, v.meta);
- }) : this._worker.on(H, function() {
- b.delay(S, arguments, z);
- }), this;
- }, resume: function() {
- return b.delay(this._worker.resume, [], this._worker), this;
- }, pause: function() {
- return this._worker.pause(), this;
- }, toNodejsStream: function(H) {
- if (b.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
- return new R(this, { objectMode: this._outputType !== "nodebuffer" }, H);
- } }, r.exports = X;
- }, { "../base64": 1, "../external": 6, "../nodejs/NodejsStreamOutputAdapter": 13, "../support": 30, "../utils": 32, "./ConvertWorker": 24, "./GenericWorker": 28 }], 30: [function(c, r, h) {
- if (h.base64 = !0, h.array = !0, h.string = !0, h.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", h.nodebuffer = s !== void 0, h.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") h.blob = !1;
- else {
- var b = new ArrayBuffer(0);
- try {
- h.blob = new Blob([b], { type: "application/zip" }).size === 0;
- } catch {
- try {
- var u = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
- u.append(b), h.blob = u.getBlob("application/zip").size === 0;
- } catch {
- h.blob = !1;
- }
- }
- }
- try {
- h.nodestream = !!c("readable-stream").Readable;
- } catch {
- h.nodestream = !1;
- }
- }, { "readable-stream": 16 }], 31: [function(c, r, h) {
- for (var b = c("./utils"), u = c("./support"), m = c("./nodejsUtils"), Z = c("./stream/GenericWorker"), p = new Array(256), Y = 0; Y < 256; Y++) p[Y] = 252 <= Y ? 6 : 248 <= Y ? 5 : 240 <= Y ? 4 : 224 <= Y ? 3 : 192 <= Y ? 2 : 1;
- function R() {
- Z.call(this, "utf-8 decode"), this.leftOver = null;
- }
- function X() {
- Z.call(this, "utf-8 encode");
- }
- p[254] = p[254] = 1, h.utf8encode = function(H) {
- return u.nodebuffer ? m.newBufferFrom(H, "utf-8") : function(S) {
- var z, v, K, V, N, B = S.length, G = 0;
- for (V = 0; V < B; V++) (64512 & (v = S.charCodeAt(V))) == 55296 && V + 1 < B && (64512 & (K = S.charCodeAt(V + 1))) == 56320 && (v = 65536 + (v - 55296 << 10) + (K - 56320), V++), G += v < 128 ? 1 : v < 2048 ? 2 : v < 65536 ? 3 : 4;
- for (z = u.uint8array ? new Uint8Array(G) : new Array(G), V = N = 0; N < G; V++) (64512 & (v = S.charCodeAt(V))) == 55296 && V + 1 < B && (64512 & (K = S.charCodeAt(V + 1))) == 56320 && (v = 65536 + (v - 55296 << 10) + (K - 56320), V++), v < 128 ? z[N++] = v : (v < 2048 ? z[N++] = 192 | v >>> 6 : (v < 65536 ? z[N++] = 224 | v >>> 12 : (z[N++] = 240 | v >>> 18, z[N++] = 128 | v >>> 12 & 63), z[N++] = 128 | v >>> 6 & 63), z[N++] = 128 | 63 & v);
- return z;
- }(H);
- }, h.utf8decode = function(H) {
- return u.nodebuffer ? b.transformTo("nodebuffer", H).toString("utf-8") : function(S) {
- var z, v, K, V, N = S.length, B = new Array(2 * N);
- for (z = v = 0; z < N; ) if ((K = S[z++]) < 128) B[v++] = K;
- else if (4 < (V = p[K])) B[v++] = 65533, z += V - 1;
- else {
- for (K &= V === 2 ? 31 : V === 3 ? 15 : 7; 1 < V && z < N; ) K = K << 6 | 63 & S[z++], V--;
- 1 < V ? B[v++] = 65533 : K < 65536 ? B[v++] = K : (K -= 65536, B[v++] = 55296 | K >> 10 & 1023, B[v++] = 56320 | 1023 & K);
- }
- return B.length !== v && (B.subarray ? B = B.subarray(0, v) : B.length = v), b.applyFromCharCode(B);
- }(H = b.transformTo(u.uint8array ? "uint8array" : "array", H));
- }, b.inherits(R, Z), R.prototype.processChunk = function(H) {
- var S = b.transformTo(u.uint8array ? "uint8array" : "array", H.data);
- if (this.leftOver && this.leftOver.length) {
- if (u.uint8array) {
- var z = S;
- (S = new Uint8Array(z.length + this.leftOver.length)).set(this.leftOver, 0), S.set(z, this.leftOver.length);
- } else S = this.leftOver.concat(S);
- this.leftOver = null;
- }
- var v = function(V, N) {
- var B;
- for ((N = N || V.length) > V.length && (N = V.length), B = N - 1; 0 <= B && (192 & V[B]) == 128; ) B--;
- return B < 0 || B === 0 ? N : B + p[V[B]] > N ? B : N;
- }(S), K = S;
- v !== S.length && (u.uint8array ? (K = S.subarray(0, v), this.leftOver = S.subarray(v, S.length)) : (K = S.slice(0, v), this.leftOver = S.slice(v, S.length))), this.push({ data: h.utf8decode(K), meta: H.meta });
- }, R.prototype.flush = function() {
- this.leftOver && this.leftOver.length && (this.push({ data: h.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
- }, h.Utf8DecodeWorker = R, b.inherits(X, Z), X.prototype.processChunk = function(H) {
- this.push({ data: h.utf8encode(H.data), meta: H.meta });
- }, h.Utf8EncodeWorker = X;
- }, { "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./support": 30, "./utils": 32 }], 32: [function(c, r, h) {
- var b = c("./support"), u = c("./base64"), m = c("./nodejsUtils"), Z = c("./external");
- function p(z) {
- return z;
- }
- function Y(z, v) {
- for (var K = 0; K < z.length; ++K) v[K] = 255 & z.charCodeAt(K);
- return v;
- }
- c("setimmediate"), h.newBlob = function(z, v) {
- h.checkSupport("blob");
- try {
- return new Blob([z], { type: v });
- } catch {
- try {
- var K = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
- return K.append(z), K.getBlob(v);
- } catch {
- throw new Error("Bug : can't construct the Blob.");
- }
- }
- };
- var R = { stringifyByChunk: function(z, v, K) {
- var V = [], N = 0, B = z.length;
- if (B <= K) return String.fromCharCode.apply(null, z);
- for (; N < B; ) v === "array" || v === "nodebuffer" ? V.push(String.fromCharCode.apply(null, z.slice(N, Math.min(N + K, B)))) : V.push(String.fromCharCode.apply(null, z.subarray(N, Math.min(N + K, B)))), N += K;
- return V.join("");
- }, stringifyByChar: function(z) {
- for (var v = "", K = 0; K < z.length; K++) v += String.fromCharCode(z[K]);
- return v;
- }, applyCanBeUsed: { uint8array: function() {
- try {
- return b.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
- } catch {
- return !1;
- }
- }(), nodebuffer: function() {
- try {
- return b.nodebuffer && String.fromCharCode.apply(null, m.allocBuffer(1)).length === 1;
- } catch {
- return !1;
- }
- }() } };
- function X(z) {
- var v = 65536, K = h.getTypeOf(z), V = !0;
- if (K === "uint8array" ? V = R.applyCanBeUsed.uint8array : K === "nodebuffer" && (V = R.applyCanBeUsed.nodebuffer), V) for (; 1 < v; ) try {
- return R.stringifyByChunk(z, K, v);
- } catch {
- v = Math.floor(v / 2);
- }
- return R.stringifyByChar(z);
- }
- function H(z, v) {
- for (var K = 0; K < z.length; K++) v[K] = z[K];
- return v;
- }
- h.applyFromCharCode = X;
- var S = {};
- S.string = { string: p, array: function(z) {
- return Y(z, new Array(z.length));
- }, arraybuffer: function(z) {
- return S.string.uint8array(z).buffer;
- }, uint8array: function(z) {
- return Y(z, new Uint8Array(z.length));
- }, nodebuffer: function(z) {
- return Y(z, m.allocBuffer(z.length));
- } }, S.array = { string: X, array: p, arraybuffer: function(z) {
- return new Uint8Array(z).buffer;
- }, uint8array: function(z) {
- return new Uint8Array(z);
- }, nodebuffer: function(z) {
- return m.newBufferFrom(z);
- } }, S.arraybuffer = { string: function(z) {
- return X(new Uint8Array(z));
- }, array: function(z) {
- return H(new Uint8Array(z), new Array(z.byteLength));
- }, arraybuffer: p, uint8array: function(z) {
- return new Uint8Array(z);
- }, nodebuffer: function(z) {
- return m.newBufferFrom(new Uint8Array(z));
- } }, S.uint8array = { string: X, array: function(z) {
- return H(z, new Array(z.length));
- }, arraybuffer: function(z) {
- return z.buffer;
- }, uint8array: p, nodebuffer: function(z) {
- return m.newBufferFrom(z);
- } }, S.nodebuffer = { string: X, array: function(z) {
- return H(z, new Array(z.length));
- }, arraybuffer: function(z) {
- return S.nodebuffer.uint8array(z).buffer;
- }, uint8array: function(z) {
- return H(z, new Uint8Array(z.length));
- }, nodebuffer: p }, h.transformTo = function(z, v) {
- if (v = v || "", !z) return v;
- h.checkSupport(z);
- var K = h.getTypeOf(v);
- return S[K][z](v);
- }, h.resolve = function(z) {
- for (var v = z.split("/"), K = [], V = 0; V < v.length; V++) {
- var N = v[V];
- N === "." || N === "" && V !== 0 && V !== v.length - 1 || (N === ".." ? K.pop() : K.push(N));
- }
- return K.join("/");
- }, h.getTypeOf = function(z) {
- return typeof z == "string" ? "string" : Object.prototype.toString.call(z) === "[object Array]" ? "array" : b.nodebuffer && m.isBuffer(z) ? "nodebuffer" : b.uint8array && z instanceof Uint8Array ? "uint8array" : b.arraybuffer && z instanceof ArrayBuffer ? "arraybuffer" : void 0;
- }, h.checkSupport = function(z) {
- if (!b[z.toLowerCase()]) throw new Error(z + " is not supported by this platform");
- }, h.MAX_VALUE_16BITS = 65535, h.MAX_VALUE_32BITS = -1, h.pretty = function(z) {
- var v, K, V = "";
- for (K = 0; K < (z || "").length; K++) V += "\\x" + ((v = z.charCodeAt(K)) < 16 ? "0" : "") + v.toString(16).toUpperCase();
- return V;
- }, h.delay = function(z, v, K) {
- o(function() {
- z.apply(K || null, v || []);
- });
- }, h.inherits = function(z, v) {
- function K() {
- }
- K.prototype = v.prototype, z.prototype = new K();
- }, h.extend = function() {
- var z, v, K = {};
- for (z = 0; z < arguments.length; z++) for (v in arguments[z]) Object.prototype.hasOwnProperty.call(arguments[z], v) && K[v] === void 0 && (K[v] = arguments[z][v]);
- return K;
- }, h.prepareContent = function(z, v, K, V, N) {
- return Z.Promise.resolve(v).then(function(B) {
- return b.blob && (B instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(B)) !== -1) && typeof FileReader < "u" ? new Z.Promise(function(G, w) {
- var W = new FileReader();
- W.onload = function(y) {
- G(y.target.result);
- }, W.onerror = function(y) {
- w(y.target.error);
- }, W.readAsArrayBuffer(B);
- }) : B;
- }).then(function(B) {
- var G = h.getTypeOf(B);
- return G ? (G === "arraybuffer" ? B = h.transformTo("uint8array", B) : G === "string" && (N ? B = u.decode(B) : K && V !== !0 && (B = function(w) {
- return Y(w, b.uint8array ? new Uint8Array(w.length) : new Array(w.length));
- }(B))), B) : Z.Promise.reject(new Error("Can't read the data of '" + z + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
- });
- };
- }, { "./base64": 1, "./external": 6, "./nodejsUtils": 14, "./support": 30, setimmediate: 54 }], 33: [function(c, r, h) {
- var b = c("./reader/readerFor"), u = c("./utils"), m = c("./signature"), Z = c("./zipEntry"), p = c("./support");
- function Y(R) {
- this.files = [], this.loadOptions = R;
- }
- Y.prototype = { checkSignature: function(R) {
- if (!this.reader.readAndCheckSignature(R)) {
- this.reader.index -= 4;
- var X = this.reader.readString(4);
- throw new Error("Corrupted zip or bug: unexpected signature (" + u.pretty(X) + ", expected " + u.pretty(R) + ")");
- }
- }, isSignature: function(R, X) {
- var H = this.reader.index;
- this.reader.setIndex(R);
- var S = this.reader.readString(4) === X;
- return this.reader.setIndex(H), S;
- }, readBlockEndOfCentral: function() {
- this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
- var R = this.reader.readData(this.zipCommentLength), X = p.uint8array ? "uint8array" : "array", H = u.transformTo(X, R);
- this.zipComment = this.loadOptions.decodeFileName(H);
- }, readBlockZip64EndOfCentral: function() {
- this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
- for (var R, X, H, S = this.zip64EndOfCentralSize - 44; 0 < S; ) R = this.reader.readInt(2), X = this.reader.readInt(4), H = this.reader.readData(X), this.zip64ExtensibleData[R] = { id: R, length: X, value: H };
- }, readBlockZip64EndOfCentralLocator: function() {
- if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error("Multi-volumes zip are not supported");
- }, readLocalFiles: function() {
- var R, X;
- for (R = 0; R < this.files.length; R++) X = this.files[R], this.reader.setIndex(X.localHeaderOffset), this.checkSignature(m.LOCAL_FILE_HEADER), X.readLocalPart(this.reader), X.handleUTF8(), X.processAttributes();
- }, readCentralDir: function() {
- var R;
- for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(m.CENTRAL_FILE_HEADER); ) (R = new Z({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(R);
- if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
- }, readEndOfCentral: function() {
- var R = this.reader.lastIndexOfSignature(m.CENTRAL_DIRECTORY_END);
- if (R < 0) throw this.isSignature(0, m.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
- this.reader.setIndex(R);
- var X = R;
- if (this.checkSignature(m.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === u.MAX_VALUE_16BITS || this.diskWithCentralDirStart === u.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === u.MAX_VALUE_16BITS || this.centralDirRecords === u.MAX_VALUE_16BITS || this.centralDirSize === u.MAX_VALUE_32BITS || this.centralDirOffset === u.MAX_VALUE_32BITS) {
- if (this.zip64 = !0, (R = this.reader.lastIndexOfSignature(m.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
- if (this.reader.setIndex(R), this.checkSignature(m.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, m.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(m.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
- this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(m.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
- }
- var H = this.centralDirOffset + this.centralDirSize;
- this.zip64 && (H += 20, H += 12 + this.zip64EndOfCentralSize);
- var S = X - H;
- if (0 < S) this.isSignature(X, m.CENTRAL_FILE_HEADER) || (this.reader.zero = S);
- else if (S < 0) throw new Error("Corrupted zip: missing " + Math.abs(S) + " bytes.");
- }, prepareReader: function(R) {
- this.reader = b(R);
- }, load: function(R) {
- this.prepareReader(R), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
- } }, r.exports = Y;
- }, { "./reader/readerFor": 22, "./signature": 23, "./support": 30, "./utils": 32, "./zipEntry": 34 }], 34: [function(c, r, h) {
- var b = c("./reader/readerFor"), u = c("./utils"), m = c("./compressedObject"), Z = c("./crc32"), p = c("./utf8"), Y = c("./compressions"), R = c("./support");
- function X(H, S) {
- this.options = H, this.loadOptions = S;
- }
- X.prototype = { isEncrypted: function() {
- return (1 & this.bitFlag) == 1;
- }, useUTF8: function() {
- return (2048 & this.bitFlag) == 2048;
- }, readLocalPart: function(H) {
- var S, z;
- if (H.skip(22), this.fileNameLength = H.readInt(2), z = H.readInt(2), this.fileName = H.readData(this.fileNameLength), H.skip(z), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
- if ((S = function(v) {
- for (var K in Y) if (Object.prototype.hasOwnProperty.call(Y, K) && Y[K].magic === v) return Y[K];
- return null;
- }(this.compressionMethod)) === null) throw new Error("Corrupted zip : compression " + u.pretty(this.compressionMethod) + " unknown (inner file : " + u.transformTo("string", this.fileName) + ")");
- this.decompressed = new m(this.compressedSize, this.uncompressedSize, this.crc32, S, H.readData(this.compressedSize));
- }, readCentralPart: function(H) {
- this.versionMadeBy = H.readInt(2), H.skip(2), this.bitFlag = H.readInt(2), this.compressionMethod = H.readString(2), this.date = H.readDate(), this.crc32 = H.readInt(4), this.compressedSize = H.readInt(4), this.uncompressedSize = H.readInt(4);
- var S = H.readInt(2);
- if (this.extraFieldsLength = H.readInt(2), this.fileCommentLength = H.readInt(2), this.diskNumberStart = H.readInt(2), this.internalFileAttributes = H.readInt(2), this.externalFileAttributes = H.readInt(4), this.localHeaderOffset = H.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
- H.skip(S), this.readExtraFields(H), this.parseZIP64ExtraField(H), this.fileComment = H.readData(this.fileCommentLength);
- }, processAttributes: function() {
- this.unixPermissions = null, this.dosPermissions = null;
- var H = this.versionMadeBy >> 8;
- this.dir = !!(16 & this.externalFileAttributes), H == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), H == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
- }, parseZIP64ExtraField: function() {
- if (this.extraFields[1]) {
- var H = b(this.extraFields[1].value);
- this.uncompressedSize === u.MAX_VALUE_32BITS && (this.uncompressedSize = H.readInt(8)), this.compressedSize === u.MAX_VALUE_32BITS && (this.compressedSize = H.readInt(8)), this.localHeaderOffset === u.MAX_VALUE_32BITS && (this.localHeaderOffset = H.readInt(8)), this.diskNumberStart === u.MAX_VALUE_32BITS && (this.diskNumberStart = H.readInt(4));
- }
- }, readExtraFields: function(H) {
- var S, z, v, K = H.index + this.extraFieldsLength;
- for (this.extraFields || (this.extraFields = {}); H.index + 4 < K; ) S = H.readInt(2), z = H.readInt(2), v = H.readData(z), this.extraFields[S] = { id: S, length: z, value: v };
- H.setIndex(K);
- }, handleUTF8: function() {
- var H = R.uint8array ? "uint8array" : "array";
- if (this.useUTF8()) this.fileNameStr = p.utf8decode(this.fileName), this.fileCommentStr = p.utf8decode(this.fileComment);
- else {
- var S = this.findExtraFieldUnicodePath();
- if (S !== null) this.fileNameStr = S;
- else {
- var z = u.transformTo(H, this.fileName);
- this.fileNameStr = this.loadOptions.decodeFileName(z);
- }
- var v = this.findExtraFieldUnicodeComment();
- if (v !== null) this.fileCommentStr = v;
- else {
- var K = u.transformTo(H, this.fileComment);
- this.fileCommentStr = this.loadOptions.decodeFileName(K);
- }
- }
- }, findExtraFieldUnicodePath: function() {
- var H = this.extraFields[28789];
- if (H) {
- var S = b(H.value);
- return S.readInt(1) !== 1 || Z(this.fileName) !== S.readInt(4) ? null : p.utf8decode(S.readData(H.length - 5));
- }
- return null;
- }, findExtraFieldUnicodeComment: function() {
- var H = this.extraFields[25461];
- if (H) {
- var S = b(H.value);
- return S.readInt(1) !== 1 || Z(this.fileComment) !== S.readInt(4) ? null : p.utf8decode(S.readData(H.length - 5));
- }
- return null;
- } }, r.exports = X;
- }, { "./compressedObject": 2, "./compressions": 3, "./crc32": 4, "./reader/readerFor": 22, "./support": 30, "./utf8": 31, "./utils": 32 }], 35: [function(c, r, h) {
- function b(S, z, v) {
- this.name = S, this.dir = v.dir, this.date = v.date, this.comment = v.comment, this.unixPermissions = v.unixPermissions, this.dosPermissions = v.dosPermissions, this._data = z, this._dataBinary = v.binary, this.options = { compression: v.compression, compressionOptions: v.compressionOptions };
- }
- var u = c("./stream/StreamHelper"), m = c("./stream/DataWorker"), Z = c("./utf8"), p = c("./compressedObject"), Y = c("./stream/GenericWorker");
- b.prototype = { internalStream: function(S) {
- var z = null, v = "string";
- try {
- if (!S) throw new Error("No output type specified.");
- var K = (v = S.toLowerCase()) === "string" || v === "text";
- v !== "binarystring" && v !== "text" || (v = "string"), z = this._decompressWorker();
- var V = !this._dataBinary;
- V && !K && (z = z.pipe(new Z.Utf8EncodeWorker())), !V && K && (z = z.pipe(new Z.Utf8DecodeWorker()));
- } catch (N) {
- (z = new Y("error")).error(N);
- }
- return new u(z, v, "");
- }, async: function(S, z) {
- return this.internalStream(S).accumulate(z);
- }, nodeStream: function(S, z) {
- return this.internalStream(S || "nodebuffer").toNodejsStream(z);
- }, _compressWorker: function(S, z) {
- if (this._data instanceof p && this._data.compression.magic === S.magic) return this._data.getCompressedWorker();
- var v = this._decompressWorker();
- return this._dataBinary || (v = v.pipe(new Z.Utf8EncodeWorker())), p.createWorkerFrom(v, S, z);
- }, _decompressWorker: function() {
- return this._data instanceof p ? this._data.getContentWorker() : this._data instanceof Y ? this._data : new m(this._data);
- } };
- for (var R = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], X = function() {
- throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
- }, H = 0; H < R.length; H++) b.prototype[R[H]] = X;
- r.exports = b;
- }, { "./compressedObject": 2, "./stream/DataWorker": 27, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31 }], 36: [function(c, r, h) {
- (function(b) {
- var u, m, Z = b.MutationObserver || b.WebKitMutationObserver;
- if (Z) {
- var p = 0, Y = new Z(S), R = b.document.createTextNode("");
- Y.observe(R, { characterData: !0 }), u = function() {
- R.data = p = ++p % 2;
- };
- } else if (b.setImmediate || b.MessageChannel === void 0) u = "document" in b && "onreadystatechange" in b.document.createElement("script") ? function() {
- var z = b.document.createElement("script");
- z.onreadystatechange = function() {
- S(), z.onreadystatechange = null, z.parentNode.removeChild(z), z = null;
- }, b.document.documentElement.appendChild(z);
- } : function() {
- setTimeout(S, 0);
- };
- else {
- var X = new b.MessageChannel();
- X.port1.onmessage = S, u = function() {
- X.port2.postMessage(0);
- };
- }
- var H = [];
- function S() {
- var z, v;
- m = !0;
- for (var K = H.length; K; ) {
- for (v = H, H = [], z = -1; ++z < K; ) v[z]();
- K = H.length;
- }
- m = !1;
- }
- r.exports = function(z) {
- H.push(z) !== 1 || m || u();
- };
- }).call(this, A !== void 0 ? A : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 37: [function(c, r, h) {
- var b = c("immediate");
- function u() {
- }
- var m = {}, Z = ["REJECTED"], p = ["FULFILLED"], Y = ["PENDING"];
- function R(K) {
- if (typeof K != "function") throw new TypeError("resolver must be a function");
- this.state = Y, this.queue = [], this.outcome = void 0, K !== u && z(this, K);
- }
- function X(K, V, N) {
- this.promise = K, typeof V == "function" && (this.onFulfilled = V, this.callFulfilled = this.otherCallFulfilled), typeof N == "function" && (this.onRejected = N, this.callRejected = this.otherCallRejected);
- }
- function H(K, V, N) {
- b(function() {
- var B;
- try {
- B = V(N);
- } catch (G) {
- return m.reject(K, G);
- }
- B === K ? m.reject(K, new TypeError("Cannot resolve promise with itself")) : m.resolve(K, B);
- });
- }
- function S(K) {
- var V = K && K.then;
- if (K && (typeof K == "object" || typeof K == "function") && typeof V == "function") return function() {
- V.apply(K, arguments);
- };
- }
- function z(K, V) {
- var N = !1;
- function B(W) {
- N || (N = !0, m.reject(K, W));
- }
- function G(W) {
- N || (N = !0, m.resolve(K, W));
- }
- var w = v(function() {
- V(G, B);
- });
- w.status === "error" && B(w.value);
- }
- function v(K, V) {
- var N = {};
- try {
- N.value = K(V), N.status = "success";
- } catch (B) {
- N.status = "error", N.value = B;
- }
- return N;
- }
- (r.exports = R).prototype.finally = function(K) {
- if (typeof K != "function") return this;
- var V = this.constructor;
- return this.then(function(N) {
- return V.resolve(K()).then(function() {
- return N;
- });
- }, function(N) {
- return V.resolve(K()).then(function() {
- throw N;
- });
- });
- }, R.prototype.catch = function(K) {
- return this.then(null, K);
- }, R.prototype.then = function(K, V) {
- if (typeof K != "function" && this.state === p || typeof V != "function" && this.state === Z) return this;
- var N = new this.constructor(u);
- return this.state !== Y ? H(N, this.state === p ? K : V, this.outcome) : this.queue.push(new X(N, K, V)), N;
- }, X.prototype.callFulfilled = function(K) {
- m.resolve(this.promise, K);
- }, X.prototype.otherCallFulfilled = function(K) {
- H(this.promise, this.onFulfilled, K);
- }, X.prototype.callRejected = function(K) {
- m.reject(this.promise, K);
- }, X.prototype.otherCallRejected = function(K) {
- H(this.promise, this.onRejected, K);
- }, m.resolve = function(K, V) {
- var N = v(S, V);
- if (N.status === "error") return m.reject(K, N.value);
- var B = N.value;
- if (B) z(K, B);
- else {
- K.state = p, K.outcome = V;
- for (var G = -1, w = K.queue.length; ++G < w; ) K.queue[G].callFulfilled(V);
- }
- return K;
- }, m.reject = function(K, V) {
- K.state = Z, K.outcome = V;
- for (var N = -1, B = K.queue.length; ++N < B; ) K.queue[N].callRejected(V);
- return K;
- }, R.resolve = function(K) {
- return K instanceof this ? K : m.resolve(new this(u), K);
- }, R.reject = function(K) {
- var V = new this(u);
- return m.reject(V, K);
- }, R.all = function(K) {
- var V = this;
- if (Object.prototype.toString.call(K) !== "[object Array]") return this.reject(new TypeError("must be an array"));
- var N = K.length, B = !1;
- if (!N) return this.resolve([]);
- for (var G = new Array(N), w = 0, W = -1, y = new this(u); ++W < N; ) f(K[W], W);
- return y;
- function f(D, F) {
- V.resolve(D).then(function(T) {
- G[F] = T, ++w !== N || B || (B = !0, m.resolve(y, G));
- }, function(T) {
- B || (B = !0, m.reject(y, T));
- });
- }
- }, R.race = function(K) {
- if (Object.prototype.toString.call(K) !== "[object Array]") return this.reject(new TypeError("must be an array"));
- var V = K.length, N = !1;
- if (!V) return this.resolve([]);
- for (var B, G = -1, w = new this(u); ++G < V; ) B = K[G], this.resolve(B).then(function(W) {
- N || (N = !0, m.resolve(w, W));
- }, function(W) {
- N || (N = !0, m.reject(w, W));
- });
- return w;
- };
- }, { immediate: 36 }], 38: [function(c, r, h) {
- var b = {};
- (0, c("./lib/utils/common").assign)(b, c("./lib/deflate"), c("./lib/inflate"), c("./lib/zlib/constants")), r.exports = b;
- }, { "./lib/deflate": 39, "./lib/inflate": 40, "./lib/utils/common": 41, "./lib/zlib/constants": 44 }], 39: [function(c, r, h) {
- var b = c("./zlib/deflate"), u = c("./utils/common"), m = c("./utils/strings"), Z = c("./zlib/messages"), p = c("./zlib/zstream"), Y = Object.prototype.toString;
- function R(H) {
- if (!(this instanceof R)) return new R(H);
- this.options = u.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, H || {});
- var S = this.options;
- S.raw && 0 < S.windowBits ? S.windowBits = -S.windowBits : S.gzip && 0 < S.windowBits && S.windowBits < 16 && (S.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new p(), this.strm.avail_out = 0;
- var z = b.deflateInit2(this.strm, S.level, S.method, S.windowBits, S.memLevel, S.strategy);
- if (z !== 0) throw new Error(Z[z]);
- if (S.header && b.deflateSetHeader(this.strm, S.header), S.dictionary) {
- var v;
- if (v = typeof S.dictionary == "string" ? m.string2buf(S.dictionary) : Y.call(S.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(S.dictionary) : S.dictionary, (z = b.deflateSetDictionary(this.strm, v)) !== 0) throw new Error(Z[z]);
- this._dict_set = !0;
- }
- }
- function X(H, S) {
- var z = new R(S);
- if (z.push(H, !0), z.err) throw z.msg || Z[z.err];
- return z.result;
- }
- R.prototype.push = function(H, S) {
- var z, v, K = this.strm, V = this.options.chunkSize;
- if (this.ended) return !1;
- v = S === ~~S ? S : S === !0 ? 4 : 0, typeof H == "string" ? K.input = m.string2buf(H) : Y.call(H) === "[object ArrayBuffer]" ? K.input = new Uint8Array(H) : K.input = H, K.next_in = 0, K.avail_in = K.input.length;
- do {
- if (K.avail_out === 0 && (K.output = new u.Buf8(V), K.next_out = 0, K.avail_out = V), (z = b.deflate(K, v)) !== 1 && z !== 0) return this.onEnd(z), !(this.ended = !0);
- K.avail_out !== 0 && (K.avail_in !== 0 || v !== 4 && v !== 2) || (this.options.to === "string" ? this.onData(m.buf2binstring(u.shrinkBuf(K.output, K.next_out))) : this.onData(u.shrinkBuf(K.output, K.next_out)));
- } while ((0 < K.avail_in || K.avail_out === 0) && z !== 1);
- return v === 4 ? (z = b.deflateEnd(this.strm), this.onEnd(z), this.ended = !0, z === 0) : v !== 2 || (this.onEnd(0), !(K.avail_out = 0));
- }, R.prototype.onData = function(H) {
- this.chunks.push(H);
- }, R.prototype.onEnd = function(H) {
- H === 0 && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = u.flattenChunks(this.chunks)), this.chunks = [], this.err = H, this.msg = this.strm.msg;
- }, h.Deflate = R, h.deflate = X, h.deflateRaw = function(H, S) {
- return (S = S || {}).raw = !0, X(H, S);
- }, h.gzip = function(H, S) {
- return (S = S || {}).gzip = !0, X(H, S);
- };
- }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/deflate": 46, "./zlib/messages": 51, "./zlib/zstream": 53 }], 40: [function(c, r, h) {
- var b = c("./zlib/inflate"), u = c("./utils/common"), m = c("./utils/strings"), Z = c("./zlib/constants"), p = c("./zlib/messages"), Y = c("./zlib/zstream"), R = c("./zlib/gzheader"), X = Object.prototype.toString;
- function H(z) {
- if (!(this instanceof H)) return new H(z);
- this.options = u.assign({ chunkSize: 16384, windowBits: 0, to: "" }, z || {});
- var v = this.options;
- v.raw && 0 <= v.windowBits && v.windowBits < 16 && (v.windowBits = -v.windowBits, v.windowBits === 0 && (v.windowBits = -15)), !(0 <= v.windowBits && v.windowBits < 16) || z && z.windowBits || (v.windowBits += 32), 15 < v.windowBits && v.windowBits < 48 && (15 & v.windowBits) == 0 && (v.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new Y(), this.strm.avail_out = 0;
- var K = b.inflateInit2(this.strm, v.windowBits);
- if (K !== Z.Z_OK) throw new Error(p[K]);
- this.header = new R(), b.inflateGetHeader(this.strm, this.header);
- }
- function S(z, v) {
- var K = new H(v);
- if (K.push(z, !0), K.err) throw K.msg || p[K.err];
- return K.result;
- }
- H.prototype.push = function(z, v) {
- var K, V, N, B, G, w, W = this.strm, y = this.options.chunkSize, f = this.options.dictionary, D = !1;
- if (this.ended) return !1;
- V = v === ~~v ? v : v === !0 ? Z.Z_FINISH : Z.Z_NO_FLUSH, typeof z == "string" ? W.input = m.binstring2buf(z) : X.call(z) === "[object ArrayBuffer]" ? W.input = new Uint8Array(z) : W.input = z, W.next_in = 0, W.avail_in = W.input.length;
- do {
- if (W.avail_out === 0 && (W.output = new u.Buf8(y), W.next_out = 0, W.avail_out = y), (K = b.inflate(W, Z.Z_NO_FLUSH)) === Z.Z_NEED_DICT && f && (w = typeof f == "string" ? m.string2buf(f) : X.call(f) === "[object ArrayBuffer]" ? new Uint8Array(f) : f, K = b.inflateSetDictionary(this.strm, w)), K === Z.Z_BUF_ERROR && D === !0 && (K = Z.Z_OK, D = !1), K !== Z.Z_STREAM_END && K !== Z.Z_OK) return this.onEnd(K), !(this.ended = !0);
- W.next_out && (W.avail_out !== 0 && K !== Z.Z_STREAM_END && (W.avail_in !== 0 || V !== Z.Z_FINISH && V !== Z.Z_SYNC_FLUSH) || (this.options.to === "string" ? (N = m.utf8border(W.output, W.next_out), B = W.next_out - N, G = m.buf2string(W.output, N), W.next_out = B, W.avail_out = y - B, B && u.arraySet(W.output, W.output, N, B, 0), this.onData(G)) : this.onData(u.shrinkBuf(W.output, W.next_out)))), W.avail_in === 0 && W.avail_out === 0 && (D = !0);
- } while ((0 < W.avail_in || W.avail_out === 0) && K !== Z.Z_STREAM_END);
- return K === Z.Z_STREAM_END && (V = Z.Z_FINISH), V === Z.Z_FINISH ? (K = b.inflateEnd(this.strm), this.onEnd(K), this.ended = !0, K === Z.Z_OK) : V !== Z.Z_SYNC_FLUSH || (this.onEnd(Z.Z_OK), !(W.avail_out = 0));
- }, H.prototype.onData = function(z) {
- this.chunks.push(z);
- }, H.prototype.onEnd = function(z) {
- z === Z.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = u.flattenChunks(this.chunks)), this.chunks = [], this.err = z, this.msg = this.strm.msg;
- }, h.Inflate = H, h.inflate = S, h.inflateRaw = function(z, v) {
- return (v = v || {}).raw = !0, S(z, v);
- }, h.ungzip = S;
- }, { "./utils/common": 41, "./utils/strings": 42, "./zlib/constants": 44, "./zlib/gzheader": 47, "./zlib/inflate": 49, "./zlib/messages": 51, "./zlib/zstream": 53 }], 41: [function(c, r, h) {
- var b = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
- h.assign = function(Z) {
- for (var p = Array.prototype.slice.call(arguments, 1); p.length; ) {
- var Y = p.shift();
- if (Y) {
- if (typeof Y != "object") throw new TypeError(Y + "must be non-object");
- for (var R in Y) Y.hasOwnProperty(R) && (Z[R] = Y[R]);
- }
- }
- return Z;
- }, h.shrinkBuf = function(Z, p) {
- return Z.length === p ? Z : Z.subarray ? Z.subarray(0, p) : (Z.length = p, Z);
- };
- var u = { arraySet: function(Z, p, Y, R, X) {
- if (p.subarray && Z.subarray) Z.set(p.subarray(Y, Y + R), X);
- else for (var H = 0; H < R; H++) Z[X + H] = p[Y + H];
- }, flattenChunks: function(Z) {
- var p, Y, R, X, H, S;
- for (p = R = 0, Y = Z.length; p < Y; p++) R += Z[p].length;
- for (S = new Uint8Array(R), p = X = 0, Y = Z.length; p < Y; p++) H = Z[p], S.set(H, X), X += H.length;
- return S;
- } }, m = { arraySet: function(Z, p, Y, R, X) {
- for (var H = 0; H < R; H++) Z[X + H] = p[Y + H];
- }, flattenChunks: function(Z) {
- return [].concat.apply([], Z);
- } };
- h.setTyped = function(Z) {
- Z ? (h.Buf8 = Uint8Array, h.Buf16 = Uint16Array, h.Buf32 = Int32Array, h.assign(h, u)) : (h.Buf8 = Array, h.Buf16 = Array, h.Buf32 = Array, h.assign(h, m));
- }, h.setTyped(b);
- }, {}], 42: [function(c, r, h) {
- var b = c("./common"), u = !0, m = !0;
- try {
- String.fromCharCode.apply(null, [0]);
- } catch {
- u = !1;
- }
- try {
- String.fromCharCode.apply(null, new Uint8Array(1));
- } catch {
- m = !1;
- }
- for (var Z = new b.Buf8(256), p = 0; p < 256; p++) Z[p] = 252 <= p ? 6 : 248 <= p ? 5 : 240 <= p ? 4 : 224 <= p ? 3 : 192 <= p ? 2 : 1;
- function Y(R, X) {
- if (X < 65537 && (R.subarray && m || !R.subarray && u)) return String.fromCharCode.apply(null, b.shrinkBuf(R, X));
- for (var H = "", S = 0; S < X; S++) H += String.fromCharCode(R[S]);
- return H;
- }
- Z[254] = Z[254] = 1, h.string2buf = function(R) {
- var X, H, S, z, v, K = R.length, V = 0;
- for (z = 0; z < K; z++) (64512 & (H = R.charCodeAt(z))) == 55296 && z + 1 < K && (64512 & (S = R.charCodeAt(z + 1))) == 56320 && (H = 65536 + (H - 55296 << 10) + (S - 56320), z++), V += H < 128 ? 1 : H < 2048 ? 2 : H < 65536 ? 3 : 4;
- for (X = new b.Buf8(V), z = v = 0; v < V; z++) (64512 & (H = R.charCodeAt(z))) == 55296 && z + 1 < K && (64512 & (S = R.charCodeAt(z + 1))) == 56320 && (H = 65536 + (H - 55296 << 10) + (S - 56320), z++), H < 128 ? X[v++] = H : (H < 2048 ? X[v++] = 192 | H >>> 6 : (H < 65536 ? X[v++] = 224 | H >>> 12 : (X[v++] = 240 | H >>> 18, X[v++] = 128 | H >>> 12 & 63), X[v++] = 128 | H >>> 6 & 63), X[v++] = 128 | 63 & H);
- return X;
- }, h.buf2binstring = function(R) {
- return Y(R, R.length);
- }, h.binstring2buf = function(R) {
- for (var X = new b.Buf8(R.length), H = 0, S = X.length; H < S; H++) X[H] = R.charCodeAt(H);
- return X;
- }, h.buf2string = function(R, X) {
- var H, S, z, v, K = X || R.length, V = new Array(2 * K);
- for (H = S = 0; H < K; ) if ((z = R[H++]) < 128) V[S++] = z;
- else if (4 < (v = Z[z])) V[S++] = 65533, H += v - 1;
- else {
- for (z &= v === 2 ? 31 : v === 3 ? 15 : 7; 1 < v && H < K; ) z = z << 6 | 63 & R[H++], v--;
- 1 < v ? V[S++] = 65533 : z < 65536 ? V[S++] = z : (z -= 65536, V[S++] = 55296 | z >> 10 & 1023, V[S++] = 56320 | 1023 & z);
- }
- return Y(V, S);
- }, h.utf8border = function(R, X) {
- var H;
- for ((X = X || R.length) > R.length && (X = R.length), H = X - 1; 0 <= H && (192 & R[H]) == 128; ) H--;
- return H < 0 || H === 0 ? X : H + Z[R[H]] > X ? H : X;
- };
- }, { "./common": 41 }], 43: [function(c, r, h) {
- r.exports = function(b, u, m, Z) {
- for (var p = 65535 & b | 0, Y = b >>> 16 & 65535 | 0, R = 0; m !== 0; ) {
- for (m -= R = 2e3 < m ? 2e3 : m; Y = Y + (p = p + u[Z++] | 0) | 0, --R; ) ;
- p %= 65521, Y %= 65521;
- }
- return p | Y << 16 | 0;
- };
- }, {}], 44: [function(c, r, h) {
- r.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };
- }, {}], 45: [function(c, r, h) {
- var b = function() {
- for (var u, m = [], Z = 0; Z < 256; Z++) {
- u = Z;
- for (var p = 0; p < 8; p++) u = 1 & u ? 3988292384 ^ u >>> 1 : u >>> 1;
- m[Z] = u;
- }
- return m;
- }();
- r.exports = function(u, m, Z, p) {
- var Y = b, R = p + Z;
- u ^= -1;
- for (var X = p; X < R; X++) u = u >>> 8 ^ Y[255 & (u ^ m[X])];
- return -1 ^ u;
- };
- }, {}], 46: [function(c, r, h) {
- var b, u = c("../utils/common"), m = c("./trees"), Z = c("./adler32"), p = c("./crc32"), Y = c("./messages"), R = -2, X = 258, H = 262, S = 113;
- function z(L, E) {
- return L.msg = Y[E], E;
- }
- function v(L) {
- return (L << 1) - (4 < L ? 9 : 0);
- }
- function K(L) {
- for (var E = L.length; 0 <= --E; ) L[E] = 0;
- }
- function V(L) {
- var E = L.state, J = E.pending;
- J > L.avail_out && (J = L.avail_out), J !== 0 && (u.arraySet(L.output, E.pending_buf, E.pending_out, J, L.next_out), L.next_out += J, E.pending_out += J, L.total_out += J, L.avail_out -= J, E.pending -= J, E.pending === 0 && (E.pending_out = 0));
- }
- function N(L, E) {
- m._tr_flush_block(L, 0 <= L.block_start ? L.block_start : -1, L.strstart - L.block_start, E), L.block_start = L.strstart, V(L.strm);
- }
- function B(L, E) {
- L.pending_buf[L.pending++] = E;
- }
- function G(L, E) {
- L.pending_buf[L.pending++] = E >>> 8 & 255, L.pending_buf[L.pending++] = 255 & E;
- }
- function w(L, E) {
- var J, k, j = L.max_chain_length, q = L.strstart, Cg = L.prev_length, Ig = L.nice_match, x = L.strstart > L.w_size - H ? L.strstart - (L.w_size - H) : 0, Ag = L.window, eg = L.w_mask, O = L.prev, _ = L.strstart + X, gg = Ag[q + Cg - 1], lg = Ag[q + Cg];
- L.prev_length >= L.good_match && (j >>= 2), Ig > L.lookahead && (Ig = L.lookahead);
- do
- if (Ag[(J = E) + Cg] === lg && Ag[J + Cg - 1] === gg && Ag[J] === Ag[q] && Ag[++J] === Ag[q + 1]) {
- q += 2, J++;
- do
- ;
- while (Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && Ag[++q] === Ag[++J] && q < _);
- if (k = X - (_ - q), q = _ - X, Cg < k) {
- if (L.match_start = E, Ig <= (Cg = k)) break;
- gg = Ag[q + Cg - 1], lg = Ag[q + Cg];
- }
- }
- while ((E = O[E & eg]) > x && --j != 0);
- return Cg <= L.lookahead ? Cg : L.lookahead;
- }
- function W(L) {
- var E, J, k, j, q, Cg, Ig, x, Ag, eg, O = L.w_size;
- do {
- if (j = L.window_size - L.lookahead - L.strstart, L.strstart >= O + (O - H)) {
- for (u.arraySet(L.window, L.window, O, O, 0), L.match_start -= O, L.strstart -= O, L.block_start -= O, E = J = L.hash_size; k = L.head[--E], L.head[E] = O <= k ? k - O : 0, --J; ) ;
- for (E = J = O; k = L.prev[--E], L.prev[E] = O <= k ? k - O : 0, --J; ) ;
- j += O;
- }
- if (L.strm.avail_in === 0) break;
- if (Cg = L.strm, Ig = L.window, x = L.strstart + L.lookahead, eg = void 0, (Ag = j) < (eg = Cg.avail_in) && (eg = Ag), J = eg === 0 ? 0 : (Cg.avail_in -= eg, u.arraySet(Ig, Cg.input, Cg.next_in, eg, x), Cg.state.wrap === 1 ? Cg.adler = Z(Cg.adler, Ig, eg, x) : Cg.state.wrap === 2 && (Cg.adler = p(Cg.adler, Ig, eg, x)), Cg.next_in += eg, Cg.total_in += eg, eg), L.lookahead += J, L.lookahead + L.insert >= 3) for (q = L.strstart - L.insert, L.ins_h = L.window[q], L.ins_h = (L.ins_h << L.hash_shift ^ L.window[q + 1]) & L.hash_mask; L.insert && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[q + 3 - 1]) & L.hash_mask, L.prev[q & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = q, q++, L.insert--, !(L.lookahead + L.insert < 3)); ) ;
- } while (L.lookahead < H && L.strm.avail_in !== 0);
- }
- function y(L, E) {
- for (var J, k; ; ) {
- if (L.lookahead < H) {
- if (W(L), L.lookahead < H && E === 0) return 1;
- if (L.lookahead === 0) break;
- }
- if (J = 0, L.lookahead >= 3 && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart), J !== 0 && L.strstart - J <= L.w_size - H && (L.match_length = w(L, J)), L.match_length >= 3) if (k = m._tr_tally(L, L.strstart - L.match_start, L.match_length - 3), L.lookahead -= L.match_length, L.match_length <= L.max_lazy_match && L.lookahead >= 3) {
- for (L.match_length--; L.strstart++, L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart, --L.match_length != 0; ) ;
- L.strstart++;
- } else L.strstart += L.match_length, L.match_length = 0, L.ins_h = L.window[L.strstart], L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 1]) & L.hash_mask;
- else k = m._tr_tally(L, 0, L.window[L.strstart]), L.lookahead--, L.strstart++;
- if (k && (N(L, !1), L.strm.avail_out === 0)) return 1;
- }
- return L.insert = L.strstart < 2 ? L.strstart : 2, E === 4 ? (N(L, !0), L.strm.avail_out === 0 ? 3 : 4) : L.last_lit && (N(L, !1), L.strm.avail_out === 0) ? 1 : 2;
- }
- function f(L, E) {
- for (var J, k, j; ; ) {
- if (L.lookahead < H) {
- if (W(L), L.lookahead < H && E === 0) return 1;
- if (L.lookahead === 0) break;
- }
- if (J = 0, L.lookahead >= 3 && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart), L.prev_length = L.match_length, L.prev_match = L.match_start, L.match_length = 2, J !== 0 && L.prev_length < L.max_lazy_match && L.strstart - J <= L.w_size - H && (L.match_length = w(L, J), L.match_length <= 5 && (L.strategy === 1 || L.match_length === 3 && 4096 < L.strstart - L.match_start) && (L.match_length = 2)), L.prev_length >= 3 && L.match_length <= L.prev_length) {
- for (j = L.strstart + L.lookahead - 3, k = m._tr_tally(L, L.strstart - 1 - L.prev_match, L.prev_length - 3), L.lookahead -= L.prev_length - 1, L.prev_length -= 2; ++L.strstart <= j && (L.ins_h = (L.ins_h << L.hash_shift ^ L.window[L.strstart + 3 - 1]) & L.hash_mask, J = L.prev[L.strstart & L.w_mask] = L.head[L.ins_h], L.head[L.ins_h] = L.strstart), --L.prev_length != 0; ) ;
- if (L.match_available = 0, L.match_length = 2, L.strstart++, k && (N(L, !1), L.strm.avail_out === 0)) return 1;
- } else if (L.match_available) {
- if ((k = m._tr_tally(L, 0, L.window[L.strstart - 1])) && N(L, !1), L.strstart++, L.lookahead--, L.strm.avail_out === 0) return 1;
- } else L.match_available = 1, L.strstart++, L.lookahead--;
- }
- return L.match_available && (k = m._tr_tally(L, 0, L.window[L.strstart - 1]), L.match_available = 0), L.insert = L.strstart < 2 ? L.strstart : 2, E === 4 ? (N(L, !0), L.strm.avail_out === 0 ? 3 : 4) : L.last_lit && (N(L, !1), L.strm.avail_out === 0) ? 1 : 2;
- }
- function D(L, E, J, k, j) {
- this.good_length = L, this.max_lazy = E, this.nice_length = J, this.max_chain = k, this.func = j;
- }
- function F() {
- this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new u.Buf16(1146), this.dyn_dtree = new u.Buf16(122), this.bl_tree = new u.Buf16(78), K(this.dyn_ltree), K(this.dyn_dtree), K(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new u.Buf16(16), this.heap = new u.Buf16(573), K(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new u.Buf16(573), K(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
- }
- function T(L) {
- var E;
- return L && L.state ? (L.total_in = L.total_out = 0, L.data_type = 2, (E = L.state).pending = 0, E.pending_out = 0, E.wrap < 0 && (E.wrap = -E.wrap), E.status = E.wrap ? 42 : S, L.adler = E.wrap === 2 ? 0 : 1, E.last_flush = 0, m._tr_init(E), 0) : z(L, R);
- }
- function Q(L) {
- var E = T(L);
- return E === 0 && function(J) {
- J.window_size = 2 * J.w_size, K(J.head), J.max_lazy_match = b[J.level].max_lazy, J.good_match = b[J.level].good_length, J.nice_match = b[J.level].nice_length, J.max_chain_length = b[J.level].max_chain, J.strstart = 0, J.block_start = 0, J.lookahead = 0, J.insert = 0, J.match_length = J.prev_length = 2, J.match_available = 0, J.ins_h = 0;
- }(L.state), E;
- }
- function P(L, E, J, k, j, q) {
- if (!L) return R;
- var Cg = 1;
- if (E === -1 && (E = 6), k < 0 ? (Cg = 0, k = -k) : 15 < k && (Cg = 2, k -= 16), j < 1 || 9 < j || J !== 8 || k < 8 || 15 < k || E < 0 || 9 < E || q < 0 || 4 < q) return z(L, R);
- k === 8 && (k = 9);
- var Ig = new F();
- return (L.state = Ig).strm = L, Ig.wrap = Cg, Ig.gzhead = null, Ig.w_bits = k, Ig.w_size = 1 << Ig.w_bits, Ig.w_mask = Ig.w_size - 1, Ig.hash_bits = j + 7, Ig.hash_size = 1 << Ig.hash_bits, Ig.hash_mask = Ig.hash_size - 1, Ig.hash_shift = ~~((Ig.hash_bits + 3 - 1) / 3), Ig.window = new u.Buf8(2 * Ig.w_size), Ig.head = new u.Buf16(Ig.hash_size), Ig.prev = new u.Buf16(Ig.w_size), Ig.lit_bufsize = 1 << j + 6, Ig.pending_buf_size = 4 * Ig.lit_bufsize, Ig.pending_buf = new u.Buf8(Ig.pending_buf_size), Ig.d_buf = 1 * Ig.lit_bufsize, Ig.l_buf = 3 * Ig.lit_bufsize, Ig.level = E, Ig.strategy = q, Ig.method = J, Q(L);
- }
- b = [new D(0, 0, 0, 0, function(L, E) {
- var J = 65535;
- for (J > L.pending_buf_size - 5 && (J = L.pending_buf_size - 5); ; ) {
- if (L.lookahead <= 1) {
- if (W(L), L.lookahead === 0 && E === 0) return 1;
- if (L.lookahead === 0) break;
- }
- L.strstart += L.lookahead, L.lookahead = 0;
- var k = L.block_start + J;
- if ((L.strstart === 0 || L.strstart >= k) && (L.lookahead = L.strstart - k, L.strstart = k, N(L, !1), L.strm.avail_out === 0) || L.strstart - L.block_start >= L.w_size - H && (N(L, !1), L.strm.avail_out === 0)) return 1;
- }
- return L.insert = 0, E === 4 ? (N(L, !0), L.strm.avail_out === 0 ? 3 : 4) : (L.strstart > L.block_start && (N(L, !1), L.strm.avail_out), 1);
- }), new D(4, 4, 8, 4, y), new D(4, 5, 16, 8, y), new D(4, 6, 32, 32, y), new D(4, 4, 16, 16, f), new D(8, 16, 32, 32, f), new D(8, 16, 128, 128, f), new D(8, 32, 128, 256, f), new D(32, 128, 258, 1024, f), new D(32, 258, 258, 4096, f)], h.deflateInit = function(L, E) {
- return P(L, E, 8, 15, 8, 0);
- }, h.deflateInit2 = P, h.deflateReset = Q, h.deflateResetKeep = T, h.deflateSetHeader = function(L, E) {
- return L && L.state ? L.state.wrap !== 2 ? R : (L.state.gzhead = E, 0) : R;
- }, h.deflate = function(L, E) {
- var J, k, j, q;
- if (!L || !L.state || 5 < E || E < 0) return L ? z(L, R) : R;
- if (k = L.state, !L.output || !L.input && L.avail_in !== 0 || k.status === 666 && E !== 4) return z(L, L.avail_out === 0 ? -5 : R);
- if (k.strm = L, J = k.last_flush, k.last_flush = E, k.status === 42) if (k.wrap === 2) L.adler = 0, B(k, 31), B(k, 139), B(k, 8), k.gzhead ? (B(k, (k.gzhead.text ? 1 : 0) + (k.gzhead.hcrc ? 2 : 0) + (k.gzhead.extra ? 4 : 0) + (k.gzhead.name ? 8 : 0) + (k.gzhead.comment ? 16 : 0)), B(k, 255 & k.gzhead.time), B(k, k.gzhead.time >> 8 & 255), B(k, k.gzhead.time >> 16 & 255), B(k, k.gzhead.time >> 24 & 255), B(k, k.level === 9 ? 2 : 2 <= k.strategy || k.level < 2 ? 4 : 0), B(k, 255 & k.gzhead.os), k.gzhead.extra && k.gzhead.extra.length && (B(k, 255 & k.gzhead.extra.length), B(k, k.gzhead.extra.length >> 8 & 255)), k.gzhead.hcrc && (L.adler = p(L.adler, k.pending_buf, k.pending, 0)), k.gzindex = 0, k.status = 69) : (B(k, 0), B(k, 0), B(k, 0), B(k, 0), B(k, 0), B(k, k.level === 9 ? 2 : 2 <= k.strategy || k.level < 2 ? 4 : 0), B(k, 3), k.status = S);
- else {
- var Cg = 8 + (k.w_bits - 8 << 4) << 8;
- Cg |= (2 <= k.strategy || k.level < 2 ? 0 : k.level < 6 ? 1 : k.level === 6 ? 2 : 3) << 6, k.strstart !== 0 && (Cg |= 32), Cg += 31 - Cg % 31, k.status = S, G(k, Cg), k.strstart !== 0 && (G(k, L.adler >>> 16), G(k, 65535 & L.adler)), L.adler = 1;
- }
- if (k.status === 69) if (k.gzhead.extra) {
- for (j = k.pending; k.gzindex < (65535 & k.gzhead.extra.length) && (k.pending !== k.pending_buf_size || (k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), V(L), j = k.pending, k.pending !== k.pending_buf_size)); ) B(k, 255 & k.gzhead.extra[k.gzindex]), k.gzindex++;
- k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), k.gzindex === k.gzhead.extra.length && (k.gzindex = 0, k.status = 73);
- } else k.status = 73;
- if (k.status === 73) if (k.gzhead.name) {
- j = k.pending;
- do {
- if (k.pending === k.pending_buf_size && (k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), V(L), j = k.pending, k.pending === k.pending_buf_size)) {
- q = 1;
- break;
- }
- q = k.gzindex < k.gzhead.name.length ? 255 & k.gzhead.name.charCodeAt(k.gzindex++) : 0, B(k, q);
- } while (q !== 0);
- k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), q === 0 && (k.gzindex = 0, k.status = 91);
- } else k.status = 91;
- if (k.status === 91) if (k.gzhead.comment) {
- j = k.pending;
- do {
- if (k.pending === k.pending_buf_size && (k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), V(L), j = k.pending, k.pending === k.pending_buf_size)) {
- q = 1;
- break;
- }
- q = k.gzindex < k.gzhead.comment.length ? 255 & k.gzhead.comment.charCodeAt(k.gzindex++) : 0, B(k, q);
- } while (q !== 0);
- k.gzhead.hcrc && k.pending > j && (L.adler = p(L.adler, k.pending_buf, k.pending - j, j)), q === 0 && (k.status = 103);
- } else k.status = 103;
- if (k.status === 103 && (k.gzhead.hcrc ? (k.pending + 2 > k.pending_buf_size && V(L), k.pending + 2 <= k.pending_buf_size && (B(k, 255 & L.adler), B(k, L.adler >> 8 & 255), L.adler = 0, k.status = S)) : k.status = S), k.pending !== 0) {
- if (V(L), L.avail_out === 0) return k.last_flush = -1, 0;
- } else if (L.avail_in === 0 && v(E) <= v(J) && E !== 4) return z(L, -5);
- if (k.status === 666 && L.avail_in !== 0) return z(L, -5);
- if (L.avail_in !== 0 || k.lookahead !== 0 || E !== 0 && k.status !== 666) {
- var Ig = k.strategy === 2 ? function(x, Ag) {
- for (var eg; ; ) {
- if (x.lookahead === 0 && (W(x), x.lookahead === 0)) {
- if (Ag === 0) return 1;
- break;
- }
- if (x.match_length = 0, eg = m._tr_tally(x, 0, x.window[x.strstart]), x.lookahead--, x.strstart++, eg && (N(x, !1), x.strm.avail_out === 0)) return 1;
- }
- return x.insert = 0, Ag === 4 ? (N(x, !0), x.strm.avail_out === 0 ? 3 : 4) : x.last_lit && (N(x, !1), x.strm.avail_out === 0) ? 1 : 2;
- }(k, E) : k.strategy === 3 ? function(x, Ag) {
- for (var eg, O, _, gg, lg = x.window; ; ) {
- if (x.lookahead <= X) {
- if (W(x), x.lookahead <= X && Ag === 0) return 1;
- if (x.lookahead === 0) break;
- }
- if (x.match_length = 0, x.lookahead >= 3 && 0 < x.strstart && (O = lg[_ = x.strstart - 1]) === lg[++_] && O === lg[++_] && O === lg[++_]) {
- gg = x.strstart + X;
- do
- ;
- while (O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && O === lg[++_] && _ < gg);
- x.match_length = X - (gg - _), x.match_length > x.lookahead && (x.match_length = x.lookahead);
- }
- if (x.match_length >= 3 ? (eg = m._tr_tally(x, 1, x.match_length - 3), x.lookahead -= x.match_length, x.strstart += x.match_length, x.match_length = 0) : (eg = m._tr_tally(x, 0, x.window[x.strstart]), x.lookahead--, x.strstart++), eg && (N(x, !1), x.strm.avail_out === 0)) return 1;
- }
- return x.insert = 0, Ag === 4 ? (N(x, !0), x.strm.avail_out === 0 ? 3 : 4) : x.last_lit && (N(x, !1), x.strm.avail_out === 0) ? 1 : 2;
- }(k, E) : b[k.level].func(k, E);
- if (Ig !== 3 && Ig !== 4 || (k.status = 666), Ig === 1 || Ig === 3) return L.avail_out === 0 && (k.last_flush = -1), 0;
- if (Ig === 2 && (E === 1 ? m._tr_align(k) : E !== 5 && (m._tr_stored_block(k, 0, 0, !1), E === 3 && (K(k.head), k.lookahead === 0 && (k.strstart = 0, k.block_start = 0, k.insert = 0))), V(L), L.avail_out === 0)) return k.last_flush = -1, 0;
- }
- return E !== 4 ? 0 : k.wrap <= 0 ? 1 : (k.wrap === 2 ? (B(k, 255 & L.adler), B(k, L.adler >> 8 & 255), B(k, L.adler >> 16 & 255), B(k, L.adler >> 24 & 255), B(k, 255 & L.total_in), B(k, L.total_in >> 8 & 255), B(k, L.total_in >> 16 & 255), B(k, L.total_in >> 24 & 255)) : (G(k, L.adler >>> 16), G(k, 65535 & L.adler)), V(L), 0 < k.wrap && (k.wrap = -k.wrap), k.pending !== 0 ? 0 : 1);
- }, h.deflateEnd = function(L) {
- var E;
- return L && L.state ? (E = L.state.status) !== 42 && E !== 69 && E !== 73 && E !== 91 && E !== 103 && E !== S && E !== 666 ? z(L, R) : (L.state = null, E === S ? z(L, -3) : 0) : R;
- }, h.deflateSetDictionary = function(L, E) {
- var J, k, j, q, Cg, Ig, x, Ag, eg = E.length;
- if (!L || !L.state || (q = (J = L.state).wrap) === 2 || q === 1 && J.status !== 42 || J.lookahead) return R;
- for (q === 1 && (L.adler = Z(L.adler, E, eg, 0)), J.wrap = 0, eg >= J.w_size && (q === 0 && (K(J.head), J.strstart = 0, J.block_start = 0, J.insert = 0), Ag = new u.Buf8(J.w_size), u.arraySet(Ag, E, eg - J.w_size, J.w_size, 0), E = Ag, eg = J.w_size), Cg = L.avail_in, Ig = L.next_in, x = L.input, L.avail_in = eg, L.next_in = 0, L.input = E, W(J); J.lookahead >= 3; ) {
- for (k = J.strstart, j = J.lookahead - 2; J.ins_h = (J.ins_h << J.hash_shift ^ J.window[k + 3 - 1]) & J.hash_mask, J.prev[k & J.w_mask] = J.head[J.ins_h], J.head[J.ins_h] = k, k++, --j; ) ;
- J.strstart = k, J.lookahead = 2, W(J);
- }
- return J.strstart += J.lookahead, J.block_start = J.strstart, J.insert = J.lookahead, J.lookahead = 0, J.match_length = J.prev_length = 2, J.match_available = 0, L.next_in = Ig, L.input = x, L.avail_in = Cg, J.wrap = q, 0;
- }, h.deflateInfo = "pako deflate (from Nodeca project)";
- }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./messages": 51, "./trees": 52 }], 47: [function(c, r, h) {
- r.exports = function() {
- this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
- };
- }, {}], 48: [function(c, r, h) {
- r.exports = function(b, u) {
- var m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L;
- m = b.state, Z = b.next_in, P = b.input, p = Z + (b.avail_in - 5), Y = b.next_out, L = b.output, R = Y - (u - b.avail_out), X = Y + (b.avail_out - 257), H = m.dmax, S = m.wsize, z = m.whave, v = m.wnext, K = m.window, V = m.hold, N = m.bits, B = m.lencode, G = m.distcode, w = (1 << m.lenbits) - 1, W = (1 << m.distbits) - 1;
- g: do {
- N < 15 && (V += P[Z++] << N, N += 8, V += P[Z++] << N, N += 8), y = B[V & w];
- I: for (; ; ) {
- if (V >>>= f = y >>> 24, N -= f, (f = y >>> 16 & 255) == 0) L[Y++] = 65535 & y;
- else {
- if (!(16 & f)) {
- if ((64 & f) == 0) {
- y = B[(65535 & y) + (V & (1 << f) - 1)];
- continue I;
- }
- if (32 & f) {
- m.mode = 12;
- break g;
- }
- b.msg = "invalid literal/length code", m.mode = 30;
- break g;
- }
- D = 65535 & y, (f &= 15) && (N < f && (V += P[Z++] << N, N += 8), D += V & (1 << f) - 1, V >>>= f, N -= f), N < 15 && (V += P[Z++] << N, N += 8, V += P[Z++] << N, N += 8), y = G[V & W];
- C: for (; ; ) {
- if (V >>>= f = y >>> 24, N -= f, !(16 & (f = y >>> 16 & 255))) {
- if ((64 & f) == 0) {
- y = G[(65535 & y) + (V & (1 << f) - 1)];
- continue C;
- }
- b.msg = "invalid distance code", m.mode = 30;
- break g;
- }
- if (F = 65535 & y, N < (f &= 15) && (V += P[Z++] << N, (N += 8) < f && (V += P[Z++] << N, N += 8)), H < (F += V & (1 << f) - 1)) {
- b.msg = "invalid distance too far back", m.mode = 30;
- break g;
- }
- if (V >>>= f, N -= f, (f = Y - R) < F) {
- if (z < (f = F - f) && m.sane) {
- b.msg = "invalid distance too far back", m.mode = 30;
- break g;
- }
- if (Q = K, (T = 0) === v) {
- if (T += S - f, f < D) {
- for (D -= f; L[Y++] = K[T++], --f; ) ;
- T = Y - F, Q = L;
- }
- } else if (v < f) {
- if (T += S + v - f, (f -= v) < D) {
- for (D -= f; L[Y++] = K[T++], --f; ) ;
- if (T = 0, v < D) {
- for (D -= f = v; L[Y++] = K[T++], --f; ) ;
- T = Y - F, Q = L;
- }
- }
- } else if (T += v - f, f < D) {
- for (D -= f; L[Y++] = K[T++], --f; ) ;
- T = Y - F, Q = L;
- }
- for (; 2 < D; ) L[Y++] = Q[T++], L[Y++] = Q[T++], L[Y++] = Q[T++], D -= 3;
- D && (L[Y++] = Q[T++], 1 < D && (L[Y++] = Q[T++]));
- } else {
- for (T = Y - F; L[Y++] = L[T++], L[Y++] = L[T++], L[Y++] = L[T++], 2 < (D -= 3); ) ;
- D && (L[Y++] = L[T++], 1 < D && (L[Y++] = L[T++]));
- }
- break;
- }
- }
- break;
- }
- } while (Z < p && Y < X);
- Z -= D = N >> 3, V &= (1 << (N -= D << 3)) - 1, b.next_in = Z, b.next_out = Y, b.avail_in = Z < p ? p - Z + 5 : 5 - (Z - p), b.avail_out = Y < X ? X - Y + 257 : 257 - (Y - X), m.hold = V, m.bits = N;
- };
- }, {}], 49: [function(c, r, h) {
- var b = c("../utils/common"), u = c("./adler32"), m = c("./crc32"), Z = c("./inffast"), p = c("./inftrees"), Y = -2;
- function R(w) {
- return (w >>> 24 & 255) + (w >>> 8 & 65280) + ((65280 & w) << 8) + ((255 & w) << 24);
- }
- function X() {
- this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new b.Buf16(320), this.work = new b.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
- }
- function H(w) {
- var W;
- return w && w.state ? (W = w.state, w.total_in = w.total_out = W.total = 0, w.msg = "", W.wrap && (w.adler = 1 & W.wrap), W.mode = 1, W.last = 0, W.havedict = 0, W.dmax = 32768, W.head = null, W.hold = 0, W.bits = 0, W.lencode = W.lendyn = new b.Buf32(852), W.distcode = W.distdyn = new b.Buf32(592), W.sane = 1, W.back = -1, 0) : Y;
- }
- function S(w) {
- var W;
- return w && w.state ? ((W = w.state).wsize = 0, W.whave = 0, W.wnext = 0, H(w)) : Y;
- }
- function z(w, W) {
- var y, f;
- return w && w.state ? (f = w.state, W < 0 ? (y = 0, W = -W) : (y = 1 + (W >> 4), W < 48 && (W &= 15)), W && (W < 8 || 15 < W) ? Y : (f.window !== null && f.wbits !== W && (f.window = null), f.wrap = y, f.wbits = W, S(w))) : Y;
- }
- function v(w, W) {
- var y, f;
- return w ? (f = new X(), (w.state = f).window = null, (y = z(w, W)) !== 0 && (w.state = null), y) : Y;
- }
- var K, V, N = !0;
- function B(w) {
- if (N) {
- var W;
- for (K = new b.Buf32(512), V = new b.Buf32(32), W = 0; W < 144; ) w.lens[W++] = 8;
- for (; W < 256; ) w.lens[W++] = 9;
- for (; W < 280; ) w.lens[W++] = 7;
- for (; W < 288; ) w.lens[W++] = 8;
- for (p(1, w.lens, 0, 288, K, 0, w.work, { bits: 9 }), W = 0; W < 32; ) w.lens[W++] = 5;
- p(2, w.lens, 0, 32, V, 0, w.work, { bits: 5 }), N = !1;
- }
- w.lencode = K, w.lenbits = 9, w.distcode = V, w.distbits = 5;
- }
- function G(w, W, y, f) {
- var D, F = w.state;
- return F.window === null && (F.wsize = 1 << F.wbits, F.wnext = 0, F.whave = 0, F.window = new b.Buf8(F.wsize)), f >= F.wsize ? (b.arraySet(F.window, W, y - F.wsize, F.wsize, 0), F.wnext = 0, F.whave = F.wsize) : (f < (D = F.wsize - F.wnext) && (D = f), b.arraySet(F.window, W, y - f, D, F.wnext), (f -= D) ? (b.arraySet(F.window, W, y - f, f, 0), F.wnext = f, F.whave = F.wsize) : (F.wnext += D, F.wnext === F.wsize && (F.wnext = 0), F.whave < F.wsize && (F.whave += D))), 0;
- }
- h.inflateReset = S, h.inflateReset2 = z, h.inflateResetKeep = H, h.inflateInit = function(w) {
- return v(w, 15);
- }, h.inflateInit2 = v, h.inflate = function(w, W) {
- var y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og = 0, cg = new b.Buf8(4), rg = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
- if (!w || !w.state || !w.output || !w.input && w.avail_in !== 0) return Y;
- (y = w.state).mode === 12 && (y.mode = 13), T = w.next_out, D = w.output, P = w.avail_out, F = w.next_in, f = w.input, Q = w.avail_in, L = y.hold, E = y.bits, J = Q, k = P, lg = 0;
- g: for (; ; ) switch (y.mode) {
- case 1:
- if (y.wrap === 0) {
- y.mode = 13;
- break;
- }
- for (; E < 16; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (2 & y.wrap && L === 35615) {
- cg[y.check = 0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0), E = L = 0, y.mode = 2;
- break;
- }
- if (y.flags = 0, y.head && (y.head.done = !1), !(1 & y.wrap) || (((255 & L) << 8) + (L >> 8)) % 31) {
- w.msg = "incorrect header check", y.mode = 30;
- break;
- }
- if ((15 & L) != 8) {
- w.msg = "unknown compression method", y.mode = 30;
- break;
- }
- if (E -= 4, gg = 8 + (15 & (L >>>= 4)), y.wbits === 0) y.wbits = gg;
- else if (gg > y.wbits) {
- w.msg = "invalid window size", y.mode = 30;
- break;
- }
- y.dmax = 1 << gg, w.adler = y.check = 1, y.mode = 512 & L ? 10 : 12, E = L = 0;
- break;
- case 2:
- for (; E < 16; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (y.flags = L, (255 & y.flags) != 8) {
- w.msg = "unknown compression method", y.mode = 30;
- break;
- }
- if (57344 & y.flags) {
- w.msg = "unknown header flags set", y.mode = 30;
- break;
- }
- y.head && (y.head.text = L >> 8 & 1), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0)), E = L = 0, y.mode = 3;
- case 3:
- for (; E < 32; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- y.head && (y.head.time = L), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, cg[2] = L >>> 16 & 255, cg[3] = L >>> 24 & 255, y.check = m(y.check, cg, 4, 0)), E = L = 0, y.mode = 4;
- case 4:
- for (; E < 16; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- y.head && (y.head.xflags = 255 & L, y.head.os = L >> 8), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0)), E = L = 0, y.mode = 5;
- case 5:
- if (1024 & y.flags) {
- for (; E < 16; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- y.length = L, y.head && (y.head.extra_len = L), 512 & y.flags && (cg[0] = 255 & L, cg[1] = L >>> 8 & 255, y.check = m(y.check, cg, 2, 0)), E = L = 0;
- } else y.head && (y.head.extra = null);
- y.mode = 6;
- case 6:
- if (1024 & y.flags && (Q < (j = y.length) && (j = Q), j && (y.head && (gg = y.head.extra_len - y.length, y.head.extra || (y.head.extra = new Array(y.head.extra_len)), b.arraySet(y.head.extra, f, F, j, gg)), 512 & y.flags && (y.check = m(y.check, f, j, F)), Q -= j, F += j, y.length -= j), y.length)) break g;
- y.length = 0, y.mode = 7;
- case 7:
- if (2048 & y.flags) {
- if (Q === 0) break g;
- for (j = 0; gg = f[F + j++], y.head && gg && y.length < 65536 && (y.head.name += String.fromCharCode(gg)), gg && j < Q; ) ;
- if (512 & y.flags && (y.check = m(y.check, f, j, F)), Q -= j, F += j, gg) break g;
- } else y.head && (y.head.name = null);
- y.length = 0, y.mode = 8;
- case 8:
- if (4096 & y.flags) {
- if (Q === 0) break g;
- for (j = 0; gg = f[F + j++], y.head && gg && y.length < 65536 && (y.head.comment += String.fromCharCode(gg)), gg && j < Q; ) ;
- if (512 & y.flags && (y.check = m(y.check, f, j, F)), Q -= j, F += j, gg) break g;
- } else y.head && (y.head.comment = null);
- y.mode = 9;
- case 9:
- if (512 & y.flags) {
- for (; E < 16; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (L !== (65535 & y.check)) {
- w.msg = "header crc mismatch", y.mode = 30;
- break;
- }
- E = L = 0;
- }
- y.head && (y.head.hcrc = y.flags >> 9 & 1, y.head.done = !0), w.adler = y.check = 0, y.mode = 12;
- break;
- case 10:
- for (; E < 32; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- w.adler = y.check = R(L), E = L = 0, y.mode = 11;
- case 11:
- if (y.havedict === 0) return w.next_out = T, w.avail_out = P, w.next_in = F, w.avail_in = Q, y.hold = L, y.bits = E, 2;
- w.adler = y.check = 1, y.mode = 12;
- case 12:
- if (W === 5 || W === 6) break g;
- case 13:
- if (y.last) {
- L >>>= 7 & E, E -= 7 & E, y.mode = 27;
- break;
- }
- for (; E < 3; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- switch (y.last = 1 & L, E -= 1, 3 & (L >>>= 1)) {
- case 0:
- y.mode = 14;
- break;
- case 1:
- if (B(y), y.mode = 20, W !== 6) break;
- L >>>= 2, E -= 2;
- break g;
- case 2:
- y.mode = 17;
- break;
- case 3:
- w.msg = "invalid block type", y.mode = 30;
- }
- L >>>= 2, E -= 2;
- break;
- case 14:
- for (L >>>= 7 & E, E -= 7 & E; E < 32; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if ((65535 & L) != (L >>> 16 ^ 65535)) {
- w.msg = "invalid stored block lengths", y.mode = 30;
- break;
- }
- if (y.length = 65535 & L, E = L = 0, y.mode = 15, W === 6) break g;
- case 15:
- y.mode = 16;
- case 16:
- if (j = y.length) {
- if (Q < j && (j = Q), P < j && (j = P), j === 0) break g;
- b.arraySet(D, f, F, j, T), Q -= j, F += j, P -= j, T += j, y.length -= j;
- break;
- }
- y.mode = 12;
- break;
- case 17:
- for (; E < 14; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (y.nlen = 257 + (31 & L), L >>>= 5, E -= 5, y.ndist = 1 + (31 & L), L >>>= 5, E -= 5, y.ncode = 4 + (15 & L), L >>>= 4, E -= 4, 286 < y.nlen || 30 < y.ndist) {
- w.msg = "too many length or distance symbols", y.mode = 30;
- break;
- }
- y.have = 0, y.mode = 18;
- case 18:
- for (; y.have < y.ncode; ) {
- for (; E < 3; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- y.lens[rg[y.have++]] = 7 & L, L >>>= 3, E -= 3;
- }
- for (; y.have < 19; ) y.lens[rg[y.have++]] = 0;
- if (y.lencode = y.lendyn, y.lenbits = 7, ng = { bits: y.lenbits }, lg = p(0, y.lens, 0, 19, y.lencode, 0, y.work, ng), y.lenbits = ng.bits, lg) {
- w.msg = "invalid code lengths set", y.mode = 30;
- break;
- }
- y.have = 0, y.mode = 19;
- case 19:
- for (; y.have < y.nlen + y.ndist; ) {
- for (; x = (og = y.lencode[L & (1 << y.lenbits) - 1]) >>> 16 & 255, Ag = 65535 & og, !((Ig = og >>> 24) <= E); ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (Ag < 16) L >>>= Ig, E -= Ig, y.lens[y.have++] = Ag;
- else {
- if (Ag === 16) {
- for (sg = Ig + 2; E < sg; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (L >>>= Ig, E -= Ig, y.have === 0) {
- w.msg = "invalid bit length repeat", y.mode = 30;
- break;
- }
- gg = y.lens[y.have - 1], j = 3 + (3 & L), L >>>= 2, E -= 2;
- } else if (Ag === 17) {
- for (sg = Ig + 3; E < sg; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- E -= Ig, gg = 0, j = 3 + (7 & (L >>>= Ig)), L >>>= 3, E -= 3;
- } else {
- for (sg = Ig + 7; E < sg; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- E -= Ig, gg = 0, j = 11 + (127 & (L >>>= Ig)), L >>>= 7, E -= 7;
- }
- if (y.have + j > y.nlen + y.ndist) {
- w.msg = "invalid bit length repeat", y.mode = 30;
- break;
- }
- for (; j--; ) y.lens[y.have++] = gg;
- }
- }
- if (y.mode === 30) break;
- if (y.lens[256] === 0) {
- w.msg = "invalid code -- missing end-of-block", y.mode = 30;
- break;
- }
- if (y.lenbits = 9, ng = { bits: y.lenbits }, lg = p(1, y.lens, 0, y.nlen, y.lencode, 0, y.work, ng), y.lenbits = ng.bits, lg) {
- w.msg = "invalid literal/lengths set", y.mode = 30;
- break;
- }
- if (y.distbits = 6, y.distcode = y.distdyn, ng = { bits: y.distbits }, lg = p(2, y.lens, y.nlen, y.ndist, y.distcode, 0, y.work, ng), y.distbits = ng.bits, lg) {
- w.msg = "invalid distances set", y.mode = 30;
- break;
- }
- if (y.mode = 20, W === 6) break g;
- case 20:
- y.mode = 21;
- case 21:
- if (6 <= Q && 258 <= P) {
- w.next_out = T, w.avail_out = P, w.next_in = F, w.avail_in = Q, y.hold = L, y.bits = E, Z(w, k), T = w.next_out, D = w.output, P = w.avail_out, F = w.next_in, f = w.input, Q = w.avail_in, L = y.hold, E = y.bits, y.mode === 12 && (y.back = -1);
- break;
- }
- for (y.back = 0; x = (og = y.lencode[L & (1 << y.lenbits) - 1]) >>> 16 & 255, Ag = 65535 & og, !((Ig = og >>> 24) <= E); ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (x && (240 & x) == 0) {
- for (eg = Ig, O = x, _ = Ag; x = (og = y.lencode[_ + ((L & (1 << eg + O) - 1) >> eg)]) >>> 16 & 255, Ag = 65535 & og, !(eg + (Ig = og >>> 24) <= E); ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- L >>>= eg, E -= eg, y.back += eg;
- }
- if (L >>>= Ig, E -= Ig, y.back += Ig, y.length = Ag, x === 0) {
- y.mode = 26;
- break;
- }
- if (32 & x) {
- y.back = -1, y.mode = 12;
- break;
- }
- if (64 & x) {
- w.msg = "invalid literal/length code", y.mode = 30;
- break;
- }
- y.extra = 15 & x, y.mode = 22;
- case 22:
- if (y.extra) {
- for (sg = y.extra; E < sg; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- y.length += L & (1 << y.extra) - 1, L >>>= y.extra, E -= y.extra, y.back += y.extra;
- }
- y.was = y.length, y.mode = 23;
- case 23:
- for (; x = (og = y.distcode[L & (1 << y.distbits) - 1]) >>> 16 & 255, Ag = 65535 & og, !((Ig = og >>> 24) <= E); ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if ((240 & x) == 0) {
- for (eg = Ig, O = x, _ = Ag; x = (og = y.distcode[_ + ((L & (1 << eg + O) - 1) >> eg)]) >>> 16 & 255, Ag = 65535 & og, !(eg + (Ig = og >>> 24) <= E); ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- L >>>= eg, E -= eg, y.back += eg;
- }
- if (L >>>= Ig, E -= Ig, y.back += Ig, 64 & x) {
- w.msg = "invalid distance code", y.mode = 30;
- break;
- }
- y.offset = Ag, y.extra = 15 & x, y.mode = 24;
- case 24:
- if (y.extra) {
- for (sg = y.extra; E < sg; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- y.offset += L & (1 << y.extra) - 1, L >>>= y.extra, E -= y.extra, y.back += y.extra;
- }
- if (y.offset > y.dmax) {
- w.msg = "invalid distance too far back", y.mode = 30;
- break;
- }
- y.mode = 25;
- case 25:
- if (P === 0) break g;
- if (j = k - P, y.offset > j) {
- if ((j = y.offset - j) > y.whave && y.sane) {
- w.msg = "invalid distance too far back", y.mode = 30;
- break;
- }
- q = j > y.wnext ? (j -= y.wnext, y.wsize - j) : y.wnext - j, j > y.length && (j = y.length), Cg = y.window;
- } else Cg = D, q = T - y.offset, j = y.length;
- for (P < j && (j = P), P -= j, y.length -= j; D[T++] = Cg[q++], --j; ) ;
- y.length === 0 && (y.mode = 21);
- break;
- case 26:
- if (P === 0) break g;
- D[T++] = y.length, P--, y.mode = 21;
- break;
- case 27:
- if (y.wrap) {
- for (; E < 32; ) {
- if (Q === 0) break g;
- Q--, L |= f[F++] << E, E += 8;
- }
- if (k -= P, w.total_out += k, y.total += k, k && (w.adler = y.check = y.flags ? m(y.check, D, k, T - k) : u(y.check, D, k, T - k)), k = P, (y.flags ? L : R(L)) !== y.check) {
- w.msg = "incorrect data check", y.mode = 30;
- break;
- }
- E = L = 0;
- }
- y.mode = 28;
- case 28:
- if (y.wrap && y.flags) {
- for (; E < 32; ) {
- if (Q === 0) break g;
- Q--, L += f[F++] << E, E += 8;
- }
- if (L !== (4294967295 & y.total)) {
- w.msg = "incorrect length check", y.mode = 30;
- break;
- }
- E = L = 0;
- }
- y.mode = 29;
- case 29:
- lg = 1;
- break g;
- case 30:
- lg = -3;
- break g;
- case 31:
- return -4;
- case 32:
- default:
- return Y;
- }
- return w.next_out = T, w.avail_out = P, w.next_in = F, w.avail_in = Q, y.hold = L, y.bits = E, (y.wsize || k !== w.avail_out && y.mode < 30 && (y.mode < 27 || W !== 4)) && G(w, w.output, w.next_out, k - w.avail_out) ? (y.mode = 31, -4) : (J -= w.avail_in, k -= w.avail_out, w.total_in += J, w.total_out += k, y.total += k, y.wrap && k && (w.adler = y.check = y.flags ? m(y.check, D, k, w.next_out - k) : u(y.check, D, k, w.next_out - k)), w.data_type = y.bits + (y.last ? 64 : 0) + (y.mode === 12 ? 128 : 0) + (y.mode === 20 || y.mode === 15 ? 256 : 0), (J == 0 && k === 0 || W === 4) && lg === 0 && (lg = -5), lg);
- }, h.inflateEnd = function(w) {
- if (!w || !w.state) return Y;
- var W = w.state;
- return W.window && (W.window = null), w.state = null, 0;
- }, h.inflateGetHeader = function(w, W) {
- var y;
- return w && w.state ? (2 & (y = w.state).wrap) == 0 ? Y : ((y.head = W).done = !1, 0) : Y;
- }, h.inflateSetDictionary = function(w, W) {
- var y, f = W.length;
- return w && w.state ? (y = w.state).wrap !== 0 && y.mode !== 11 ? Y : y.mode === 11 && u(1, W, f, 0) !== y.check ? -3 : G(w, W, f, f) ? (y.mode = 31, -4) : (y.havedict = 1, 0) : Y;
- }, h.inflateInfo = "pako inflate (from Nodeca project)";
- }, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./inffast": 48, "./inftrees": 50 }], 50: [function(c, r, h) {
- var b = c("../utils/common"), u = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], m = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], Z = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], p = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
- r.exports = function(Y, R, X, H, S, z, v, K) {
- var V, N, B, G, w, W, y, f, D, F = K.bits, T = 0, Q = 0, P = 0, L = 0, E = 0, J = 0, k = 0, j = 0, q = 0, Cg = 0, Ig = null, x = 0, Ag = new b.Buf16(16), eg = new b.Buf16(16), O = null, _ = 0;
- for (T = 0; T <= 15; T++) Ag[T] = 0;
- for (Q = 0; Q < H; Q++) Ag[R[X + Q]]++;
- for (E = F, L = 15; 1 <= L && Ag[L] === 0; L--) ;
- if (L < E && (E = L), L === 0) return S[z++] = 20971520, S[z++] = 20971520, K.bits = 1, 0;
- for (P = 1; P < L && Ag[P] === 0; P++) ;
- for (E < P && (E = P), T = j = 1; T <= 15; T++) if (j <<= 1, (j -= Ag[T]) < 0) return -1;
- if (0 < j && (Y === 0 || L !== 1)) return -1;
- for (eg[1] = 0, T = 1; T < 15; T++) eg[T + 1] = eg[T] + Ag[T];
- for (Q = 0; Q < H; Q++) R[X + Q] !== 0 && (v[eg[R[X + Q]]++] = Q);
- if (W = Y === 0 ? (Ig = O = v, 19) : Y === 1 ? (Ig = u, x -= 257, O = m, _ -= 257, 256) : (Ig = Z, O = p, -1), T = P, w = z, k = Q = Cg = 0, B = -1, G = (q = 1 << (J = E)) - 1, Y === 1 && 852 < q || Y === 2 && 592 < q) return 1;
- for (; ; ) {
- for (y = T - k, D = v[Q] < W ? (f = 0, v[Q]) : v[Q] > W ? (f = O[_ + v[Q]], Ig[x + v[Q]]) : (f = 96, 0), V = 1 << T - k, P = N = 1 << J; S[w + (Cg >> k) + (N -= V)] = y << 24 | f << 16 | D | 0, N !== 0; ) ;
- for (V = 1 << T - 1; Cg & V; ) V >>= 1;
- if (V !== 0 ? (Cg &= V - 1, Cg += V) : Cg = 0, Q++, --Ag[T] == 0) {
- if (T === L) break;
- T = R[X + v[Q]];
- }
- if (E < T && (Cg & G) !== B) {
- for (k === 0 && (k = E), w += P, j = 1 << (J = T - k); J + k < L && !((j -= Ag[J + k]) <= 0); ) J++, j <<= 1;
- if (q += 1 << J, Y === 1 && 852 < q || Y === 2 && 592 < q) return 1;
- S[B = Cg & G] = E << 24 | J << 16 | w - z | 0;
- }
- }
- return Cg !== 0 && (S[w + Cg] = T - k << 24 | 64 << 16 | 0), K.bits = E, 0;
- };
- }, { "../utils/common": 41 }], 51: [function(c, r, h) {
- r.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" };
- }, {}], 52: [function(c, r, h) {
- var b = c("../utils/common");
- function u(O) {
- for (var _ = O.length; 0 <= --_; ) O[_] = 0;
- }
- var m = 256, Z = 286, p = 30, Y = 15, R = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], X = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], H = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], S = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], z = new Array(576);
- u(z);
- var v = new Array(60);
- u(v);
- var K = new Array(512);
- u(K);
- var V = new Array(256);
- u(V);
- var N = new Array(29);
- u(N);
- var B, G, w, W = new Array(p);
- function y(O, _, gg, lg, ng) {
- this.static_tree = O, this.extra_bits = _, this.extra_base = gg, this.elems = lg, this.max_length = ng, this.has_stree = O && O.length;
- }
- function f(O, _) {
- this.dyn_tree = O, this.max_code = 0, this.stat_desc = _;
- }
- function D(O) {
- return O < 256 ? K[O] : K[256 + (O >>> 7)];
- }
- function F(O, _) {
- O.pending_buf[O.pending++] = 255 & _, O.pending_buf[O.pending++] = _ >>> 8 & 255;
- }
- function T(O, _, gg) {
- O.bi_valid > 16 - gg ? (O.bi_buf |= _ << O.bi_valid & 65535, F(O, O.bi_buf), O.bi_buf = _ >> 16 - O.bi_valid, O.bi_valid += gg - 16) : (O.bi_buf |= _ << O.bi_valid & 65535, O.bi_valid += gg);
- }
- function Q(O, _, gg) {
- T(O, gg[2 * _], gg[2 * _ + 1]);
- }
- function P(O, _) {
- for (var gg = 0; gg |= 1 & O, O >>>= 1, gg <<= 1, 0 < --_; ) ;
- return gg >>> 1;
- }
- function L(O, _, gg) {
- var lg, ng, sg = new Array(16), og = 0;
- for (lg = 1; lg <= Y; lg++) sg[lg] = og = og + gg[lg - 1] << 1;
- for (ng = 0; ng <= _; ng++) {
- var cg = O[2 * ng + 1];
- cg !== 0 && (O[2 * ng] = P(sg[cg]++, cg));
- }
- }
- function E(O) {
- var _;
- for (_ = 0; _ < Z; _++) O.dyn_ltree[2 * _] = 0;
- for (_ = 0; _ < p; _++) O.dyn_dtree[2 * _] = 0;
- for (_ = 0; _ < 19; _++) O.bl_tree[2 * _] = 0;
- O.dyn_ltree[512] = 1, O.opt_len = O.static_len = 0, O.last_lit = O.matches = 0;
- }
- function J(O) {
- 8 < O.bi_valid ? F(O, O.bi_buf) : 0 < O.bi_valid && (O.pending_buf[O.pending++] = O.bi_buf), O.bi_buf = 0, O.bi_valid = 0;
- }
- function k(O, _, gg, lg) {
- var ng = 2 * _, sg = 2 * gg;
- return O[ng] < O[sg] || O[ng] === O[sg] && lg[_] <= lg[gg];
- }
- function j(O, _, gg) {
- for (var lg = O.heap[gg], ng = gg << 1; ng <= O.heap_len && (ng < O.heap_len && k(_, O.heap[ng + 1], O.heap[ng], O.depth) && ng++, !k(_, lg, O.heap[ng], O.depth)); ) O.heap[gg] = O.heap[ng], gg = ng, ng <<= 1;
- O.heap[gg] = lg;
- }
- function q(O, _, gg) {
- var lg, ng, sg, og, cg = 0;
- if (O.last_lit !== 0) for (; lg = O.pending_buf[O.d_buf + 2 * cg] << 8 | O.pending_buf[O.d_buf + 2 * cg + 1], ng = O.pending_buf[O.l_buf + cg], cg++, lg === 0 ? Q(O, ng, _) : (Q(O, (sg = V[ng]) + m + 1, _), (og = R[sg]) !== 0 && T(O, ng -= N[sg], og), Q(O, sg = D(--lg), gg), (og = X[sg]) !== 0 && T(O, lg -= W[sg], og)), cg < O.last_lit; ) ;
- Q(O, 256, _);
- }
- function Cg(O, _) {
- var gg, lg, ng, sg = _.dyn_tree, og = _.stat_desc.static_tree, cg = _.stat_desc.has_stree, rg = _.stat_desc.elems, dg = -1;
- for (O.heap_len = 0, O.heap_max = 573, gg = 0; gg < rg; gg++) sg[2 * gg] !== 0 ? (O.heap[++O.heap_len] = dg = gg, O.depth[gg] = 0) : sg[2 * gg + 1] = 0;
- for (; O.heap_len < 2; ) sg[2 * (ng = O.heap[++O.heap_len] = dg < 2 ? ++dg : 0)] = 1, O.depth[ng] = 0, O.opt_len--, cg && (O.static_len -= og[2 * ng + 1]);
- for (_.max_code = dg, gg = O.heap_len >> 1; 1 <= gg; gg--) j(O, sg, gg);
- for (ng = rg; gg = O.heap[1], O.heap[1] = O.heap[O.heap_len--], j(O, sg, 1), lg = O.heap[1], O.heap[--O.heap_max] = gg, O.heap[--O.heap_max] = lg, sg[2 * ng] = sg[2 * gg] + sg[2 * lg], O.depth[ng] = (O.depth[gg] >= O.depth[lg] ? O.depth[gg] : O.depth[lg]) + 1, sg[2 * gg + 1] = sg[2 * lg + 1] = ng, O.heap[1] = ng++, j(O, sg, 1), 2 <= O.heap_len; ) ;
- O.heap[--O.heap_max] = O.heap[1], function(Bg, Zg) {
- var Xg, Kg, kg, Wg, Ng, wg, fg = Zg.dyn_tree, Jg = Zg.max_code, zg = Zg.stat_desc.static_tree, cI = Zg.stat_desc.has_stree, YI = Zg.stat_desc.extra_bits, Eg = Zg.stat_desc.extra_base, aI = Zg.stat_desc.max_length, dI = 0;
- for (Wg = 0; Wg <= Y; Wg++) Bg.bl_count[Wg] = 0;
- for (fg[2 * Bg.heap[Bg.heap_max] + 1] = 0, Xg = Bg.heap_max + 1; Xg < 573; Xg++) aI < (Wg = fg[2 * fg[2 * (Kg = Bg.heap[Xg]) + 1] + 1] + 1) && (Wg = aI, dI++), fg[2 * Kg + 1] = Wg, Jg < Kg || (Bg.bl_count[Wg]++, Ng = 0, Eg <= Kg && (Ng = YI[Kg - Eg]), wg = fg[2 * Kg], Bg.opt_len += wg * (Wg + Ng), cI && (Bg.static_len += wg * (zg[2 * Kg + 1] + Ng)));
- if (dI !== 0) {
- do {
- for (Wg = aI - 1; Bg.bl_count[Wg] === 0; ) Wg--;
- Bg.bl_count[Wg]--, Bg.bl_count[Wg + 1] += 2, Bg.bl_count[aI]--, dI -= 2;
- } while (0 < dI);
- for (Wg = aI; Wg !== 0; Wg--) for (Kg = Bg.bl_count[Wg]; Kg !== 0; ) Jg < (kg = Bg.heap[--Xg]) || (fg[2 * kg + 1] !== Wg && (Bg.opt_len += (Wg - fg[2 * kg + 1]) * fg[2 * kg], fg[2 * kg + 1] = Wg), Kg--);
- }
- }(O, _), L(sg, dg, O.bl_count);
- }
- function Ig(O, _, gg) {
- var lg, ng, sg = -1, og = _[1], cg = 0, rg = 7, dg = 4;
- for (og === 0 && (rg = 138, dg = 3), _[2 * (gg + 1) + 1] = 65535, lg = 0; lg <= gg; lg++) ng = og, og = _[2 * (lg + 1) + 1], ++cg < rg && ng === og || (cg < dg ? O.bl_tree[2 * ng] += cg : ng !== 0 ? (ng !== sg && O.bl_tree[2 * ng]++, O.bl_tree[32]++) : cg <= 10 ? O.bl_tree[34]++ : O.bl_tree[36]++, sg = ng, dg = (cg = 0) === og ? (rg = 138, 3) : ng === og ? (rg = 6, 3) : (rg = 7, 4));
- }
- function x(O, _, gg) {
- var lg, ng, sg = -1, og = _[1], cg = 0, rg = 7, dg = 4;
- for (og === 0 && (rg = 138, dg = 3), lg = 0; lg <= gg; lg++) if (ng = og, og = _[2 * (lg + 1) + 1], !(++cg < rg && ng === og)) {
- if (cg < dg) for (; Q(O, ng, O.bl_tree), --cg != 0; ) ;
- else ng !== 0 ? (ng !== sg && (Q(O, ng, O.bl_tree), cg--), Q(O, 16, O.bl_tree), T(O, cg - 3, 2)) : cg <= 10 ? (Q(O, 17, O.bl_tree), T(O, cg - 3, 3)) : (Q(O, 18, O.bl_tree), T(O, cg - 11, 7));
- sg = ng, dg = (cg = 0) === og ? (rg = 138, 3) : ng === og ? (rg = 6, 3) : (rg = 7, 4);
- }
- }
- u(W);
- var Ag = !1;
- function eg(O, _, gg, lg) {
- T(O, 0 + (lg ? 1 : 0), 3), function(ng, sg, og, cg) {
- J(ng), F(ng, og), F(ng, ~og), b.arraySet(ng.pending_buf, ng.window, sg, og, ng.pending), ng.pending += og;
- }(O, _, gg);
- }
- h._tr_init = function(O) {
- Ag || (function() {
- var _, gg, lg, ng, sg, og = new Array(16);
- for (ng = lg = 0; ng < 28; ng++) for (N[ng] = lg, _ = 0; _ < 1 << R[ng]; _++) V[lg++] = ng;
- for (V[lg - 1] = ng, ng = sg = 0; ng < 16; ng++) for (W[ng] = sg, _ = 0; _ < 1 << X[ng]; _++) K[sg++] = ng;
- for (sg >>= 7; ng < p; ng++) for (W[ng] = sg << 7, _ = 0; _ < 1 << X[ng] - 7; _++) K[256 + sg++] = ng;
- for (gg = 0; gg <= Y; gg++) og[gg] = 0;
- for (_ = 0; _ <= 143; ) z[2 * _ + 1] = 8, _++, og[8]++;
- for (; _ <= 255; ) z[2 * _ + 1] = 9, _++, og[9]++;
- for (; _ <= 279; ) z[2 * _ + 1] = 7, _++, og[7]++;
- for (; _ <= 287; ) z[2 * _ + 1] = 8, _++, og[8]++;
- for (L(z, 287, og), _ = 0; _ < p; _++) v[2 * _ + 1] = 5, v[2 * _] = P(_, 5);
- B = new y(z, R, 257, Z, Y), G = new y(v, X, 0, p, Y), w = new y(new Array(0), H, 0, 19, 7);
- }(), Ag = !0), O.l_desc = new f(O.dyn_ltree, B), O.d_desc = new f(O.dyn_dtree, G), O.bl_desc = new f(O.bl_tree, w), O.bi_buf = 0, O.bi_valid = 0, E(O);
- }, h._tr_stored_block = eg, h._tr_flush_block = function(O, _, gg, lg) {
- var ng, sg, og = 0;
- 0 < O.level ? (O.strm.data_type === 2 && (O.strm.data_type = function(cg) {
- var rg, dg = 4093624447;
- for (rg = 0; rg <= 31; rg++, dg >>>= 1) if (1 & dg && cg.dyn_ltree[2 * rg] !== 0) return 0;
- if (cg.dyn_ltree[18] !== 0 || cg.dyn_ltree[20] !== 0 || cg.dyn_ltree[26] !== 0) return 1;
- for (rg = 32; rg < m; rg++) if (cg.dyn_ltree[2 * rg] !== 0) return 1;
- return 0;
- }(O)), Cg(O, O.l_desc), Cg(O, O.d_desc), og = function(cg) {
- var rg;
- for (Ig(cg, cg.dyn_ltree, cg.l_desc.max_code), Ig(cg, cg.dyn_dtree, cg.d_desc.max_code), Cg(cg, cg.bl_desc), rg = 18; 3 <= rg && cg.bl_tree[2 * S[rg] + 1] === 0; rg--) ;
- return cg.opt_len += 3 * (rg + 1) + 5 + 5 + 4, rg;
- }(O), ng = O.opt_len + 3 + 7 >>> 3, (sg = O.static_len + 3 + 7 >>> 3) <= ng && (ng = sg)) : ng = sg = gg + 5, gg + 4 <= ng && _ !== -1 ? eg(O, _, gg, lg) : O.strategy === 4 || sg === ng ? (T(O, 2 + (lg ? 1 : 0), 3), q(O, z, v)) : (T(O, 4 + (lg ? 1 : 0), 3), function(cg, rg, dg, Bg) {
- var Zg;
- for (T(cg, rg - 257, 5), T(cg, dg - 1, 5), T(cg, Bg - 4, 4), Zg = 0; Zg < Bg; Zg++) T(cg, cg.bl_tree[2 * S[Zg] + 1], 3);
- x(cg, cg.dyn_ltree, rg - 1), x(cg, cg.dyn_dtree, dg - 1);
- }(O, O.l_desc.max_code + 1, O.d_desc.max_code + 1, og + 1), q(O, O.dyn_ltree, O.dyn_dtree)), E(O), lg && J(O);
- }, h._tr_tally = function(O, _, gg) {
- return O.pending_buf[O.d_buf + 2 * O.last_lit] = _ >>> 8 & 255, O.pending_buf[O.d_buf + 2 * O.last_lit + 1] = 255 & _, O.pending_buf[O.l_buf + O.last_lit] = 255 & gg, O.last_lit++, _ === 0 ? O.dyn_ltree[2 * gg]++ : (O.matches++, _--, O.dyn_ltree[2 * (V[gg] + m + 1)]++, O.dyn_dtree[2 * D(_)]++), O.last_lit === O.lit_bufsize - 1;
- }, h._tr_align = function(O) {
- T(O, 2, 3), Q(O, 256, z), function(_) {
- _.bi_valid === 16 ? (F(_, _.bi_buf), _.bi_buf = 0, _.bi_valid = 0) : 8 <= _.bi_valid && (_.pending_buf[_.pending++] = 255 & _.bi_buf, _.bi_buf >>= 8, _.bi_valid -= 8);
- }(O);
- };
- }, { "../utils/common": 41 }], 53: [function(c, r, h) {
- r.exports = function() {
- this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
- };
- }, {}], 54: [function(c, r, h) {
- (function(b) {
- (function(u, m) {
- if (!u.setImmediate) {
- var Z, p, Y, R, X = 1, H = {}, S = !1, z = u.document, v = Object.getPrototypeOf && Object.getPrototypeOf(u);
- v = v && v.setTimeout ? v : u, Z = {}.toString.call(u.process) === "[object process]" ? function(B) {
- e.nextTick(function() {
- V(B);
- });
- } : function() {
- if (u.postMessage && !u.importScripts) {
- var B = !0, G = u.onmessage;
- return u.onmessage = function() {
- B = !1;
- }, u.postMessage("", "*"), u.onmessage = G, B;
- }
- }() ? (R = "setImmediate$" + Math.random() + "$", u.addEventListener ? u.addEventListener("message", N, !1) : u.attachEvent("onmessage", N), function(B) {
- u.postMessage(R + B, "*");
- }) : u.MessageChannel ? ((Y = new MessageChannel()).port1.onmessage = function(B) {
- V(B.data);
- }, function(B) {
- Y.port2.postMessage(B);
- }) : z && "onreadystatechange" in z.createElement("script") ? (p = z.documentElement, function(B) {
- var G = z.createElement("script");
- G.onreadystatechange = function() {
- V(B), G.onreadystatechange = null, p.removeChild(G), G = null;
- }, p.appendChild(G);
- }) : function(B) {
- setTimeout(V, 0, B);
- }, v.setImmediate = function(B) {
- typeof B != "function" && (B = new Function("" + B));
- for (var G = new Array(arguments.length - 1), w = 0; w < G.length; w++) G[w] = arguments[w + 1];
- var W = { callback: B, args: G };
- return H[X] = W, Z(X), X++;
- }, v.clearImmediate = K;
- }
- function K(B) {
- delete H[B];
- }
- function V(B) {
- if (S) setTimeout(V, 0, B);
- else {
- var G = H[B];
- if (G) {
- S = !0;
- try {
- (function(w) {
- var W = w.callback, y = w.args;
- switch (y.length) {
- case 0:
- W();
- break;
- case 1:
- W(y[0]);
- break;
- case 2:
- W(y[0], y[1]);
- break;
- case 3:
- W(y[0], y[1], y[2]);
- break;
- default:
- W.apply(void 0, y);
- }
- })(G);
- } finally {
- K(B), S = !1;
- }
- }
- }
- }
- function N(B) {
- B.source === u && typeof B.data == "string" && B.data.indexOf(R) === 0 && V(+B.data.slice(R.length));
- }
- })(typeof self > "u" ? b === void 0 ? this : b : self);
- }).call(this, A !== void 0 ? A : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}] }, {}, [10])(10);
- });
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {}, g("buffer").Buffer, arguments[3], arguments[4], arguments[5], arguments[6], g("timers").setImmediate);
- }, { _process: 467, buffer: 220, timers: 523 }], 442: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = /[\\^$.*+?()[\]{}|]/g, s = RegExp(A.source), l = typeof e == "object" && e && e.Object === Object && e, n = typeof self == "object" && self && self.Object === Object && self, a = l || n || Function("return this")(), d = Object.prototype.toString, o = a.Symbol, c = o ? o.prototype : void 0, r = c ? c.toString : void 0;
- function h(b) {
- if (typeof b == "string") return b;
- if (function(m) {
- return typeof m == "symbol" || /* @__PURE__ */ function(Z) {
- return !!Z && typeof Z == "object";
- }(m) && d.call(m) == "[object Symbol]";
- }(b)) return r ? r.call(b) : "";
- var u = b + "";
- return u == "0" && 1 / b == -1 / 0 ? "-0" : u;
- }
- C.exports = function(b) {
- var u;
- return (b = (u = b) == null ? "" : h(u)) && s.test(b) ? b.replace(A, "\\$&") : b;
- };
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 443: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = "[object Arguments]", s = "[object Map]", l = "[object Object]", n = "[object Set]", a = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, d = /^\w*$/, o = /^\./, c = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, r = /\\(\\)?/g, h = /^\[object .+?Constructor\]$/, b = /^(?:0|[1-9]\d*)$/, u = {};
- u["[object Float32Array]"] = u["[object Float64Array]"] = u["[object Int8Array]"] = u["[object Int16Array]"] = u["[object Int32Array]"] = u["[object Uint8Array]"] = u["[object Uint8ClampedArray]"] = u["[object Uint16Array]"] = u["[object Uint32Array]"] = !0, u[A] = u["[object Array]"] = u["[object ArrayBuffer]"] = u["[object Boolean]"] = u["[object DataView]"] = u["[object Date]"] = u["[object Error]"] = u["[object Function]"] = u[s] = u["[object Number]"] = u[l] = u["[object RegExp]"] = u[n] = u["[object String]"] = u["[object WeakMap]"] = !1;
- var m = typeof e == "object" && e && e.Object === Object && e, Z = typeof self == "object" && self && self.Object === Object && self, p = m || Z || Function("return this")(), Y = typeof i == "object" && i && !i.nodeType && i, R = Y && typeof C == "object" && C && !C.nodeType && C, X = R && R.exports === Y && m.process, H = function() {
- try {
- return X && X.binding("util");
- } catch {
- }
- }(), S = H && H.isTypedArray;
- function z(ag, mg, Sg, Fg) {
- for (var tI = -1, vg = ag ? ag.length : 0; ++tI < vg; ) {
- var xg = ag[tI];
- mg(Fg, xg, Sg(xg), ag);
- }
- return Fg;
- }
- function v(ag, mg) {
- for (var Sg = -1, Fg = ag ? ag.length : 0; ++Sg < Fg; ) if (mg(ag[Sg], Sg, ag)) return !0;
- return !1;
- }
- function K(ag) {
- var mg = !1;
- if (ag != null && typeof ag.toString != "function") try {
- mg = !!(ag + "");
- } catch {
- }
- return mg;
- }
- function V(ag) {
- var mg = -1, Sg = Array(ag.size);
- return ag.forEach(function(Fg, tI) {
- Sg[++mg] = [tI, Fg];
- }), Sg;
- }
- function N(ag) {
- var mg = -1, Sg = Array(ag.size);
- return ag.forEach(function(Fg) {
- Sg[++mg] = Fg;
- }), Sg;
- }
- var B, G, w, W = Array.prototype, y = Function.prototype, f = Object.prototype, D = p["__core-js_shared__"], F = (B = /[^.]+$/.exec(D && D.keys && D.keys.IE_PROTO || "")) ? "Symbol(src)_1." + B : "", T = y.toString, Q = f.hasOwnProperty, P = f.toString, L = RegExp("^" + T.call(Q).replace(/[\\^$.*+?()[\]{}|]/g, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), E = p.Symbol, J = p.Uint8Array, k = f.propertyIsEnumerable, j = W.splice, q = (G = Object.keys, w = Object, function(ag) {
- return G(w(ag));
- }), Cg = eI(p, "DataView"), Ig = eI(p, "Map"), x = eI(p, "Promise"), Ag = eI(p, "Set"), eg = eI(p, "WeakMap"), O = eI(Object, "create"), _ = bg(Cg), gg = bg(Ig), lg = bg(x), ng = bg(Ag), sg = bg(eg), og = E ? E.prototype : void 0, cg = og ? og.valueOf : void 0, rg = og ? og.toString : void 0;
- function dg(ag) {
- var mg = -1, Sg = ag ? ag.length : 0;
- for (this.clear(); ++mg < Sg; ) {
- var Fg = ag[mg];
- this.set(Fg[0], Fg[1]);
- }
- }
- function Bg(ag) {
- var mg = -1, Sg = ag ? ag.length : 0;
- for (this.clear(); ++mg < Sg; ) {
- var Fg = ag[mg];
- this.set(Fg[0], Fg[1]);
- }
- }
- function Zg(ag) {
- var mg = -1, Sg = ag ? ag.length : 0;
- for (this.clear(); ++mg < Sg; ) {
- var Fg = ag[mg];
- this.set(Fg[0], Fg[1]);
- }
- }
- function Xg(ag) {
- var mg = -1, Sg = ag ? ag.length : 0;
- for (this.__data__ = new Zg(); ++mg < Sg; ) this.add(ag[mg]);
- }
- function Kg(ag) {
- this.__data__ = new Bg(ag);
- }
- function kg(ag, mg) {
- var Sg = nI(ag) || GI(ag) ? function(xg, vI) {
- for (var fI = -1, MI = Array(xg); ++fI < xg; ) MI[fI] = vI(fI);
- return MI;
- }(ag.length, String) : [], Fg = Sg.length, tI = !!Fg;
- for (var vg in ag) !Q.call(ag, vg) || tI && (vg == "length" || EI(vg, Fg)) || Sg.push(vg);
- return Sg;
- }
- function Wg(ag, mg) {
- for (var Sg = ag.length; Sg--; ) if (jg(ag[Sg][0], mg)) return Sg;
- return -1;
- }
- function Ng(ag, mg, Sg, Fg) {
- return fg(ag, function(tI, vg, xg) {
- mg(Fg, tI, Sg(tI), xg);
- }), Fg;
- }
- dg.prototype.clear = function() {
- this.__data__ = O ? O(null) : {};
- }, dg.prototype.delete = function(ag) {
- return this.has(ag) && delete this.__data__[ag];
- }, dg.prototype.get = function(ag) {
- var mg = this.__data__;
- if (O) {
- var Sg = mg[ag];
- return Sg === "__lodash_hash_undefined__" ? void 0 : Sg;
- }
- return Q.call(mg, ag) ? mg[ag] : void 0;
- }, dg.prototype.has = function(ag) {
- var mg = this.__data__;
- return O ? mg[ag] !== void 0 : Q.call(mg, ag);
- }, dg.prototype.set = function(ag, mg) {
- return this.__data__[ag] = O && mg === void 0 ? "__lodash_hash_undefined__" : mg, this;
- }, Bg.prototype.clear = function() {
- this.__data__ = [];
- }, Bg.prototype.delete = function(ag) {
- var mg = this.__data__, Sg = Wg(mg, ag);
- return !(Sg < 0) && (Sg == mg.length - 1 ? mg.pop() : j.call(mg, Sg, 1), !0);
- }, Bg.prototype.get = function(ag) {
- var mg = this.__data__, Sg = Wg(mg, ag);
- return Sg < 0 ? void 0 : mg[Sg][1];
- }, Bg.prototype.has = function(ag) {
- return Wg(this.__data__, ag) > -1;
- }, Bg.prototype.set = function(ag, mg) {
- var Sg = this.__data__, Fg = Wg(Sg, ag);
- return Fg < 0 ? Sg.push([ag, mg]) : Sg[Fg][1] = mg, this;
- }, Zg.prototype.clear = function() {
- this.__data__ = { hash: new dg(), map: new (Ig || Bg)(), string: new dg() };
- }, Zg.prototype.delete = function(ag) {
- return SI(this, ag).delete(ag);
- }, Zg.prototype.get = function(ag) {
- return SI(this, ag).get(ag);
- }, Zg.prototype.has = function(ag) {
- return SI(this, ag).has(ag);
- }, Zg.prototype.set = function(ag, mg) {
- return SI(this, ag).set(ag, mg), this;
- }, Xg.prototype.add = Xg.prototype.push = function(ag) {
- return this.__data__.set(ag, "__lodash_hash_undefined__"), this;
- }, Xg.prototype.has = function(ag) {
- return this.__data__.has(ag);
- }, Kg.prototype.clear = function() {
- this.__data__ = new Bg();
- }, Kg.prototype.delete = function(ag) {
- return this.__data__.delete(ag);
- }, Kg.prototype.get = function(ag) {
- return this.__data__.get(ag);
- }, Kg.prototype.has = function(ag) {
- return this.__data__.has(ag);
- }, Kg.prototype.set = function(ag, mg) {
- var Sg = this.__data__;
- if (Sg instanceof Bg) {
- var Fg = Sg.__data__;
- if (!Ig || Fg.length < 199) return Fg.push([ag, mg]), this;
- Sg = this.__data__ = new Zg(Fg);
- }
- return Sg.set(ag, mg), this;
- };
- var wg, fg = (wg = function(ag, mg) {
- return ag && Jg(ag, mg, dC);
- }, function(ag, mg) {
- if (ag == null) return ag;
- if (!CI(ag)) return wg(ag, mg);
- for (var Sg = ag.length, Fg = -1, tI = Object(ag); ++Fg < Sg && mg(tI[Fg], Fg, tI) !== !1; ) ;
- return ag;
- }), Jg = /* @__PURE__ */ function(ag) {
- return function(mg, Sg, Fg) {
- for (var tI = -1, vg = Object(mg), xg = Fg(mg), vI = xg.length; vI--; ) {
- var fI = xg[++tI];
- if (Sg(vg[fI], fI, vg) === !1) break;
- }
- return mg;
- };
- }();
- function zg(ag, mg) {
- for (var Sg = 0, Fg = (mg = oI(mg, ag) ? [mg] : _g(mg)).length; ag != null && Sg < Fg; ) ag = ag[hg(mg[Sg++])];
- return Sg && Sg == Fg ? ag : void 0;
- }
- function cI(ag, mg) {
- return ag != null && mg in Object(ag);
- }
- function YI(ag, mg, Sg, Fg, tI) {
- return ag === mg || (ag == null || mg == null || !VI(ag) && !yC(mg) ? ag != ag && mg != mg : function(vg, xg, vI, fI, MI, hI) {
- var AC = nI(vg), PI = nI(xg), jI = "[object Array]", mC = "[object Array]";
- AC || (jI = (jI = NI(vg)) == A ? l : jI), PI || (mC = (mC = NI(xg)) == A ? l : mC);
- var ZC = jI == l && !K(vg), Vt = mC == l && !K(xg), Si = jI == mC;
- if (Si && !ZC) return hI || (hI = new Kg()), AC || It(vg) ? xI(vg, xg, vI, fI, MI, hI) : function(IC, QI, sA, vA, An, Bi, lA) {
- switch (sA) {
- case "[object DataView]":
- if (IC.byteLength != QI.byteLength || IC.byteOffset != QI.byteOffset) return !1;
- IC = IC.buffer, QI = QI.buffer;
- case "[object ArrayBuffer]":
- return !(IC.byteLength != QI.byteLength || !vA(new J(IC), new J(QI)));
- case "[object Boolean]":
- case "[object Date]":
- case "[object Number]":
- return jg(+IC, +QI);
- case "[object Error]":
- return IC.name == QI.name && IC.message == QI.message;
- case "[object RegExp]":
- case "[object String]":
- return IC == QI + "";
- case s:
- var nA = V;
- case n:
- var Io = 2 & Bi;
- if (nA || (nA = N), IC.size != QI.size && !Io) return !1;
- var xs = lA.get(IC);
- if (xs) return xs == QI;
- Bi |= 1, lA.set(IC, QI);
- var xt = xI(nA(IC), nA(QI), vA, An, Bi, lA);
- return lA.delete(IC), xt;
- case "[object Symbol]":
- if (cg) return cg.call(IC) == cg.call(QI);
- }
- return !1;
- }(vg, xg, jI, vI, fI, MI, hI);
- if (!(2 & MI)) {
- var LA = ZC && Q.call(vg, "__wrapped__"), vs = Vt && Q.call(xg, "__wrapped__");
- if (LA || vs) {
- var AA = LA ? vg.value() : vg, Ts = vs ? xg.value() : xg;
- return hI || (hI = new Kg()), vI(AA, Ts, fI, MI, hI);
- }
- }
- return Si ? (hI || (hI = new Kg()), function(IC, QI, sA, vA, An, Bi) {
- var lA = 2 & An, nA = dC(IC), Io = nA.length, xs = dC(QI).length;
- if (Io != xs && !lA) return !1;
- for (var xt = Io; xt--; ) {
- var Mt = nA[xt];
- if (!(lA ? Mt in QI : Q.call(QI, Mt))) return !1;
- }
- var S0 = Bi.get(IC);
- if (S0 && Bi.get(QI)) return S0 == QI;
- var _C = !0;
- Bi.set(IC, QI), Bi.set(QI, IC);
- for (var Gd = lA; ++xt < Io; ) {
- Mt = nA[xt];
- var Co = IC[Mt], to = QI[Mt];
- if (vA) var pG = lA ? vA(to, Co, Mt, QI, IC, Bi) : vA(Co, to, Mt, IC, QI, Bi);
- if (!(pG === void 0 ? Co === to || sA(Co, to, vA, An, Bi) : pG)) {
- _C = !1;
- break;
- }
- Gd || (Gd = Mt == "constructor");
- }
- if (_C && !Gd) {
- var js = IC.constructor, wd = QI.constructor;
- js == wd || !("constructor" in IC) || !("constructor" in QI) || typeof js == "function" && js instanceof js && typeof wd == "function" && wd instanceof wd || (_C = !1);
- }
- return Bi.delete(IC), Bi.delete(QI), _C;
- }(vg, xg, vI, fI, MI, hI)) : !1;
- }(ag, mg, YI, Sg, Fg, tI));
- }
- function Eg(ag) {
- return !(!VI(ag) || function(mg) {
- return !!F && F in mg;
- }(ag)) && (WI(ag) || K(ag) ? L : h).test(bg(ag));
- }
- function aI(ag) {
- return typeof ag == "function" ? ag : ag == null ? Tt : typeof ag == "object" ? nI(ag) ? function(Fg, tI) {
- return oI(Fg) && LI(tI) ? pg(hg(Fg), tI) : function(vg) {
- var xg = function(vI, fI, MI) {
- var hI = vI == null ? void 0 : zg(vI, fI);
- return hI === void 0 ? MI : hI;
- }(vg, Fg);
- return xg === void 0 && xg === tI ? function(vI, fI) {
- return vI != null && function(MI, hI, AC) {
- hI = oI(hI, MI) ? [hI] : _g(hI);
- for (var PI, jI = -1, mC = hI.length; ++jI < mC; ) {
- var ZC = hg(hI[jI]);
- if (!(PI = MI != null && AC(MI, ZC))) break;
- MI = MI[ZC];
- }
- return PI || !!(mC = MI ? MI.length : 0) && mI(mC) && EI(ZC, mC) && (nI(MI) || GI(MI));
- }(vI, fI, cI);
- }(vg, Fg) : YI(tI, xg, void 0, 3);
- };
- }(ag[0], ag[1]) : function(Fg) {
- var tI = function(vg) {
- for (var xg = dC(vg), vI = xg.length; vI--; ) {
- var fI = xg[vI], MI = vg[fI];
- xg[vI] = [fI, MI, LI(MI)];
- }
- return xg;
- }(Fg);
- return tI.length == 1 && tI[0][2] ? pg(tI[0][0], tI[0][1]) : function(vg) {
- return vg === Fg || function(xg, vI, fI, MI) {
- var hI = fI.length, AC = hI;
- if (xg == null) return !AC;
- for (xg = Object(xg); hI--; ) {
- var PI = fI[hI];
- if (PI[2] ? PI[1] !== xg[PI[0]] : !(PI[0] in xg)) return !1;
- }
- for (; ++hI < AC; ) {
- var jI = (PI = fI[hI])[0], mC = xg[jI], ZC = PI[1];
- if (PI[2]) {
- if (mC === void 0 && !(jI in xg)) return !1;
- } else {
- var Vt = new Kg(), Si;
- if (!(Si === void 0 ? YI(ZC, mC, MI, 3, Vt) : Si)) return !1;
- }
- }
- return !0;
- }(vg, Fg, tI);
- };
- }(ag) : oI(mg = ag) ? (Sg = hg(mg), function(Fg) {
- return Fg == null ? void 0 : Fg[Sg];
- }) : /* @__PURE__ */ function(Fg) {
- return function(tI) {
- return zg(tI, Fg);
- };
- }(mg);
- var mg, Sg;
- }
- function dI(ag) {
- if (Sg = (mg = ag) && mg.constructor, Fg = typeof Sg == "function" && Sg.prototype || f, mg !== Fg) return q(ag);
- var mg, Sg, Fg, tI = [];
- for (var vg in Object(ag)) Q.call(ag, vg) && vg != "constructor" && tI.push(vg);
- return tI;
- }
- function _g(ag) {
- return nI(ag) ? ag : uI(ag);
- }
- function xI(ag, mg, Sg, Fg, tI, vg) {
- var xg = 2 & tI, vI = ag.length, fI = mg.length;
- if (vI != fI && !(xg && fI > vI)) return !1;
- var MI = vg.get(ag);
- if (MI && vg.get(mg)) return MI == mg;
- var hI = -1, AC = !0, PI = 1 & tI ? new Xg() : void 0;
- for (vg.set(ag, mg), vg.set(mg, ag); ++hI < vI; ) {
- var jI = ag[hI], mC = mg[hI];
- if (Fg) var ZC = xg ? Fg(mC, jI, hI, mg, ag, vg) : Fg(jI, mC, hI, ag, mg, vg);
- if (ZC !== void 0) {
- if (ZC) continue;
- AC = !1;
- break;
- }
- if (PI) {
- if (!v(mg, function(Vt, Si) {
- if (!PI.has(Si) && (jI === Vt || Sg(jI, Vt, Fg, tI, vg))) return PI.add(Si);
- })) {
- AC = !1;
- break;
- }
- } else if (jI !== mC && !Sg(jI, mC, Fg, tI, vg)) {
- AC = !1;
- break;
- }
- }
- return vg.delete(ag), vg.delete(mg), AC;
- }
- function SI(ag, mg) {
- var Sg, Fg, tI = ag.__data__;
- return ((Fg = typeof (Sg = mg)) == "string" || Fg == "number" || Fg == "symbol" || Fg == "boolean" ? Sg !== "__proto__" : Sg === null) ? tI[typeof mg == "string" ? "string" : "hash"] : tI.map;
- }
- function eI(ag, mg) {
- var Sg = function(Fg, tI) {
- return Fg == null ? void 0 : Fg[tI];
- }(ag, mg);
- return Eg(Sg) ? Sg : void 0;
- }
- var NI = function(ag) {
- return P.call(ag);
- };
- function EI(ag, mg) {
- return !!(mg = mg ?? 9007199254740991) && (typeof ag == "number" || b.test(ag)) && ag > -1 && ag % 1 == 0 && ag < mg;
- }
- function oI(ag, mg) {
- if (nI(ag)) return !1;
- var Sg = typeof ag;
- return !(Sg != "number" && Sg != "symbol" && Sg != "boolean" && ag != null && !gC(ag)) || d.test(ag) || !a.test(ag) || mg != null && ag in Object(mg);
- }
- function LI(ag) {
- return ag == ag && !VI(ag);
- }
- function pg(ag, mg) {
- return function(Sg) {
- return Sg != null && Sg[ag] === mg && (mg !== void 0 || ag in Object(Sg));
- };
- }
- (Cg && NI(new Cg(new ArrayBuffer(1))) != "[object DataView]" || Ig && NI(new Ig()) != s || x && NI(x.resolve()) != "[object Promise]" || Ag && NI(new Ag()) != n || eg && NI(new eg()) != "[object WeakMap]") && (NI = function(ag) {
- var mg = P.call(ag), Sg = mg == l ? ag.constructor : void 0, Fg = Sg ? bg(Sg) : void 0;
- if (Fg) switch (Fg) {
- case _:
- return "[object DataView]";
- case gg:
- return s;
- case lg:
- return "[object Promise]";
- case ng:
- return n;
- case sg:
- return "[object WeakMap]";
- }
- return mg;
- });
- var uI = rI(function(ag) {
- var mg;
- ag = (mg = ag) == null ? "" : function(Fg) {
- if (typeof Fg == "string") return Fg;
- if (gC(Fg)) return rg ? rg.call(Fg) : "";
- var tI = Fg + "";
- return tI == "0" && 1 / Fg == -1 / 0 ? "-0" : tI;
- }(mg);
- var Sg = [];
- return o.test(ag) && Sg.push(""), ag.replace(c, function(Fg, tI, vg, xg) {
- Sg.push(vg ? xg.replace(r, "$1") : tI || Fg);
- }), Sg;
- });
- function hg(ag) {
- if (typeof ag == "string" || gC(ag)) return ag;
- var mg = ag + "";
- return mg == "0" && 1 / ag == -1 / 0 ? "-0" : mg;
- }
- function bg(ag) {
- if (ag != null) {
- try {
- return T.call(ag);
- } catch {
- }
- try {
- return ag + "";
- } catch {
- }
- }
- return "";
- }
- var Rg, Tg = (Rg = function(ag, mg, Sg) {
- Q.call(ag, Sg) ? ag[Sg].push(mg) : ag[Sg] = [mg];
- }, function(ag, mg) {
- var Sg = nI(ag) ? z : Ng, Fg = {};
- return Sg(ag, Rg, aI(mg), Fg);
- });
- function rI(ag, mg) {
- if (typeof ag != "function" || mg && typeof mg != "function") throw new TypeError("Expected a function");
- var Sg = function() {
- var Fg = arguments, tI = mg ? mg.apply(this, Fg) : Fg[0], vg = Sg.cache;
- if (vg.has(tI)) return vg.get(tI);
- var xg = ag.apply(this, Fg);
- return Sg.cache = vg.set(tI, xg), xg;
- };
- return Sg.cache = new (rI.Cache || Zg)(), Sg;
- }
- function jg(ag, mg) {
- return ag === mg || ag != ag && mg != mg;
- }
- function GI(ag) {
- return function(mg) {
- return yC(mg) && CI(mg);
- }(ag) && Q.call(ag, "callee") && (!k.call(ag, "callee") || P.call(ag) == A);
- }
- rI.Cache = Zg;
- var nI = Array.isArray;
- function CI(ag) {
- return ag != null && mI(ag.length) && !WI(ag);
- }
- function WI(ag) {
- var mg = VI(ag) ? P.call(ag) : "";
- return mg == "[object Function]" || mg == "[object GeneratorFunction]";
- }
- function mI(ag) {
- return typeof ag == "number" && ag > -1 && ag % 1 == 0 && ag <= 9007199254740991;
- }
- function VI(ag) {
- var mg = typeof ag;
- return !!ag && (mg == "object" || mg == "function");
- }
- function yC(ag) {
- return !!ag && typeof ag == "object";
- }
- function gC(ag) {
- return typeof ag == "symbol" || yC(ag) && P.call(ag) == "[object Symbol]";
- }
- var It = S ? /* @__PURE__ */ function(ag) {
- return function(mg) {
- return ag(mg);
- };
- }(S) : function(ag) {
- return yC(ag) && mI(ag.length) && !!u[P.call(ag)];
- };
- function dC(ag) {
- return CI(ag) ? kg(ag) : dI(ag);
- }
- function Tt(ag) {
- return ag;
- }
- C.exports = Tg;
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 444: [function(g, C, i) {
- var e = Object.prototype.toString;
- C.exports = function(A) {
- return A === !0 || A === !1 || /* @__PURE__ */ function(s) {
- return !!s && typeof s == "object";
- }(A) && e.call(A) == "[object Boolean]";
- };
- }, {}], 445: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = "[object Arguments]", s = "[object Map]", l = "[object Object]", n = "[object Set]", a = /^\[object .+?Constructor\]$/, d = /^(?:0|[1-9]\d*)$/, o = {};
- o["[object Float32Array]"] = o["[object Float64Array]"] = o["[object Int8Array]"] = o["[object Int16Array]"] = o["[object Int32Array]"] = o["[object Uint8Array]"] = o["[object Uint8ClampedArray]"] = o["[object Uint16Array]"] = o["[object Uint32Array]"] = !0, o[A] = o["[object Array]"] = o["[object ArrayBuffer]"] = o["[object Boolean]"] = o["[object DataView]"] = o["[object Date]"] = o["[object Error]"] = o["[object Function]"] = o[s] = o["[object Number]"] = o[l] = o["[object RegExp]"] = o[n] = o["[object String]"] = o["[object WeakMap]"] = !1;
- var c = typeof e == "object" && e && e.Object === Object && e, r = typeof self == "object" && self && self.Object === Object && self, h = c || r || Function("return this")(), b = typeof i == "object" && i && !i.nodeType && i, u = b && typeof C == "object" && C && !C.nodeType && C, m = u && u.exports === b, Z = m && c.process, p = function() {
- try {
- return Z && Z.binding && Z.binding("util");
- } catch {
- }
- }(), Y = p && p.isTypedArray;
- function R(hg, bg) {
- for (var Rg = -1, Tg = hg == null ? 0 : hg.length; ++Rg < Tg; ) if (bg(hg[Rg], Rg, hg)) return !0;
- return !1;
- }
- function X(hg) {
- var bg = -1, Rg = Array(hg.size);
- return hg.forEach(function(Tg, rI) {
- Rg[++bg] = [rI, Tg];
- }), Rg;
- }
- function H(hg) {
- var bg = -1, Rg = Array(hg.size);
- return hg.forEach(function(Tg) {
- Rg[++bg] = Tg;
- }), Rg;
- }
- var S, z, v, K = Array.prototype, V = Function.prototype, N = Object.prototype, B = h["__core-js_shared__"], G = V.toString, w = N.hasOwnProperty, W = (S = /[^.]+$/.exec(B && B.keys && B.keys.IE_PROTO || "")) ? "Symbol(src)_1." + S : "", y = N.toString, f = RegExp("^" + G.call(w).replace(/[\\^$.*+?()[\]{}|]/g, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), D = m ? h.Buffer : void 0, F = h.Symbol, T = h.Uint8Array, Q = N.propertyIsEnumerable, P = K.splice, L = F ? F.toStringTag : void 0, E = Object.getOwnPropertySymbols, J = D ? D.isBuffer : void 0, k = (z = Object.keys, v = Object, function(hg) {
- return z(v(hg));
- }), j = cI(h, "DataView"), q = cI(h, "Map"), Cg = cI(h, "Promise"), Ig = cI(h, "Set"), x = cI(h, "WeakMap"), Ag = cI(Object, "create"), eg = dI(j), O = dI(q), _ = dI(Cg), gg = dI(Ig), lg = dI(x), ng = F ? F.prototype : void 0, sg = ng ? ng.valueOf : void 0;
- function og(hg) {
- var bg = -1, Rg = hg == null ? 0 : hg.length;
- for (this.clear(); ++bg < Rg; ) {
- var Tg = hg[bg];
- this.set(Tg[0], Tg[1]);
- }
- }
- function cg(hg) {
- var bg = -1, Rg = hg == null ? 0 : hg.length;
- for (this.clear(); ++bg < Rg; ) {
- var Tg = hg[bg];
- this.set(Tg[0], Tg[1]);
- }
- }
- function rg(hg) {
- var bg = -1, Rg = hg == null ? 0 : hg.length;
- for (this.clear(); ++bg < Rg; ) {
- var Tg = hg[bg];
- this.set(Tg[0], Tg[1]);
- }
- }
- function dg(hg) {
- var bg = -1, Rg = hg == null ? 0 : hg.length;
- for (this.__data__ = new rg(); ++bg < Rg; ) this.add(hg[bg]);
- }
- function Bg(hg) {
- var bg = this.__data__ = new cg(hg);
- this.size = bg.size;
- }
- function Zg(hg, bg) {
- var Rg = SI(hg), Tg = !Rg && xI(hg), rI = !Rg && !Tg && eI(hg), jg = !Rg && !Tg && !rI && pg(hg), GI = Rg || Tg || rI || jg, nI = GI ? function(mI, VI) {
- for (var yC = -1, gC = Array(mI); ++yC < mI; ) gC[yC] = VI(yC);
- return gC;
- }(hg.length, String) : [], CI = nI.length;
- for (var WI in hg) !w.call(hg, WI) || GI && (WI == "length" || rI && (WI == "offset" || WI == "parent") || jg && (WI == "buffer" || WI == "byteLength" || WI == "byteOffset") || aI(WI, CI)) || nI.push(WI);
- return nI;
- }
- function Xg(hg, bg) {
- for (var Rg = hg.length; Rg--; ) if (_g(hg[Rg][0], bg)) return Rg;
- return -1;
- }
- function Kg(hg) {
- return hg == null ? hg === void 0 ? "[object Undefined]" : "[object Null]" : L && L in Object(hg) ? function(bg) {
- var Rg = w.call(bg, L), Tg = bg[L];
- try {
- bg[L] = void 0;
- var rI = !0;
- } catch {
- }
- var jg = y.call(bg);
- return rI && (Rg ? bg[L] = Tg : delete bg[L]), jg;
- }(hg) : function(bg) {
- return y.call(bg);
- }(hg);
- }
- function kg(hg) {
- return LI(hg) && Kg(hg) == A;
- }
- function Wg(hg, bg, Rg, Tg, rI) {
- return hg === bg || (hg == null || bg == null || !LI(hg) && !LI(bg) ? hg != hg && bg != bg : function(jg, GI, nI, CI, WI, mI) {
- var VI = SI(jg), yC = SI(GI), gC = VI ? "[object Array]" : Eg(jg), It = yC ? "[object Array]" : Eg(GI), dC = (gC = gC == A ? l : gC) == l, Tt = (It = It == A ? l : It) == l, ag = gC == It;
- if (ag && eI(jg)) {
- if (!eI(GI)) return !1;
- VI = !0, dC = !1;
- }
- if (ag && !dC) return mI || (mI = new Bg()), VI || pg(jg) ? fg(jg, GI, nI, CI, WI, mI) : function(vg, xg, vI, fI, MI, hI, AC) {
- switch (vI) {
- case "[object DataView]":
- if (vg.byteLength != xg.byteLength || vg.byteOffset != xg.byteOffset) return !1;
- vg = vg.buffer, xg = xg.buffer;
- case "[object ArrayBuffer]":
- return !(vg.byteLength != xg.byteLength || !hI(new T(vg), new T(xg)));
- case "[object Boolean]":
- case "[object Date]":
- case "[object Number]":
- return _g(+vg, +xg);
- case "[object Error]":
- return vg.name == xg.name && vg.message == xg.message;
- case "[object RegExp]":
- case "[object String]":
- return vg == xg + "";
- case s:
- var PI = X;
- case n:
- var jI = 1 & fI;
- if (PI || (PI = H), vg.size != xg.size && !jI) return !1;
- var mC = AC.get(vg);
- if (mC) return mC == xg;
- fI |= 2, AC.set(vg, xg);
- var ZC = fg(PI(vg), PI(xg), fI, MI, hI, AC);
- return AC.delete(vg), ZC;
- case "[object Symbol]":
- if (sg) return sg.call(vg) == sg.call(xg);
- }
- return !1;
- }(jg, GI, gC, nI, CI, WI, mI);
- if (!(1 & nI)) {
- var mg = dC && w.call(jg, "__wrapped__"), Sg = Tt && w.call(GI, "__wrapped__");
- if (mg || Sg) {
- var Fg = mg ? jg.value() : jg, tI = Sg ? GI.value() : GI;
- return mI || (mI = new Bg()), WI(Fg, tI, nI, CI, mI);
- }
- }
- return ag ? (mI || (mI = new Bg()), function(vg, xg, vI, fI, MI, hI) {
- var AC = 1 & vI, PI = Jg(vg), jI = PI.length, mC = Jg(xg).length;
- if (jI != mC && !AC) return !1;
- for (var ZC = jI; ZC--; ) {
- var Vt = PI[ZC];
- if (!(AC ? Vt in xg : w.call(xg, Vt))) return !1;
- }
- var Si = hI.get(vg);
- if (Si && hI.get(xg)) return Si == xg;
- var LA = !0;
- hI.set(vg, xg), hI.set(xg, vg);
- for (var vs = AC; ++ZC < jI; ) {
- Vt = PI[ZC];
- var AA = vg[Vt], Ts = xg[Vt];
- if (fI) var IC = AC ? fI(Ts, AA, Vt, xg, vg, hI) : fI(AA, Ts, Vt, vg, xg, hI);
- if (!(IC === void 0 ? AA === Ts || MI(AA, Ts, vI, fI, hI) : IC)) {
- LA = !1;
- break;
- }
- vs || (vs = Vt == "constructor");
- }
- if (LA && !vs) {
- var QI = vg.constructor, sA = xg.constructor;
- QI == sA || !("constructor" in vg) || !("constructor" in xg) || typeof QI == "function" && QI instanceof QI && typeof sA == "function" && sA instanceof sA || (LA = !1);
- }
- return hI.delete(vg), hI.delete(xg), LA;
- }(jg, GI, nI, CI, WI, mI)) : !1;
- }(hg, bg, Rg, Tg, Wg, rI));
- }
- function Ng(hg) {
- return !(!oI(hg) || function(bg) {
- return !!W && W in bg;
- }(hg)) && (NI(hg) ? f : a).test(dI(hg));
- }
- function wg(hg) {
- if (Rg = (bg = hg) && bg.constructor, Tg = typeof Rg == "function" && Rg.prototype || N, bg !== Tg) return k(hg);
- var bg, Rg, Tg, rI = [];
- for (var jg in Object(hg)) w.call(hg, jg) && jg != "constructor" && rI.push(jg);
- return rI;
- }
- function fg(hg, bg, Rg, Tg, rI, jg) {
- var GI = 1 & Rg, nI = hg.length, CI = bg.length;
- if (nI != CI && !(GI && CI > nI)) return !1;
- var WI = jg.get(hg);
- if (WI && jg.get(bg)) return WI == bg;
- var mI = -1, VI = !0, yC = 2 & Rg ? new dg() : void 0;
- for (jg.set(hg, bg), jg.set(bg, hg); ++mI < nI; ) {
- var gC = hg[mI], It = bg[mI];
- if (Tg) var dC = GI ? Tg(It, gC, mI, bg, hg, jg) : Tg(gC, It, mI, hg, bg, jg);
- if (dC !== void 0) {
- if (dC) continue;
- VI = !1;
- break;
- }
- if (yC) {
- if (!R(bg, function(Tt, ag) {
- if (mg = ag, !yC.has(mg) && (gC === Tt || rI(gC, Tt, Rg, Tg, jg))) return yC.push(ag);
- var mg;
- })) {
- VI = !1;
- break;
- }
- } else if (gC !== It && !rI(gC, It, Rg, Tg, jg)) {
- VI = !1;
- break;
- }
- }
- return jg.delete(hg), jg.delete(bg), VI;
- }
- function Jg(hg) {
- return function(bg, Rg, Tg) {
- var rI = Rg(bg);
- return SI(bg) ? rI : function(jg, GI) {
- for (var nI = -1, CI = GI.length, WI = jg.length; ++nI < CI; ) jg[WI + nI] = GI[nI];
- return jg;
- }(rI, Tg(bg));
- }(hg, uI, YI);
- }
- function zg(hg, bg) {
- var Rg, Tg, rI = hg.__data__;
- return ((Tg = typeof (Rg = bg)) == "string" || Tg == "number" || Tg == "symbol" || Tg == "boolean" ? Rg !== "__proto__" : Rg === null) ? rI[typeof bg == "string" ? "string" : "hash"] : rI.map;
- }
- function cI(hg, bg) {
- var Rg = function(Tg, rI) {
- return Tg == null ? void 0 : Tg[rI];
- }(hg, bg);
- return Ng(Rg) ? Rg : void 0;
- }
- og.prototype.clear = function() {
- this.__data__ = Ag ? Ag(null) : {}, this.size = 0;
- }, og.prototype.delete = function(hg) {
- var bg = this.has(hg) && delete this.__data__[hg];
- return this.size -= bg ? 1 : 0, bg;
- }, og.prototype.get = function(hg) {
- var bg = this.__data__;
- if (Ag) {
- var Rg = bg[hg];
- return Rg === "__lodash_hash_undefined__" ? void 0 : Rg;
- }
- return w.call(bg, hg) ? bg[hg] : void 0;
- }, og.prototype.has = function(hg) {
- var bg = this.__data__;
- return Ag ? bg[hg] !== void 0 : w.call(bg, hg);
- }, og.prototype.set = function(hg, bg) {
- var Rg = this.__data__;
- return this.size += this.has(hg) ? 0 : 1, Rg[hg] = Ag && bg === void 0 ? "__lodash_hash_undefined__" : bg, this;
- }, cg.prototype.clear = function() {
- this.__data__ = [], this.size = 0;
- }, cg.prototype.delete = function(hg) {
- var bg = this.__data__, Rg = Xg(bg, hg);
- return !(Rg < 0) && (Rg == bg.length - 1 ? bg.pop() : P.call(bg, Rg, 1), --this.size, !0);
- }, cg.prototype.get = function(hg) {
- var bg = this.__data__, Rg = Xg(bg, hg);
- return Rg < 0 ? void 0 : bg[Rg][1];
- }, cg.prototype.has = function(hg) {
- return Xg(this.__data__, hg) > -1;
- }, cg.prototype.set = function(hg, bg) {
- var Rg = this.__data__, Tg = Xg(Rg, hg);
- return Tg < 0 ? (++this.size, Rg.push([hg, bg])) : Rg[Tg][1] = bg, this;
- }, rg.prototype.clear = function() {
- this.size = 0, this.__data__ = { hash: new og(), map: new (q || cg)(), string: new og() };
- }, rg.prototype.delete = function(hg) {
- var bg = zg(this, hg).delete(hg);
- return this.size -= bg ? 1 : 0, bg;
- }, rg.prototype.get = function(hg) {
- return zg(this, hg).get(hg);
- }, rg.prototype.has = function(hg) {
- return zg(this, hg).has(hg);
- }, rg.prototype.set = function(hg, bg) {
- var Rg = zg(this, hg), Tg = Rg.size;
- return Rg.set(hg, bg), this.size += Rg.size == Tg ? 0 : 1, this;
- }, dg.prototype.add = dg.prototype.push = function(hg) {
- return this.__data__.set(hg, "__lodash_hash_undefined__"), this;
- }, dg.prototype.has = function(hg) {
- return this.__data__.has(hg);
- }, Bg.prototype.clear = function() {
- this.__data__ = new cg(), this.size = 0;
- }, Bg.prototype.delete = function(hg) {
- var bg = this.__data__, Rg = bg.delete(hg);
- return this.size = bg.size, Rg;
- }, Bg.prototype.get = function(hg) {
- return this.__data__.get(hg);
- }, Bg.prototype.has = function(hg) {
- return this.__data__.has(hg);
- }, Bg.prototype.set = function(hg, bg) {
- var Rg = this.__data__;
- if (Rg instanceof cg) {
- var Tg = Rg.__data__;
- if (!q || Tg.length < 199) return Tg.push([hg, bg]), this.size = ++Rg.size, this;
- Rg = this.__data__ = new rg(Tg);
- }
- return Rg.set(hg, bg), this.size = Rg.size, this;
- };
- var YI = E ? function(hg) {
- return hg == null ? [] : (hg = Object(hg), function(bg, Rg) {
- for (var Tg = -1, rI = bg == null ? 0 : bg.length, jg = 0, GI = []; ++Tg < rI; ) {
- var nI = bg[Tg];
- Rg(nI, Tg, bg) && (GI[jg++] = nI);
- }
- return GI;
- }(E(hg), function(bg) {
- return Q.call(hg, bg);
- }));
- } : function() {
- return [];
- }, Eg = Kg;
- function aI(hg, bg) {
- return !!(bg = bg ?? 9007199254740991) && (typeof hg == "number" || d.test(hg)) && hg > -1 && hg % 1 == 0 && hg < bg;
- }
- function dI(hg) {
- if (hg != null) {
- try {
- return G.call(hg);
- } catch {
- }
- try {
- return hg + "";
- } catch {
- }
- }
- return "";
- }
- function _g(hg, bg) {
- return hg === bg || hg != hg && bg != bg;
- }
- (j && Eg(new j(new ArrayBuffer(1))) != "[object DataView]" || q && Eg(new q()) != s || Cg && Eg(Cg.resolve()) != "[object Promise]" || Ig && Eg(new Ig()) != n || x && Eg(new x()) != "[object WeakMap]") && (Eg = function(hg) {
- var bg = Kg(hg), Rg = bg == l ? hg.constructor : void 0, Tg = Rg ? dI(Rg) : "";
- if (Tg) switch (Tg) {
- case eg:
- return "[object DataView]";
- case O:
- return s;
- case _:
- return "[object Promise]";
- case gg:
- return n;
- case lg:
- return "[object WeakMap]";
- }
- return bg;
- });
- var xI = kg(/* @__PURE__ */ function() {
- return arguments;
- }()) ? kg : function(hg) {
- return LI(hg) && w.call(hg, "callee") && !Q.call(hg, "callee");
- }, SI = Array.isArray, eI = J || function() {
- return !1;
- };
- function NI(hg) {
- if (!oI(hg)) return !1;
- var bg = Kg(hg);
- return bg == "[object Function]" || bg == "[object GeneratorFunction]" || bg == "[object AsyncFunction]" || bg == "[object Proxy]";
- }
- function EI(hg) {
- return typeof hg == "number" && hg > -1 && hg % 1 == 0 && hg <= 9007199254740991;
- }
- function oI(hg) {
- var bg = typeof hg;
- return hg != null && (bg == "object" || bg == "function");
- }
- function LI(hg) {
- return hg != null && typeof hg == "object";
- }
- var pg = Y ? /* @__PURE__ */ function(hg) {
- return function(bg) {
- return hg(bg);
- };
- }(Y) : function(hg) {
- return LI(hg) && EI(hg.length) && !!o[Kg(hg)];
- };
- function uI(hg) {
- return (bg = hg) != null && EI(bg.length) && !NI(bg) ? Zg(hg) : wg(hg);
- var bg;
- }
- C.exports = function(hg, bg) {
- return Wg(hg, bg);
- };
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 446: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = typeof e == "object" && e && e.Object === Object && e, s = typeof self == "object" && self && self.Object === Object && self, l = A || s || Function("return this")(), n = Object.prototype, a = n.hasOwnProperty, d = n.toString, o = l.Symbol, c = o ? o.toStringTag : void 0;
- function r(h) {
- return h == null ? h === void 0 ? "[object Undefined]" : "[object Null]" : c && c in Object(h) ? function(b) {
- var u = a.call(b, c), m = b[c];
- try {
- b[c] = void 0;
- var Z = !0;
- } catch {
- }
- var p = d.call(b);
- return Z && (u ? b[c] = m : delete b[c]), p;
- }(h) : function(b) {
- return d.call(b);
- }(h);
- }
- C.exports = function(h) {
- if (!function(u) {
- var m = typeof u;
- return u != null && (m == "object" || m == "function");
- }(h)) return !1;
- var b = r(h);
- return b == "[object Function]" || b == "[object GeneratorFunction]" || b == "[object AsyncFunction]" || b == "[object Proxy]";
- };
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 447: [function(g, C, i) {
- C.exports = function(e) {
- return e == null;
- };
- }, {}], 448: [function(g, C, i) {
- C.exports = function(e) {
- return e === void 0;
- };
- }, {}], 449: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = /^\[object .+?Constructor\]$/, s = typeof e == "object" && e && e.Object === Object && e, l = typeof self == "object" && self && self.Object === Object && self, n = s || l || Function("return this")();
- function a(F, T) {
- return !!(F && F.length) && function(Q, P, L) {
- if (P != P) return function(k, j, q, Cg) {
- for (var Ig = k.length, x = q + -1; ++x < Ig; ) if (j(k[x], x, k)) return x;
- return -1;
- }(Q, d, L);
- for (var E = L - 1, J = Q.length; ++E < J; ) if (Q[E] === P) return E;
- return -1;
- }(F, T, 0) > -1;
- }
- function d(F) {
- return F != F;
- }
- function o(F, T) {
- return F.has(T);
- }
- function c(F) {
- var T = -1, Q = Array(F.size);
- return F.forEach(function(P) {
- Q[++T] = P;
- }), Q;
- }
- var r, h = Array.prototype, b = Function.prototype, u = Object.prototype, m = n["__core-js_shared__"], Z = (r = /[^.]+$/.exec(m && m.keys && m.keys.IE_PROTO || "")) ? "Symbol(src)_1." + r : "", p = b.toString, Y = u.hasOwnProperty, R = u.toString, X = RegExp("^" + p.call(Y).replace(/[\\^$.*+?()[\]{}|]/g, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"), H = h.splice, S = f(n, "Map"), z = f(n, "Set"), v = f(Object, "create");
- function K(F) {
- var T = -1, Q = F ? F.length : 0;
- for (this.clear(); ++T < Q; ) {
- var P = F[T];
- this.set(P[0], P[1]);
- }
- }
- function V(F) {
- var T = -1, Q = F ? F.length : 0;
- for (this.clear(); ++T < Q; ) {
- var P = F[T];
- this.set(P[0], P[1]);
- }
- }
- function N(F) {
- var T = -1, Q = F ? F.length : 0;
- for (this.clear(); ++T < Q; ) {
- var P = F[T];
- this.set(P[0], P[1]);
- }
- }
- function B(F) {
- var T = -1, Q = F ? F.length : 0;
- for (this.__data__ = new N(); ++T < Q; ) this.add(F[T]);
- }
- function G(F, T) {
- for (var Q, P, L = F.length; L--; ) if ((Q = F[L][0]) === (P = T) || Q != Q && P != P) return L;
- return -1;
- }
- function w(F) {
- return !(!D(F) || (T = F, Z && Z in T)) && (function(Q) {
- var P = D(Q) ? R.call(Q) : "";
- return P == "[object Function]" || P == "[object GeneratorFunction]";
- }(F) || function(Q) {
- var P = !1;
- if (Q != null && typeof Q.toString != "function") try {
- P = !!(Q + "");
- } catch {
- }
- return P;
- }(F) ? X : A).test(function(Q) {
- if (Q != null) {
- try {
- return p.call(Q);
- } catch {
- }
- try {
- return Q + "";
- } catch {
- }
- }
- return "";
- }(F));
- var T;
- }
- K.prototype.clear = function() {
- this.__data__ = v ? v(null) : {};
- }, K.prototype.delete = function(F) {
- return this.has(F) && delete this.__data__[F];
- }, K.prototype.get = function(F) {
- var T = this.__data__;
- if (v) {
- var Q = T[F];
- return Q === "__lodash_hash_undefined__" ? void 0 : Q;
- }
- return Y.call(T, F) ? T[F] : void 0;
- }, K.prototype.has = function(F) {
- var T = this.__data__;
- return v ? T[F] !== void 0 : Y.call(T, F);
- }, K.prototype.set = function(F, T) {
- return this.__data__[F] = v && T === void 0 ? "__lodash_hash_undefined__" : T, this;
- }, V.prototype.clear = function() {
- this.__data__ = [];
- }, V.prototype.delete = function(F) {
- var T = this.__data__, Q = G(T, F);
- return !(Q < 0) && (Q == T.length - 1 ? T.pop() : H.call(T, Q, 1), !0);
- }, V.prototype.get = function(F) {
- var T = this.__data__, Q = G(T, F);
- return Q < 0 ? void 0 : T[Q][1];
- }, V.prototype.has = function(F) {
- return G(this.__data__, F) > -1;
- }, V.prototype.set = function(F, T) {
- var Q = this.__data__, P = G(Q, F);
- return P < 0 ? Q.push([F, T]) : Q[P][1] = T, this;
- }, N.prototype.clear = function() {
- this.__data__ = { hash: new K(), map: new (S || V)(), string: new K() };
- }, N.prototype.delete = function(F) {
- return y(this, F).delete(F);
- }, N.prototype.get = function(F) {
- return y(this, F).get(F);
- }, N.prototype.has = function(F) {
- return y(this, F).has(F);
- }, N.prototype.set = function(F, T) {
- return y(this, F).set(F, T), this;
- }, B.prototype.add = B.prototype.push = function(F) {
- return this.__data__.set(F, "__lodash_hash_undefined__"), this;
- }, B.prototype.has = function(F) {
- return this.__data__.has(F);
- };
- var W = z && 1 / c(new z([, -0]))[1] == 1 / 0 ? function(F) {
- return new z(F);
- } : function() {
- };
- function y(F, T) {
- var Q, P, L = F.__data__;
- return ((P = typeof (Q = T)) == "string" || P == "number" || P == "symbol" || P == "boolean" ? Q !== "__proto__" : Q === null) ? L[typeof T == "string" ? "string" : "hash"] : L.map;
- }
- function f(F, T) {
- var Q = function(P, L) {
- return P == null ? void 0 : P[L];
- }(F, T);
- return w(Q) ? Q : void 0;
- }
- function D(F) {
- var T = typeof F;
- return !!F && (T == "object" || T == "function");
- }
- C.exports = function(F) {
- return F && F.length ? function(T, Q, P) {
- var L = -1, E = a, J = T.length, k = !0, j = [], q = j;
- if (J >= 200) {
- var Cg = W(T);
- if (Cg) return c(Cg);
- k = !1, E = o, q = new B();
- } else q = j;
- g: for (; ++L < J; ) {
- var Ig = T[L], x = Ig;
- if (Ig = Ig !== 0 ? Ig : 0, k && x == x) {
- for (var Ag = q.length; Ag--; ) if (q[Ag] === x) continue g;
- j.push(Ig);
- } else E(q, x, P) || (q !== j && q.push(x), j.push(Ig));
- }
- return j;
- }(F) : [];
- };
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 450: [function(g, C, i) {
- var e = g("inherits"), A = g("hash-base"), s = g("safe-buffer").Buffer, l = new Array(16);
- function n() {
- A.call(this, 64), this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878;
- }
- function a(h, b) {
- return h << b | h >>> 32 - b;
- }
- function d(h, b, u, m, Z, p, Y) {
- return a(h + (b & u | ~b & m) + Z + p | 0, Y) + b | 0;
- }
- function o(h, b, u, m, Z, p, Y) {
- return a(h + (b & m | u & ~m) + Z + p | 0, Y) + b | 0;
- }
- function c(h, b, u, m, Z, p, Y) {
- return a(h + (b ^ u ^ m) + Z + p | 0, Y) + b | 0;
- }
- function r(h, b, u, m, Z, p, Y) {
- return a(h + (u ^ (b | ~m)) + Z + p | 0, Y) + b | 0;
- }
- e(n, A), n.prototype._update = function() {
- for (var h = l, b = 0; b < 16; ++b) h[b] = this._block.readInt32LE(4 * b);
- var u = this._a, m = this._b, Z = this._c, p = this._d;
- u = d(u, m, Z, p, h[0], 3614090360, 7), p = d(p, u, m, Z, h[1], 3905402710, 12), Z = d(Z, p, u, m, h[2], 606105819, 17), m = d(m, Z, p, u, h[3], 3250441966, 22), u = d(u, m, Z, p, h[4], 4118548399, 7), p = d(p, u, m, Z, h[5], 1200080426, 12), Z = d(Z, p, u, m, h[6], 2821735955, 17), m = d(m, Z, p, u, h[7], 4249261313, 22), u = d(u, m, Z, p, h[8], 1770035416, 7), p = d(p, u, m, Z, h[9], 2336552879, 12), Z = d(Z, p, u, m, h[10], 4294925233, 17), m = d(m, Z, p, u, h[11], 2304563134, 22), u = d(u, m, Z, p, h[12], 1804603682, 7), p = d(p, u, m, Z, h[13], 4254626195, 12), Z = d(Z, p, u, m, h[14], 2792965006, 17), u = o(u, m = d(m, Z, p, u, h[15], 1236535329, 22), Z, p, h[1], 4129170786, 5), p = o(p, u, m, Z, h[6], 3225465664, 9), Z = o(Z, p, u, m, h[11], 643717713, 14), m = o(m, Z, p, u, h[0], 3921069994, 20), u = o(u, m, Z, p, h[5], 3593408605, 5), p = o(p, u, m, Z, h[10], 38016083, 9), Z = o(Z, p, u, m, h[15], 3634488961, 14), m = o(m, Z, p, u, h[4], 3889429448, 20), u = o(u, m, Z, p, h[9], 568446438, 5), p = o(p, u, m, Z, h[14], 3275163606, 9), Z = o(Z, p, u, m, h[3], 4107603335, 14), m = o(m, Z, p, u, h[8], 1163531501, 20), u = o(u, m, Z, p, h[13], 2850285829, 5), p = o(p, u, m, Z, h[2], 4243563512, 9), Z = o(Z, p, u, m, h[7], 1735328473, 14), u = c(u, m = o(m, Z, p, u, h[12], 2368359562, 20), Z, p, h[5], 4294588738, 4), p = c(p, u, m, Z, h[8], 2272392833, 11), Z = c(Z, p, u, m, h[11], 1839030562, 16), m = c(m, Z, p, u, h[14], 4259657740, 23), u = c(u, m, Z, p, h[1], 2763975236, 4), p = c(p, u, m, Z, h[4], 1272893353, 11), Z = c(Z, p, u, m, h[7], 4139469664, 16), m = c(m, Z, p, u, h[10], 3200236656, 23), u = c(u, m, Z, p, h[13], 681279174, 4), p = c(p, u, m, Z, h[0], 3936430074, 11), Z = c(Z, p, u, m, h[3], 3572445317, 16), m = c(m, Z, p, u, h[6], 76029189, 23), u = c(u, m, Z, p, h[9], 3654602809, 4), p = c(p, u, m, Z, h[12], 3873151461, 11), Z = c(Z, p, u, m, h[15], 530742520, 16), u = r(u, m = c(m, Z, p, u, h[2], 3299628645, 23), Z, p, h[0], 4096336452, 6), p = r(p, u, m, Z, h[7], 1126891415, 10), Z = r(Z, p, u, m, h[14], 2878612391, 15), m = r(m, Z, p, u, h[5], 4237533241, 21), u = r(u, m, Z, p, h[12], 1700485571, 6), p = r(p, u, m, Z, h[3], 2399980690, 10), Z = r(Z, p, u, m, h[10], 4293915773, 15), m = r(m, Z, p, u, h[1], 2240044497, 21), u = r(u, m, Z, p, h[8], 1873313359, 6), p = r(p, u, m, Z, h[15], 4264355552, 10), Z = r(Z, p, u, m, h[6], 2734768916, 15), m = r(m, Z, p, u, h[13], 1309151649, 21), u = r(u, m, Z, p, h[4], 4149444226, 6), p = r(p, u, m, Z, h[11], 3174756917, 10), Z = r(Z, p, u, m, h[2], 718787259, 15), m = r(m, Z, p, u, h[9], 3951481745, 21), this._a = this._a + u | 0, this._b = this._b + m | 0, this._c = this._c + Z | 0, this._d = this._d + p | 0;
- }, n.prototype._digest = function() {
- this._block[this._blockOffset++] = 128, this._blockOffset > 56 && (this._block.fill(0, this._blockOffset, 64), this._update(), this._blockOffset = 0), this._block.fill(0, this._blockOffset, 56), this._block.writeUInt32LE(this._length[0], 56), this._block.writeUInt32LE(this._length[1], 60), this._update();
- var h = s.allocUnsafe(16);
- return h.writeInt32LE(this._a, 0), h.writeInt32LE(this._b, 4), h.writeInt32LE(this._c, 8), h.writeInt32LE(this._d, 12), h;
- }, C.exports = n;
- }, { "hash-base": 425, inherits: 440, "safe-buffer": 494 }], 451: [function(g, C, i) {
- var e = g("bn.js"), A = g("brorand");
- function s(l) {
- this.rand = l || new A.Rand();
- }
- C.exports = s, s.create = function(l) {
- return new s(l);
- }, s.prototype._randbelow = function(l) {
- var n = l.bitLength(), a = Math.ceil(n / 8);
- do
- var d = new e(this.rand.generate(a));
- while (d.cmp(l) >= 0);
- return d;
- }, s.prototype._randrange = function(l, n) {
- var a = n.sub(l);
- return l.add(this._randbelow(a));
- }, s.prototype.test = function(l, n, a) {
- var d = l.bitLength(), o = e.mont(l), c = new e(1).toRed(o);
- n || (n = Math.max(1, d / 48 | 0));
- for (var r = l.subn(1), h = 0; !r.testn(h); h++) ;
- for (var b = l.shrn(h), u = r.toRed(o); n > 0; n--) {
- var m = this._randrange(new e(2), r);
- a && a(m);
- var Z = m.toRed(o).redPow(b);
- if (Z.cmp(c) !== 0 && Z.cmp(u) !== 0) {
- for (var p = 1; p < h; p++) {
- if ((Z = Z.redSqr()).cmp(c) === 0) return !1;
- if (Z.cmp(u) === 0) break;
- }
- if (p === h) return !1;
- }
- }
- return !0;
- }, s.prototype.getDivisor = function(l, n) {
- var a = l.bitLength(), d = e.mont(l), o = new e(1).toRed(d);
- n || (n = Math.max(1, a / 48 | 0));
- for (var c = l.subn(1), r = 0; !c.testn(r); r++) ;
- for (var h = l.shrn(r), b = c.toRed(d); n > 0; n--) {
- var u = this._randrange(new e(2), c), m = l.gcd(u);
- if (m.cmpn(1) !== 0) return m;
- var Z = u.toRed(d).redPow(h);
- if (Z.cmp(o) !== 0 && Z.cmp(b) !== 0) {
- for (var p = 1; p < r; p++) {
- if ((Z = Z.redSqr()).cmp(o) === 0) return Z.fromRed().subn(1).gcd(l);
- if (Z.cmp(b) === 0) break;
- }
- if (p === r) return (Z = Z.redSqr()).fromRed().subn(1).gcd(l);
- }
- }
- return !1;
- };
- }, { "bn.js": 452, brorand: 187 }], 452: [function(g, C, i) {
- arguments[4][184][0].apply(i, arguments);
- }, { buffer: 188, dup: 184 }], 453: [function(g, C, i) {
- function e(A, s) {
- if (!A) throw new Error(s || "Assertion failed");
- }
- C.exports = e, e.equal = function(A, s, l) {
- if (A != s) throw new Error(l || "Assertion failed: " + A + " != " + s);
- };
- }, {}], 454: [function(g, C, i) {
- var e = i;
- function A(l) {
- return l.length === 1 ? "0" + l : l;
- }
- function s(l) {
- for (var n = "", a = 0; a < l.length; a++) n += A(l[a].toString(16));
- return n;
- }
- e.toArray = function(l, n) {
- if (Array.isArray(l)) return l.slice();
- if (!l) return [];
- var a = [];
- if (typeof l != "string") {
- for (var d = 0; d < l.length; d++) a[d] = 0 | l[d];
- return a;
- }
- if (n === "hex")
- for ((l = l.replace(/[^a-z0-9]+/gi, "")).length % 2 != 0 && (l = "0" + l), d = 0; d < l.length; d += 2) a.push(parseInt(l[d] + l[d + 1], 16));
- else for (d = 0; d < l.length; d++) {
- var o = l.charCodeAt(d), c = o >> 8, r = 255 & o;
- c ? a.push(c, r) : a.push(r);
- }
- return a;
- }, e.zero2 = A, e.toHex = s, e.encode = function(l, n) {
- return n === "hex" ? s(l) : l;
- };
- }, {}], 455: [function(g, C, i) {
- C.exports = { "2.16.840.1.101.3.4.1.1": "aes-128-ecb", "2.16.840.1.101.3.4.1.2": "aes-128-cbc", "2.16.840.1.101.3.4.1.3": "aes-128-ofb", "2.16.840.1.101.3.4.1.4": "aes-128-cfb", "2.16.840.1.101.3.4.1.21": "aes-192-ecb", "2.16.840.1.101.3.4.1.22": "aes-192-cbc", "2.16.840.1.101.3.4.1.23": "aes-192-ofb", "2.16.840.1.101.3.4.1.24": "aes-192-cfb", "2.16.840.1.101.3.4.1.41": "aes-256-ecb", "2.16.840.1.101.3.4.1.42": "aes-256-cbc", "2.16.840.1.101.3.4.1.43": "aes-256-ofb", "2.16.840.1.101.3.4.1.44": "aes-256-cfb" };
- }, {}], 456: [function(g, C, i) {
- var e = g("asn1.js");
- i.certificate = g("./certificate");
- var A = e.define("RSAPrivateKey", function() {
- this.seq().obj(this.key("version").int(), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
- });
- i.RSAPrivateKey = A;
- var s = e.define("RSAPublicKey", function() {
- this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
- });
- i.RSAPublicKey = s;
- var l = e.define("SubjectPublicKeyInfo", function() {
- this.seq().obj(this.key("algorithm").use(n), this.key("subjectPublicKey").bitstr());
- });
- i.PublicKey = l;
- var n = e.define("AlgorithmIdentifier", function() {
- this.seq().obj(this.key("algorithm").objid(), this.key("none").null_().optional(), this.key("curve").objid().optional(), this.key("params").seq().obj(this.key("p").int(), this.key("q").int(), this.key("g").int()).optional());
- }), a = e.define("PrivateKeyInfo", function() {
- this.seq().obj(this.key("version").int(), this.key("algorithm").use(n), this.key("subjectPrivateKey").octstr());
- });
- i.PrivateKey = a;
- var d = e.define("EncryptedPrivateKeyInfo", function() {
- this.seq().obj(this.key("algorithm").seq().obj(this.key("id").objid(), this.key("decrypt").seq().obj(this.key("kde").seq().obj(this.key("id").objid(), this.key("kdeparams").seq().obj(this.key("salt").octstr(), this.key("iters").int())), this.key("cipher").seq().obj(this.key("algo").objid(), this.key("iv").octstr()))), this.key("subjectPrivateKey").octstr());
- });
- i.EncryptedPrivateKey = d;
- var o = e.define("DSAPrivateKey", function() {
- this.seq().obj(this.key("version").int(), this.key("p").int(), this.key("q").int(), this.key("g").int(), this.key("pub_key").int(), this.key("priv_key").int());
- });
- i.DSAPrivateKey = o, i.DSAparam = e.define("DSAparam", function() {
- this.int();
- });
- var c = e.define("ECPrivateKey", function() {
- this.seq().obj(this.key("version").int(), this.key("privateKey").octstr(), this.key("parameters").optional().explicit(0).use(r), this.key("publicKey").optional().explicit(1).bitstr());
- });
- i.ECPrivateKey = c;
- var r = e.define("ECParameters", function() {
- this.choice({ namedCurve: this.objid() });
- });
- i.signature = e.define("signature", function() {
- this.seq().obj(this.key("r").int(), this.key("s").int());
- });
- }, { "./certificate": 457, "asn1.js": 170 }], 457: [function(g, C, i) {
- var e = g("asn1.js"), A = e.define("Time", function() {
- this.choice({ utcTime: this.utctime(), generalTime: this.gentime() });
- }), s = e.define("AttributeTypeValue", function() {
- this.seq().obj(this.key("type").objid(), this.key("value").any());
- }), l = e.define("AlgorithmIdentifier", function() {
- this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional(), this.key("curve").objid().optional());
- }), n = e.define("SubjectPublicKeyInfo", function() {
- this.seq().obj(this.key("algorithm").use(l), this.key("subjectPublicKey").bitstr());
- }), a = e.define("RelativeDistinguishedName", function() {
- this.setof(s);
- }), d = e.define("RDNSequence", function() {
- this.seqof(a);
- }), o = e.define("Name", function() {
- this.choice({ rdnSequence: this.use(d) });
- }), c = e.define("Validity", function() {
- this.seq().obj(this.key("notBefore").use(A), this.key("notAfter").use(A));
- }), r = e.define("Extension", function() {
- this.seq().obj(this.key("extnID").objid(), this.key("critical").bool().def(!1), this.key("extnValue").octstr());
- }), h = e.define("TBSCertificate", function() {
- this.seq().obj(this.key("version").explicit(0).int().optional(), this.key("serialNumber").int(), this.key("signature").use(l), this.key("issuer").use(o), this.key("validity").use(c), this.key("subject").use(o), this.key("subjectPublicKeyInfo").use(n), this.key("issuerUniqueID").implicit(1).bitstr().optional(), this.key("subjectUniqueID").implicit(2).bitstr().optional(), this.key("extensions").explicit(3).seqof(r).optional());
- }), b = e.define("X509Certificate", function() {
- this.seq().obj(this.key("tbsCertificate").use(h), this.key("signatureAlgorithm").use(l), this.key("signatureValue").bitstr());
- });
- C.exports = b;
- }, { "asn1.js": 170 }], 458: [function(g, C, i) {
- var e = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m, A = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m, s = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m, l = g("evp_bytestokey"), n = g("browserify-aes"), a = g("safe-buffer").Buffer;
- C.exports = function(d, o) {
- var c, r = d.toString(), h = r.match(e);
- if (h) {
- var b = "aes" + h[1], u = a.from(h[2], "hex"), m = a.from(h[3].replace(/[\r\n]/g, ""), "base64"), Z = l(o, u.slice(0, 8), parseInt(h[1], 10)).key, p = [], Y = n.createDecipheriv(b, Z, u);
- p.push(Y.update(m)), p.push(Y.final()), c = a.concat(p);
- } else {
- var R = r.match(s);
- c = a.from(R[2].replace(/[\r\n]/g, ""), "base64");
- }
- return { tag: r.match(A)[1], data: c };
- };
- }, { "browserify-aes": 191, evp_bytestokey: 423, "safe-buffer": 494 }], 459: [function(g, C, i) {
- var e = g("./asn1"), A = g("./aesid.json"), s = g("./fixProc"), l = g("browserify-aes"), n = g("pbkdf2"), a = g("safe-buffer").Buffer;
- function d(o) {
- var c;
- typeof o != "object" || a.isBuffer(o) || (c = o.passphrase, o = o.key), typeof o == "string" && (o = a.from(o));
- var r, h, b = s(o, c), u = b.tag, m = b.data;
- switch (u) {
- case "CERTIFICATE":
- h = e.certificate.decode(m, "der").tbsCertificate.subjectPublicKeyInfo;
- case "PUBLIC KEY":
- switch (h || (h = e.PublicKey.decode(m, "der")), r = h.algorithm.algorithm.join(".")) {
- case "1.2.840.113549.1.1.1":
- return e.RSAPublicKey.decode(h.subjectPublicKey.data, "der");
- case "1.2.840.10045.2.1":
- return h.subjectPrivateKey = h.subjectPublicKey, { type: "ec", data: h };
- case "1.2.840.10040.4.1":
- return h.algorithm.params.pub_key = e.DSAparam.decode(h.subjectPublicKey.data, "der"), { type: "dsa", data: h.algorithm.params };
- default:
- throw new Error("unknown key id " + r);
- }
- case "ENCRYPTED PRIVATE KEY":
- m = function(Z, p) {
- var Y = Z.algorithm.decrypt.kde.kdeparams.salt, R = parseInt(Z.algorithm.decrypt.kde.kdeparams.iters.toString(), 10), X = A[Z.algorithm.decrypt.cipher.algo.join(".")], H = Z.algorithm.decrypt.cipher.iv, S = Z.subjectPrivateKey, z = parseInt(X.split("-")[1], 10) / 8, v = n.pbkdf2Sync(p, Y, R, z, "sha1"), K = l.createDecipheriv(X, v, H), V = [];
- return V.push(K.update(S)), V.push(K.final()), a.concat(V);
- }(m = e.EncryptedPrivateKey.decode(m, "der"), c);
- case "PRIVATE KEY":
- switch (r = (h = e.PrivateKey.decode(m, "der")).algorithm.algorithm.join(".")) {
- case "1.2.840.113549.1.1.1":
- return e.RSAPrivateKey.decode(h.subjectPrivateKey, "der");
- case "1.2.840.10045.2.1":
- return { curve: h.algorithm.curve, privateKey: e.ECPrivateKey.decode(h.subjectPrivateKey, "der").privateKey };
- case "1.2.840.10040.4.1":
- return h.algorithm.params.priv_key = e.DSAparam.decode(h.subjectPrivateKey, "der"), { type: "dsa", params: h.algorithm.params };
- default:
- throw new Error("unknown key id " + r);
- }
- case "RSA PUBLIC KEY":
- return e.RSAPublicKey.decode(m, "der");
- case "RSA PRIVATE KEY":
- return e.RSAPrivateKey.decode(m, "der");
- case "DSA PRIVATE KEY":
- return { type: "dsa", params: e.DSAPrivateKey.decode(m, "der") };
- case "EC PRIVATE KEY":
- return { curve: (m = e.ECPrivateKey.decode(m, "der")).parameters.value, privateKey: m.privateKey };
- default:
- throw new Error("unknown key type " + u);
- }
- }
- C.exports = d, d.signature = e.signature;
- }, { "./aesid.json": 455, "./asn1": 456, "./fixProc": 458, "browserify-aes": 191, pbkdf2: 460, "safe-buffer": 494 }], 460: [function(g, C, i) {
- i.pbkdf2 = g("./lib/async"), i.pbkdf2Sync = g("./lib/sync");
- }, { "./lib/async": 461, "./lib/sync": 464 }], 461: [function(g, C, i) {
- (function(e) {
- (function() {
- var A, s, l = g("safe-buffer").Buffer, n = g("./precondition"), a = g("./default-encoding"), d = g("./sync"), o = g("./to-buffer"), c = e.crypto && e.crypto.subtle, r = { sha: "SHA-1", "sha-1": "SHA-1", sha1: "SHA-1", sha256: "SHA-256", "sha-256": "SHA-256", sha384: "SHA-384", "sha-384": "SHA-384", "sha-512": "SHA-512", sha512: "SHA-512" }, h = [];
- function b() {
- return s || (s = e.process && e.process.nextTick ? e.process.nextTick : e.queueMicrotask ? e.queueMicrotask : e.setImmediate ? e.setImmediate : e.setTimeout);
- }
- function u(m, Z, p, Y, R) {
- return c.importKey("raw", m, { name: "PBKDF2" }, !1, ["deriveBits"]).then(function(X) {
- return c.deriveBits({ name: "PBKDF2", salt: Z, iterations: p, hash: { name: R } }, X, Y << 3);
- }).then(function(X) {
- return l.from(X);
- });
- }
- C.exports = function(m, Z, p, Y, R, X) {
- typeof R == "function" && (X = R, R = void 0);
- var H = r[(R = R || "sha1").toLowerCase()];
- if (H && typeof e.Promise == "function") {
- if (n(p, Y), m = o(m, a, "Password"), Z = o(Z, a, "Salt"), typeof X != "function") throw new Error("No callback provided to pbkdf2");
- (function(S, z) {
- S.then(function(v) {
- b()(function() {
- z(null, v);
- });
- }, function(v) {
- b()(function() {
- z(v);
- });
- });
- })(function(S) {
- if (e.process && !e.process.browser || !c || !c.importKey || !c.deriveBits) return Promise.resolve(!1);
- if (h[S] !== void 0) return h[S];
- var z = u(A = A || l.alloc(8), A, 10, 128, S).then(function() {
- return !0;
- }).catch(function() {
- return !1;
- });
- return h[S] = z, z;
- }(H).then(function(S) {
- return S ? u(m, Z, p, Y, H) : d(m, Z, p, Y, R);
- }), X);
- } else b()(function() {
- var S;
- try {
- S = d(m, Z, p, Y, R);
- } catch (z) {
- return X(z);
- }
- X(null, S);
- });
- };
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { "./default-encoding": 462, "./precondition": 463, "./sync": 464, "./to-buffer": 465, "safe-buffer": 494 }], 462: [function(g, C, i) {
- (function(e, A) {
- (function() {
- var s;
- A.process && A.process.browser ? s = "utf-8" : A.process && A.process.version ? s = parseInt(e.version.split(".")[0].slice(1), 10) >= 6 ? "utf-8" : "binary" : s = "utf-8", C.exports = s;
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { _process: 467 }], 463: [function(g, C, i) {
- var e = Math.pow(2, 30) - 1;
- C.exports = function(A, s) {
- if (typeof A != "number") throw new TypeError("Iterations not a number");
- if (A < 0) throw new TypeError("Bad iterations");
- if (typeof s != "number") throw new TypeError("Key length not a number");
- if (s < 0 || s > e || s != s) throw new TypeError("Bad key length");
- };
- }, {}], 464: [function(g, C, i) {
- var e = g("create-hash/md5"), A = g("ripemd160"), s = g("sha.js"), l = g("safe-buffer").Buffer, n = g("./precondition"), a = g("./default-encoding"), d = g("./to-buffer"), o = l.alloc(128), c = { md5: 16, sha1: 20, sha224: 28, sha256: 32, sha384: 48, sha512: 64, rmd160: 20, ripemd160: 20 };
- function r(h, b, u) {
- var m = /* @__PURE__ */ function(H) {
- function S(z) {
- return s(H).update(z).digest();
- }
- return H === "rmd160" || H === "ripemd160" ? function(z) {
- return new A().update(z).digest();
- } : H === "md5" ? e : S;
- }(h), Z = h === "sha512" || h === "sha384" ? 128 : 64;
- b.length > Z ? b = m(b) : b.length < Z && (b = l.concat([b, o], Z));
- for (var p = l.allocUnsafe(Z + c[h]), Y = l.allocUnsafe(Z + c[h]), R = 0; R < Z; R++) p[R] = 54 ^ b[R], Y[R] = 92 ^ b[R];
- var X = l.allocUnsafe(Z + u + 4);
- p.copy(X, 0, 0, Z), this.ipad1 = X, this.ipad2 = p, this.opad = Y, this.alg = h, this.blocksize = Z, this.hash = m, this.size = c[h];
- }
- r.prototype.run = function(h, b) {
- return h.copy(b, this.blocksize), this.hash(b).copy(this.opad, this.blocksize), this.hash(this.opad);
- }, C.exports = function(h, b, u, m, Z) {
- n(u, m);
- var p = new r(Z = Z || "sha1", h = d(h, a, "Password"), (b = d(b, a, "Salt")).length), Y = l.allocUnsafe(m), R = l.allocUnsafe(b.length + 4);
- b.copy(R, 0, 0, b.length);
- for (var X = 0, H = c[Z], S = Math.ceil(m / H), z = 1; z <= S; z++) {
- R.writeUInt32BE(z, b.length);
- for (var v = p.run(R, p.ipad1), K = v, V = 1; V < u; V++) {
- K = p.run(K, p.ipad2);
- for (var N = 0; N < H; N++) v[N] ^= K[N];
- }
- v.copy(Y, X), X += H;
- }
- return Y;
- };
- }, { "./default-encoding": 462, "./precondition": 463, "./to-buffer": 465, "create-hash/md5": 387, ripemd160: 493, "safe-buffer": 494, "sha.js": 498 }], 465: [function(g, C, i) {
- var e = g("safe-buffer").Buffer;
- C.exports = function(A, s, l) {
- if (e.isBuffer(A)) return A;
- if (typeof A == "string") return e.from(A, s);
- if (ArrayBuffer.isView(A)) return e.from(A.buffer);
- throw new TypeError(l + " must be a string, a Buffer, a typed array or a DataView");
- };
- }, { "safe-buffer": 494 }], 466: [function(g, C, i) {
- (function(e) {
- (function() {
- e === void 0 || !e.version || e.version.indexOf("v0.") === 0 || e.version.indexOf("v1.") === 0 && e.version.indexOf("v1.8.") !== 0 ? C.exports = { nextTick: function(A, s, l, n) {
- if (typeof A != "function") throw new TypeError('"callback" argument must be a function');
- var a, d, o = arguments.length;
- switch (o) {
- case 0:
- case 1:
- return e.nextTick(A);
- case 2:
- return e.nextTick(function() {
- A.call(null, s);
- });
- case 3:
- return e.nextTick(function() {
- A.call(null, s, l);
- });
- case 4:
- return e.nextTick(function() {
- A.call(null, s, l, n);
- });
- default:
- for (a = new Array(o - 1), d = 0; d < a.length; ) a[d++] = arguments[d];
- return e.nextTick(function() {
- A.apply(null, a);
- });
- }
- } } : C.exports = e;
- }).call(this);
- }).call(this, g("_process"));
- }, { _process: 467 }], 467: [function(g, C, i) {
- var e, A, s = C.exports = {};
- function l() {
- throw new Error("setTimeout has not been defined");
- }
- function n() {
- throw new Error("clearTimeout has not been defined");
- }
- function a(Z) {
- if (e === setTimeout) return setTimeout(Z, 0);
- if ((e === l || !e) && setTimeout) return e = setTimeout, setTimeout(Z, 0);
- try {
- return e(Z, 0);
- } catch {
- try {
- return e.call(null, Z, 0);
- } catch {
- return e.call(this, Z, 0);
- }
- }
- }
- (function() {
- try {
- e = typeof setTimeout == "function" ? setTimeout : l;
- } catch {
- e = l;
- }
- try {
- A = typeof clearTimeout == "function" ? clearTimeout : n;
- } catch {
- A = n;
- }
- })();
- var d, o = [], c = !1, r = -1;
- function h() {
- c && d && (c = !1, d.length ? o = d.concat(o) : r = -1, o.length && b());
- }
- function b() {
- if (!c) {
- var Z = a(h);
- c = !0;
- for (var p = o.length; p; ) {
- for (d = o, o = []; ++r < p; ) d && d[r].run();
- r = -1, p = o.length;
- }
- d = null, c = !1, function(Y) {
- if (A === clearTimeout) return clearTimeout(Y);
- if ((A === n || !A) && clearTimeout) return A = clearTimeout, clearTimeout(Y);
- try {
- A(Y);
- } catch {
- try {
- return A.call(null, Y);
- } catch {
- return A.call(this, Y);
- }
- }
- }(Z);
- }
- }
- function u(Z, p) {
- this.fun = Z, this.array = p;
- }
- function m() {
- }
- s.nextTick = function(Z) {
- var p = new Array(arguments.length - 1);
- if (arguments.length > 1) for (var Y = 1; Y < arguments.length; Y++) p[Y - 1] = arguments[Y];
- o.push(new u(Z, p)), o.length !== 1 || c || a(b);
- }, u.prototype.run = function() {
- this.fun.apply(null, this.array);
- }, s.title = "browser", s.browser = !0, s.env = {}, s.argv = [], s.version = "", s.versions = {}, s.on = m, s.addListener = m, s.once = m, s.off = m, s.removeListener = m, s.removeAllListeners = m, s.emit = m, s.prependListener = m, s.prependOnceListener = m, s.listeners = function(Z) {
- return [];
- }, s.binding = function(Z) {
- throw new Error("process.binding is not supported");
- }, s.cwd = function() {
- return "/";
- }, s.chdir = function(Z) {
- throw new Error("process.chdir is not supported");
- }, s.umask = function() {
- return 0;
- };
- }, {}], 468: [function(g, C, i) {
- i.publicEncrypt = g("./publicEncrypt"), i.privateDecrypt = g("./privateDecrypt"), i.privateEncrypt = function(e, A) {
- return i.publicEncrypt(e, A, !0);
- }, i.publicDecrypt = function(e, A) {
- return i.privateDecrypt(e, A, !0);
- };
- }, { "./privateDecrypt": 471, "./publicEncrypt": 472 }], 469: [function(g, C, i) {
- var e = g("create-hash"), A = g("safe-buffer").Buffer;
- function s(l) {
- var n = A.allocUnsafe(4);
- return n.writeUInt32BE(l, 0), n;
- }
- C.exports = function(l, n) {
- for (var a, d = A.alloc(0), o = 0; d.length < n; ) a = s(o++), d = A.concat([d, e("sha1").update(l).update(a).digest()]);
- return d.slice(0, n);
- };
- }, { "create-hash": 386, "safe-buffer": 494 }], 470: [function(g, C, i) {
- arguments[4][184][0].apply(i, arguments);
- }, { buffer: 188, dup: 184 }], 471: [function(g, C, i) {
- var e = g("parse-asn1"), A = g("./mgf"), s = g("./xor"), l = g("bn.js"), n = g("browserify-rsa"), a = g("create-hash"), d = g("./withPublic"), o = g("safe-buffer").Buffer;
- C.exports = function(c, r, h) {
- var b;
- b = c.padding ? c.padding : h ? 1 : 4;
- var u, m = e(c), Z = m.modulus.byteLength();
- if (r.length > Z || new l(r).cmp(m.modulus) >= 0) throw new Error("decryption error");
- u = h ? d(new l(r), m) : n(r, m);
- var p = o.alloc(Z - u.length);
- if (u = o.concat([p, u], Z), b === 4) return function(Y, R) {
- var X = Y.modulus.byteLength(), H = a("sha1").update(o.alloc(0)).digest(), S = H.length;
- if (R[0] !== 0) throw new Error("decryption error");
- var z = R.slice(1, S + 1), v = R.slice(S + 1), K = s(z, A(v, S)), V = s(v, A(K, X - S - 1));
- if (function(B, G) {
- B = o.from(B), G = o.from(G);
- var w = 0, W = B.length;
- B.length !== G.length && (w++, W = Math.min(B.length, G.length));
- for (var y = -1; ++y < W; ) w += B[y] ^ G[y];
- return w;
- }(H, V.slice(0, S))) throw new Error("decryption error");
- for (var N = S; V[N] === 0; ) N++;
- if (V[N++] !== 1) throw new Error("decryption error");
- return V.slice(N);
- }(m, u);
- if (b === 1) return function(Y, R, X) {
- for (var H = R.slice(0, 2), S = 2, z = 0; R[S++] !== 0; ) if (S >= R.length) {
- z++;
- break;
- }
- var v = R.slice(2, S - 1);
- if ((H.toString("hex") !== "0002" && !X || H.toString("hex") !== "0001" && X) && z++, v.length < 8 && z++, z) throw new Error("decryption error");
- return R.slice(S);
- }(0, u, h);
- if (b === 3) return u;
- throw new Error("unknown padding");
- };
- }, { "./mgf": 469, "./withPublic": 473, "./xor": 474, "bn.js": 470, "browserify-rsa": 209, "create-hash": 386, "parse-asn1": 459, "safe-buffer": 494 }], 472: [function(g, C, i) {
- var e = g("parse-asn1"), A = g("randombytes"), s = g("create-hash"), l = g("./mgf"), n = g("./xor"), a = g("bn.js"), d = g("./withPublic"), o = g("browserify-rsa"), c = g("safe-buffer").Buffer;
- C.exports = function(r, h, b) {
- var u;
- u = r.padding ? r.padding : b ? 1 : 4;
- var m, Z = e(r);
- if (u === 4) m = function(p, Y) {
- var R = p.modulus.byteLength(), X = Y.length, H = s("sha1").update(c.alloc(0)).digest(), S = H.length, z = 2 * S;
- if (X > R - z - 2) throw new Error("message too long");
- var v = c.alloc(R - X - z - 2), K = R - S - 1, V = A(S), N = n(c.concat([H, v, c.alloc(1, 1), Y], K), l(V, K)), B = n(V, l(N, S));
- return new a(c.concat([c.alloc(1), B, N], R));
- }(Z, h);
- else if (u === 1) m = function(p, Y, R) {
- var X, H = Y.length, S = p.modulus.byteLength();
- if (H > S - 11) throw new Error("message too long");
- return X = R ? c.alloc(S - H - 3, 255) : function(z) {
- for (var v, K = c.allocUnsafe(z), V = 0, N = A(2 * z), B = 0; V < z; ) B === N.length && (N = A(2 * z), B = 0), (v = N[B++]) && (K[V++] = v);
- return K;
- }(S - H - 3), new a(c.concat([c.from([0, R ? 1 : 2]), X, c.alloc(1), Y], S));
- }(Z, h, b);
- else {
- if (u !== 3) throw new Error("unknown padding");
- if ((m = new a(h)).cmp(Z.modulus) >= 0) throw new Error("data too long for modulus");
- }
- return b ? o(m, Z) : d(m, Z);
- };
- }, { "./mgf": 469, "./withPublic": 473, "./xor": 474, "bn.js": 470, "browserify-rsa": 209, "create-hash": 386, "parse-asn1": 459, randombytes: 475, "safe-buffer": 494 }], 473: [function(g, C, i) {
- var e = g("bn.js"), A = g("safe-buffer").Buffer;
- C.exports = function(s, l) {
- return A.from(s.toRed(e.mont(l.modulus)).redPow(new e(l.publicExponent)).fromRed().toArray());
- };
- }, { "bn.js": 470, "safe-buffer": 494 }], 474: [function(g, C, i) {
- C.exports = function(e, A) {
- for (var s = e.length, l = -1; ++l < s; ) e[l] ^= A[l];
- return e;
- };
- }, {}], 475: [function(g, C, i) {
- (function(e, A) {
- (function() {
- var s = g("safe-buffer").Buffer, l = A.crypto || A.msCrypto;
- l && l.getRandomValues ? C.exports = function(n, a) {
- if (n > 4294967295) throw new RangeError("requested too many random bytes");
- var d = s.allocUnsafe(n);
- if (n > 0) if (n > 65536) for (var o = 0; o < n; o += 65536) l.getRandomValues(d.slice(o, o + 65536));
- else l.getRandomValues(d);
- return typeof a == "function" ? e.nextTick(function() {
- a(null, d);
- }) : d;
- } : C.exports = function() {
- throw new Error(`Secure random number generation is not supported by this browser.
- Use Chrome, Firefox or Internet Explorer 11`);
- };
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { _process: 467, "safe-buffer": 494 }], 476: [function(g, C, i) {
- (function(e, A) {
- (function() {
- function s() {
- throw new Error(`secure random number generation not supported by this browser
- use chrome, FireFox or Internet Explorer 11`);
- }
- var l = g("safe-buffer"), n = g("randombytes"), a = l.Buffer, d = l.kMaxLength, o = A.crypto || A.msCrypto, c = Math.pow(2, 32) - 1;
- function r(u, m) {
- if (typeof u != "number" || u != u) throw new TypeError("offset must be a number");
- if (u > c || u < 0) throw new TypeError("offset must be a uint32");
- if (u > d || u > m) throw new RangeError("offset out of range");
- }
- function h(u, m, Z) {
- if (typeof u != "number" || u != u) throw new TypeError("size must be a number");
- if (u > c || u < 0) throw new TypeError("size must be a uint32");
- if (u + m > Z || u > d) throw new RangeError("buffer too small");
- }
- function b(u, m, Z, p) {
- if (e.browser) {
- var Y = u.buffer, R = new Uint8Array(Y, m, Z);
- return o.getRandomValues(R), p ? void e.nextTick(function() {
- p(null, u);
- }) : u;
- }
- if (!p) return n(Z).copy(u, m), u;
- n(Z, function(X, H) {
- if (X) return p(X);
- H.copy(u, m), p(null, u);
- });
- }
- o && o.getRandomValues || !e.browser ? (i.randomFill = function(u, m, Z, p) {
- if (!(a.isBuffer(u) || u instanceof A.Uint8Array)) throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
- if (typeof m == "function") p = m, m = 0, Z = u.length;
- else if (typeof Z == "function") p = Z, Z = u.length - m;
- else if (typeof p != "function") throw new TypeError('"cb" argument must be a function');
- return r(m, u.length), h(Z, m, u.length), b(u, m, Z, p);
- }, i.randomFillSync = function(u, m, Z) {
- if (m === void 0 && (m = 0), !(a.isBuffer(u) || u instanceof A.Uint8Array)) throw new TypeError('"buf" argument must be a Buffer or Uint8Array');
- return r(m, u.length), Z === void 0 && (Z = u.length - m), h(Z, m, u.length), b(u, m, Z);
- }) : (i.randomFill = s, i.randomFillSync = s);
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { _process: 467, randombytes: 475, "safe-buffer": 494 }], 477: [function(g, C, i) {
- var e = {};
- function A(l, n, a) {
- a || (a = Error);
- var d = function(o) {
- var c, r;
- function h(b, u, m) {
- return o.call(this, function(Z, p, Y) {
- return typeof n == "string" ? n : n(Z, p, Y);
- }(b, u, m)) || this;
- }
- return r = o, (c = h).prototype = Object.create(r.prototype), c.prototype.constructor = c, c.__proto__ = r, h;
- }(a);
- d.prototype.name = a.name, d.prototype.code = l, e[l] = d;
- }
- function s(l, n) {
- if (Array.isArray(l)) {
- var a = l.length;
- return l = l.map(function(d) {
- return String(d);
- }), a > 2 ? "one of ".concat(n, " ").concat(l.slice(0, a - 1).join(", "), ", or ") + l[a - 1] : a === 2 ? "one of ".concat(n, " ").concat(l[0], " or ").concat(l[1]) : "of ".concat(n, " ").concat(l[0]);
- }
- return "of ".concat(n, " ").concat(String(l));
- }
- A("ERR_INVALID_OPT_VALUE", function(l, n) {
- return 'The value "' + n + '" is invalid for option "' + l + '"';
- }, TypeError), A("ERR_INVALID_ARG_TYPE", function(l, n, a) {
- var d, o, c;
- if (typeof n == "string" && (o = "not ", n.substr(0, o.length) === o) ? (d = "must not be", n = n.replace(/^not /, "")) : d = "must be", function(h, b, u) {
- return (u === void 0 || u > h.length) && (u = h.length), h.substring(u - b.length, u) === b;
- }(l, " argument")) c = "The ".concat(l, " ").concat(d, " ").concat(s(n, "type"));
- else {
- var r = function(h, b, u) {
- return typeof u != "number" && (u = 0), !(u + b.length > h.length) && h.indexOf(b, u) !== -1;
- }(l, ".") ? "property" : "argument";
- c = 'The "'.concat(l, '" ').concat(r, " ").concat(d, " ").concat(s(n, "type"));
- }
- return c += ". Received type ".concat(typeof a);
- }, TypeError), A("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF"), A("ERR_METHOD_NOT_IMPLEMENTED", function(l) {
- return "The " + l + " method is not implemented";
- }), A("ERR_STREAM_PREMATURE_CLOSE", "Premature close"), A("ERR_STREAM_DESTROYED", function(l) {
- return "Cannot call " + l + " after a stream was destroyed";
- }), A("ERR_MULTIPLE_CALLBACK", "Callback called multiple times"), A("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable"), A("ERR_STREAM_WRITE_AFTER_END", "write after end"), A("ERR_STREAM_NULL_VALUES", "May not write null values to stream", TypeError), A("ERR_UNKNOWN_ENCODING", function(l) {
- return "Unknown encoding: " + l;
- }, TypeError), A("ERR_STREAM_UNSHIFT_AFTER_END_EVENT", "stream.unshift() after end event"), C.exports.codes = e;
- }, {}], 478: [function(g, C, i) {
- (function(e) {
- (function() {
- var A = Object.keys || function(h) {
- var b = [];
- for (var u in h) b.push(u);
- return b;
- };
- C.exports = o;
- var s = g("./_stream_readable"), l = g("./_stream_writable");
- g("inherits")(o, s);
- for (var n = A(l.prototype), a = 0; a < n.length; a++) {
- var d = n[a];
- o.prototype[d] || (o.prototype[d] = l.prototype[d]);
- }
- function o(h) {
- if (!(this instanceof o)) return new o(h);
- s.call(this, h), l.call(this, h), this.allowHalfOpen = !0, h && (h.readable === !1 && (this.readable = !1), h.writable === !1 && (this.writable = !1), h.allowHalfOpen === !1 && (this.allowHalfOpen = !1, this.once("end", c)));
- }
- function c() {
- this._writableState.ended || e.nextTick(r, this);
- }
- function r(h) {
- h.end();
- }
- Object.defineProperty(o.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
- return this._writableState.highWaterMark;
- } }), Object.defineProperty(o.prototype, "writableBuffer", { enumerable: !1, get: function() {
- return this._writableState && this._writableState.getBuffer();
- } }), Object.defineProperty(o.prototype, "writableLength", { enumerable: !1, get: function() {
- return this._writableState.length;
- } }), Object.defineProperty(o.prototype, "destroyed", { enumerable: !1, get: function() {
- return this._readableState !== void 0 && this._writableState !== void 0 && this._readableState.destroyed && this._writableState.destroyed;
- }, set: function(h) {
- this._readableState !== void 0 && this._writableState !== void 0 && (this._readableState.destroyed = h, this._writableState.destroyed = h);
- } });
- }).call(this);
- }).call(this, g("_process"));
- }, { "./_stream_readable": 480, "./_stream_writable": 482, _process: 467, inherits: 440 }], 479: [function(g, C, i) {
- C.exports = A;
- var e = g("./_stream_transform");
- function A(s) {
- if (!(this instanceof A)) return new A(s);
- e.call(this, s);
- }
- g("inherits")(A, e), A.prototype._transform = function(s, l, n) {
- n(null, s);
- };
- }, { "./_stream_transform": 481, inherits: 440 }], 480: [function(g, C, i) {
- (function(e, A) {
- (function() {
- var s;
- C.exports = K, K.ReadableState = v, g("events").EventEmitter;
- var l = function(J, k) {
- return J.listeners(k).length;
- }, n = g("./internal/streams/stream"), a = g("buffer").Buffer, d = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
- }, o, c = g("util");
- o = c && c.debuglog ? c.debuglog("stream") : function() {
- };
- var r, h, b, u = g("./internal/streams/buffer_list"), m = g("./internal/streams/destroy"), Z = g("./internal/streams/state").getHighWaterMark, p = g("../errors").codes, Y = p.ERR_INVALID_ARG_TYPE, R = p.ERR_STREAM_PUSH_AFTER_EOF, X = p.ERR_METHOD_NOT_IMPLEMENTED, H = p.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;
- g("inherits")(K, n);
- var S = m.errorOrDestroy, z = ["error", "close", "destroy", "pause", "resume"];
- function v(J, k, j) {
- s = s || g("./_stream_duplex"), J = J || {}, typeof j != "boolean" && (j = k instanceof s), this.objectMode = !!J.objectMode, j && (this.objectMode = this.objectMode || !!J.readableObjectMode), this.highWaterMark = Z(this, J, "readableHighWaterMark", j), this.buffer = new u(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.paused = !0, this.emitClose = J.emitClose !== !1, this.autoDestroy = !!J.autoDestroy, this.destroyed = !1, this.defaultEncoding = J.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, J.encoding && (r || (r = g("string_decoder/").StringDecoder), this.decoder = new r(J.encoding), this.encoding = J.encoding);
- }
- function K(J) {
- if (s = s || g("./_stream_duplex"), !(this instanceof K)) return new K(J);
- var k = this instanceof s;
- this._readableState = new v(J, this, k), this.readable = !0, J && (typeof J.read == "function" && (this._read = J.read), typeof J.destroy == "function" && (this._destroy = J.destroy)), n.call(this);
- }
- function V(J, k, j, q, Cg) {
- o("readableAddChunk", k);
- var Ig, x = J._readableState;
- if (k === null) x.reading = !1, function(Ag, eg) {
- if (o("onEofChunk"), !eg.ended) {
- if (eg.decoder) {
- var O = eg.decoder.end();
- O && O.length && (eg.buffer.push(O), eg.length += eg.objectMode ? 1 : O.length);
- }
- eg.ended = !0, eg.sync ? G(Ag) : (eg.needReadable = !1, eg.emittedReadable || (eg.emittedReadable = !0, w(Ag)));
- }
- }(J, x);
- else if (Cg || (Ig = function(Ag, eg) {
- var O;
- _ = eg, a.isBuffer(_) || _ instanceof d || typeof eg == "string" || eg === void 0 || Ag.objectMode || (O = new Y("chunk", ["string", "Buffer", "Uint8Array"], eg));
- var _;
- return O;
- }(x, k)), Ig) S(J, Ig);
- else if (x.objectMode || k && k.length > 0) if (typeof k == "string" || x.objectMode || Object.getPrototypeOf(k) === a.prototype || (k = function(Ag) {
- return a.from(Ag);
- }(k)), q) x.endEmitted ? S(J, new H()) : N(J, x, k, !0);
- else if (x.ended) S(J, new R());
- else {
- if (x.destroyed) return !1;
- x.reading = !1, x.decoder && !j ? (k = x.decoder.write(k), x.objectMode || k.length !== 0 ? N(J, x, k, !1) : W(J, x)) : N(J, x, k, !1);
- }
- else q || (x.reading = !1, W(J, x));
- return !x.ended && (x.length < x.highWaterMark || x.length === 0);
- }
- function N(J, k, j, q) {
- k.flowing && k.length === 0 && !k.sync ? (k.awaitDrain = 0, J.emit("data", j)) : (k.length += k.objectMode ? 1 : j.length, q ? k.buffer.unshift(j) : k.buffer.push(j), k.needReadable && G(J)), W(J, k);
- }
- Object.defineProperty(K.prototype, "destroyed", { enumerable: !1, get: function() {
- return this._readableState !== void 0 && this._readableState.destroyed;
- }, set: function(J) {
- this._readableState && (this._readableState.destroyed = J);
- } }), K.prototype.destroy = m.destroy, K.prototype._undestroy = m.undestroy, K.prototype._destroy = function(J, k) {
- k(J);
- }, K.prototype.push = function(J, k) {
- var j, q = this._readableState;
- return q.objectMode ? j = !0 : typeof J == "string" && ((k = k || q.defaultEncoding) !== q.encoding && (J = a.from(J, k), k = ""), j = !0), V(this, J, k, !1, j);
- }, K.prototype.unshift = function(J) {
- return V(this, J, null, !0, !1);
- }, K.prototype.isPaused = function() {
- return this._readableState.flowing === !1;
- }, K.prototype.setEncoding = function(J) {
- r || (r = g("string_decoder/").StringDecoder);
- var k = new r(J);
- this._readableState.decoder = k, this._readableState.encoding = this._readableState.decoder.encoding;
- for (var j = this._readableState.buffer.head, q = ""; j !== null; ) q += k.write(j.data), j = j.next;
- return this._readableState.buffer.clear(), q !== "" && this._readableState.buffer.push(q), this._readableState.length = q.length, this;
- };
- function B(J, k) {
- return J <= 0 || k.length === 0 && k.ended ? 0 : k.objectMode ? 1 : J != J ? k.flowing && k.length ? k.buffer.head.data.length : k.length : (J > k.highWaterMark && (k.highWaterMark = function(j) {
- return j >= 1073741824 ? j = 1073741824 : (j--, j |= j >>> 1, j |= j >>> 2, j |= j >>> 4, j |= j >>> 8, j |= j >>> 16, j++), j;
- }(J)), J <= k.length ? J : k.ended ? k.length : (k.needReadable = !0, 0));
- }
- function G(J) {
- var k = J._readableState;
- o("emitReadable", k.needReadable, k.emittedReadable), k.needReadable = !1, k.emittedReadable || (o("emitReadable", k.flowing), k.emittedReadable = !0, e.nextTick(w, J));
- }
- function w(J) {
- var k = J._readableState;
- o("emitReadable_", k.destroyed, k.length, k.ended), k.destroyed || !k.length && !k.ended || (J.emit("readable"), k.emittedReadable = !1), k.needReadable = !k.flowing && !k.ended && k.length <= k.highWaterMark, T(J);
- }
- function W(J, k) {
- k.readingMore || (k.readingMore = !0, e.nextTick(y, J, k));
- }
- function y(J, k) {
- for (; !k.reading && !k.ended && (k.length < k.highWaterMark || k.flowing && k.length === 0); ) {
- var j = k.length;
- if (o("maybeReadMore read 0"), J.read(0), j === k.length) break;
- }
- k.readingMore = !1;
- }
- function f(J) {
- var k = J._readableState;
- k.readableListening = J.listenerCount("readable") > 0, k.resumeScheduled && !k.paused ? k.flowing = !0 : J.listenerCount("data") > 0 && J.resume();
- }
- function D(J) {
- o("readable nexttick read 0"), J.read(0);
- }
- function F(J, k) {
- o("resume", k.reading), k.reading || J.read(0), k.resumeScheduled = !1, J.emit("resume"), T(J), k.flowing && !k.reading && J.read(0);
- }
- function T(J) {
- var k = J._readableState;
- for (o("flow", k.flowing); k.flowing && J.read() !== null; ) ;
- }
- function Q(J, k) {
- return k.length === 0 ? null : (k.objectMode ? j = k.buffer.shift() : !J || J >= k.length ? (j = k.decoder ? k.buffer.join("") : k.buffer.length === 1 ? k.buffer.first() : k.buffer.concat(k.length), k.buffer.clear()) : j = k.buffer.consume(J, k.decoder), j);
- var j;
- }
- function P(J) {
- var k = J._readableState;
- o("endReadable", k.endEmitted), k.endEmitted || (k.ended = !0, e.nextTick(L, k, J));
- }
- function L(J, k) {
- if (o("endReadableNT", J.endEmitted, J.length), !J.endEmitted && J.length === 0 && (J.endEmitted = !0, k.readable = !1, k.emit("end"), J.autoDestroy)) {
- var j = k._writableState;
- (!j || j.autoDestroy && j.finished) && k.destroy();
- }
- }
- function E(J, k) {
- for (var j = 0, q = J.length; j < q; j++) if (J[j] === k) return j;
- return -1;
- }
- K.prototype.read = function(J) {
- o("read", J), J = parseInt(J, 10);
- var k = this._readableState, j = J;
- if (J !== 0 && (k.emittedReadable = !1), J === 0 && k.needReadable && ((k.highWaterMark !== 0 ? k.length >= k.highWaterMark : k.length > 0) || k.ended)) return o("read: emitReadable", k.length, k.ended), k.length === 0 && k.ended ? P(this) : G(this), null;
- if ((J = B(J, k)) === 0 && k.ended) return k.length === 0 && P(this), null;
- var q, Cg = k.needReadable;
- return o("need readable", Cg), (k.length === 0 || k.length - J < k.highWaterMark) && o("length less than watermark", Cg = !0), k.ended || k.reading ? o("reading or ended", Cg = !1) : Cg && (o("do read"), k.reading = !0, k.sync = !0, k.length === 0 && (k.needReadable = !0), this._read(k.highWaterMark), k.sync = !1, k.reading || (J = B(j, k))), (q = J > 0 ? Q(J, k) : null) === null ? (k.needReadable = k.length <= k.highWaterMark, J = 0) : (k.length -= J, k.awaitDrain = 0), k.length === 0 && (k.ended || (k.needReadable = !0), j !== J && k.ended && P(this)), q !== null && this.emit("data", q), q;
- }, K.prototype._read = function(J) {
- S(this, new X("_read()"));
- }, K.prototype.pipe = function(J, k) {
- var j = this, q = this._readableState;
- switch (q.pipesCount) {
- case 0:
- q.pipes = J;
- break;
- case 1:
- q.pipes = [q.pipes, J];
- break;
- default:
- q.pipes.push(J);
- }
- q.pipesCount += 1, o("pipe count=%d opts=%j", q.pipesCount, k);
- var Cg = (!k || k.end !== !1) && J !== e.stdout && J !== e.stderr ? x : ng;
- function Ig(sg, og) {
- o("onunpipe"), sg === j && og && og.hasUnpiped === !1 && (og.hasUnpiped = !0, o("cleanup"), J.removeListener("close", gg), J.removeListener("finish", lg), J.removeListener("drain", Ag), J.removeListener("error", _), J.removeListener("unpipe", Ig), j.removeListener("end", x), j.removeListener("end", ng), j.removeListener("data", O), eg = !0, !q.awaitDrain || J._writableState && !J._writableState.needDrain || Ag());
- }
- function x() {
- o("onend"), J.end();
- }
- q.endEmitted ? e.nextTick(Cg) : j.once("end", Cg), J.on("unpipe", Ig);
- var Ag = /* @__PURE__ */ function(sg) {
- return function() {
- var og = sg._readableState;
- o("pipeOnDrain", og.awaitDrain), og.awaitDrain && og.awaitDrain--, og.awaitDrain === 0 && l(sg, "data") && (og.flowing = !0, T(sg));
- };
- }(j);
- J.on("drain", Ag);
- var eg = !1;
- function O(sg) {
- o("ondata");
- var og = J.write(sg);
- o("dest.write", og), og === !1 && ((q.pipesCount === 1 && q.pipes === J || q.pipesCount > 1 && E(q.pipes, J) !== -1) && !eg && (o("false write response, pause", q.awaitDrain), q.awaitDrain++), j.pause());
- }
- function _(sg) {
- o("onerror", sg), ng(), J.removeListener("error", _), l(J, "error") === 0 && S(J, sg);
- }
- function gg() {
- J.removeListener("finish", lg), ng();
- }
- function lg() {
- o("onfinish"), J.removeListener("close", gg), ng();
- }
- function ng() {
- o("unpipe"), j.unpipe(J);
- }
- return j.on("data", O), function(sg, og, cg) {
- if (typeof sg.prependListener == "function") return sg.prependListener(og, cg);
- sg._events && sg._events[og] ? Array.isArray(sg._events[og]) ? sg._events[og].unshift(cg) : sg._events[og] = [cg, sg._events[og]] : sg.on(og, cg);
- }(J, "error", _), J.once("close", gg), J.once("finish", lg), J.emit("pipe", j), q.flowing || (o("pipe resume"), j.resume()), J;
- }, K.prototype.unpipe = function(J) {
- var k = this._readableState, j = { hasUnpiped: !1 };
- if (k.pipesCount === 0) return this;
- if (k.pipesCount === 1) return J && J !== k.pipes || (J || (J = k.pipes), k.pipes = null, k.pipesCount = 0, k.flowing = !1, J && J.emit("unpipe", this, j)), this;
- if (!J) {
- var q = k.pipes, Cg = k.pipesCount;
- k.pipes = null, k.pipesCount = 0, k.flowing = !1;
- for (var Ig = 0; Ig < Cg; Ig++) q[Ig].emit("unpipe", this, { hasUnpiped: !1 });
- return this;
- }
- var x = E(k.pipes, J);
- return x === -1 || (k.pipes.splice(x, 1), k.pipesCount -= 1, k.pipesCount === 1 && (k.pipes = k.pipes[0]), J.emit("unpipe", this, j)), this;
- }, K.prototype.on = function(J, k) {
- var j = n.prototype.on.call(this, J, k), q = this._readableState;
- return J === "data" ? (q.readableListening = this.listenerCount("readable") > 0, q.flowing !== !1 && this.resume()) : J === "readable" && (q.endEmitted || q.readableListening || (q.readableListening = q.needReadable = !0, q.flowing = !1, q.emittedReadable = !1, o("on readable", q.length, q.reading), q.length ? G(this) : q.reading || e.nextTick(D, this))), j;
- }, K.prototype.addListener = K.prototype.on, K.prototype.removeListener = function(J, k) {
- var j = n.prototype.removeListener.call(this, J, k);
- return J === "readable" && e.nextTick(f, this), j;
- }, K.prototype.removeAllListeners = function(J) {
- var k = n.prototype.removeAllListeners.apply(this, arguments);
- return J !== "readable" && J !== void 0 || e.nextTick(f, this), k;
- }, K.prototype.resume = function() {
- var J = this._readableState;
- return J.flowing || (o("resume"), J.flowing = !J.readableListening, function(k, j) {
- j.resumeScheduled || (j.resumeScheduled = !0, e.nextTick(F, k, j));
- }(this, J)), J.paused = !1, this;
- }, K.prototype.pause = function() {
- return o("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (o("pause"), this._readableState.flowing = !1, this.emit("pause")), this._readableState.paused = !0, this;
- }, K.prototype.wrap = function(J) {
- var k = this, j = this._readableState, q = !1;
- for (var Cg in J.on("end", function() {
- if (o("wrapped end"), j.decoder && !j.ended) {
- var x = j.decoder.end();
- x && x.length && k.push(x);
- }
- k.push(null);
- }), J.on("data", function(x) {
- o("wrapped data"), j.decoder && (x = j.decoder.write(x)), j.objectMode && x == null || (j.objectMode || x && x.length) && (k.push(x) || (q = !0, J.pause()));
- }), J) this[Cg] === void 0 && typeof J[Cg] == "function" && (this[Cg] = /* @__PURE__ */ function(x) {
- return function() {
- return J[x].apply(J, arguments);
- };
- }(Cg));
- for (var Ig = 0; Ig < z.length; Ig++) J.on(z[Ig], this.emit.bind(this, z[Ig]));
- return this._read = function(x) {
- o("wrapped _read", x), q && (q = !1, J.resume());
- }, this;
- }, typeof Symbol == "function" && (K.prototype[Symbol.asyncIterator] = function() {
- return h === void 0 && (h = g("./internal/streams/async_iterator")), h(this);
- }), Object.defineProperty(K.prototype, "readableHighWaterMark", { enumerable: !1, get: function() {
- return this._readableState.highWaterMark;
- } }), Object.defineProperty(K.prototype, "readableBuffer", { enumerable: !1, get: function() {
- return this._readableState && this._readableState.buffer;
- } }), Object.defineProperty(K.prototype, "readableFlowing", { enumerable: !1, get: function() {
- return this._readableState.flowing;
- }, set: function(J) {
- this._readableState && (this._readableState.flowing = J);
- } }), K._fromList = Q, Object.defineProperty(K.prototype, "readableLength", { enumerable: !1, get: function() {
- return this._readableState.length;
- } }), typeof Symbol == "function" && (K.from = function(J, k) {
- return b === void 0 && (b = g("./internal/streams/from")), b(K, J, k);
- });
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { "../errors": 477, "./_stream_duplex": 478, "./internal/streams/async_iterator": 483, "./internal/streams/buffer_list": 484, "./internal/streams/destroy": 485, "./internal/streams/from": 487, "./internal/streams/state": 489, "./internal/streams/stream": 490, _process: 467, buffer: 220, events: 422, inherits: 440, "string_decoder/": 522, util: 188 }], 481: [function(g, C, i) {
- C.exports = o;
- var e = g("../errors").codes, A = e.ERR_METHOD_NOT_IMPLEMENTED, s = e.ERR_MULTIPLE_CALLBACK, l = e.ERR_TRANSFORM_ALREADY_TRANSFORMING, n = e.ERR_TRANSFORM_WITH_LENGTH_0, a = g("./_stream_duplex");
- function d(h, b) {
- var u = this._transformState;
- u.transforming = !1;
- var m = u.writecb;
- if (m === null) return this.emit("error", new s());
- u.writechunk = null, u.writecb = null, b != null && this.push(b), m(h);
- var Z = this._readableState;
- Z.reading = !1, (Z.needReadable || Z.length < Z.highWaterMark) && this._read(Z.highWaterMark);
- }
- function o(h) {
- if (!(this instanceof o)) return new o(h);
- a.call(this, h), this._transformState = { afterTransform: d.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, h && (typeof h.transform == "function" && (this._transform = h.transform), typeof h.flush == "function" && (this._flush = h.flush)), this.on("prefinish", c);
- }
- function c() {
- var h = this;
- typeof this._flush != "function" || this._readableState.destroyed ? r(this, null, null) : this._flush(function(b, u) {
- r(h, b, u);
- });
- }
- function r(h, b, u) {
- if (b) return h.emit("error", b);
- if (u != null && h.push(u), h._writableState.length) throw new n();
- if (h._transformState.transforming) throw new l();
- return h.push(null);
- }
- g("inherits")(o, a), o.prototype.push = function(h, b) {
- return this._transformState.needTransform = !1, a.prototype.push.call(this, h, b);
- }, o.prototype._transform = function(h, b, u) {
- u(new A("_transform()"));
- }, o.prototype._write = function(h, b, u) {
- var m = this._transformState;
- if (m.writecb = u, m.writechunk = h, m.writeencoding = b, !m.transforming) {
- var Z = this._readableState;
- (m.needTransform || Z.needReadable || Z.length < Z.highWaterMark) && this._read(Z.highWaterMark);
- }
- }, o.prototype._read = function(h) {
- var b = this._transformState;
- b.writechunk === null || b.transforming ? b.needTransform = !0 : (b.transforming = !0, this._transform(b.writechunk, b.writeencoding, b.afterTransform));
- }, o.prototype._destroy = function(h, b) {
- a.prototype._destroy.call(this, h, function(u) {
- b(u);
- });
- };
- }, { "../errors": 477, "./_stream_duplex": 478, inherits: 440 }], 482: [function(g, C, i) {
- (function(e, A) {
- (function() {
- function s(y) {
- var f = this;
- this.next = null, this.entry = null, this.finish = function() {
- (function(D, F, T) {
- var Q = D.entry;
- for (D.entry = null; Q; ) {
- var P = Q.callback;
- F.pendingcb--, P(T), Q = Q.next;
- }
- F.corkedRequestsFree.next = D;
- })(f, y);
- };
- }
- var l;
- C.exports = K, K.WritableState = v;
- var n = { deprecate: g("util-deprecate") }, a = g("./internal/streams/stream"), d = g("buffer").Buffer, o = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
- }, c, r = g("./internal/streams/destroy"), h = g("./internal/streams/state").getHighWaterMark, b = g("../errors").codes, u = b.ERR_INVALID_ARG_TYPE, m = b.ERR_METHOD_NOT_IMPLEMENTED, Z = b.ERR_MULTIPLE_CALLBACK, p = b.ERR_STREAM_CANNOT_PIPE, Y = b.ERR_STREAM_DESTROYED, R = b.ERR_STREAM_NULL_VALUES, X = b.ERR_STREAM_WRITE_AFTER_END, H = b.ERR_UNKNOWN_ENCODING, S = r.errorOrDestroy;
- function z() {
- }
- function v(y, f, D) {
- l = l || g("./_stream_duplex"), y = y || {}, typeof D != "boolean" && (D = f instanceof l), this.objectMode = !!y.objectMode, D && (this.objectMode = this.objectMode || !!y.writableObjectMode), this.highWaterMark = h(this, y, "writableHighWaterMark", D), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;
- var F = y.decodeStrings === !1;
- this.decodeStrings = !F, this.defaultEncoding = y.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(T) {
- (function(Q, P) {
- var L = Q._writableState, E = L.sync, J = L.writecb;
- if (typeof J != "function") throw new Z();
- if (function(j) {
- j.writing = !1, j.writecb = null, j.length -= j.writelen, j.writelen = 0;
- }(L), P) (function(j, q, Cg, Ig, x) {
- --q.pendingcb, Cg ? (e.nextTick(x, Ig), e.nextTick(W, j, q), j._writableState.errorEmitted = !0, S(j, Ig)) : (x(Ig), j._writableState.errorEmitted = !0, S(j, Ig), W(j, q));
- })(Q, L, E, P, J);
- else {
- var k = G(L) || Q.destroyed;
- k || L.corked || L.bufferProcessing || !L.bufferedRequest || B(Q, L), E ? e.nextTick(N, Q, L, k, J) : N(Q, L, k, J);
- }
- })(f, T);
- }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.emitClose = y.emitClose !== !1, this.autoDestroy = !!y.autoDestroy, this.bufferedRequestCount = 0, this.corkedRequestsFree = new s(this);
- }
- function K(y) {
- var f = this instanceof (l = l || g("./_stream_duplex"));
- if (!f && !c.call(K, this)) return new K(y);
- this._writableState = new v(y, this, f), this.writable = !0, y && (typeof y.write == "function" && (this._write = y.write), typeof y.writev == "function" && (this._writev = y.writev), typeof y.destroy == "function" && (this._destroy = y.destroy), typeof y.final == "function" && (this._final = y.final)), a.call(this);
- }
- function V(y, f, D, F, T, Q, P) {
- f.writelen = F, f.writecb = P, f.writing = !0, f.sync = !0, f.destroyed ? f.onwrite(new Y("write")) : D ? y._writev(T, f.onwrite) : y._write(T, Q, f.onwrite), f.sync = !1;
- }
- function N(y, f, D, F) {
- D || function(T, Q) {
- Q.length === 0 && Q.needDrain && (Q.needDrain = !1, T.emit("drain"));
- }(y, f), f.pendingcb--, F(), W(y, f);
- }
- function B(y, f) {
- f.bufferProcessing = !0;
- var D = f.bufferedRequest;
- if (y._writev && D && D.next) {
- var F = f.bufferedRequestCount, T = new Array(F), Q = f.corkedRequestsFree;
- Q.entry = D;
- for (var P = 0, L = !0; D; ) T[P] = D, D.isBuf || (L = !1), D = D.next, P += 1;
- T.allBuffers = L, V(y, f, !0, f.length, T, "", Q.finish), f.pendingcb++, f.lastBufferedRequest = null, Q.next ? (f.corkedRequestsFree = Q.next, Q.next = null) : f.corkedRequestsFree = new s(f), f.bufferedRequestCount = 0;
- } else {
- for (; D; ) {
- var E = D.chunk, J = D.encoding, k = D.callback;
- if (V(y, f, !1, f.objectMode ? 1 : E.length, E, J, k), D = D.next, f.bufferedRequestCount--, f.writing) break;
- }
- D === null && (f.lastBufferedRequest = null);
- }
- f.bufferedRequest = D, f.bufferProcessing = !1;
- }
- function G(y) {
- return y.ending && y.length === 0 && y.bufferedRequest === null && !y.finished && !y.writing;
- }
- function w(y, f) {
- y._final(function(D) {
- f.pendingcb--, D && S(y, D), f.prefinished = !0, y.emit("prefinish"), W(y, f);
- });
- }
- function W(y, f) {
- var D = G(f);
- if (D && (function(T, Q) {
- Q.prefinished || Q.finalCalled || (typeof T._final != "function" || Q.destroyed ? (Q.prefinished = !0, T.emit("prefinish")) : (Q.pendingcb++, Q.finalCalled = !0, e.nextTick(w, T, Q)));
- }(y, f), f.pendingcb === 0 && (f.finished = !0, y.emit("finish"), f.autoDestroy))) {
- var F = y._readableState;
- (!F || F.autoDestroy && F.endEmitted) && y.destroy();
- }
- return D;
- }
- g("inherits")(K, a), v.prototype.getBuffer = function() {
- for (var y = this.bufferedRequest, f = []; y; ) f.push(y), y = y.next;
- return f;
- }, function() {
- try {
- Object.defineProperty(v.prototype, "buffer", { get: n.deprecate(function() {
- return this.getBuffer();
- }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });
- } catch {
- }
- }(), typeof Symbol == "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] == "function" ? (c = Function.prototype[Symbol.hasInstance], Object.defineProperty(K, Symbol.hasInstance, { value: function(y) {
- return !!c.call(this, y) || this === K && y && y._writableState instanceof v;
- } })) : c = function(y) {
- return y instanceof this;
- }, K.prototype.pipe = function() {
- S(this, new p());
- }, K.prototype.write = function(y, f, D) {
- var F, T = this._writableState, Q = !1, P = !T.objectMode && (F = y, d.isBuffer(F) || F instanceof o);
- return P && !d.isBuffer(y) && (y = function(L) {
- return d.from(L);
- }(y)), typeof f == "function" && (D = f, f = null), P ? f = "buffer" : f || (f = T.defaultEncoding), typeof D != "function" && (D = z), T.ending ? function(L, E) {
- var J = new X();
- S(L, J), e.nextTick(E, J);
- }(this, D) : (P || function(L, E, J, k) {
- var j;
- return J === null ? j = new R() : typeof J == "string" || E.objectMode || (j = new u("chunk", ["string", "Buffer"], J)), !j || (S(L, j), e.nextTick(k, j), !1);
- }(this, T, y, D)) && (T.pendingcb++, Q = function(L, E, J, k, j, q) {
- if (!J) {
- var Cg = function(eg, O, _) {
- return eg.objectMode || eg.decodeStrings === !1 || typeof O != "string" || (O = d.from(O, _)), O;
- }(E, k, j);
- k !== Cg && (J = !0, j = "buffer", k = Cg);
- }
- var Ig = E.objectMode ? 1 : k.length;
- E.length += Ig;
- var x = E.length < E.highWaterMark;
- if (x || (E.needDrain = !0), E.writing || E.corked) {
- var Ag = E.lastBufferedRequest;
- E.lastBufferedRequest = { chunk: k, encoding: j, isBuf: J, callback: q, next: null }, Ag ? Ag.next = E.lastBufferedRequest : E.bufferedRequest = E.lastBufferedRequest, E.bufferedRequestCount += 1;
- } else V(L, E, !1, Ig, k, j, q);
- return x;
- }(this, T, P, y, f, D)), Q;
- }, K.prototype.cork = function() {
- this._writableState.corked++;
- }, K.prototype.uncork = function() {
- var y = this._writableState;
- y.corked && (y.corked--, y.writing || y.corked || y.bufferProcessing || !y.bufferedRequest || B(this, y));
- }, K.prototype.setDefaultEncoding = function(y) {
- if (typeof y == "string" && (y = y.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((y + "").toLowerCase()) > -1)) throw new H(y);
- return this._writableState.defaultEncoding = y, this;
- }, Object.defineProperty(K.prototype, "writableBuffer", { enumerable: !1, get: function() {
- return this._writableState && this._writableState.getBuffer();
- } }), Object.defineProperty(K.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
- return this._writableState.highWaterMark;
- } }), K.prototype._write = function(y, f, D) {
- D(new m("_write()"));
- }, K.prototype._writev = null, K.prototype.end = function(y, f, D) {
- var F = this._writableState;
- return typeof y == "function" ? (D = y, y = null, f = null) : typeof f == "function" && (D = f, f = null), y != null && this.write(y, f), F.corked && (F.corked = 1, this.uncork()), F.ending || function(T, Q, P) {
- Q.ending = !0, W(T, Q), P && (Q.finished ? e.nextTick(P) : T.once("finish", P)), Q.ended = !0, T.writable = !1;
- }(this, F, D), this;
- }, Object.defineProperty(K.prototype, "writableLength", { enumerable: !1, get: function() {
- return this._writableState.length;
- } }), Object.defineProperty(K.prototype, "destroyed", { enumerable: !1, get: function() {
- return this._writableState !== void 0 && this._writableState.destroyed;
- }, set: function(y) {
- this._writableState && (this._writableState.destroyed = y);
- } }), K.prototype.destroy = r.destroy, K.prototype._undestroy = r.undestroy, K.prototype._destroy = function(y, f) {
- f(y);
- };
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { "../errors": 477, "./_stream_duplex": 478, "./internal/streams/destroy": 485, "./internal/streams/state": 489, "./internal/streams/stream": 490, _process: 467, buffer: 220, inherits: 440, "util-deprecate": 524 }], 483: [function(g, C, i) {
- (function(e) {
- (function() {
- var A;
- function s(Y, R, X) {
- return (R = function(H) {
- var S = function(z, v) {
- if (typeof z != "object" || z === null) return z;
- var K = z[Symbol.toPrimitive];
- if (K !== void 0) {
- var V = K.call(z, v);
- if (typeof V != "object") return V;
- throw new TypeError("@@toPrimitive must return a primitive value.");
- }
- return (v === "string" ? String : Number)(z);
- }(H, "string");
- return typeof S == "symbol" ? S : String(S);
- }(R)) in Y ? Object.defineProperty(Y, R, { value: X, enumerable: !0, configurable: !0, writable: !0 }) : Y[R] = X, Y;
- }
- var l = g("./end-of-stream"), n = Symbol("lastResolve"), a = Symbol("lastReject"), d = Symbol("error"), o = Symbol("ended"), c = Symbol("lastPromise"), r = Symbol("handlePromise"), h = Symbol("stream");
- function b(Y, R) {
- return { value: Y, done: R };
- }
- function u(Y) {
- var R = Y[n];
- if (R !== null) {
- var X = Y[h].read();
- X !== null && (Y[c] = null, Y[n] = null, Y[a] = null, R(b(X, !1)));
- }
- }
- function m(Y) {
- e.nextTick(u, Y);
- }
- var Z = Object.getPrototypeOf(function() {
- }), p = Object.setPrototypeOf((s(A = { get stream() {
- return this[h];
- }, next: function() {
- var Y = this, R = this[d];
- if (R !== null) return Promise.reject(R);
- if (this[o]) return Promise.resolve(b(void 0, !0));
- if (this[h].destroyed) return new Promise(function(z, v) {
- e.nextTick(function() {
- Y[d] ? v(Y[d]) : z(b(void 0, !0));
- });
- });
- var X, H = this[c];
- if (H) X = new Promise(/* @__PURE__ */ function(z, v) {
- return function(K, V) {
- z.then(function() {
- v[o] ? K(b(void 0, !0)) : v[r](K, V);
- }, V);
- };
- }(H, this));
- else {
- var S = this[h].read();
- if (S !== null) return Promise.resolve(b(S, !1));
- X = new Promise(this[r]);
- }
- return this[c] = X, X;
- } }, Symbol.asyncIterator, function() {
- return this;
- }), s(A, "return", function() {
- var Y = this;
- return new Promise(function(R, X) {
- Y[h].destroy(null, function(H) {
- H ? X(H) : R(b(void 0, !0));
- });
- });
- }), A), Z);
- C.exports = function(Y) {
- var R, X = Object.create(p, (s(R = {}, h, { value: Y, writable: !0 }), s(R, n, { value: null, writable: !0 }), s(R, a, { value: null, writable: !0 }), s(R, d, { value: null, writable: !0 }), s(R, o, { value: Y._readableState.endEmitted, writable: !0 }), s(R, r, { value: function(H, S) {
- var z = X[h].read();
- z ? (X[c] = null, X[n] = null, X[a] = null, H(b(z, !1))) : (X[n] = H, X[a] = S);
- }, writable: !0 }), R));
- return X[c] = null, l(Y, function(H) {
- if (H && H.code !== "ERR_STREAM_PREMATURE_CLOSE") {
- var S = X[a];
- return S !== null && (X[c] = null, X[n] = null, X[a] = null, S(H)), void (X[d] = H);
- }
- var z = X[n];
- z !== null && (X[c] = null, X[n] = null, X[a] = null, z(b(void 0, !0))), X[o] = !0;
- }), Y.on("readable", m.bind(null, X)), X;
- };
- }).call(this);
- }).call(this, g("_process"));
- }, { "./end-of-stream": 486, _process: 467 }], 484: [function(g, C, i) {
- function e(c, r) {
- var h = Object.keys(c);
- if (Object.getOwnPropertySymbols) {
- var b = Object.getOwnPropertySymbols(c);
- r && (b = b.filter(function(u) {
- return Object.getOwnPropertyDescriptor(c, u).enumerable;
- })), h.push.apply(h, b);
- }
- return h;
- }
- function A(c) {
- for (var r = 1; r < arguments.length; r++) {
- var h = arguments[r] != null ? arguments[r] : {};
- r % 2 ? e(Object(h), !0).forEach(function(b) {
- s(c, b, h[b]);
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(c, Object.getOwnPropertyDescriptors(h)) : e(Object(h)).forEach(function(b) {
- Object.defineProperty(c, b, Object.getOwnPropertyDescriptor(h, b));
- });
- }
- return c;
- }
- function s(c, r, h) {
- return (r = n(r)) in c ? Object.defineProperty(c, r, { value: h, enumerable: !0, configurable: !0, writable: !0 }) : c[r] = h, c;
- }
- function l(c, r) {
- for (var h = 0; h < r.length; h++) {
- var b = r[h];
- b.enumerable = b.enumerable || !1, b.configurable = !0, "value" in b && (b.writable = !0), Object.defineProperty(c, n(b.key), b);
- }
- }
- function n(c) {
- var r = function(h, b) {
- if (typeof h != "object" || h === null) return h;
- var u = h[Symbol.toPrimitive];
- if (u !== void 0) {
- var m = u.call(h, b);
- if (typeof m != "object") return m;
- throw new TypeError("@@toPrimitive must return a primitive value.");
- }
- return (b === "string" ? String : Number)(h);
- }(c, "string");
- return typeof r == "symbol" ? r : String(r);
- }
- var a = g("buffer").Buffer, d = g("util").inspect, o = d && d.custom || "inspect";
- C.exports = function() {
- function c() {
- (function(b, u) {
- if (!(b instanceof u)) throw new TypeError("Cannot call a class as a function");
- })(this, c), this.head = null, this.tail = null, this.length = 0;
- }
- var r, h;
- return r = c, (h = [{ key: "push", value: function(b) {
- var u = { data: b, next: null };
- this.length > 0 ? this.tail.next = u : this.head = u, this.tail = u, ++this.length;
- } }, { key: "unshift", value: function(b) {
- var u = { data: b, next: this.head };
- this.length === 0 && (this.tail = u), this.head = u, ++this.length;
- } }, { key: "shift", value: function() {
- if (this.length !== 0) {
- var b = this.head.data;
- return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, b;
- }
- } }, { key: "clear", value: function() {
- this.head = this.tail = null, this.length = 0;
- } }, { key: "join", value: function(b) {
- if (this.length === 0) return "";
- for (var u = this.head, m = "" + u.data; u = u.next; ) m += b + u.data;
- return m;
- } }, { key: "concat", value: function(b) {
- if (this.length === 0) return a.alloc(0);
- for (var u, m, Z, p = a.allocUnsafe(b >>> 0), Y = this.head, R = 0; Y; ) u = Y.data, m = p, Z = R, a.prototype.copy.call(u, m, Z), R += Y.data.length, Y = Y.next;
- return p;
- } }, { key: "consume", value: function(b, u) {
- var m;
- return b < this.head.data.length ? (m = this.head.data.slice(0, b), this.head.data = this.head.data.slice(b)) : m = b === this.head.data.length ? this.shift() : u ? this._getString(b) : this._getBuffer(b), m;
- } }, { key: "first", value: function() {
- return this.head.data;
- } }, { key: "_getString", value: function(b) {
- var u = this.head, m = 1, Z = u.data;
- for (b -= Z.length; u = u.next; ) {
- var p = u.data, Y = b > p.length ? p.length : b;
- if (Y === p.length ? Z += p : Z += p.slice(0, b), (b -= Y) == 0) {
- Y === p.length ? (++m, u.next ? this.head = u.next : this.head = this.tail = null) : (this.head = u, u.data = p.slice(Y));
- break;
- }
- ++m;
- }
- return this.length -= m, Z;
- } }, { key: "_getBuffer", value: function(b) {
- var u = a.allocUnsafe(b), m = this.head, Z = 1;
- for (m.data.copy(u), b -= m.data.length; m = m.next; ) {
- var p = m.data, Y = b > p.length ? p.length : b;
- if (p.copy(u, u.length - b, 0, Y), (b -= Y) == 0) {
- Y === p.length ? (++Z, m.next ? this.head = m.next : this.head = this.tail = null) : (this.head = m, m.data = p.slice(Y));
- break;
- }
- ++Z;
- }
- return this.length -= Z, u;
- } }, { key: o, value: function(b, u) {
- return d(this, A(A({}, u), {}, { depth: 0, customInspect: !1 }));
- } }]) && l(r.prototype, h), Object.defineProperty(r, "prototype", { writable: !1 }), c;
- }();
- }, { buffer: 220, util: 188 }], 485: [function(g, C, i) {
- (function(e) {
- (function() {
- function A(n, a) {
- l(n, a), s(n);
- }
- function s(n) {
- n._writableState && !n._writableState.emitClose || n._readableState && !n._readableState.emitClose || n.emit("close");
- }
- function l(n, a) {
- n.emit("error", a);
- }
- C.exports = { destroy: function(n, a) {
- var d = this, o = this._readableState && this._readableState.destroyed, c = this._writableState && this._writableState.destroyed;
- return o || c ? (a ? a(n) : n && (this._writableState ? this._writableState.errorEmitted || (this._writableState.errorEmitted = !0, e.nextTick(l, this, n)) : e.nextTick(l, this, n)), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(n || null, function(r) {
- !a && r ? d._writableState ? d._writableState.errorEmitted ? e.nextTick(s, d) : (d._writableState.errorEmitted = !0, e.nextTick(A, d, r)) : e.nextTick(A, d, r) : a ? (e.nextTick(s, d), a(r)) : e.nextTick(s, d);
- }), this);
- }, undestroy: function() {
- this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finalCalled = !1, this._writableState.prefinished = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);
- }, errorOrDestroy: function(n, a) {
- var d = n._readableState, o = n._writableState;
- d && d.autoDestroy || o && o.autoDestroy ? n.destroy(a) : n.emit("error", a);
- } };
- }).call(this);
- }).call(this, g("_process"));
- }, { _process: 467 }], 486: [function(g, C, i) {
- var e = g("../../../errors").codes.ERR_STREAM_PREMATURE_CLOSE;
- function A() {
- }
- C.exports = function s(l, n, a) {
- if (typeof n == "function") return s(l, null, n);
- n || (n = {}), a = /* @__PURE__ */ function(Y) {
- var R = !1;
- return function() {
- if (!R) {
- R = !0;
- for (var X = arguments.length, H = new Array(X), S = 0; S < X; S++) H[S] = arguments[S];
- Y.apply(this, H);
- }
- };
- }(a || A);
- var d = n.readable || n.readable !== !1 && l.readable, o = n.writable || n.writable !== !1 && l.writable, c = function() {
- l.writable || h();
- }, r = l._writableState && l._writableState.finished, h = function() {
- o = !1, r = !0, d || a.call(l);
- }, b = l._readableState && l._readableState.endEmitted, u = function() {
- d = !1, b = !0, o || a.call(l);
- }, m = function(Y) {
- a.call(l, Y);
- }, Z = function() {
- var Y;
- return d && !b ? (l._readableState && l._readableState.ended || (Y = new e()), a.call(l, Y)) : o && !r ? (l._writableState && l._writableState.ended || (Y = new e()), a.call(l, Y)) : void 0;
- }, p = function() {
- l.req.on("finish", h);
- };
- return function(Y) {
- return Y.setHeader && typeof Y.abort == "function";
- }(l) ? (l.on("complete", h), l.on("abort", Z), l.req ? p() : l.on("request", p)) : o && !l._writableState && (l.on("end", c), l.on("close", c)), l.on("end", u), l.on("finish", h), n.error !== !1 && l.on("error", m), l.on("close", Z), function() {
- l.removeListener("complete", h), l.removeListener("abort", Z), l.removeListener("request", p), l.req && l.req.removeListener("finish", h), l.removeListener("end", c), l.removeListener("close", c), l.removeListener("finish", h), l.removeListener("end", u), l.removeListener("error", m), l.removeListener("close", Z);
- };
- };
- }, { "../../../errors": 477 }], 487: [function(g, C, i) {
- C.exports = function() {
- throw new Error("Readable.from is not available in the browser");
- };
- }, {}], 488: [function(g, C, i) {
- var e, A = g("../../../errors").codes, s = A.ERR_MISSING_ARGS, l = A.ERR_STREAM_DESTROYED;
- function n(r) {
- if (r) throw r;
- }
- function a(r, h, b, u) {
- u = /* @__PURE__ */ function(p) {
- var Y = !1;
- return function() {
- Y || (Y = !0, p.apply(void 0, arguments));
- };
- }(u);
- var m = !1;
- r.on("close", function() {
- m = !0;
- }), e === void 0 && (e = g("./end-of-stream")), e(r, { readable: h, writable: b }, function(p) {
- if (p) return u(p);
- m = !0, u();
- });
- var Z = !1;
- return function(p) {
- if (!m && !Z) return Z = !0, function(Y) {
- return Y.setHeader && typeof Y.abort == "function";
- }(r) ? r.abort() : typeof r.destroy == "function" ? r.destroy() : void u(p || new l("pipe"));
- };
- }
- function d(r) {
- r();
- }
- function o(r, h) {
- return r.pipe(h);
- }
- function c(r) {
- return r.length ? typeof r[r.length - 1] != "function" ? n : r.pop() : n;
- }
- C.exports = function() {
- for (var r = arguments.length, h = new Array(r), b = 0; b < r; b++) h[b] = arguments[b];
- var u, m = c(h);
- if (Array.isArray(h[0]) && (h = h[0]), h.length < 2) throw new s("streams");
- var Z = h.map(function(p, Y) {
- var R = Y < h.length - 1;
- return a(p, R, Y > 0, function(X) {
- u || (u = X), X && Z.forEach(d), R || (Z.forEach(d), m(u));
- });
- });
- return h.reduce(o);
- };
- }, { "../../../errors": 477, "./end-of-stream": 486 }], 489: [function(g, C, i) {
- var e = g("../../../errors").codes.ERR_INVALID_OPT_VALUE;
- C.exports = { getHighWaterMark: function(A, s, l, n) {
- var a = function(d, o, c) {
- return d.highWaterMark != null ? d.highWaterMark : o ? d[c] : null;
- }(s, n, l);
- if (a != null) {
- if (!isFinite(a) || Math.floor(a) !== a || a < 0) throw new e(n ? l : "highWaterMark", a);
- return Math.floor(a);
- }
- return A.objectMode ? 16 : 16384;
- } };
- }, { "../../../errors": 477 }], 490: [function(g, C, i) {
- C.exports = g("events").EventEmitter;
- }, { events: 422 }], 491: [function(g, C, i) {
- (i = C.exports = g("./lib/_stream_readable.js")).Stream = i, i.Readable = i, i.Writable = g("./lib/_stream_writable.js"), i.Duplex = g("./lib/_stream_duplex.js"), i.Transform = g("./lib/_stream_transform.js"), i.PassThrough = g("./lib/_stream_passthrough.js"), i.finished = g("./lib/internal/streams/end-of-stream.js"), i.pipeline = g("./lib/internal/streams/pipeline.js");
- }, { "./lib/_stream_duplex.js": 478, "./lib/_stream_passthrough.js": 479, "./lib/_stream_readable.js": 480, "./lib/_stream_transform.js": 481, "./lib/_stream_writable.js": 482, "./lib/internal/streams/end-of-stream.js": 486, "./lib/internal/streams/pipeline.js": 488 }], 492: [function(g, C, i) {
- var e = function(A) {
- var s = Object.prototype, l = s.hasOwnProperty, n = Object.defineProperty || function(W, y, f) {
- W[y] = f.value;
- }, a = typeof Symbol == "function" ? Symbol : {}, d = a.iterator || "@@iterator", o = a.asyncIterator || "@@asyncIterator", c = a.toStringTag || "@@toStringTag";
- function r(W, y, f) {
- return Object.defineProperty(W, y, { value: f, enumerable: !0, configurable: !0, writable: !0 }), W[y];
- }
- try {
- r({}, "");
- } catch {
- r = function(y, f, D) {
- return y[f] = D;
- };
- }
- function h(W, y, f, D) {
- var F = y && y.prototype instanceof m ? y : m, T = Object.create(F.prototype), Q = new B(D || []);
- return n(T, "_invoke", { value: v(W, f, Q) }), T;
- }
- function b(W, y, f) {
- try {
- return { type: "normal", arg: W.call(y, f) };
- } catch (D) {
- return { type: "throw", arg: D };
- }
- }
- A.wrap = h;
- var u = {};
- function m() {
- }
- function Z() {
- }
- function p() {
- }
- var Y = {};
- r(Y, d, function() {
- return this;
- });
- var R = Object.getPrototypeOf, X = R && R(R(G([])));
- X && X !== s && l.call(X, d) && (Y = X);
- var H = p.prototype = m.prototype = Object.create(Y);
- function S(W) {
- ["next", "throw", "return"].forEach(function(y) {
- r(W, y, function(f) {
- return this._invoke(y, f);
- });
- });
- }
- function z(W, y) {
- var f;
- n(this, "_invoke", { value: function(D, F) {
- function T() {
- return new y(function(Q, P) {
- (function L(E, J, k, j) {
- var q = b(W[E], W, J);
- if (q.type !== "throw") {
- var Cg = q.arg, Ig = Cg.value;
- return Ig && typeof Ig == "object" && l.call(Ig, "__await") ? y.resolve(Ig.__await).then(function(x) {
- L("next", x, k, j);
- }, function(x) {
- L("throw", x, k, j);
- }) : y.resolve(Ig).then(function(x) {
- Cg.value = x, k(Cg);
- }, function(x) {
- return L("throw", x, k, j);
- });
- }
- j(q.arg);
- })(D, F, Q, P);
- });
- }
- return f = f ? f.then(T, T) : T();
- } });
- }
- function v(W, y, f) {
- var D = "suspendedStart";
- return function(F, T) {
- if (D === "executing") throw new Error("Generator is already running");
- if (D === "completed") {
- if (F === "throw") throw T;
- return w();
- }
- for (f.method = F, f.arg = T; ; ) {
- var Q = f.delegate;
- if (Q) {
- var P = K(Q, f);
- if (P) {
- if (P === u) continue;
- return P;
- }
- }
- if (f.method === "next") f.sent = f._sent = f.arg;
- else if (f.method === "throw") {
- if (D === "suspendedStart") throw D = "completed", f.arg;
- f.dispatchException(f.arg);
- } else f.method === "return" && f.abrupt("return", f.arg);
- D = "executing";
- var L = b(W, y, f);
- if (L.type === "normal") {
- if (D = f.done ? "completed" : "suspendedYield", L.arg === u) continue;
- return { value: L.arg, done: f.done };
- }
- L.type === "throw" && (D = "completed", f.method = "throw", f.arg = L.arg);
- }
- };
- }
- function K(W, y) {
- var f = y.method, D = W.iterator[f];
- if (D === void 0) return y.delegate = null, f === "throw" && W.iterator.return && (y.method = "return", y.arg = void 0, K(W, y), y.method === "throw") || f !== "return" && (y.method = "throw", y.arg = new TypeError("The iterator does not provide a '" + f + "' method")), u;
- var F = b(D, W.iterator, y.arg);
- if (F.type === "throw") return y.method = "throw", y.arg = F.arg, y.delegate = null, u;
- var T = F.arg;
- return T ? T.done ? (y[W.resultName] = T.value, y.next = W.nextLoc, y.method !== "return" && (y.method = "next", y.arg = void 0), y.delegate = null, u) : T : (y.method = "throw", y.arg = new TypeError("iterator result is not an object"), y.delegate = null, u);
- }
- function V(W) {
- var y = { tryLoc: W[0] };
- 1 in W && (y.catchLoc = W[1]), 2 in W && (y.finallyLoc = W[2], y.afterLoc = W[3]), this.tryEntries.push(y);
- }
- function N(W) {
- var y = W.completion || {};
- y.type = "normal", delete y.arg, W.completion = y;
- }
- function B(W) {
- this.tryEntries = [{ tryLoc: "root" }], W.forEach(V, this), this.reset(!0);
- }
- function G(W) {
- if (W) {
- var y = W[d];
- if (y) return y.call(W);
- if (typeof W.next == "function") return W;
- if (!isNaN(W.length)) {
- var f = -1, D = function F() {
- for (; ++f < W.length; ) if (l.call(W, f)) return F.value = W[f], F.done = !1, F;
- return F.value = void 0, F.done = !0, F;
- };
- return D.next = D;
- }
- }
- return { next: w };
- }
- function w() {
- return { value: void 0, done: !0 };
- }
- return Z.prototype = p, n(H, "constructor", { value: p, configurable: !0 }), n(p, "constructor", { value: Z, configurable: !0 }), Z.displayName = r(p, c, "GeneratorFunction"), A.isGeneratorFunction = function(W) {
- var y = typeof W == "function" && W.constructor;
- return !!y && (y === Z || (y.displayName || y.name) === "GeneratorFunction");
- }, A.mark = function(W) {
- return Object.setPrototypeOf ? Object.setPrototypeOf(W, p) : (W.__proto__ = p, r(W, c, "GeneratorFunction")), W.prototype = Object.create(H), W;
- }, A.awrap = function(W) {
- return { __await: W };
- }, S(z.prototype), r(z.prototype, o, function() {
- return this;
- }), A.AsyncIterator = z, A.async = function(W, y, f, D, F) {
- F === void 0 && (F = Promise);
- var T = new z(h(W, y, f, D), F);
- return A.isGeneratorFunction(y) ? T : T.next().then(function(Q) {
- return Q.done ? Q.value : T.next();
- });
- }, S(H), r(H, c, "Generator"), r(H, d, function() {
- return this;
- }), r(H, "toString", function() {
- return "[object Generator]";
- }), A.keys = function(W) {
- var y = Object(W), f = [];
- for (var D in y) f.push(D);
- return f.reverse(), function F() {
- for (; f.length; ) {
- var T = f.pop();
- if (T in y) return F.value = T, F.done = !1, F;
- }
- return F.done = !0, F;
- };
- }, A.values = G, B.prototype = { constructor: B, reset: function(W) {
- if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = !1, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(N), !W) for (var y in this) y.charAt(0) === "t" && l.call(this, y) && !isNaN(+y.slice(1)) && (this[y] = void 0);
- }, stop: function() {
- this.done = !0;
- var W = this.tryEntries[0].completion;
- if (W.type === "throw") throw W.arg;
- return this.rval;
- }, dispatchException: function(W) {
- if (this.done) throw W;
- var y = this;
- function f(L, E) {
- return T.type = "throw", T.arg = W, y.next = L, E && (y.method = "next", y.arg = void 0), !!E;
- }
- for (var D = this.tryEntries.length - 1; D >= 0; --D) {
- var F = this.tryEntries[D], T = F.completion;
- if (F.tryLoc === "root") return f("end");
- if (F.tryLoc <= this.prev) {
- var Q = l.call(F, "catchLoc"), P = l.call(F, "finallyLoc");
- if (Q && P) {
- if (this.prev < F.catchLoc) return f(F.catchLoc, !0);
- if (this.prev < F.finallyLoc) return f(F.finallyLoc);
- } else if (Q) {
- if (this.prev < F.catchLoc) return f(F.catchLoc, !0);
- } else {
- if (!P) throw new Error("try statement without catch or finally");
- if (this.prev < F.finallyLoc) return f(F.finallyLoc);
- }
- }
- }
- }, abrupt: function(W, y) {
- for (var f = this.tryEntries.length - 1; f >= 0; --f) {
- var D = this.tryEntries[f];
- if (D.tryLoc <= this.prev && l.call(D, "finallyLoc") && this.prev < D.finallyLoc) {
- var F = D;
- break;
- }
- }
- F && (W === "break" || W === "continue") && F.tryLoc <= y && y <= F.finallyLoc && (F = null);
- var T = F ? F.completion : {};
- return T.type = W, T.arg = y, F ? (this.method = "next", this.next = F.finallyLoc, u) : this.complete(T);
- }, complete: function(W, y) {
- if (W.type === "throw") throw W.arg;
- return W.type === "break" || W.type === "continue" ? this.next = W.arg : W.type === "return" ? (this.rval = this.arg = W.arg, this.method = "return", this.next = "end") : W.type === "normal" && y && (this.next = y), u;
- }, finish: function(W) {
- for (var y = this.tryEntries.length - 1; y >= 0; --y) {
- var f = this.tryEntries[y];
- if (f.finallyLoc === W) return this.complete(f.completion, f.afterLoc), N(f), u;
- }
- }, catch: function(W) {
- for (var y = this.tryEntries.length - 1; y >= 0; --y) {
- var f = this.tryEntries[y];
- if (f.tryLoc === W) {
- var D = f.completion;
- if (D.type === "throw") {
- var F = D.arg;
- N(f);
- }
- return F;
- }
- }
- throw new Error("illegal catch attempt");
- }, delegateYield: function(W, y, f) {
- return this.delegate = { iterator: G(W), resultName: y, nextLoc: f }, this.method === "next" && (this.arg = void 0), u;
- } }, A;
- }(typeof C == "object" ? C.exports : {});
- try {
- regeneratorRuntime = e;
- } catch {
- typeof globalThis == "object" ? globalThis.regeneratorRuntime = e : Function("r", "regeneratorRuntime = r")(e);
- }
- }, {}], 493: [function(g, C, i) {
- var e = g("buffer").Buffer, A = g("inherits"), s = g("hash-base"), l = new Array(16), n = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], a = [5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11], d = [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], o = [8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11], c = [0, 1518500249, 1859775393, 2400959708, 2840853838], r = [1352829926, 1548603684, 1836072691, 2053994217, 0];
- function h() {
- s.call(this, 64), this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878, this._e = 3285377520;
- }
- function b(R, X) {
- return R << X | R >>> 32 - X;
- }
- function u(R, X, H, S, z, v, K, V) {
- return b(R + (X ^ H ^ S) + v + K | 0, V) + z | 0;
- }
- function m(R, X, H, S, z, v, K, V) {
- return b(R + (X & H | ~X & S) + v + K | 0, V) + z | 0;
- }
- function Z(R, X, H, S, z, v, K, V) {
- return b(R + ((X | ~H) ^ S) + v + K | 0, V) + z | 0;
- }
- function p(R, X, H, S, z, v, K, V) {
- return b(R + (X & S | H & ~S) + v + K | 0, V) + z | 0;
- }
- function Y(R, X, H, S, z, v, K, V) {
- return b(R + (X ^ (H | ~S)) + v + K | 0, V) + z | 0;
- }
- A(h, s), h.prototype._update = function() {
- for (var R = l, X = 0; X < 16; ++X) R[X] = this._block.readInt32LE(4 * X);
- for (var H = 0 | this._a, S = 0 | this._b, z = 0 | this._c, v = 0 | this._d, K = 0 | this._e, V = 0 | this._a, N = 0 | this._b, B = 0 | this._c, G = 0 | this._d, w = 0 | this._e, W = 0; W < 80; W += 1) {
- var y, f;
- W < 16 ? (y = u(H, S, z, v, K, R[n[W]], c[0], d[W]), f = Y(V, N, B, G, w, R[a[W]], r[0], o[W])) : W < 32 ? (y = m(H, S, z, v, K, R[n[W]], c[1], d[W]), f = p(V, N, B, G, w, R[a[W]], r[1], o[W])) : W < 48 ? (y = Z(H, S, z, v, K, R[n[W]], c[2], d[W]), f = Z(V, N, B, G, w, R[a[W]], r[2], o[W])) : W < 64 ? (y = p(H, S, z, v, K, R[n[W]], c[3], d[W]), f = m(V, N, B, G, w, R[a[W]], r[3], o[W])) : (y = Y(H, S, z, v, K, R[n[W]], c[4], d[W]), f = u(V, N, B, G, w, R[a[W]], r[4], o[W])), H = K, K = v, v = b(z, 10), z = S, S = y, V = w, w = G, G = b(B, 10), B = N, N = f;
- }
- var D = this._b + z + G | 0;
- this._b = this._c + v + w | 0, this._c = this._d + K + V | 0, this._d = this._e + H + N | 0, this._e = this._a + S + B | 0, this._a = D;
- }, h.prototype._digest = function() {
- this._block[this._blockOffset++] = 128, this._blockOffset > 56 && (this._block.fill(0, this._blockOffset, 64), this._update(), this._blockOffset = 0), this._block.fill(0, this._blockOffset, 56), this._block.writeUInt32LE(this._length[0], 56), this._block.writeUInt32LE(this._length[1], 60), this._update();
- var R = e.alloc ? e.alloc(20) : new e(20);
- return R.writeInt32LE(this._a, 0), R.writeInt32LE(this._b, 4), R.writeInt32LE(this._c, 8), R.writeInt32LE(this._d, 12), R.writeInt32LE(this._e, 16), R;
- }, C.exports = h;
- }, { buffer: 220, "hash-base": 425, inherits: 440 }], 494: [function(g, C, i) {
- /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
- var e = g("buffer"), A = e.Buffer;
- function s(n, a) {
- for (var d in n) a[d] = n[d];
- }
- function l(n, a, d) {
- return A(n, a, d);
- }
- A.from && A.alloc && A.allocUnsafe && A.allocUnsafeSlow ? C.exports = e : (s(e, i), i.Buffer = l), l.prototype = Object.create(A.prototype), s(A, l), l.from = function(n, a, d) {
- if (typeof n == "number") throw new TypeError("Argument must not be a number");
- return A(n, a, d);
- }, l.alloc = function(n, a, d) {
- if (typeof n != "number") throw new TypeError("Argument must be a number");
- var o = A(n);
- return a !== void 0 ? typeof d == "string" ? o.fill(a, d) : o.fill(a) : o.fill(0), o;
- }, l.allocUnsafe = function(n) {
- if (typeof n != "number") throw new TypeError("Argument must be a number");
- return A(n);
- }, l.allocUnsafeSlow = function(n) {
- if (typeof n != "number") throw new TypeError("Argument must be a number");
- return e.SlowBuffer(n);
- };
- }, { buffer: 220 }], 495: [function(g, C, i) {
- (function(e) {
- (function() {
- var A, s = g("buffer"), l = s.Buffer, n = {};
- for (A in s) s.hasOwnProperty(A) && A !== "SlowBuffer" && A !== "Buffer" && (n[A] = s[A]);
- var a = n.Buffer = {};
- for (A in l) l.hasOwnProperty(A) && A !== "allocUnsafe" && A !== "allocUnsafeSlow" && (a[A] = l[A]);
- if (n.Buffer.prototype = l.prototype, a.from && a.from !== Uint8Array.from || (a.from = function(d, o, c) {
- if (typeof d == "number") throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof d);
- if (d && d.length === void 0) throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof d);
- return l(d, o, c);
- }), a.alloc || (a.alloc = function(d, o, c) {
- if (typeof d != "number") throw new TypeError('The "size" argument must be of type number. Received type ' + typeof d);
- if (d < 0 || d >= 2 * (1 << 30)) throw new RangeError('The value "' + d + '" is invalid for option "size"');
- var r = l(d);
- return o && o.length !== 0 ? typeof c == "string" ? r.fill(o, c) : r.fill(o) : r.fill(0), r;
- }), !n.kStringMaxLength) try {
- n.kStringMaxLength = e.binding("buffer").kStringMaxLength;
- } catch {
- }
- n.constants || (n.constants = { MAX_LENGTH: n.kMaxLength }, n.kStringMaxLength && (n.constants.MAX_STRING_LENGTH = n.kStringMaxLength)), C.exports = n;
- }).call(this);
- }).call(this, g("_process"));
- }, { _process: 467, buffer: 220 }], 496: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 });
- const e = g("xmlchars/xml/1.0/ed5"), A = g("xmlchars/xml/1.1/ed2"), s = g("xmlchars/xmlns/1.0/ed3");
- var l = e.isS, n = e.isChar, a = e.isNameStartChar, d = e.isNameChar, o = e.S_LIST, c = e.NAME_RE, r = A.isChar, h = s.isNCNameStartChar, b = s.isNCNameChar, u = s.NC_NAME_RE;
- const m = "http://www.w3.org/XML/1998/namespace", Z = "http://www.w3.org/2000/xmlns/", p = { __proto__: null, xml: m, xmlns: Z }, Y = { __proto__: null, amp: "&", gt: ">", lt: "<", quot: '"', apos: "'" }, R = (G) => G === 34 || G === 39, X = [34, 39], H = [...X, 91, 62], S = [...X, 60, 93], z = [61, 63, ...o], v = [...o, 62, 38, 60];
- function K(G, w, W) {
- switch (w) {
- case "xml":
- W !== m && G.fail(`xml prefix must be bound to ${m}.`);
- break;
- case "xmlns":
- W !== Z && G.fail(`xmlns prefix must be bound to ${Z}.`);
- }
- switch (W) {
- case Z:
- G.fail(w === "" ? `the default namespace may not be set to ${W}.` : `may not assign a prefix (even "xmlns") to the URI ${Z}.`);
- break;
- case m:
- switch (w) {
- case "xml":
- break;
- case "":
- G.fail(`the default namespace may not be set to ${W}.`);
- break;
- default:
- G.fail("may not assign the xml namespace to another prefix.");
- }
- }
- }
- const V = (G) => u.test(G), N = (G) => c.test(G);
- i.EVENTS = ["xmldecl", "text", "processinginstruction", "doctype", "comment", "opentagstart", "attribute", "opentag", "closetag", "cdata", "error", "end", "ready"];
- const B = { xmldecl: "xmldeclHandler", text: "textHandler", processinginstruction: "piHandler", doctype: "doctypeHandler", comment: "commentHandler", opentagstart: "openTagStartHandler", attribute: "attributeHandler", opentag: "openTagHandler", closetag: "closeTagHandler", cdata: "cdataHandler", error: "errorHandler", end: "endHandler", ready: "readyHandler" };
- i.SaxesParser = class {
- constructor(G) {
- this.opt = G ?? {}, this.fragmentOpt = !!this.opt.fragment;
- const w = this.xmlnsOpt = !!this.opt.xmlns;
- if (this.trackPosition = this.opt.position !== !1, this.fileName = this.opt.fileName, w) {
- this.nameStartCheck = h, this.nameCheck = b, this.isName = V, this.processAttribs = this.processAttribsNS, this.pushAttrib = this.pushAttribNS, this.ns = Object.assign({ __proto__: null }, p);
- const W = this.opt.additionalNamespaces;
- W != null && (function(y, f) {
- for (const D of Object.keys(f)) K(y, D, f[D]);
- }(this, W), Object.assign(this.ns, W));
- } else this.nameStartCheck = a, this.nameCheck = d, this.isName = N, this.processAttribs = this.processAttribsPlain, this.pushAttrib = this.pushAttribPlain;
- this.stateTable = [this.sBegin, this.sBeginWhitespace, this.sDoctype, this.sDoctypeQuote, this.sDTD, this.sDTDQuoted, this.sDTDOpenWaka, this.sDTDOpenWakaBang, this.sDTDComment, this.sDTDCommentEnding, this.sDTDCommentEnded, this.sDTDPI, this.sDTDPIEnding, this.sText, this.sEntity, this.sOpenWaka, this.sOpenWakaBang, this.sComment, this.sCommentEnding, this.sCommentEnded, this.sCData, this.sCDataEnding, this.sCDataEnding2, this.sPIFirstChar, this.sPIRest, this.sPIBody, this.sPIEnding, this.sXMLDeclNameStart, this.sXMLDeclName, this.sXMLDeclEq, this.sXMLDeclValueStart, this.sXMLDeclValue, this.sXMLDeclSeparator, this.sXMLDeclEnding, this.sOpenTag, this.sOpenTagSlash, this.sAttrib, this.sAttribName, this.sAttribNameSawWhite, this.sAttribValue, this.sAttribValueQuoted, this.sAttribValueClosed, this.sAttribValueUnquoted, this.sCloseTag, this.sCloseTagSawWhite], this._init();
- }
- get closed() {
- return this._closed;
- }
- _init() {
- var G;
- this.openWakaBang = "", this.text = "", this.name = "", this.piTarget = "", this.entity = "", this.q = null, this.tags = [], this.tag = null, this.topNS = null, this.chunk = "", this.chunkPosition = 0, this.i = 0, this.prevI = 0, this.carriedFromPrevious = void 0, this.forbiddenState = 0, this.attribList = [];
- const { fragmentOpt: w } = this;
- this.state = w ? 13 : 0, this.reportedTextBeforeRoot = this.reportedTextAfterRoot = this.closedRoot = this.sawRoot = w, this.xmlDeclPossible = !w, this.xmlDeclExpects = ["version"], this.entityReturnState = void 0;
- let { defaultXMLVersion: W } = this.opt;
- if (W === void 0) {
- if (this.opt.forceXMLVersion === !0) throw new Error("forceXMLVersion set but defaultXMLVersion is not set");
- W = "1.0";
- }
- this.setXMLVersion(W), this.positionAtNewLine = 0, this.doctype = !1, this._closed = !1, this.xmlDecl = { version: void 0, encoding: void 0, standalone: void 0 }, this.line = 1, this.column = 0, this.ENTITIES = Object.create(Y), (G = this.readyHandler) === null || G === void 0 || G.call(this);
- }
- get position() {
- return this.chunkPosition + this.i;
- }
- get columnIndex() {
- return this.position - this.positionAtNewLine;
- }
- on(G, w) {
- this[B[G]] = w;
- }
- off(G) {
- this[B[G]] = void 0;
- }
- makeError(G) {
- var w;
- let W = (w = this.fileName) !== null && w !== void 0 ? w : "";
- return this.trackPosition && (W.length > 0 && (W += ":"), W += `${this.line}:${this.column}`), W.length > 0 && (W += ": "), new Error(W + G);
- }
- fail(G) {
- const w = this.makeError(G), W = this.errorHandler;
- if (W === void 0) throw w;
- return W(w), this;
- }
- write(G) {
- if (this.closed) return this.fail("cannot write after close; assign an onready handler.");
- let w = !1;
- G === null ? (w = !0, G = "") : typeof G == "object" && (G = G.toString()), this.carriedFromPrevious !== void 0 && (G = `${this.carriedFromPrevious}${G}`, this.carriedFromPrevious = void 0);
- let W = G.length;
- const y = G.charCodeAt(W - 1);
- !w && (y === 13 || y >= 55296 && y <= 56319) && (this.carriedFromPrevious = G[W - 1], W--, G = G.slice(0, W));
- const { stateTable: f } = this;
- for (this.chunk = G, this.i = 0; this.i < W; ) f[this.state].call(this);
- return this.chunkPosition += W, w ? this.end() : this;
- }
- close() {
- return this.write(null);
- }
- getCode10() {
- const { chunk: G, i: w } = this;
- if (this.prevI = w, this.i = w + 1, w >= G.length) return -1;
- const W = G.charCodeAt(w);
- if (this.column++, W < 55296) {
- if (W >= 32 || W === 9) return W;
- switch (W) {
- case 10:
- return this.line++, this.column = 0, this.positionAtNewLine = this.position, 10;
- case 13:
- return G.charCodeAt(w + 1) === 10 && (this.i = w + 2), this.line++, this.column = 0, this.positionAtNewLine = this.position, -2;
- default:
- return this.fail("disallowed character."), W;
- }
- }
- if (W > 56319) return W >= 57344 && W <= 65533 || this.fail("disallowed character."), W;
- const y = 65536 + 1024 * (W - 55296) + (G.charCodeAt(w + 1) - 56320);
- return this.i = w + 2, y > 1114111 && this.fail("disallowed character."), y;
- }
- getCode11() {
- const { chunk: G, i: w } = this;
- if (this.prevI = w, this.i = w + 1, w >= G.length) return -1;
- const W = G.charCodeAt(w);
- if (this.column++, W < 55296) {
- if (W > 31 && W < 127 || W > 159 && W !== 8232 || W === 9) return W;
- switch (W) {
- case 10:
- return this.line++, this.column = 0, this.positionAtNewLine = this.position, 10;
- case 13: {
- const f = G.charCodeAt(w + 1);
- f !== 10 && f !== 133 || (this.i = w + 2);
- }
- case 133:
- case 8232:
- return this.line++, this.column = 0, this.positionAtNewLine = this.position, -2;
- default:
- return this.fail("disallowed character."), W;
- }
- }
- if (W > 56319) return W >= 57344 && W <= 65533 || this.fail("disallowed character."), W;
- const y = 65536 + 1024 * (W - 55296) + (G.charCodeAt(w + 1) - 56320);
- return this.i = w + 2, y > 1114111 && this.fail("disallowed character."), y;
- }
- getCodeNorm() {
- const G = this.getCode();
- return G === -2 ? 10 : G;
- }
- unget() {
- this.i = this.prevI, this.column--;
- }
- captureTo(G) {
- let { i: w } = this;
- const { chunk: W } = this;
- for (; ; ) {
- const y = this.getCode(), f = y === -2, D = f ? 10 : y;
- if (D === -1 || G.includes(D)) return this.text += W.slice(w, this.prevI), D;
- f && (this.text += W.slice(w, this.prevI) + `
- `, w = this.i);
- }
- }
- captureToChar(G) {
- let { i: w } = this;
- const { chunk: W } = this;
- for (; ; ) {
- let y = this.getCode();
- switch (y) {
- case -2:
- this.text += W.slice(w, this.prevI) + `
- `, w = this.i, y = 10;
- break;
- case -1:
- return this.text += W.slice(w), !1;
- }
- if (y === G) return this.text += W.slice(w, this.prevI), !0;
- }
- }
- captureNameChars() {
- const { chunk: G, i: w } = this;
- for (; ; ) {
- const W = this.getCode();
- if (W === -1) return this.name += G.slice(w), -1;
- if (!d(W)) return this.name += G.slice(w, this.prevI), W === -2 ? 10 : W;
- }
- }
- skipSpaces() {
- for (; ; ) {
- const G = this.getCodeNorm();
- if (G === -1 || !l(G)) return G;
- }
- }
- setXMLVersion(G) {
- this.currentXMLVersion = G, G === "1.0" ? (this.isChar = n, this.getCode = this.getCode10) : (this.isChar = r, this.getCode = this.getCode11);
- }
- sBegin() {
- this.chunk.charCodeAt(0) === 65279 && (this.i++, this.column++), this.state = 1;
- }
- sBeginWhitespace() {
- const G = this.i, w = this.skipSpaces();
- switch (this.prevI !== G && (this.xmlDeclPossible = !1), w) {
- case 60:
- if (this.state = 15, this.text.length !== 0) throw new Error("no-empty text at start");
- break;
- case -1:
- break;
- default:
- this.unget(), this.state = 13, this.xmlDeclPossible = !1;
- }
- }
- sDoctype() {
- var G;
- const w = this.captureTo(H);
- switch (w) {
- case 62:
- (G = this.doctypeHandler) === null || G === void 0 || G.call(this, this.text), this.text = "", this.state = 13, this.doctype = !0;
- break;
- case -1:
- break;
- default:
- this.text += String.fromCodePoint(w), w === 91 ? this.state = 4 : R(w) && (this.state = 3, this.q = w);
- }
- }
- sDoctypeQuote() {
- const G = this.q;
- this.captureToChar(G) && (this.text += String.fromCodePoint(G), this.q = null, this.state = 2);
- }
- sDTD() {
- const G = this.captureTo(S);
- G !== -1 && (this.text += String.fromCodePoint(G), G === 93 ? this.state = 2 : G === 60 ? this.state = 6 : R(G) && (this.state = 5, this.q = G));
- }
- sDTDQuoted() {
- const G = this.q;
- this.captureToChar(G) && (this.text += String.fromCodePoint(G), this.state = 4, this.q = null);
- }
- sDTDOpenWaka() {
- const G = this.getCodeNorm();
- switch (this.text += String.fromCodePoint(G), G) {
- case 33:
- this.state = 7, this.openWakaBang = "";
- break;
- case 63:
- this.state = 11;
- break;
- default:
- this.state = 4;
- }
- }
- sDTDOpenWakaBang() {
- const G = String.fromCodePoint(this.getCodeNorm()), w = this.openWakaBang += G;
- this.text += G, w !== "-" && (this.state = w === "--" ? 8 : 4, this.openWakaBang = "");
- }
- sDTDComment() {
- this.captureToChar(45) && (this.text += "-", this.state = 9);
- }
- sDTDCommentEnding() {
- const G = this.getCodeNorm();
- this.text += String.fromCodePoint(G), this.state = G === 45 ? 10 : 8;
- }
- sDTDCommentEnded() {
- const G = this.getCodeNorm();
- this.text += String.fromCodePoint(G), G === 62 ? this.state = 4 : (this.fail("malformed comment."), this.state = 8);
- }
- sDTDPI() {
- this.captureToChar(63) && (this.text += "?", this.state = 12);
- }
- sDTDPIEnding() {
- const G = this.getCodeNorm();
- this.text += String.fromCodePoint(G), G === 62 && (this.state = 4);
- }
- sText() {
- this.tags.length !== 0 ? this.handleTextInRoot() : this.handleTextOutsideRoot();
- }
- sEntity() {
- let { i: G } = this;
- const { chunk: w } = this;
- g: for (; ; ) switch (this.getCode()) {
- case -2:
- this.entity += w.slice(G, this.prevI) + `
- `, G = this.i;
- break;
- case 59: {
- const { entityReturnState: W } = this, y = this.entity + w.slice(G, this.prevI);
- let f;
- this.state = W, y === "" ? (this.fail("empty entity name."), f = "&;") : (f = this.parseEntity(y), this.entity = ""), W === 13 && this.textHandler === void 0 || (this.text += f);
- break g;
- }
- case -1:
- this.entity += w.slice(G);
- break g;
- }
- }
- sOpenWaka() {
- const G = this.getCode();
- if (a(G)) this.state = 34, this.unget(), this.xmlDeclPossible = !1;
- else switch (G) {
- case 47:
- this.state = 43, this.xmlDeclPossible = !1;
- break;
- case 33:
- this.state = 16, this.openWakaBang = "", this.xmlDeclPossible = !1;
- break;
- case 63:
- this.state = 23;
- break;
- default:
- this.fail("disallowed character in tag name"), this.state = 13, this.xmlDeclPossible = !1;
- }
- }
- sOpenWakaBang() {
- switch (this.openWakaBang += String.fromCodePoint(this.getCodeNorm()), this.openWakaBang) {
- case "[CDATA[":
- this.sawRoot || this.reportedTextBeforeRoot || (this.fail("text data outside of root node."), this.reportedTextBeforeRoot = !0), this.closedRoot && !this.reportedTextAfterRoot && (this.fail("text data outside of root node."), this.reportedTextAfterRoot = !0), this.state = 20, this.openWakaBang = "";
- break;
- case "--":
- this.state = 17, this.openWakaBang = "";
- break;
- case "DOCTYPE":
- this.state = 2, (this.doctype || this.sawRoot) && this.fail("inappropriately located doctype declaration."), this.openWakaBang = "";
- break;
- default:
- this.openWakaBang.length >= 7 && this.fail("incorrect syntax.");
- }
- }
- sComment() {
- this.captureToChar(45) && (this.state = 18);
- }
- sCommentEnding() {
- var G;
- const w = this.getCodeNorm();
- w === 45 ? (this.state = 19, (G = this.commentHandler) === null || G === void 0 || G.call(this, this.text), this.text = "") : (this.text += "-" + String.fromCodePoint(w), this.state = 17);
- }
- sCommentEnded() {
- const G = this.getCodeNorm();
- G !== 62 ? (this.fail("malformed comment."), this.text += "--" + String.fromCodePoint(G), this.state = 17) : this.state = 13;
- }
- sCData() {
- this.captureToChar(93) && (this.state = 21);
- }
- sCDataEnding() {
- const G = this.getCodeNorm();
- G === 93 ? this.state = 22 : (this.text += "]" + String.fromCodePoint(G), this.state = 20);
- }
- sCDataEnding2() {
- var G;
- const w = this.getCodeNorm();
- switch (w) {
- case 62:
- (G = this.cdataHandler) === null || G === void 0 || G.call(this, this.text), this.text = "", this.state = 13;
- break;
- case 93:
- this.text += "]";
- break;
- default:
- this.text += "]]" + String.fromCodePoint(w), this.state = 20;
- }
- }
- sPIFirstChar() {
- const G = this.getCodeNorm();
- this.nameStartCheck(G) ? (this.piTarget += String.fromCodePoint(G), this.state = 24) : G === 63 || l(G) ? (this.fail("processing instruction without a target."), this.state = G === 63 ? 26 : 25) : (this.fail("disallowed character in processing instruction name."), this.piTarget += String.fromCodePoint(G), this.state = 24);
- }
- sPIRest() {
- const { chunk: G, i: w } = this;
- for (; ; ) {
- const W = this.getCodeNorm();
- if (W === -1) return void (this.piTarget += G.slice(w));
- if (!this.nameCheck(W)) {
- this.piTarget += G.slice(w, this.prevI);
- const y = W === 63;
- y || l(W) ? this.piTarget === "xml" ? (this.xmlDeclPossible || this.fail("an XML declaration must be at the start of the document."), this.state = y ? 33 : 27) : this.state = y ? 26 : 25 : (this.fail("disallowed character in processing instruction name."), this.piTarget += String.fromCodePoint(W));
- break;
- }
- }
- }
- sPIBody() {
- if (this.text.length === 0) {
- const G = this.getCodeNorm();
- G === 63 ? this.state = 26 : l(G) || (this.text = String.fromCodePoint(G));
- } else this.captureToChar(63) && (this.state = 26);
- }
- sPIEnding() {
- var G;
- const w = this.getCodeNorm();
- if (w === 62) {
- const { piTarget: W } = this;
- W.toLowerCase() === "xml" && this.fail("the XML declaration must appear at the start of the document."), (G = this.piHandler) === null || G === void 0 || G.call(this, { target: W, body: this.text }), this.piTarget = this.text = "", this.state = 13;
- } else w === 63 ? this.text += "?" : (this.text += "?" + String.fromCodePoint(w), this.state = 25);
- this.xmlDeclPossible = !1;
- }
- sXMLDeclNameStart() {
- const G = this.skipSpaces();
- G !== 63 ? G !== -1 && (this.state = 28, this.name = String.fromCodePoint(G)) : this.state = 33;
- }
- sXMLDeclName() {
- const G = this.captureTo(z);
- if (G === 63) return this.state = 33, this.name += this.text, this.text = "", void this.fail("XML declaration is incomplete.");
- if (l(G) || G === 61) {
- if (this.name += this.text, this.text = "", !this.xmlDeclExpects.includes(this.name)) switch (this.name.length) {
- case 0:
- this.fail("did not expect any more name/value pairs.");
- break;
- case 1:
- this.fail(`expected the name ${this.xmlDeclExpects[0]}.`);
- break;
- default:
- this.fail("expected one of " + this.xmlDeclExpects.join(", "));
- }
- this.state = G === 61 ? 30 : 29;
- }
- }
- sXMLDeclEq() {
- const G = this.getCodeNorm();
- if (G === 63) return this.state = 33, void this.fail("XML declaration is incomplete.");
- l(G) || (G !== 61 && this.fail("value required."), this.state = 30);
- }
- sXMLDeclValueStart() {
- const G = this.getCodeNorm();
- if (G === 63) return this.state = 33, void this.fail("XML declaration is incomplete.");
- l(G) || (R(G) ? this.q = G : (this.fail("value must be quoted."), this.q = 32), this.state = 31);
- }
- sXMLDeclValue() {
- const G = this.captureTo([this.q, 63]);
- if (G === 63) return this.state = 33, this.text = "", void this.fail("XML declaration is incomplete.");
- if (G === -1) return;
- const w = this.text;
- switch (this.text = "", this.name) {
- case "version": {
- this.xmlDeclExpects = ["encoding", "standalone"];
- const W = w;
- this.xmlDecl.version = W, /^1\.[0-9]+$/.test(W) ? this.opt.forceXMLVersion || this.setXMLVersion(W) : this.fail("version number must match /^1\\.[0-9]+$/.");
- break;
- }
- case "encoding":
- /^[A-Za-z][A-Za-z0-9._-]*$/.test(w) || this.fail("encoding value must match /^[A-Za-z0-9][A-Za-z0-9._-]*$/."), this.xmlDeclExpects = ["standalone"], this.xmlDecl.encoding = w;
- break;
- case "standalone":
- w !== "yes" && w !== "no" && this.fail('standalone value must match "yes" or "no".'), this.xmlDeclExpects = [], this.xmlDecl.standalone = w;
- }
- this.name = "", this.state = 32;
- }
- sXMLDeclSeparator() {
- const G = this.getCodeNorm();
- G !== 63 ? (l(G) || (this.fail("whitespace required."), this.unget()), this.state = 27) : this.state = 33;
- }
- sXMLDeclEnding() {
- var G;
- this.getCodeNorm() === 62 ? (this.piTarget !== "xml" ? this.fail("processing instructions are not allowed before root.") : this.name !== "version" && this.xmlDeclExpects.includes("version") && this.fail("XML declaration must contain a version."), (G = this.xmldeclHandler) === null || G === void 0 || G.call(this, this.xmlDecl), this.name = "", this.piTarget = this.text = "", this.state = 13) : this.fail("The character ? is disallowed anywhere in XML declarations."), this.xmlDeclPossible = !1;
- }
- sOpenTag() {
- var G;
- const w = this.captureNameChars();
- if (w === -1) return;
- const W = this.tag = { name: this.name, attributes: /* @__PURE__ */ Object.create(null) };
- switch (this.name = "", this.xmlnsOpt && (this.topNS = W.ns = /* @__PURE__ */ Object.create(null)), (G = this.openTagStartHandler) === null || G === void 0 || G.call(this, W), this.sawRoot = !0, !this.fragmentOpt && this.closedRoot && this.fail("documents may contain only one root."), w) {
- case 62:
- this.openTag();
- break;
- case 47:
- this.state = 35;
- break;
- default:
- l(w) || this.fail("disallowed character in tag name."), this.state = 36;
- }
- }
- sOpenTagSlash() {
- this.getCode() === 62 ? this.openSelfClosingTag() : (this.fail("forward-slash in opening tag not followed by >."), this.state = 36);
- }
- sAttrib() {
- const G = this.skipSpaces();
- G !== -1 && (a(G) ? (this.unget(), this.state = 37) : G === 62 ? this.openTag() : G === 47 ? this.state = 35 : this.fail("disallowed character in attribute name."));
- }
- sAttribName() {
- const G = this.captureNameChars();
- G === 61 ? this.state = 39 : l(G) ? this.state = 38 : G === 62 ? (this.fail("attribute without value."), this.pushAttrib(this.name, this.name), this.name = this.text = "", this.openTag()) : G !== -1 && this.fail("disallowed character in attribute name.");
- }
- sAttribNameSawWhite() {
- const G = this.skipSpaces();
- switch (G) {
- case -1:
- return;
- case 61:
- this.state = 39;
- break;
- default:
- this.fail("attribute without value."), this.text = "", this.name = "", G === 62 ? this.openTag() : a(G) ? (this.unget(), this.state = 37) : (this.fail("disallowed character in attribute name."), this.state = 36);
- }
- }
- sAttribValue() {
- const G = this.getCodeNorm();
- R(G) ? (this.q = G, this.state = 40) : l(G) || (this.fail("unquoted attribute value."), this.state = 42, this.unget());
- }
- sAttribValueQuoted() {
- const { q: G, chunk: w } = this;
- let { i: W } = this;
- for (; ; ) switch (this.getCode()) {
- case G:
- return this.pushAttrib(this.name, this.text + w.slice(W, this.prevI)), this.name = this.text = "", this.q = null, void (this.state = 41);
- case 38:
- return this.text += w.slice(W, this.prevI), this.state = 14, void (this.entityReturnState = 40);
- case 10:
- case -2:
- case 9:
- this.text += w.slice(W, this.prevI) + " ", W = this.i;
- break;
- case 60:
- return this.text += w.slice(W, this.prevI), void this.fail("disallowed character.");
- case -1:
- return void (this.text += w.slice(W));
- }
- }
- sAttribValueClosed() {
- const G = this.getCodeNorm();
- l(G) ? this.state = 36 : G === 62 ? this.openTag() : G === 47 ? this.state = 35 : a(G) ? (this.fail("no whitespace between attributes."), this.unget(), this.state = 37) : this.fail("disallowed character in attribute name.");
- }
- sAttribValueUnquoted() {
- const G = this.captureTo(v);
- switch (G) {
- case 38:
- this.state = 14, this.entityReturnState = 42;
- break;
- case 60:
- this.fail("disallowed character.");
- break;
- case -1:
- break;
- default:
- this.text.includes("]]>") && this.fail('the string "]]>" is disallowed in char data.'), this.pushAttrib(this.name, this.text), this.name = this.text = "", G === 62 ? this.openTag() : this.state = 36;
- }
- }
- sCloseTag() {
- const G = this.captureNameChars();
- G === 62 ? this.closeTag() : l(G) ? this.state = 44 : G !== -1 && this.fail("disallowed character in closing tag.");
- }
- sCloseTagSawWhite() {
- switch (this.skipSpaces()) {
- case 62:
- this.closeTag();
- break;
- case -1:
- break;
- default:
- this.fail("disallowed character in closing tag.");
- }
- }
- handleTextInRoot() {
- let { i: G, forbiddenState: w } = this;
- const { chunk: W, textHandler: y } = this;
- g: for (; ; ) switch (this.getCode()) {
- case 60:
- if (this.state = 15, y !== void 0) {
- const { text: f } = this, D = W.slice(G, this.prevI);
- f.length !== 0 ? (y(f + D), this.text = "") : D.length !== 0 && y(D);
- }
- w = 0;
- break g;
- case 38:
- this.state = 14, this.entityReturnState = 13, y !== void 0 && (this.text += W.slice(G, this.prevI)), w = 0;
- break g;
- case 93:
- switch (w) {
- case 0:
- w = 1;
- break;
- case 1:
- w = 2;
- break;
- case 2:
- break;
- default:
- throw new Error("impossible state");
- }
- break;
- case 62:
- w === 2 && this.fail('the string "]]>" is disallowed in char data.'), w = 0;
- break;
- case -2:
- y !== void 0 && (this.text += W.slice(G, this.prevI) + `
- `), G = this.i, w = 0;
- break;
- case -1:
- y !== void 0 && (this.text += W.slice(G));
- break g;
- default:
- w = 0;
- }
- this.forbiddenState = w;
- }
- handleTextOutsideRoot() {
- let { i: G } = this;
- const { chunk: w, textHandler: W } = this;
- let y = !1;
- g: for (; ; ) {
- const f = this.getCode();
- switch (f) {
- case 60:
- if (this.state = 15, W !== void 0) {
- const { text: D } = this, F = w.slice(G, this.prevI);
- D.length !== 0 ? (W(D + F), this.text = "") : F.length !== 0 && W(F);
- }
- break g;
- case 38:
- this.state = 14, this.entityReturnState = 13, W !== void 0 && (this.text += w.slice(G, this.prevI)), y = !0;
- break g;
- case -2:
- W !== void 0 && (this.text += w.slice(G, this.prevI) + `
- `), G = this.i;
- break;
- case -1:
- W !== void 0 && (this.text += w.slice(G));
- break g;
- default:
- l(f) || (y = !0);
- }
- }
- y && (this.sawRoot || this.reportedTextBeforeRoot || (this.fail("text data outside of root node."), this.reportedTextBeforeRoot = !0), this.closedRoot && !this.reportedTextAfterRoot && (this.fail("text data outside of root node."), this.reportedTextAfterRoot = !0));
- }
- pushAttribNS(G, w) {
- var W;
- const { prefix: y, local: f } = this.qname(G), D = { name: G, prefix: y, local: f, value: w };
- if (this.attribList.push(D), (W = this.attributeHandler) === null || W === void 0 || W.call(this, D), y === "xmlns") {
- const F = w.trim();
- this.currentXMLVersion === "1.0" && F === "" && this.fail("invalid attempt to undefine prefix in XML 1.0"), this.topNS[f] = F, K(this, f, F);
- } else if (G === "xmlns") {
- const F = w.trim();
- this.topNS[""] = F, K(this, "", F);
- }
- }
- pushAttribPlain(G, w) {
- var W;
- const y = { name: G, value: w };
- this.attribList.push(y), (W = this.attributeHandler) === null || W === void 0 || W.call(this, y);
- }
- end() {
- var G, w;
- this.sawRoot || this.fail("document must contain a root element.");
- const { tags: W } = this;
- for (; W.length > 0; ) {
- const f = W.pop();
- this.fail("unclosed tag: " + f.name);
- }
- this.state !== 0 && this.state !== 13 && this.fail("unexpected end.");
- const { text: y } = this;
- return y.length !== 0 && ((G = this.textHandler) === null || G === void 0 || G.call(this, y), this.text = ""), this._closed = !0, (w = this.endHandler) === null || w === void 0 || w.call(this), this._init(), this;
- }
- resolve(G) {
- var w, W;
- let y = this.topNS[G];
- if (y !== void 0) return y;
- const { tags: f } = this;
- for (let D = f.length - 1; D >= 0; D--) if (y = f[D].ns[G], y !== void 0) return y;
- return y = this.ns[G], y !== void 0 ? y : (W = (w = this.opt).resolvePrefix) === null || W === void 0 ? void 0 : W.call(w, G);
- }
- qname(G) {
- const w = G.indexOf(":");
- if (w === -1) return { prefix: "", local: G };
- const W = G.slice(w + 1), y = G.slice(0, w);
- return (y === "" || W === "" || W.includes(":")) && this.fail(`malformed name: ${G}.`), { prefix: y, local: W };
- }
- processAttribsNS() {
- var G;
- const { attribList: w } = this, W = this.tag;
- {
- const { prefix: D, local: F } = this.qname(W.name);
- W.prefix = D, W.local = F;
- const T = W.uri = (G = this.resolve(D)) !== null && G !== void 0 ? G : "";
- D !== "" && (D === "xmlns" && this.fail('tags may not have "xmlns" as prefix.'), T === "" && (this.fail(`unbound namespace prefix: ${JSON.stringify(D)}.`), W.uri = D));
- }
- if (w.length === 0) return;
- const { attributes: y } = W, f = /* @__PURE__ */ new Set();
- for (const D of w) {
- const { name: F, prefix: T, local: Q } = D;
- let P, L;
- T === "" ? (P = F === "xmlns" ? Z : "", L = F) : (P = this.resolve(T), P === void 0 && (this.fail(`unbound namespace prefix: ${JSON.stringify(T)}.`), P = T), L = `{${P}}${Q}`), f.has(L) && this.fail(`duplicate attribute: ${L}.`), f.add(L), D.uri = P, y[F] = D;
- }
- this.attribList = [];
- }
- processAttribsPlain() {
- const { attribList: G } = this, w = this.tag.attributes;
- for (const { name: W, value: y } of G) w[W] !== void 0 && this.fail(`duplicate attribute: ${W}.`), w[W] = y;
- this.attribList = [];
- }
- openTag() {
- var G;
- this.processAttribs();
- const { tags: w } = this, W = this.tag;
- W.isSelfClosing = !1, (G = this.openTagHandler) === null || G === void 0 || G.call(this, W), w.push(W), this.state = 13, this.name = "";
- }
- openSelfClosingTag() {
- var G, w, W;
- this.processAttribs();
- const { tags: y } = this, f = this.tag;
- f.isSelfClosing = !0, (G = this.openTagHandler) === null || G === void 0 || G.call(this, f), (w = this.closeTagHandler) === null || w === void 0 || w.call(this, f), (this.tag = (W = y[y.length - 1]) !== null && W !== void 0 ? W : null) === null && (this.closedRoot = !0), this.state = 13, this.name = "";
- }
- closeTag() {
- const { tags: G, name: w } = this;
- if (this.state = 13, this.name = "", w === "") return this.fail("weird empty close tag."), void (this.text += "</>");
- const W = this.closeTagHandler;
- let y = G.length;
- for (; y-- > 0; ) {
- const f = this.tag = G.pop();
- if (this.topNS = f.ns, W == null || W(f), f.name === w) break;
- this.fail("unexpected close tag.");
- }
- y === 0 ? this.closedRoot = !0 : y < 0 && (this.fail(`unmatched closing tag: ${w}.`), this.text += `</${w}>`);
- }
- parseEntity(G) {
- if (G[0] !== "#") {
- const W = this.ENTITIES[G];
- return W !== void 0 ? W : (this.fail(this.isName(G) ? "undefined entity." : "disallowed character in entity name."), `&${G};`);
- }
- let w = NaN;
- return G[1] === "x" && /^#x[0-9a-f]+$/i.test(G) ? w = parseInt(G.slice(2), 16) : /^#[0-9]+$/.test(G) && (w = parseInt(G.slice(1), 10)), this.isChar(w) ? String.fromCodePoint(w) : (this.fail("malformed character entity."), `&${G};`);
- }
- };
- }, { "xmlchars/xml/1.0/ed5": 543, "xmlchars/xml/1.1/ed2": 544, "xmlchars/xmlns/1.0/ed3": 545 }], 497: [function(g, C, i) {
- var e = g("safe-buffer").Buffer;
- function A(s, l) {
- this._block = e.alloc(s), this._finalSize = l, this._blockSize = s, this._len = 0;
- }
- A.prototype.update = function(s, l) {
- typeof s == "string" && (l = l || "utf8", s = e.from(s, l));
- for (var n = this._block, a = this._blockSize, d = s.length, o = this._len, c = 0; c < d; ) {
- for (var r = o % a, h = Math.min(d - c, a - r), b = 0; b < h; b++) n[r + b] = s[c + b];
- c += h, (o += h) % a == 0 && this._update(n);
- }
- return this._len += d, this;
- }, A.prototype.digest = function(s) {
- var l = this._len % this._blockSize;
- this._block[l] = 128, this._block.fill(0, l + 1), l >= this._finalSize && (this._update(this._block), this._block.fill(0));
- var n = 8 * this._len;
- if (n <= 4294967295) this._block.writeUInt32BE(n, this._blockSize - 4);
- else {
- var a = (4294967295 & n) >>> 0, d = (n - a) / 4294967296;
- this._block.writeUInt32BE(d, this._blockSize - 8), this._block.writeUInt32BE(a, this._blockSize - 4);
- }
- this._update(this._block);
- var o = this._hash();
- return s ? o.toString(s) : o;
- }, A.prototype._update = function() {
- throw new Error("_update must be implemented by subclass");
- }, C.exports = A;
- }, { "safe-buffer": 494 }], 498: [function(g, C, i) {
- var e = C.exports = function(A) {
- A = A.toLowerCase();
- var s = e[A];
- if (!s) throw new Error(A + " is not supported (we accept pull requests)");
- return new s();
- };
- e.sha = g("./sha"), e.sha1 = g("./sha1"), e.sha224 = g("./sha224"), e.sha256 = g("./sha256"), e.sha384 = g("./sha384"), e.sha512 = g("./sha512");
- }, { "./sha": 499, "./sha1": 500, "./sha224": 501, "./sha256": 502, "./sha384": 503, "./sha512": 504 }], 499: [function(g, C, i) {
- var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1518500249, 1859775393, -1894007588, -899497514], n = new Array(80);
- function a() {
- this.init(), this._w = n, A.call(this, 64, 56);
- }
- function d(c) {
- return c << 30 | c >>> 2;
- }
- function o(c, r, h, b) {
- return c === 0 ? r & h | ~r & b : c === 2 ? r & h | r & b | h & b : r ^ h ^ b;
- }
- e(a, A), a.prototype.init = function() {
- return this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878, this._e = 3285377520, this;
- }, a.prototype._update = function(c) {
- for (var r, h = this._w, b = 0 | this._a, u = 0 | this._b, m = 0 | this._c, Z = 0 | this._d, p = 0 | this._e, Y = 0; Y < 16; ++Y) h[Y] = c.readInt32BE(4 * Y);
- for (; Y < 80; ++Y) h[Y] = h[Y - 3] ^ h[Y - 8] ^ h[Y - 14] ^ h[Y - 16];
- for (var R = 0; R < 80; ++R) {
- var X = ~~(R / 20), H = 0 | ((r = b) << 5 | r >>> 27) + o(X, u, m, Z) + p + h[R] + l[X];
- p = Z, Z = m, m = d(u), u = b, b = H;
- }
- this._a = b + this._a | 0, this._b = u + this._b | 0, this._c = m + this._c | 0, this._d = Z + this._d | 0, this._e = p + this._e | 0;
- }, a.prototype._hash = function() {
- var c = s.allocUnsafe(20);
- return c.writeInt32BE(0 | this._a, 0), c.writeInt32BE(0 | this._b, 4), c.writeInt32BE(0 | this._c, 8), c.writeInt32BE(0 | this._d, 12), c.writeInt32BE(0 | this._e, 16), c;
- }, C.exports = a;
- }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 500: [function(g, C, i) {
- var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1518500249, 1859775393, -1894007588, -899497514], n = new Array(80);
- function a() {
- this.init(), this._w = n, A.call(this, 64, 56);
- }
- function d(r) {
- return r << 5 | r >>> 27;
- }
- function o(r) {
- return r << 30 | r >>> 2;
- }
- function c(r, h, b, u) {
- return r === 0 ? h & b | ~h & u : r === 2 ? h & b | h & u | b & u : h ^ b ^ u;
- }
- e(a, A), a.prototype.init = function() {
- return this._a = 1732584193, this._b = 4023233417, this._c = 2562383102, this._d = 271733878, this._e = 3285377520, this;
- }, a.prototype._update = function(r) {
- for (var h, b = this._w, u = 0 | this._a, m = 0 | this._b, Z = 0 | this._c, p = 0 | this._d, Y = 0 | this._e, R = 0; R < 16; ++R) b[R] = r.readInt32BE(4 * R);
- for (; R < 80; ++R) b[R] = (h = b[R - 3] ^ b[R - 8] ^ b[R - 14] ^ b[R - 16]) << 1 | h >>> 31;
- for (var X = 0; X < 80; ++X) {
- var H = ~~(X / 20), S = d(u) + c(H, m, Z, p) + Y + b[X] + l[H] | 0;
- Y = p, p = Z, Z = o(m), m = u, u = S;
- }
- this._a = u + this._a | 0, this._b = m + this._b | 0, this._c = Z + this._c | 0, this._d = p + this._d | 0, this._e = Y + this._e | 0;
- }, a.prototype._hash = function() {
- var r = s.allocUnsafe(20);
- return r.writeInt32BE(0 | this._a, 0), r.writeInt32BE(0 | this._b, 4), r.writeInt32BE(0 | this._c, 8), r.writeInt32BE(0 | this._d, 12), r.writeInt32BE(0 | this._e, 16), r;
- }, C.exports = a;
- }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 501: [function(g, C, i) {
- var e = g("inherits"), A = g("./sha256"), s = g("./hash"), l = g("safe-buffer").Buffer, n = new Array(64);
- function a() {
- this.init(), this._w = n, s.call(this, 64, 56);
- }
- e(a, A), a.prototype.init = function() {
- return this._a = 3238371032, this._b = 914150663, this._c = 812702999, this._d = 4144912697, this._e = 4290775857, this._f = 1750603025, this._g = 1694076839, this._h = 3204075428, this;
- }, a.prototype._hash = function() {
- var d = l.allocUnsafe(28);
- return d.writeInt32BE(this._a, 0), d.writeInt32BE(this._b, 4), d.writeInt32BE(this._c, 8), d.writeInt32BE(this._d, 12), d.writeInt32BE(this._e, 16), d.writeInt32BE(this._f, 20), d.writeInt32BE(this._g, 24), d;
- }, C.exports = a;
- }, { "./hash": 497, "./sha256": 502, inherits: 440, "safe-buffer": 494 }], 502: [function(g, C, i) {
- var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298], n = new Array(64);
- function a() {
- this.init(), this._w = n, A.call(this, 64, 56);
- }
- function d(b, u, m) {
- return m ^ b & (u ^ m);
- }
- function o(b, u, m) {
- return b & u | m & (b | u);
- }
- function c(b) {
- return (b >>> 2 | b << 30) ^ (b >>> 13 | b << 19) ^ (b >>> 22 | b << 10);
- }
- function r(b) {
- return (b >>> 6 | b << 26) ^ (b >>> 11 | b << 21) ^ (b >>> 25 | b << 7);
- }
- function h(b) {
- return (b >>> 7 | b << 25) ^ (b >>> 18 | b << 14) ^ b >>> 3;
- }
- e(a, A), a.prototype.init = function() {
- return this._a = 1779033703, this._b = 3144134277, this._c = 1013904242, this._d = 2773480762, this._e = 1359893119, this._f = 2600822924, this._g = 528734635, this._h = 1541459225, this;
- }, a.prototype._update = function(b) {
- for (var u, m = this._w, Z = 0 | this._a, p = 0 | this._b, Y = 0 | this._c, R = 0 | this._d, X = 0 | this._e, H = 0 | this._f, S = 0 | this._g, z = 0 | this._h, v = 0; v < 16; ++v) m[v] = b.readInt32BE(4 * v);
- for (; v < 64; ++v) m[v] = 0 | (((u = m[v - 2]) >>> 17 | u << 15) ^ (u >>> 19 | u << 13) ^ u >>> 10) + m[v - 7] + h(m[v - 15]) + m[v - 16];
- for (var K = 0; K < 64; ++K) {
- var V = z + r(X) + d(X, H, S) + l[K] + m[K] | 0, N = c(Z) + o(Z, p, Y) | 0;
- z = S, S = H, H = X, X = R + V | 0, R = Y, Y = p, p = Z, Z = V + N | 0;
- }
- this._a = Z + this._a | 0, this._b = p + this._b | 0, this._c = Y + this._c | 0, this._d = R + this._d | 0, this._e = X + this._e | 0, this._f = H + this._f | 0, this._g = S + this._g | 0, this._h = z + this._h | 0;
- }, a.prototype._hash = function() {
- var b = s.allocUnsafe(32);
- return b.writeInt32BE(this._a, 0), b.writeInt32BE(this._b, 4), b.writeInt32BE(this._c, 8), b.writeInt32BE(this._d, 12), b.writeInt32BE(this._e, 16), b.writeInt32BE(this._f, 20), b.writeInt32BE(this._g, 24), b.writeInt32BE(this._h, 28), b;
- }, C.exports = a;
- }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 503: [function(g, C, i) {
- var e = g("inherits"), A = g("./sha512"), s = g("./hash"), l = g("safe-buffer").Buffer, n = new Array(160);
- function a() {
- this.init(), this._w = n, s.call(this, 128, 112);
- }
- e(a, A), a.prototype.init = function() {
- return this._ah = 3418070365, this._bh = 1654270250, this._ch = 2438529370, this._dh = 355462360, this._eh = 1731405415, this._fh = 2394180231, this._gh = 3675008525, this._hh = 1203062813, this._al = 3238371032, this._bl = 914150663, this._cl = 812702999, this._dl = 4144912697, this._el = 4290775857, this._fl = 1750603025, this._gl = 1694076839, this._hl = 3204075428, this;
- }, a.prototype._hash = function() {
- var d = l.allocUnsafe(48);
- function o(c, r, h) {
- d.writeInt32BE(c, h), d.writeInt32BE(r, h + 4);
- }
- return o(this._ah, this._al, 0), o(this._bh, this._bl, 8), o(this._ch, this._cl, 16), o(this._dh, this._dl, 24), o(this._eh, this._el, 32), o(this._fh, this._fl, 40), d;
- }, C.exports = a;
- }, { "./hash": 497, "./sha512": 504, inherits: 440, "safe-buffer": 494 }], 504: [function(g, C, i) {
- var e = g("inherits"), A = g("./hash"), s = g("safe-buffer").Buffer, l = [1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591], n = new Array(160);
- function a() {
- this.init(), this._w = n, A.call(this, 128, 112);
- }
- function d(p, Y, R) {
- return R ^ p & (Y ^ R);
- }
- function o(p, Y, R) {
- return p & Y | R & (p | Y);
- }
- function c(p, Y) {
- return (p >>> 28 | Y << 4) ^ (Y >>> 2 | p << 30) ^ (Y >>> 7 | p << 25);
- }
- function r(p, Y) {
- return (p >>> 14 | Y << 18) ^ (p >>> 18 | Y << 14) ^ (Y >>> 9 | p << 23);
- }
- function h(p, Y) {
- return (p >>> 1 | Y << 31) ^ (p >>> 8 | Y << 24) ^ p >>> 7;
- }
- function b(p, Y) {
- return (p >>> 1 | Y << 31) ^ (p >>> 8 | Y << 24) ^ (p >>> 7 | Y << 25);
- }
- function u(p, Y) {
- return (p >>> 19 | Y << 13) ^ (Y >>> 29 | p << 3) ^ p >>> 6;
- }
- function m(p, Y) {
- return (p >>> 19 | Y << 13) ^ (Y >>> 29 | p << 3) ^ (p >>> 6 | Y << 26);
- }
- function Z(p, Y) {
- return p >>> 0 < Y >>> 0 ? 1 : 0;
- }
- e(a, A), a.prototype.init = function() {
- return this._ah = 1779033703, this._bh = 3144134277, this._ch = 1013904242, this._dh = 2773480762, this._eh = 1359893119, this._fh = 2600822924, this._gh = 528734635, this._hh = 1541459225, this._al = 4089235720, this._bl = 2227873595, this._cl = 4271175723, this._dl = 1595750129, this._el = 2917565137, this._fl = 725511199, this._gl = 4215389547, this._hl = 327033209, this;
- }, a.prototype._update = function(p) {
- for (var Y = this._w, R = 0 | this._ah, X = 0 | this._bh, H = 0 | this._ch, S = 0 | this._dh, z = 0 | this._eh, v = 0 | this._fh, K = 0 | this._gh, V = 0 | this._hh, N = 0 | this._al, B = 0 | this._bl, G = 0 | this._cl, w = 0 | this._dl, W = 0 | this._el, y = 0 | this._fl, f = 0 | this._gl, D = 0 | this._hl, F = 0; F < 32; F += 2) Y[F] = p.readInt32BE(4 * F), Y[F + 1] = p.readInt32BE(4 * F + 4);
- for (; F < 160; F += 2) {
- var T = Y[F - 30], Q = Y[F - 30 + 1], P = h(T, Q), L = b(Q, T), E = u(T = Y[F - 4], Q = Y[F - 4 + 1]), J = m(Q, T), k = Y[F - 14], j = Y[F - 14 + 1], q = Y[F - 32], Cg = Y[F - 32 + 1], Ig = L + j | 0, x = P + k + Z(Ig, L) | 0;
- x = (x = x + E + Z(Ig = Ig + J | 0, J) | 0) + q + Z(Ig = Ig + Cg | 0, Cg) | 0, Y[F] = x, Y[F + 1] = Ig;
- }
- for (var Ag = 0; Ag < 160; Ag += 2) {
- x = Y[Ag], Ig = Y[Ag + 1];
- var eg = o(R, X, H), O = o(N, B, G), _ = c(R, N), gg = c(N, R), lg = r(z, W), ng = r(W, z), sg = l[Ag], og = l[Ag + 1], cg = d(z, v, K), rg = d(W, y, f), dg = D + ng | 0, Bg = V + lg + Z(dg, D) | 0;
- Bg = (Bg = (Bg = Bg + cg + Z(dg = dg + rg | 0, rg) | 0) + sg + Z(dg = dg + og | 0, og) | 0) + x + Z(dg = dg + Ig | 0, Ig) | 0;
- var Zg = gg + O | 0, Xg = _ + eg + Z(Zg, gg) | 0;
- V = K, D = f, K = v, f = y, v = z, y = W, z = S + Bg + Z(W = w + dg | 0, w) | 0, S = H, w = G, H = X, G = B, X = R, B = N, R = Bg + Xg + Z(N = dg + Zg | 0, dg) | 0;
- }
- this._al = this._al + N | 0, this._bl = this._bl + B | 0, this._cl = this._cl + G | 0, this._dl = this._dl + w | 0, this._el = this._el + W | 0, this._fl = this._fl + y | 0, this._gl = this._gl + f | 0, this._hl = this._hl + D | 0, this._ah = this._ah + R + Z(this._al, N) | 0, this._bh = this._bh + X + Z(this._bl, B) | 0, this._ch = this._ch + H + Z(this._cl, G) | 0, this._dh = this._dh + S + Z(this._dl, w) | 0, this._eh = this._eh + z + Z(this._el, W) | 0, this._fh = this._fh + v + Z(this._fl, y) | 0, this._gh = this._gh + K + Z(this._gl, f) | 0, this._hh = this._hh + V + Z(this._hl, D) | 0;
- }, a.prototype._hash = function() {
- var p = s.allocUnsafe(64);
- function Y(R, X, H) {
- p.writeInt32BE(R, H), p.writeInt32BE(X, H + 4);
- }
- return Y(this._ah, this._al, 0), Y(this._bh, this._bl, 8), Y(this._ch, this._cl, 16), Y(this._dh, this._dl, 24), Y(this._eh, this._el, 32), Y(this._fh, this._fl, 40), Y(this._gh, this._gl, 48), Y(this._hh, this._hl, 56), p;
- }, C.exports = a;
- }, { "./hash": 497, inherits: 440, "safe-buffer": 494 }], 505: [function(g, C, i) {
- C.exports = A;
- var e = g("events").EventEmitter;
- function A() {
- e.call(this);
- }
- g("inherits")(A, e), A.Readable = g("readable-stream/readable.js"), A.Writable = g("readable-stream/writable.js"), A.Duplex = g("readable-stream/duplex.js"), A.Transform = g("readable-stream/transform.js"), A.PassThrough = g("readable-stream/passthrough.js"), A.Stream = A, A.prototype.pipe = function(s, l) {
- var n = this;
- function a(u) {
- s.writable && s.write(u) === !1 && n.pause && n.pause();
- }
- function d() {
- n.readable && n.resume && n.resume();
- }
- n.on("data", a), s.on("drain", d), s._isStdio || l && l.end === !1 || (n.on("end", c), n.on("close", r));
- var o = !1;
- function c() {
- o || (o = !0, s.end());
- }
- function r() {
- o || (o = !0, typeof s.destroy == "function" && s.destroy());
- }
- function h(u) {
- if (b(), e.listenerCount(this, "error") === 0) throw u;
- }
- function b() {
- n.removeListener("data", a), s.removeListener("drain", d), n.removeListener("end", c), n.removeListener("close", r), n.removeListener("error", h), s.removeListener("error", h), n.removeListener("end", b), n.removeListener("close", b), s.removeListener("close", b);
- }
- return n.on("error", h), s.on("error", h), n.on("end", b), n.on("close", b), s.on("close", b), s.emit("pipe", n), s;
- };
- }, { events: 422, inherits: 440, "readable-stream/duplex.js": 507, "readable-stream/passthrough.js": 516, "readable-stream/readable.js": 517, "readable-stream/transform.js": 518, "readable-stream/writable.js": 519 }], 506: [function(g, C, i) {
- var e = {}.toString;
- C.exports = Array.isArray || function(A) {
- return e.call(A) == "[object Array]";
- };
- }, {}], 507: [function(g, C, i) {
- C.exports = g("./lib/_stream_duplex.js");
- }, { "./lib/_stream_duplex.js": 508 }], 508: [function(g, C, i) {
- var e = g("process-nextick-args"), A = Object.keys || function(b) {
- var u = [];
- for (var m in b) u.push(m);
- return u;
- };
- C.exports = c;
- var s = Object.create(g("core-util-is"));
- s.inherits = g("inherits");
- var l = g("./_stream_readable"), n = g("./_stream_writable");
- s.inherits(c, l);
- for (var a = A(n.prototype), d = 0; d < a.length; d++) {
- var o = a[d];
- c.prototype[o] || (c.prototype[o] = n.prototype[o]);
- }
- function c(b) {
- if (!(this instanceof c)) return new c(b);
- l.call(this, b), n.call(this, b), b && b.readable === !1 && (this.readable = !1), b && b.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, b && b.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", r);
- }
- function r() {
- this.allowHalfOpen || this._writableState.ended || e.nextTick(h, this);
- }
- function h(b) {
- b.end();
- }
- Object.defineProperty(c.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
- return this._writableState.highWaterMark;
- } }), Object.defineProperty(c.prototype, "destroyed", { get: function() {
- return this._readableState !== void 0 && this._writableState !== void 0 && this._readableState.destroyed && this._writableState.destroyed;
- }, set: function(b) {
- this._readableState !== void 0 && this._writableState !== void 0 && (this._readableState.destroyed = b, this._writableState.destroyed = b);
- } }), c.prototype._destroy = function(b, u) {
- this.push(null), this.end(), e.nextTick(u, b);
- };
- }, { "./_stream_readable": 510, "./_stream_writable": 512, "core-util-is": 383, inherits: 440, "process-nextick-args": 466 }], 509: [function(g, C, i) {
- C.exports = s;
- var e = g("./_stream_transform"), A = Object.create(g("core-util-is"));
- function s(l) {
- if (!(this instanceof s)) return new s(l);
- e.call(this, l);
- }
- A.inherits = g("inherits"), A.inherits(s, e), s.prototype._transform = function(l, n, a) {
- a(null, l);
- };
- }, { "./_stream_transform": 511, "core-util-is": 383, inherits: 440 }], 510: [function(g, C, i) {
- (function(e, A) {
- (function() {
- var s = g("process-nextick-args");
- C.exports = R;
- var l, n = g("isarray");
- R.ReadableState = Y, g("events").EventEmitter;
- var a = function(D, F) {
- return D.listeners(F).length;
- }, d = g("./internal/streams/stream"), o = g("safe-buffer").Buffer, c = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
- }, r = Object.create(g("core-util-is"));
- r.inherits = g("inherits");
- var h = g("util"), b = void 0;
- b = h && h.debuglog ? h.debuglog("stream") : function() {
- };
- var u, m = g("./internal/streams/BufferList"), Z = g("./internal/streams/destroy");
- r.inherits(R, d);
- var p = ["error", "close", "destroy", "pause", "resume"];
- function Y(D, F) {
- D = D || {};
- var T = F instanceof (l = l || g("./_stream_duplex"));
- this.objectMode = !!D.objectMode, T && (this.objectMode = this.objectMode || !!D.readableObjectMode);
- var Q = D.highWaterMark, P = D.readableHighWaterMark, L = this.objectMode ? 16 : 16384;
- this.highWaterMark = Q || Q === 0 ? Q : T && (P || P === 0) ? P : L, this.highWaterMark = Math.floor(this.highWaterMark), this.buffer = new m(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.destroyed = !1, this.defaultEncoding = D.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, D.encoding && (u || (u = g("string_decoder/").StringDecoder), this.decoder = new u(D.encoding), this.encoding = D.encoding);
- }
- function R(D) {
- if (l = l || g("./_stream_duplex"), !(this instanceof R)) return new R(D);
- this._readableState = new Y(D, this), this.readable = !0, D && (typeof D.read == "function" && (this._read = D.read), typeof D.destroy == "function" && (this._destroy = D.destroy)), d.call(this);
- }
- function X(D, F, T, Q, P) {
- var L, E = D._readableState;
- return F === null ? (E.reading = !1, function(J, k) {
- if (!k.ended) {
- if (k.decoder) {
- var j = k.decoder.end();
- j && j.length && (k.buffer.push(j), k.length += k.objectMode ? 1 : j.length);
- }
- k.ended = !0, z(J);
- }
- }(D, E)) : (P || (L = function(J, k) {
- var j;
- q = k, o.isBuffer(q) || q instanceof c || typeof k == "string" || k === void 0 || J.objectMode || (j = new TypeError("Invalid non-string/buffer chunk"));
- var q;
- return j;
- }(E, F)), L ? D.emit("error", L) : E.objectMode || F && F.length > 0 ? (typeof F == "string" || E.objectMode || Object.getPrototypeOf(F) === o.prototype || (F = function(J) {
- return o.from(J);
- }(F)), Q ? E.endEmitted ? D.emit("error", new Error("stream.unshift() after end event")) : H(D, E, F, !0) : E.ended ? D.emit("error", new Error("stream.push() after EOF")) : (E.reading = !1, E.decoder && !T ? (F = E.decoder.write(F), E.objectMode || F.length !== 0 ? H(D, E, F, !1) : K(D, E)) : H(D, E, F, !1))) : Q || (E.reading = !1)), function(J) {
- return !J.ended && (J.needReadable || J.length < J.highWaterMark || J.length === 0);
- }(E);
- }
- function H(D, F, T, Q) {
- F.flowing && F.length === 0 && !F.sync ? (D.emit("data", T), D.read(0)) : (F.length += F.objectMode ? 1 : T.length, Q ? F.buffer.unshift(T) : F.buffer.push(T), F.needReadable && z(D)), K(D, F);
- }
- Object.defineProperty(R.prototype, "destroyed", { get: function() {
- return this._readableState !== void 0 && this._readableState.destroyed;
- }, set: function(D) {
- this._readableState && (this._readableState.destroyed = D);
- } }), R.prototype.destroy = Z.destroy, R.prototype._undestroy = Z.undestroy, R.prototype._destroy = function(D, F) {
- this.push(null), F(D);
- }, R.prototype.push = function(D, F) {
- var T, Q = this._readableState;
- return Q.objectMode ? T = !0 : typeof D == "string" && ((F = F || Q.defaultEncoding) !== Q.encoding && (D = o.from(D, F), F = ""), T = !0), X(this, D, F, !1, T);
- }, R.prototype.unshift = function(D) {
- return X(this, D, null, !0, !1);
- }, R.prototype.isPaused = function() {
- return this._readableState.flowing === !1;
- }, R.prototype.setEncoding = function(D) {
- return u || (u = g("string_decoder/").StringDecoder), this._readableState.decoder = new u(D), this._readableState.encoding = D, this;
- };
- function S(D, F) {
- return D <= 0 || F.length === 0 && F.ended ? 0 : F.objectMode ? 1 : D != D ? F.flowing && F.length ? F.buffer.head.data.length : F.length : (D > F.highWaterMark && (F.highWaterMark = function(T) {
- return T >= 8388608 ? T = 8388608 : (T--, T |= T >>> 1, T |= T >>> 2, T |= T >>> 4, T |= T >>> 8, T |= T >>> 16, T++), T;
- }(D)), D <= F.length ? D : F.ended ? F.length : (F.needReadable = !0, 0));
- }
- function z(D) {
- var F = D._readableState;
- F.needReadable = !1, F.emittedReadable || (b("emitReadable", F.flowing), F.emittedReadable = !0, F.sync ? s.nextTick(v, D) : v(D));
- }
- function v(D) {
- b("emit readable"), D.emit("readable"), G(D);
- }
- function K(D, F) {
- F.readingMore || (F.readingMore = !0, s.nextTick(V, D, F));
- }
- function V(D, F) {
- for (var T = F.length; !F.reading && !F.flowing && !F.ended && F.length < F.highWaterMark && (b("maybeReadMore read 0"), D.read(0), T !== F.length); ) T = F.length;
- F.readingMore = !1;
- }
- function N(D) {
- b("readable nexttick read 0"), D.read(0);
- }
- function B(D, F) {
- F.reading || (b("resume read 0"), D.read(0)), F.resumeScheduled = !1, F.awaitDrain = 0, D.emit("resume"), G(D), F.flowing && !F.reading && D.read(0);
- }
- function G(D) {
- var F = D._readableState;
- for (b("flow", F.flowing); F.flowing && D.read() !== null; ) ;
- }
- function w(D, F) {
- return F.length === 0 ? null : (F.objectMode ? T = F.buffer.shift() : !D || D >= F.length ? (T = F.decoder ? F.buffer.join("") : F.buffer.length === 1 ? F.buffer.head.data : F.buffer.concat(F.length), F.buffer.clear()) : T = function(Q, P, L) {
- var E;
- return Q < P.head.data.length ? (E = P.head.data.slice(0, Q), P.head.data = P.head.data.slice(Q)) : E = Q === P.head.data.length ? P.shift() : L ? function(J, k) {
- var j = k.head, q = 1, Cg = j.data;
- for (J -= Cg.length; j = j.next; ) {
- var Ig = j.data, x = J > Ig.length ? Ig.length : J;
- if (x === Ig.length ? Cg += Ig : Cg += Ig.slice(0, J), (J -= x) === 0) {
- x === Ig.length ? (++q, j.next ? k.head = j.next : k.head = k.tail = null) : (k.head = j, j.data = Ig.slice(x));
- break;
- }
- ++q;
- }
- return k.length -= q, Cg;
- }(Q, P) : function(J, k) {
- var j = o.allocUnsafe(J), q = k.head, Cg = 1;
- for (q.data.copy(j), J -= q.data.length; q = q.next; ) {
- var Ig = q.data, x = J > Ig.length ? Ig.length : J;
- if (Ig.copy(j, j.length - J, 0, x), (J -= x) === 0) {
- x === Ig.length ? (++Cg, q.next ? k.head = q.next : k.head = k.tail = null) : (k.head = q, q.data = Ig.slice(x));
- break;
- }
- ++Cg;
- }
- return k.length -= Cg, j;
- }(Q, P), E;
- }(D, F.buffer, F.decoder), T);
- var T;
- }
- function W(D) {
- var F = D._readableState;
- if (F.length > 0) throw new Error('"endReadable()" called on non-empty stream');
- F.endEmitted || (F.ended = !0, s.nextTick(y, F, D));
- }
- function y(D, F) {
- D.endEmitted || D.length !== 0 || (D.endEmitted = !0, F.readable = !1, F.emit("end"));
- }
- function f(D, F) {
- for (var T = 0, Q = D.length; T < Q; T++) if (D[T] === F) return T;
- return -1;
- }
- R.prototype.read = function(D) {
- b("read", D), D = parseInt(D, 10);
- var F = this._readableState, T = D;
- if (D !== 0 && (F.emittedReadable = !1), D === 0 && F.needReadable && (F.length >= F.highWaterMark || F.ended)) return b("read: emitReadable", F.length, F.ended), F.length === 0 && F.ended ? W(this) : z(this), null;
- if ((D = S(D, F)) === 0 && F.ended) return F.length === 0 && W(this), null;
- var Q, P = F.needReadable;
- return b("need readable", P), (F.length === 0 || F.length - D < F.highWaterMark) && b("length less than watermark", P = !0), F.ended || F.reading ? b("reading or ended", P = !1) : P && (b("do read"), F.reading = !0, F.sync = !0, F.length === 0 && (F.needReadable = !0), this._read(F.highWaterMark), F.sync = !1, F.reading || (D = S(T, F))), (Q = D > 0 ? w(D, F) : null) === null ? (F.needReadable = !0, D = 0) : F.length -= D, F.length === 0 && (F.ended || (F.needReadable = !0), T !== D && F.ended && W(this)), Q !== null && this.emit("data", Q), Q;
- }, R.prototype._read = function(D) {
- this.emit("error", new Error("_read() is not implemented"));
- }, R.prototype.pipe = function(D, F) {
- var T = this, Q = this._readableState;
- switch (Q.pipesCount) {
- case 0:
- Q.pipes = D;
- break;
- case 1:
- Q.pipes = [Q.pipes, D];
- break;
- default:
- Q.pipes.push(D);
- }
- Q.pipesCount += 1, b("pipe count=%d opts=%j", Q.pipesCount, F);
- var P = (!F || F.end !== !1) && D !== e.stdout && D !== e.stderr ? E : Ag;
- function L(eg, O) {
- b("onunpipe"), eg === T && O && O.hasUnpiped === !1 && (O.hasUnpiped = !0, b("cleanup"), D.removeListener("close", Ig), D.removeListener("finish", x), D.removeListener("drain", J), D.removeListener("error", Cg), D.removeListener("unpipe", L), T.removeListener("end", E), T.removeListener("end", Ag), T.removeListener("data", q), k = !0, !Q.awaitDrain || D._writableState && !D._writableState.needDrain || J());
- }
- function E() {
- b("onend"), D.end();
- }
- Q.endEmitted ? s.nextTick(P) : T.once("end", P), D.on("unpipe", L);
- var J = /* @__PURE__ */ function(eg) {
- return function() {
- var O = eg._readableState;
- b("pipeOnDrain", O.awaitDrain), O.awaitDrain && O.awaitDrain--, O.awaitDrain === 0 && a(eg, "data") && (O.flowing = !0, G(eg));
- };
- }(T);
- D.on("drain", J);
- var k = !1, j = !1;
- function q(eg) {
- b("ondata"), j = !1, D.write(eg) !== !1 || j || ((Q.pipesCount === 1 && Q.pipes === D || Q.pipesCount > 1 && f(Q.pipes, D) !== -1) && !k && (b("false write response, pause", Q.awaitDrain), Q.awaitDrain++, j = !0), T.pause());
- }
- function Cg(eg) {
- b("onerror", eg), Ag(), D.removeListener("error", Cg), a(D, "error") === 0 && D.emit("error", eg);
- }
- function Ig() {
- D.removeListener("finish", x), Ag();
- }
- function x() {
- b("onfinish"), D.removeListener("close", Ig), Ag();
- }
- function Ag() {
- b("unpipe"), T.unpipe(D);
- }
- return T.on("data", q), function(eg, O, _) {
- if (typeof eg.prependListener == "function") return eg.prependListener(O, _);
- eg._events && eg._events[O] ? n(eg._events[O]) ? eg._events[O].unshift(_) : eg._events[O] = [_, eg._events[O]] : eg.on(O, _);
- }(D, "error", Cg), D.once("close", Ig), D.once("finish", x), D.emit("pipe", T), Q.flowing || (b("pipe resume"), T.resume()), D;
- }, R.prototype.unpipe = function(D) {
- var F = this._readableState, T = { hasUnpiped: !1 };
- if (F.pipesCount === 0) return this;
- if (F.pipesCount === 1) return D && D !== F.pipes || (D || (D = F.pipes), F.pipes = null, F.pipesCount = 0, F.flowing = !1, D && D.emit("unpipe", this, T)), this;
- if (!D) {
- var Q = F.pipes, P = F.pipesCount;
- F.pipes = null, F.pipesCount = 0, F.flowing = !1;
- for (var L = 0; L < P; L++) Q[L].emit("unpipe", this, { hasUnpiped: !1 });
- return this;
- }
- var E = f(F.pipes, D);
- return E === -1 || (F.pipes.splice(E, 1), F.pipesCount -= 1, F.pipesCount === 1 && (F.pipes = F.pipes[0]), D.emit("unpipe", this, T)), this;
- }, R.prototype.on = function(D, F) {
- var T = d.prototype.on.call(this, D, F);
- if (D === "data") this._readableState.flowing !== !1 && this.resume();
- else if (D === "readable") {
- var Q = this._readableState;
- Q.endEmitted || Q.readableListening || (Q.readableListening = Q.needReadable = !0, Q.emittedReadable = !1, Q.reading ? Q.length && z(this) : s.nextTick(N, this));
- }
- return T;
- }, R.prototype.addListener = R.prototype.on, R.prototype.resume = function() {
- var D = this._readableState;
- return D.flowing || (b("resume"), D.flowing = !0, function(F, T) {
- T.resumeScheduled || (T.resumeScheduled = !0, s.nextTick(B, F, T));
- }(this, D)), this;
- }, R.prototype.pause = function() {
- return b("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (b("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
- }, R.prototype.wrap = function(D) {
- var F = this, T = this._readableState, Q = !1;
- for (var P in D.on("end", function() {
- if (b("wrapped end"), T.decoder && !T.ended) {
- var E = T.decoder.end();
- E && E.length && F.push(E);
- }
- F.push(null);
- }), D.on("data", function(E) {
- b("wrapped data"), T.decoder && (E = T.decoder.write(E)), T.objectMode && E == null || (T.objectMode || E && E.length) && (F.push(E) || (Q = !0, D.pause()));
- }), D) this[P] === void 0 && typeof D[P] == "function" && (this[P] = /* @__PURE__ */ function(E) {
- return function() {
- return D[E].apply(D, arguments);
- };
- }(P));
- for (var L = 0; L < p.length; L++) D.on(p[L], this.emit.bind(this, p[L]));
- return this._read = function(E) {
- b("wrapped _read", E), Q && (Q = !1, D.resume());
- }, this;
- }, Object.defineProperty(R.prototype, "readableHighWaterMark", { enumerable: !1, get: function() {
- return this._readableState.highWaterMark;
- } }), R._fromList = w;
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { "./_stream_duplex": 508, "./internal/streams/BufferList": 513, "./internal/streams/destroy": 514, "./internal/streams/stream": 515, _process: 467, "core-util-is": 383, events: 422, inherits: 440, isarray: 506, "process-nextick-args": 466, "safe-buffer": 520, "string_decoder/": 521, util: 188 }], 511: [function(g, C, i) {
- C.exports = l;
- var e = g("./_stream_duplex"), A = Object.create(g("core-util-is"));
- function s(d, o) {
- var c = this._transformState;
- c.transforming = !1;
- var r = c.writecb;
- if (!r) return this.emit("error", new Error("write callback called multiple times"));
- c.writechunk = null, c.writecb = null, o != null && this.push(o), r(d);
- var h = this._readableState;
- h.reading = !1, (h.needReadable || h.length < h.highWaterMark) && this._read(h.highWaterMark);
- }
- function l(d) {
- if (!(this instanceof l)) return new l(d);
- e.call(this, d), this._transformState = { afterTransform: s.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, d && (typeof d.transform == "function" && (this._transform = d.transform), typeof d.flush == "function" && (this._flush = d.flush)), this.on("prefinish", n);
- }
- function n() {
- var d = this;
- typeof this._flush == "function" ? this._flush(function(o, c) {
- a(d, o, c);
- }) : a(this, null, null);
- }
- function a(d, o, c) {
- if (o) return d.emit("error", o);
- if (c != null && d.push(c), d._writableState.length) throw new Error("Calling transform done when ws.length != 0");
- if (d._transformState.transforming) throw new Error("Calling transform done when still transforming");
- return d.push(null);
- }
- A.inherits = g("inherits"), A.inherits(l, e), l.prototype.push = function(d, o) {
- return this._transformState.needTransform = !1, e.prototype.push.call(this, d, o);
- }, l.prototype._transform = function(d, o, c) {
- throw new Error("_transform() is not implemented");
- }, l.prototype._write = function(d, o, c) {
- var r = this._transformState;
- if (r.writecb = c, r.writechunk = d, r.writeencoding = o, !r.transforming) {
- var h = this._readableState;
- (r.needTransform || h.needReadable || h.length < h.highWaterMark) && this._read(h.highWaterMark);
- }
- }, l.prototype._read = function(d) {
- var o = this._transformState;
- o.writechunk !== null && o.writecb && !o.transforming ? (o.transforming = !0, this._transform(o.writechunk, o.writeencoding, o.afterTransform)) : o.needTransform = !0;
- }, l.prototype._destroy = function(d, o) {
- var c = this;
- e.prototype._destroy.call(this, d, function(r) {
- o(r), c.emit("close");
- });
- };
- }, { "./_stream_duplex": 508, "core-util-is": 383, inherits: 440 }], 512: [function(g, C, i) {
- (function(e, A, s) {
- (function() {
- var l = g("process-nextick-args");
- function n(K) {
- var V = this;
- this.next = null, this.entry = null, this.finish = function() {
- (function(N, B, G) {
- var w = N.entry;
- for (N.entry = null; w; ) {
- var W = w.callback;
- B.pendingcb--, W(G), w = w.next;
- }
- B.corkedRequestsFree.next = N;
- })(V, K);
- };
- }
- C.exports = Y;
- var a, d = !e.browser && ["v0.10", "v0.9."].indexOf(e.version.slice(0, 5)) > -1 ? s : l.nextTick;
- Y.WritableState = p;
- var o = Object.create(g("core-util-is"));
- o.inherits = g("inherits");
- var c = { deprecate: g("util-deprecate") }, r = g("./internal/streams/stream"), h = g("safe-buffer").Buffer, b = (A !== void 0 ? A : typeof window < "u" ? window : typeof self < "u" ? self : {}).Uint8Array || function() {
- }, u, m = g("./internal/streams/destroy");
- function Z() {
- }
- function p(K, V) {
- a = a || g("./_stream_duplex"), K = K || {};
- var N = V instanceof a;
- this.objectMode = !!K.objectMode, N && (this.objectMode = this.objectMode || !!K.writableObjectMode);
- var B = K.highWaterMark, G = K.writableHighWaterMark, w = this.objectMode ? 16 : 16384;
- this.highWaterMark = B || B === 0 ? B : N && (G || G === 0) ? G : w, this.highWaterMark = Math.floor(this.highWaterMark), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;
- var W = K.decodeStrings === !1;
- this.decodeStrings = !W, this.defaultEncoding = K.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(y) {
- (function(f, D) {
- var F = f._writableState, T = F.sync, Q = F.writecb;
- if (function(L) {
- L.writing = !1, L.writecb = null, L.length -= L.writelen, L.writelen = 0;
- }(F), D) (function(L, E, J, k, j) {
- --E.pendingcb, J ? (l.nextTick(j, k), l.nextTick(v, L, E), L._writableState.errorEmitted = !0, L.emit("error", k)) : (j(k), L._writableState.errorEmitted = !0, L.emit("error", k), v(L, E));
- })(f, F, T, D, Q);
- else {
- var P = S(F);
- P || F.corked || F.bufferProcessing || !F.bufferedRequest || H(f, F), T ? d(X, f, F, P, Q) : X(f, F, P, Q);
- }
- })(V, y);
- }, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new n(this);
- }
- function Y(K) {
- if (a = a || g("./_stream_duplex"), !(u.call(Y, this) || this instanceof a)) return new Y(K);
- this._writableState = new p(K, this), this.writable = !0, K && (typeof K.write == "function" && (this._write = K.write), typeof K.writev == "function" && (this._writev = K.writev), typeof K.destroy == "function" && (this._destroy = K.destroy), typeof K.final == "function" && (this._final = K.final)), r.call(this);
- }
- function R(K, V, N, B, G, w, W) {
- V.writelen = B, V.writecb = W, V.writing = !0, V.sync = !0, N ? K._writev(G, V.onwrite) : K._write(G, w, V.onwrite), V.sync = !1;
- }
- function X(K, V, N, B) {
- N || function(G, w) {
- w.length === 0 && w.needDrain && (w.needDrain = !1, G.emit("drain"));
- }(K, V), V.pendingcb--, B(), v(K, V);
- }
- function H(K, V) {
- V.bufferProcessing = !0;
- var N = V.bufferedRequest;
- if (K._writev && N && N.next) {
- var B = V.bufferedRequestCount, G = new Array(B), w = V.corkedRequestsFree;
- w.entry = N;
- for (var W = 0, y = !0; N; ) G[W] = N, N.isBuf || (y = !1), N = N.next, W += 1;
- G.allBuffers = y, R(K, V, !0, V.length, G, "", w.finish), V.pendingcb++, V.lastBufferedRequest = null, w.next ? (V.corkedRequestsFree = w.next, w.next = null) : V.corkedRequestsFree = new n(V), V.bufferedRequestCount = 0;
- } else {
- for (; N; ) {
- var f = N.chunk, D = N.encoding, F = N.callback;
- if (R(K, V, !1, V.objectMode ? 1 : f.length, f, D, F), N = N.next, V.bufferedRequestCount--, V.writing) break;
- }
- N === null && (V.lastBufferedRequest = null);
- }
- V.bufferedRequest = N, V.bufferProcessing = !1;
- }
- function S(K) {
- return K.ending && K.length === 0 && K.bufferedRequest === null && !K.finished && !K.writing;
- }
- function z(K, V) {
- K._final(function(N) {
- V.pendingcb--, N && K.emit("error", N), V.prefinished = !0, K.emit("prefinish"), v(K, V);
- });
- }
- function v(K, V) {
- var N = S(V);
- return N && (function(B, G) {
- G.prefinished || G.finalCalled || (typeof B._final == "function" ? (G.pendingcb++, G.finalCalled = !0, l.nextTick(z, B, G)) : (G.prefinished = !0, B.emit("prefinish")));
- }(K, V), V.pendingcb === 0 && (V.finished = !0, K.emit("finish"))), N;
- }
- o.inherits(Y, r), p.prototype.getBuffer = function() {
- for (var K = this.bufferedRequest, V = []; K; ) V.push(K), K = K.next;
- return V;
- }, function() {
- try {
- Object.defineProperty(p.prototype, "buffer", { get: c.deprecate(function() {
- return this.getBuffer();
- }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });
- } catch {
- }
- }(), typeof Symbol == "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] == "function" ? (u = Function.prototype[Symbol.hasInstance], Object.defineProperty(Y, Symbol.hasInstance, { value: function(K) {
- return !!u.call(this, K) || this === Y && K && K._writableState instanceof p;
- } })) : u = function(K) {
- return K instanceof this;
- }, Y.prototype.pipe = function() {
- this.emit("error", new Error("Cannot pipe, not readable"));
- }, Y.prototype.write = function(K, V, N) {
- var B, G = this._writableState, w = !1, W = !G.objectMode && (B = K, h.isBuffer(B) || B instanceof b);
- return W && !h.isBuffer(K) && (K = function(y) {
- return h.from(y);
- }(K)), typeof V == "function" && (N = V, V = null), W ? V = "buffer" : V || (V = G.defaultEncoding), typeof N != "function" && (N = Z), G.ended ? function(y, f) {
- var D = new Error("write after end");
- y.emit("error", D), l.nextTick(f, D);
- }(this, N) : (W || function(y, f, D, F) {
- var T = !0, Q = !1;
- return D === null ? Q = new TypeError("May not write null values to stream") : typeof D == "string" || D === void 0 || f.objectMode || (Q = new TypeError("Invalid non-string/buffer chunk")), Q && (y.emit("error", Q), l.nextTick(F, Q), T = !1), T;
- }(this, G, K, N)) && (G.pendingcb++, w = function(y, f, D, F, T, Q) {
- if (!D) {
- var P = function(k, j, q) {
- return k.objectMode || k.decodeStrings === !1 || typeof j != "string" || (j = h.from(j, q)), j;
- }(f, F, T);
- F !== P && (D = !0, T = "buffer", F = P);
- }
- var L = f.objectMode ? 1 : F.length;
- f.length += L;
- var E = f.length < f.highWaterMark;
- if (E || (f.needDrain = !0), f.writing || f.corked) {
- var J = f.lastBufferedRequest;
- f.lastBufferedRequest = { chunk: F, encoding: T, isBuf: D, callback: Q, next: null }, J ? J.next = f.lastBufferedRequest : f.bufferedRequest = f.lastBufferedRequest, f.bufferedRequestCount += 1;
- } else R(y, f, !1, L, F, T, Q);
- return E;
- }(this, G, W, K, V, N)), w;
- }, Y.prototype.cork = function() {
- this._writableState.corked++;
- }, Y.prototype.uncork = function() {
- var K = this._writableState;
- K.corked && (K.corked--, K.writing || K.corked || K.bufferProcessing || !K.bufferedRequest || H(this, K));
- }, Y.prototype.setDefaultEncoding = function(K) {
- if (typeof K == "string" && (K = K.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((K + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + K);
- return this._writableState.defaultEncoding = K, this;
- }, Object.defineProperty(Y.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
- return this._writableState.highWaterMark;
- } }), Y.prototype._write = function(K, V, N) {
- N(new Error("_write() is not implemented"));
- }, Y.prototype._writev = null, Y.prototype.end = function(K, V, N) {
- var B = this._writableState;
- typeof K == "function" ? (N = K, K = null, V = null) : typeof V == "function" && (N = V, V = null), K != null && this.write(K, V), B.corked && (B.corked = 1, this.uncork()), B.ending || function(G, w, W) {
- w.ending = !0, v(G, w), W && (w.finished ? l.nextTick(W) : G.once("finish", W)), w.ended = !0, G.writable = !1;
- }(this, B, N);
- }, Object.defineProperty(Y.prototype, "destroyed", { get: function() {
- return this._writableState !== void 0 && this._writableState.destroyed;
- }, set: function(K) {
- this._writableState && (this._writableState.destroyed = K);
- } }), Y.prototype.destroy = m.destroy, Y.prototype._undestroy = m.undestroy, Y.prototype._destroy = function(K, V) {
- this.end(), V(K);
- };
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {}, g("timers").setImmediate);
- }, { "./_stream_duplex": 508, "./internal/streams/destroy": 514, "./internal/streams/stream": 515, _process: 467, "core-util-is": 383, inherits: 440, "process-nextick-args": 466, "safe-buffer": 520, timers: 523, "util-deprecate": 524 }], 513: [function(g, C, i) {
- var e = g("safe-buffer").Buffer, A = g("util");
- C.exports = function() {
- function s() {
- (function(l, n) {
- if (!(l instanceof n)) throw new TypeError("Cannot call a class as a function");
- })(this, s), this.head = null, this.tail = null, this.length = 0;
- }
- return s.prototype.push = function(l) {
- var n = { data: l, next: null };
- this.length > 0 ? this.tail.next = n : this.head = n, this.tail = n, ++this.length;
- }, s.prototype.unshift = function(l) {
- var n = { data: l, next: this.head };
- this.length === 0 && (this.tail = n), this.head = n, ++this.length;
- }, s.prototype.shift = function() {
- if (this.length !== 0) {
- var l = this.head.data;
- return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, l;
- }
- }, s.prototype.clear = function() {
- this.head = this.tail = null, this.length = 0;
- }, s.prototype.join = function(l) {
- if (this.length === 0) return "";
- for (var n = this.head, a = "" + n.data; n = n.next; ) a += l + n.data;
- return a;
- }, s.prototype.concat = function(l) {
- if (this.length === 0) return e.alloc(0);
- for (var n, a, d, o = e.allocUnsafe(l >>> 0), c = this.head, r = 0; c; ) n = c.data, a = o, d = r, n.copy(a, d), r += c.data.length, c = c.next;
- return o;
- }, s;
- }(), A && A.inspect && A.inspect.custom && (C.exports.prototype[A.inspect.custom] = function() {
- var s = A.inspect({ length: this.length });
- return this.constructor.name + " " + s;
- });
- }, { "safe-buffer": 520, util: 188 }], 514: [function(g, C, i) {
- var e = g("process-nextick-args");
- function A(s, l) {
- s.emit("error", l);
- }
- C.exports = { destroy: function(s, l) {
- var n = this, a = this._readableState && this._readableState.destroyed, d = this._writableState && this._writableState.destroyed;
- return a || d ? (l ? l(s) : s && (this._writableState ? this._writableState.errorEmitted || (this._writableState.errorEmitted = !0, e.nextTick(A, this, s)) : e.nextTick(A, this, s)), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(s || null, function(o) {
- !l && o ? n._writableState ? n._writableState.errorEmitted || (n._writableState.errorEmitted = !0, e.nextTick(A, n, o)) : e.nextTick(A, n, o) : l && l(o);
- }), this);
- }, undestroy: function() {
- this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finalCalled = !1, this._writableState.prefinished = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);
- } };
- }, { "process-nextick-args": 466 }], 515: [function(g, C, i) {
- arguments[4][490][0].apply(i, arguments);
- }, { dup: 490, events: 422 }], 516: [function(g, C, i) {
- C.exports = g("./readable").PassThrough;
- }, { "./readable": 517 }], 517: [function(g, C, i) {
- (i = C.exports = g("./lib/_stream_readable.js")).Stream = i, i.Readable = i, i.Writable = g("./lib/_stream_writable.js"), i.Duplex = g("./lib/_stream_duplex.js"), i.Transform = g("./lib/_stream_transform.js"), i.PassThrough = g("./lib/_stream_passthrough.js");
- }, { "./lib/_stream_duplex.js": 508, "./lib/_stream_passthrough.js": 509, "./lib/_stream_readable.js": 510, "./lib/_stream_transform.js": 511, "./lib/_stream_writable.js": 512 }], 518: [function(g, C, i) {
- C.exports = g("./readable").Transform;
- }, { "./readable": 517 }], 519: [function(g, C, i) {
- C.exports = g("./lib/_stream_writable.js");
- }, { "./lib/_stream_writable.js": 512 }], 520: [function(g, C, i) {
- arguments[4][217][0].apply(i, arguments);
- }, { buffer: 220, dup: 217 }], 521: [function(g, C, i) {
- arguments[4][218][0].apply(i, arguments);
- }, { dup: 218, "safe-buffer": 520 }], 522: [function(g, C, i) {
- arguments[4][218][0].apply(i, arguments);
- }, { dup: 218, "safe-buffer": 494 }], 523: [function(g, C, i) {
- (function(e, A) {
- (function() {
- var s = g("process/browser.js").nextTick, l = Function.prototype.apply, n = Array.prototype.slice, a = {}, d = 0;
- function o(c, r) {
- this._id = c, this._clearFn = r;
- }
- i.setTimeout = function() {
- return new o(l.call(setTimeout, window, arguments), clearTimeout);
- }, i.setInterval = function() {
- return new o(l.call(setInterval, window, arguments), clearInterval);
- }, i.clearTimeout = i.clearInterval = function(c) {
- c.close();
- }, o.prototype.unref = o.prototype.ref = function() {
- }, o.prototype.close = function() {
- this._clearFn.call(window, this._id);
- }, i.enroll = function(c, r) {
- clearTimeout(c._idleTimeoutId), c._idleTimeout = r;
- }, i.unenroll = function(c) {
- clearTimeout(c._idleTimeoutId), c._idleTimeout = -1;
- }, i._unrefActive = i.active = function(c) {
- clearTimeout(c._idleTimeoutId);
- var r = c._idleTimeout;
- r >= 0 && (c._idleTimeoutId = setTimeout(function() {
- c._onTimeout && c._onTimeout();
- }, r));
- }, i.setImmediate = typeof e == "function" ? e : function(c) {
- var r = d++, h = !(arguments.length < 2) && n.call(arguments, 1);
- return a[r] = !0, s(function() {
- a[r] && (h ? c.apply(null, h) : c.call(null), i.clearImmediate(r));
- }), r;
- }, i.clearImmediate = typeof A == "function" ? A : function(c) {
- delete a[c];
- };
- }).call(this);
- }).call(this, g("timers").setImmediate, g("timers").clearImmediate);
- }, { "process/browser.js": 467, timers: 523 }], 524: [function(g, C, i) {
- (function(e) {
- (function() {
- function A(s) {
- try {
- if (!e.localStorage) return !1;
- } catch {
- return !1;
- }
- var l = e.localStorage[s];
- return l != null && String(l).toLowerCase() === "true";
- }
- C.exports = function(s, l) {
- if (A("noDeprecation")) return s;
- var n = !1;
- return function() {
- if (!n) {
- if (A("throwDeprecation")) throw new Error(l);
- A("traceDeprecation") ? console.trace(l) : console.warn(l), n = !0;
- }
- return s.apply(this, arguments);
- };
- };
- }).call(this);
- }).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, {}], 525: [function(g, C, i) {
- typeof Object.create == "function" ? C.exports = function(e, A) {
- e.super_ = A, e.prototype = Object.create(A.prototype, { constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } });
- } : C.exports = function(e, A) {
- e.super_ = A;
- var s = function() {
- };
- s.prototype = A.prototype, e.prototype = new s(), e.prototype.constructor = e;
- };
- }, {}], 526: [function(g, C, i) {
- C.exports = function(e) {
- return e && typeof e == "object" && typeof e.copy == "function" && typeof e.fill == "function" && typeof e.readUInt8 == "function";
- };
- }, {}], 527: [function(g, C, i) {
- (function(e, A) {
- (function() {
- var s = /%[sdj%]/g;
- i.format = function(G) {
- if (!p(G)) {
- for (var w = [], W = 0; W < arguments.length; W++) w.push(a(arguments[W]));
- return w.join(" ");
- }
- W = 1;
- for (var y = arguments, f = y.length, D = String(G).replace(s, function(T) {
- if (T === "%%") return "%";
- if (W >= f) return T;
- switch (T) {
- case "%s":
- return String(y[W++]);
- case "%d":
- return Number(y[W++]);
- case "%j":
- try {
- return JSON.stringify(y[W++]);
- } catch {
- return "[Circular]";
- }
- default:
- return T;
- }
- }), F = y[W]; W < f; F = y[++W]) m(F) || !X(F) ? D += " " + F : D += " " + a(F);
- return D;
- }, i.deprecate = function(G, w) {
- if (Y(A.process)) return function() {
- return i.deprecate(G, w).apply(this, arguments);
- };
- if (e.noDeprecation === !0) return G;
- var W = !1;
- return function() {
- if (!W) {
- if (e.throwDeprecation) throw new Error(w);
- e.traceDeprecation ? console.trace(w) : console.error(w), W = !0;
- }
- return G.apply(this, arguments);
- };
- };
- var l, n = {};
- function a(G, w) {
- var W = { seen: [], stylize: o };
- return arguments.length >= 3 && (W.depth = arguments[2]), arguments.length >= 4 && (W.colors = arguments[3]), u(w) ? W.showHidden = w : w && i._extend(W, w), Y(W.showHidden) && (W.showHidden = !1), Y(W.depth) && (W.depth = 2), Y(W.colors) && (W.colors = !1), Y(W.customInspect) && (W.customInspect = !0), W.colors && (W.stylize = d), c(W, G, W.depth);
- }
- function d(G, w) {
- var W = a.styles[w];
- return W ? "\x1B[" + a.colors[W][0] + "m" + G + "\x1B[" + a.colors[W][1] + "m" : G;
- }
- function o(G, w) {
- return G;
- }
- function c(G, w, W) {
- if (G.customInspect && w && z(w.inspect) && w.inspect !== i.inspect && (!w.constructor || w.constructor.prototype !== w)) {
- var y = w.inspect(W, G);
- return p(y) || (y = c(G, y, W)), y;
- }
- var f = function(J, k) {
- if (Y(k)) return J.stylize("undefined", "undefined");
- if (p(k)) {
- var j = "'" + JSON.stringify(k).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'";
- return J.stylize(j, "string");
- }
- if (Z(k)) return J.stylize("" + k, "number");
- if (u(k)) return J.stylize("" + k, "boolean");
- if (m(k)) return J.stylize("null", "null");
- }(G, w);
- if (f) return f;
- var D = Object.keys(w), F = function(J) {
- var k = {};
- return J.forEach(function(j, q) {
- k[j] = !0;
- }), k;
- }(D);
- if (G.showHidden && (D = Object.getOwnPropertyNames(w)), S(w) && (D.indexOf("message") >= 0 || D.indexOf("description") >= 0)) return r(w);
- if (D.length === 0) {
- if (z(w)) {
- var T = w.name ? ": " + w.name : "";
- return G.stylize("[Function" + T + "]", "special");
- }
- if (R(w)) return G.stylize(RegExp.prototype.toString.call(w), "regexp");
- if (H(w)) return G.stylize(Date.prototype.toString.call(w), "date");
- if (S(w)) return r(w);
- }
- var Q, P = "", L = !1, E = ["{", "}"];
- return b(w) && (L = !0, E = ["[", "]"]), z(w) && (P = " [Function" + (w.name ? ": " + w.name : "") + "]"), R(w) && (P = " " + RegExp.prototype.toString.call(w)), H(w) && (P = " " + Date.prototype.toUTCString.call(w)), S(w) && (P = " " + r(w)), D.length !== 0 || L && w.length != 0 ? W < 0 ? R(w) ? G.stylize(RegExp.prototype.toString.call(w), "regexp") : G.stylize("[Object]", "special") : (G.seen.push(w), Q = L ? function(J, k, j, q, Cg) {
- for (var Ig = [], x = 0, Ag = k.length; x < Ag; ++x) B(k, String(x)) ? Ig.push(h(J, k, j, q, String(x), !0)) : Ig.push("");
- return Cg.forEach(function(eg) {
- eg.match(/^\d+$/) || Ig.push(h(J, k, j, q, eg, !0));
- }), Ig;
- }(G, w, W, F, D) : D.map(function(J) {
- return h(G, w, W, F, J, L);
- }), G.seen.pop(), function(J, k, j) {
- return J.reduce(function(q, Cg) {
- return Cg.indexOf(`
- `) >= 0, q + Cg.replace(/\u001b\[\d\d?m/g, "").length + 1;
- }, 0) > 60 ? j[0] + (k === "" ? "" : k + `
- `) + " " + J.join(`,
- `) + " " + j[1] : j[0] + k + " " + J.join(", ") + " " + j[1];
- }(Q, P, E)) : E[0] + P + E[1];
- }
- function r(G) {
- return "[" + Error.prototype.toString.call(G) + "]";
- }
- function h(G, w, W, y, f, D) {
- var F, T, Q;
- if ((Q = Object.getOwnPropertyDescriptor(w, f) || { value: w[f] }).get ? T = Q.set ? G.stylize("[Getter/Setter]", "special") : G.stylize("[Getter]", "special") : Q.set && (T = G.stylize("[Setter]", "special")), B(y, f) || (F = "[" + f + "]"), T || (G.seen.indexOf(Q.value) < 0 ? (T = m(W) ? c(G, Q.value, null) : c(G, Q.value, W - 1)).indexOf(`
- `) > -1 && (T = D ? T.split(`
- `).map(function(P) {
- return " " + P;
- }).join(`
- `).substr(2) : `
- ` + T.split(`
- `).map(function(P) {
- return " " + P;
- }).join(`
- `)) : T = G.stylize("[Circular]", "special")), Y(F)) {
- if (D && f.match(/^\d+$/)) return T;
- (F = JSON.stringify("" + f)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? (F = F.substr(1, F.length - 2), F = G.stylize(F, "name")) : (F = F.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"), F = G.stylize(F, "string"));
- }
- return F + ": " + T;
- }
- function b(G) {
- return Array.isArray(G);
- }
- function u(G) {
- return typeof G == "boolean";
- }
- function m(G) {
- return G === null;
- }
- function Z(G) {
- return typeof G == "number";
- }
- function p(G) {
- return typeof G == "string";
- }
- function Y(G) {
- return G === void 0;
- }
- function R(G) {
- return X(G) && v(G) === "[object RegExp]";
- }
- function X(G) {
- return typeof G == "object" && G !== null;
- }
- function H(G) {
- return X(G) && v(G) === "[object Date]";
- }
- function S(G) {
- return X(G) && (v(G) === "[object Error]" || G instanceof Error);
- }
- function z(G) {
- return typeof G == "function";
- }
- function v(G) {
- return Object.prototype.toString.call(G);
- }
- function K(G) {
- return G < 10 ? "0" + G.toString(10) : G.toString(10);
- }
- i.debuglog = function(G) {
- if (Y(l) && (l = e.env.NODE_DEBUG || ""), G = G.toUpperCase(), !n[G]) if (new RegExp("\\b" + G + "\\b", "i").test(l)) {
- var w = e.pid;
- n[G] = function() {
- var W = i.format.apply(i, arguments);
- console.error("%s %d: %s", G, w, W);
- };
- } else n[G] = function() {
- };
- return n[G];
- }, i.inspect = a, a.colors = { bold: [1, 22], italic: [3, 23], underline: [4, 24], inverse: [7, 27], white: [37, 39], grey: [90, 39], black: [30, 39], blue: [34, 39], cyan: [36, 39], green: [32, 39], magenta: [35, 39], red: [31, 39], yellow: [33, 39] }, a.styles = { special: "cyan", number: "yellow", boolean: "yellow", undefined: "grey", null: "bold", string: "green", date: "magenta", regexp: "red" }, i.isArray = b, i.isBoolean = u, i.isNull = m, i.isNullOrUndefined = function(G) {
- return G == null;
- }, i.isNumber = Z, i.isString = p, i.isSymbol = function(G) {
- return typeof G == "symbol";
- }, i.isUndefined = Y, i.isRegExp = R, i.isObject = X, i.isDate = H, i.isError = S, i.isFunction = z, i.isPrimitive = function(G) {
- return G === null || typeof G == "boolean" || typeof G == "number" || typeof G == "string" || typeof G == "symbol" || G === void 0;
- }, i.isBuffer = g("./support/isBuffer");
- var V = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
- function N() {
- var G = /* @__PURE__ */ new Date(), w = [K(G.getHours()), K(G.getMinutes()), K(G.getSeconds())].join(":");
- return [G.getDate(), V[G.getMonth()], w].join(" ");
- }
- function B(G, w) {
- return Object.prototype.hasOwnProperty.call(G, w);
- }
- i.log = function() {
- console.log("%s - %s", N(), i.format.apply(i, arguments));
- }, i.inherits = g("inherits"), i._extend = function(G, w) {
- if (!w || !X(w)) return G;
- for (var W = Object.keys(w), y = W.length; y--; ) G[W[y]] = w[W[y]];
- return G;
- };
- }).call(this);
- }).call(this, g("_process"), typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
- }, { "./support/isBuffer": 526, _process: 467, inherits: 525 }], 528: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), Object.defineProperty(i, "v1", { enumerable: !0, get: function() {
- return e.default;
- } }), Object.defineProperty(i, "v3", { enumerable: !0, get: function() {
- return A.default;
- } }), Object.defineProperty(i, "v4", { enumerable: !0, get: function() {
- return s.default;
- } }), Object.defineProperty(i, "v5", { enumerable: !0, get: function() {
- return l.default;
- } }), Object.defineProperty(i, "NIL", { enumerable: !0, get: function() {
- return n.default;
- } }), Object.defineProperty(i, "version", { enumerable: !0, get: function() {
- return a.default;
- } }), Object.defineProperty(i, "validate", { enumerable: !0, get: function() {
- return d.default;
- } }), Object.defineProperty(i, "stringify", { enumerable: !0, get: function() {
- return o.default;
- } }), Object.defineProperty(i, "parse", { enumerable: !0, get: function() {
- return c.default;
- } });
- var e = r(g("./v1.js")), A = r(g("./v3.js")), s = r(g("./v4.js")), l = r(g("./v5.js")), n = r(g("./nil.js")), a = r(g("./version.js")), d = r(g("./validate.js")), o = r(g("./stringify.js")), c = r(g("./parse.js"));
- function r(h) {
- return h && h.__esModule ? h : { default: h };
- }
- }, { "./nil.js": 530, "./parse.js": 531, "./stringify.js": 535, "./v1.js": 536, "./v3.js": 537, "./v4.js": 539, "./v5.js": 540, "./validate.js": 541, "./version.js": 542 }], 529: [function(g, C, i) {
- function e(c) {
- return 14 + (c + 64 >>> 9 << 4) + 1;
- }
- function A(c, r) {
- const h = (65535 & c) + (65535 & r);
- return (c >> 16) + (r >> 16) + (h >> 16) << 16 | 65535 & h;
- }
- function s(c, r, h, b, u, m) {
- return A((Z = A(A(r, c), A(b, m))) << (p = u) | Z >>> 32 - p, h);
- var Z, p;
- }
- function l(c, r, h, b, u, m, Z) {
- return s(r & h | ~r & b, c, r, u, m, Z);
- }
- function n(c, r, h, b, u, m, Z) {
- return s(r & b | h & ~b, c, r, u, m, Z);
- }
- function a(c, r, h, b, u, m, Z) {
- return s(r ^ h ^ b, c, r, u, m, Z);
- }
- function d(c, r, h, b, u, m, Z) {
- return s(h ^ (r | ~b), c, r, u, m, Z);
- }
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var o = function(c) {
- if (typeof c == "string") {
- const r = unescape(encodeURIComponent(c));
- c = new Uint8Array(r.length);
- for (let h = 0; h < r.length; ++h) c[h] = r.charCodeAt(h);
- }
- return function(r) {
- const h = [], b = 32 * r.length;
- for (let u = 0; u < b; u += 8) {
- const m = r[u >> 5] >>> u % 32 & 255, Z = parseInt("0123456789abcdef".charAt(m >>> 4 & 15) + "0123456789abcdef".charAt(15 & m), 16);
- h.push(Z);
- }
- return h;
- }(function(r, h) {
- r[h >> 5] |= 128 << h % 32, r[e(h) - 1] = h;
- let b = 1732584193, u = -271733879, m = -1732584194, Z = 271733878;
- for (let p = 0; p < r.length; p += 16) {
- const Y = b, R = u, X = m, H = Z;
- b = l(b, u, m, Z, r[p], 7, -680876936), Z = l(Z, b, u, m, r[p + 1], 12, -389564586), m = l(m, Z, b, u, r[p + 2], 17, 606105819), u = l(u, m, Z, b, r[p + 3], 22, -1044525330), b = l(b, u, m, Z, r[p + 4], 7, -176418897), Z = l(Z, b, u, m, r[p + 5], 12, 1200080426), m = l(m, Z, b, u, r[p + 6], 17, -1473231341), u = l(u, m, Z, b, r[p + 7], 22, -45705983), b = l(b, u, m, Z, r[p + 8], 7, 1770035416), Z = l(Z, b, u, m, r[p + 9], 12, -1958414417), m = l(m, Z, b, u, r[p + 10], 17, -42063), u = l(u, m, Z, b, r[p + 11], 22, -1990404162), b = l(b, u, m, Z, r[p + 12], 7, 1804603682), Z = l(Z, b, u, m, r[p + 13], 12, -40341101), m = l(m, Z, b, u, r[p + 14], 17, -1502002290), u = l(u, m, Z, b, r[p + 15], 22, 1236535329), b = n(b, u, m, Z, r[p + 1], 5, -165796510), Z = n(Z, b, u, m, r[p + 6], 9, -1069501632), m = n(m, Z, b, u, r[p + 11], 14, 643717713), u = n(u, m, Z, b, r[p], 20, -373897302), b = n(b, u, m, Z, r[p + 5], 5, -701558691), Z = n(Z, b, u, m, r[p + 10], 9, 38016083), m = n(m, Z, b, u, r[p + 15], 14, -660478335), u = n(u, m, Z, b, r[p + 4], 20, -405537848), b = n(b, u, m, Z, r[p + 9], 5, 568446438), Z = n(Z, b, u, m, r[p + 14], 9, -1019803690), m = n(m, Z, b, u, r[p + 3], 14, -187363961), u = n(u, m, Z, b, r[p + 8], 20, 1163531501), b = n(b, u, m, Z, r[p + 13], 5, -1444681467), Z = n(Z, b, u, m, r[p + 2], 9, -51403784), m = n(m, Z, b, u, r[p + 7], 14, 1735328473), u = n(u, m, Z, b, r[p + 12], 20, -1926607734), b = a(b, u, m, Z, r[p + 5], 4, -378558), Z = a(Z, b, u, m, r[p + 8], 11, -2022574463), m = a(m, Z, b, u, r[p + 11], 16, 1839030562), u = a(u, m, Z, b, r[p + 14], 23, -35309556), b = a(b, u, m, Z, r[p + 1], 4, -1530992060), Z = a(Z, b, u, m, r[p + 4], 11, 1272893353), m = a(m, Z, b, u, r[p + 7], 16, -155497632), u = a(u, m, Z, b, r[p + 10], 23, -1094730640), b = a(b, u, m, Z, r[p + 13], 4, 681279174), Z = a(Z, b, u, m, r[p], 11, -358537222), m = a(m, Z, b, u, r[p + 3], 16, -722521979), u = a(u, m, Z, b, r[p + 6], 23, 76029189), b = a(b, u, m, Z, r[p + 9], 4, -640364487), Z = a(Z, b, u, m, r[p + 12], 11, -421815835), m = a(m, Z, b, u, r[p + 15], 16, 530742520), u = a(u, m, Z, b, r[p + 2], 23, -995338651), b = d(b, u, m, Z, r[p], 6, -198630844), Z = d(Z, b, u, m, r[p + 7], 10, 1126891415), m = d(m, Z, b, u, r[p + 14], 15, -1416354905), u = d(u, m, Z, b, r[p + 5], 21, -57434055), b = d(b, u, m, Z, r[p + 12], 6, 1700485571), Z = d(Z, b, u, m, r[p + 3], 10, -1894986606), m = d(m, Z, b, u, r[p + 10], 15, -1051523), u = d(u, m, Z, b, r[p + 1], 21, -2054922799), b = d(b, u, m, Z, r[p + 8], 6, 1873313359), Z = d(Z, b, u, m, r[p + 15], 10, -30611744), m = d(m, Z, b, u, r[p + 6], 15, -1560198380), u = d(u, m, Z, b, r[p + 13], 21, 1309151649), b = d(b, u, m, Z, r[p + 4], 6, -145523070), Z = d(Z, b, u, m, r[p + 11], 10, -1120210379), m = d(m, Z, b, u, r[p + 2], 15, 718787259), u = d(u, m, Z, b, r[p + 9], 21, -343485551), b = A(b, Y), u = A(u, R), m = A(m, X), Z = A(Z, H);
- }
- return [b, u, m, Z];
- }(function(r) {
- if (r.length === 0) return [];
- const h = 8 * r.length, b = new Uint32Array(e(h));
- for (let u = 0; u < h; u += 8) b[u >> 5] |= (255 & r[u / 8]) << u % 32;
- return b;
- }(c), 8 * c.length));
- };
- i.default = o;
- }, {}], 530: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0, i.default = "00000000-0000-0000-0000-000000000000";
- }, {}], 531: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e, A = (e = g("./validate.js")) && e.__esModule ? e : { default: e }, s = function(l) {
- if (!(0, A.default)(l)) throw TypeError("Invalid UUID");
- let n;
- const a = new Uint8Array(16);
- return a[0] = (n = parseInt(l.slice(0, 8), 16)) >>> 24, a[1] = n >>> 16 & 255, a[2] = n >>> 8 & 255, a[3] = 255 & n, a[4] = (n = parseInt(l.slice(9, 13), 16)) >>> 8, a[5] = 255 & n, a[6] = (n = parseInt(l.slice(14, 18), 16)) >>> 8, a[7] = 255 & n, a[8] = (n = parseInt(l.slice(19, 23), 16)) >>> 8, a[9] = 255 & n, a[10] = (n = parseInt(l.slice(24, 36), 16)) / 1099511627776 & 255, a[11] = n / 4294967296 & 255, a[12] = n >>> 24 & 255, a[13] = n >>> 16 & 255, a[14] = n >>> 8 & 255, a[15] = 255 & n, a;
- };
- i.default = s;
- }, { "./validate.js": 541 }], 532: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0, i.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
- }, {}], 533: [function(g, C, i) {
- let e;
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = function() {
- if (!e && (e = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto < "u" && typeof msCrypto.getRandomValues == "function" && msCrypto.getRandomValues.bind(msCrypto), !e)) throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
- return e(A);
- };
- const A = new Uint8Array(16);
- }, {}], 534: [function(g, C, i) {
- function e(l, n, a, d) {
- switch (l) {
- case 0:
- return n & a ^ ~n & d;
- case 1:
- return n ^ a ^ d;
- case 2:
- return n & a ^ n & d ^ a & d;
- case 3:
- return n ^ a ^ d;
- }
- }
- function A(l, n) {
- return l << n | l >>> 32 - n;
- }
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var s = function(l) {
- const n = [1518500249, 1859775393, 2400959708, 3395469782], a = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
- if (typeof l == "string") {
- const r = unescape(encodeURIComponent(l));
- l = [];
- for (let h = 0; h < r.length; ++h) l.push(r.charCodeAt(h));
- } else Array.isArray(l) || (l = Array.prototype.slice.call(l));
- l.push(128);
- const d = l.length / 4 + 2, o = Math.ceil(d / 16), c = new Array(o);
- for (let r = 0; r < o; ++r) {
- const h = new Uint32Array(16);
- for (let b = 0; b < 16; ++b) h[b] = l[64 * r + 4 * b] << 24 | l[64 * r + 4 * b + 1] << 16 | l[64 * r + 4 * b + 2] << 8 | l[64 * r + 4 * b + 3];
- c[r] = h;
- }
- c[o - 1][14] = 8 * (l.length - 1) / Math.pow(2, 32), c[o - 1][14] = Math.floor(c[o - 1][14]), c[o - 1][15] = 8 * (l.length - 1) & 4294967295;
- for (let r = 0; r < o; ++r) {
- const h = new Uint32Array(80);
- for (let Y = 0; Y < 16; ++Y) h[Y] = c[r][Y];
- for (let Y = 16; Y < 80; ++Y) h[Y] = A(h[Y - 3] ^ h[Y - 8] ^ h[Y - 14] ^ h[Y - 16], 1);
- let b = a[0], u = a[1], m = a[2], Z = a[3], p = a[4];
- for (let Y = 0; Y < 80; ++Y) {
- const R = Math.floor(Y / 20), X = A(b, 5) + e(R, u, m, Z) + p + n[R] + h[Y] >>> 0;
- p = Z, Z = m, m = A(u, 30) >>> 0, u = b, b = X;
- }
- a[0] = a[0] + b >>> 0, a[1] = a[1] + u >>> 0, a[2] = a[2] + m >>> 0, a[3] = a[3] + Z >>> 0, a[4] = a[4] + p >>> 0;
- }
- return [a[0] >> 24 & 255, a[0] >> 16 & 255, a[0] >> 8 & 255, 255 & a[0], a[1] >> 24 & 255, a[1] >> 16 & 255, a[1] >> 8 & 255, 255 & a[1], a[2] >> 24 & 255, a[2] >> 16 & 255, a[2] >> 8 & 255, 255 & a[2], a[3] >> 24 & 255, a[3] >> 16 & 255, a[3] >> 8 & 255, 255 & a[3], a[4] >> 24 & 255, a[4] >> 16 & 255, a[4] >> 8 & 255, 255 & a[4]];
- };
- i.default = s;
- }, {}], 535: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e, A = (e = g("./validate.js")) && e.__esModule ? e : { default: e };
- const s = [];
- for (let n = 0; n < 256; ++n) s.push((n + 256).toString(16).substr(1));
- var l = function(n) {
- let a = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0;
- const d = (s[n[a + 0]] + s[n[a + 1]] + s[n[a + 2]] + s[n[a + 3]] + "-" + s[n[a + 4]] + s[n[a + 5]] + "-" + s[n[a + 6]] + s[n[a + 7]] + "-" + s[n[a + 8]] + s[n[a + 9]] + "-" + s[n[a + 10]] + s[n[a + 11]] + s[n[a + 12]] + s[n[a + 13]] + s[n[a + 14]] + s[n[a + 15]]).toLowerCase();
- if (!(0, A.default)(d)) throw TypeError("Stringified UUID is invalid");
- return d;
- };
- i.default = l;
- }, { "./validate.js": 541 }], 536: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e = s(g("./rng.js")), A = s(g("./stringify.js"));
- function s(c) {
- return c && c.__esModule ? c : { default: c };
- }
- let l, n, a = 0, d = 0;
- var o = function(c, r, h) {
- let b = r && h || 0;
- const u = r || new Array(16);
- let m = (c = c || {}).node || l, Z = c.clockseq !== void 0 ? c.clockseq : n;
- if (m == null || Z == null) {
- const S = c.random || (c.rng || e.default)();
- m == null && (m = l = [1 | S[0], S[1], S[2], S[3], S[4], S[5]]), Z == null && (Z = n = 16383 & (S[6] << 8 | S[7]));
- }
- let p = c.msecs !== void 0 ? c.msecs : Date.now(), Y = c.nsecs !== void 0 ? c.nsecs : d + 1;
- const R = p - a + (Y - d) / 1e4;
- if (R < 0 && c.clockseq === void 0 && (Z = Z + 1 & 16383), (R < 0 || p > a) && c.nsecs === void 0 && (Y = 0), Y >= 1e4) throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
- a = p, d = Y, n = Z, p += 122192928e5;
- const X = (1e4 * (268435455 & p) + Y) % 4294967296;
- u[b++] = X >>> 24 & 255, u[b++] = X >>> 16 & 255, u[b++] = X >>> 8 & 255, u[b++] = 255 & X;
- const H = p / 4294967296 * 1e4 & 268435455;
- u[b++] = H >>> 8 & 255, u[b++] = 255 & H, u[b++] = H >>> 24 & 15 | 16, u[b++] = H >>> 16 & 255, u[b++] = Z >>> 8 | 128, u[b++] = 255 & Z;
- for (let S = 0; S < 6; ++S) u[b + S] = m[S];
- return r || (0, A.default)(u);
- };
- i.default = o;
- }, { "./rng.js": 533, "./stringify.js": 535 }], 537: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e = s(g("./v35.js")), A = s(g("./md5.js"));
- function s(n) {
- return n && n.__esModule ? n : { default: n };
- }
- var l = (0, e.default)("v3", 48, A.default);
- i.default = l;
- }, { "./md5.js": 529, "./v35.js": 538 }], 538: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = function(a, d, o) {
- function c(r, h, b, u) {
- if (typeof r == "string" && (r = function(Z) {
- Z = unescape(encodeURIComponent(Z));
- const p = [];
- for (let Y = 0; Y < Z.length; ++Y) p.push(Z.charCodeAt(Y));
- return p;
- }(r)), typeof h == "string" && (h = (0, A.default)(h)), h.length !== 16) throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");
- let m = new Uint8Array(16 + r.length);
- if (m.set(h), m.set(r, h.length), m = o(m), m[6] = 15 & m[6] | d, m[8] = 63 & m[8] | 128, b) {
- u = u || 0;
- for (let Z = 0; Z < 16; ++Z) b[u + Z] = m[Z];
- return b;
- }
- return (0, e.default)(m);
- }
- try {
- c.name = a;
- } catch {
- }
- return c.DNS = l, c.URL = n, c;
- }, i.URL = i.DNS = void 0;
- var e = s(g("./stringify.js")), A = s(g("./parse.js"));
- function s(a) {
- return a && a.__esModule ? a : { default: a };
- }
- const l = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
- i.DNS = l;
- const n = "6ba7b811-9dad-11d1-80b4-00c04fd430c8";
- i.URL = n;
- }, { "./parse.js": 531, "./stringify.js": 535 }], 539: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e = s(g("./rng.js")), A = s(g("./stringify.js"));
- function s(n) {
- return n && n.__esModule ? n : { default: n };
- }
- var l = function(n, a, d) {
- const o = (n = n || {}).random || (n.rng || e.default)();
- if (o[6] = 15 & o[6] | 64, o[8] = 63 & o[8] | 128, a) {
- d = d || 0;
- for (let c = 0; c < 16; ++c) a[d + c] = o[c];
- return a;
- }
- return (0, A.default)(o);
- };
- i.default = l;
- }, { "./rng.js": 533, "./stringify.js": 535 }], 540: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e = s(g("./v35.js")), A = s(g("./sha1.js"));
- function s(n) {
- return n && n.__esModule ? n : { default: n };
- }
- var l = (0, e.default)("v5", 80, A.default);
- i.default = l;
- }, { "./sha1.js": 534, "./v35.js": 538 }], 541: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e, A = (e = g("./regex.js")) && e.__esModule ? e : { default: e }, s = function(l) {
- return typeof l == "string" && A.default.test(l);
- };
- i.default = s;
- }, { "./regex.js": 532 }], 542: [function(g, C, i) {
- Object.defineProperty(i, "__esModule", { value: !0 }), i.default = void 0;
- var e, A = (e = g("./validate.js")) && e.__esModule ? e : { default: e }, s = function(l) {
- if (!(0, A.default)(l)) throw TypeError("Invalid UUID");
- return parseInt(l.substr(14, 1), 16);
- };
- i.default = s;
- }, { "./validate.js": 541 }], 543: [function(g, C, i) {
- /**
- * Character classes and associated utilities for the 5th edition of XML 1.0.
- *
- * @author Louis-Dominique Dubeau
- * @license MIT
- * @copyright Louis-Dominique Dubeau
- */
- Object.defineProperty(i, "__esModule", { value: !0 }), i.CHAR = `
- \r --�𐀀-`, i.S = ` \r
- `, i.NAME_START_CHAR = ":A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-⁰-Ⰰ-、-豈-﷏ﷰ-�𐀀-", i.NAME_CHAR = "-" + i.NAME_START_CHAR + ".0-9·̀-ͯ‿-⁀", i.CHAR_RE = new RegExp("^[" + i.CHAR + "]$", "u"), i.S_RE = new RegExp("^[" + i.S + "]+$", "u"), i.NAME_START_CHAR_RE = new RegExp("^[" + i.NAME_START_CHAR + "]$", "u"), i.NAME_CHAR_RE = new RegExp("^[" + i.NAME_CHAR + "]$", "u"), i.NAME_RE = new RegExp("^[" + i.NAME_START_CHAR + "][" + i.NAME_CHAR + "]*$", "u"), i.NMTOKEN_RE = new RegExp("^[" + i.NAME_CHAR + "]+$", "u");
- function e(A) {
- return A >= 65 && A <= 90 || A >= 97 && A <= 122 || A === 58 || A === 95 || A === 8204 || A === 8205 || A >= 192 && A <= 214 || A >= 216 && A <= 246 || A >= 248 && A <= 767 || A >= 880 && A <= 893 || A >= 895 && A <= 8191 || A >= 8304 && A <= 8591 || A >= 11264 && A <= 12271 || A >= 12289 && A <= 55295 || A >= 63744 && A <= 64975 || A >= 65008 && A <= 65533 || A >= 65536 && A <= 983039;
- }
- i.S_LIST = [32, 10, 13, 9], i.isChar = function(A) {
- return A >= 32 && A <= 55295 || A === 10 || A === 13 || A === 9 || A >= 57344 && A <= 65533 || A >= 65536 && A <= 1114111;
- }, i.isS = function(A) {
- return A === 32 || A === 10 || A === 13 || A === 9;
- }, i.isNameStartChar = e, i.isNameChar = function(A) {
- return e(A) || A >= 48 && A <= 57 || A === 45 || A === 46 || A === 183 || A >= 768 && A <= 879 || A >= 8255 && A <= 8256;
- };
- }, {}], 544: [function(g, C, i) {
- /**
- * Character classes and associated utilities for the 2nd edition of XML 1.1.
- *
- * @author Louis-Dominique Dubeau
- * @license MIT
- * @copyright Louis-Dominique Dubeau
- */
- Object.defineProperty(i, "__esModule", { value: !0 }), i.CHAR = "--�𐀀-", i.RESTRICTED_CHAR = "-\b\v\f---", i.S = ` \r
- `, i.NAME_START_CHAR = ":A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-⁰-Ⰰ-、-豈-﷏ﷰ-�𐀀-", i.NAME_CHAR = "-" + i.NAME_START_CHAR + ".0-9·̀-ͯ‿-⁀", i.CHAR_RE = new RegExp("^[" + i.CHAR + "]$", "u"), i.RESTRICTED_CHAR_RE = new RegExp("^[" + i.RESTRICTED_CHAR + "]$", "u"), i.S_RE = new RegExp("^[" + i.S + "]+$", "u"), i.NAME_START_CHAR_RE = new RegExp("^[" + i.NAME_START_CHAR + "]$", "u"), i.NAME_CHAR_RE = new RegExp("^[" + i.NAME_CHAR + "]$", "u"), i.NAME_RE = new RegExp("^[" + i.NAME_START_CHAR + "][" + i.NAME_CHAR + "]*$", "u"), i.NMTOKEN_RE = new RegExp("^[" + i.NAME_CHAR + "]+$", "u");
- function e(A) {
- return A >= 65 && A <= 90 || A >= 97 && A <= 122 || A === 58 || A === 95 || A === 8204 || A === 8205 || A >= 192 && A <= 214 || A >= 216 && A <= 246 || A >= 248 && A <= 767 || A >= 880 && A <= 893 || A >= 895 && A <= 8191 || A >= 8304 && A <= 8591 || A >= 11264 && A <= 12271 || A >= 12289 && A <= 55295 || A >= 63744 && A <= 64975 || A >= 65008 && A <= 65533 || A >= 65536 && A <= 983039;
- }
- i.S_LIST = [32, 10, 13, 9], i.isChar = function(A) {
- return A >= 1 && A <= 55295 || A >= 57344 && A <= 65533 || A >= 65536 && A <= 1114111;
- }, i.isRestrictedChar = function(A) {
- return A >= 1 && A <= 8 || A === 11 || A === 12 || A >= 14 && A <= 31 || A >= 127 && A <= 132 || A >= 134 && A <= 159;
- }, i.isCharAndNotRestricted = function(A) {
- return A === 9 || A === 10 || A === 13 || A > 31 && A < 127 || A === 133 || A > 159 && A <= 55295 || A >= 57344 && A <= 65533 || A >= 65536 && A <= 1114111;
- }, i.isS = function(A) {
- return A === 32 || A === 10 || A === 13 || A === 9;
- }, i.isNameStartChar = e, i.isNameChar = function(A) {
- return e(A) || A >= 48 && A <= 57 || A === 45 || A === 46 || A === 183 || A >= 768 && A <= 879 || A >= 8255 && A <= 8256;
- };
- }, {}], 545: [function(g, C, i) {
- /**
- * Character class utilities for XML NS 1.0 edition 3.
- *
- * @author Louis-Dominique Dubeau
- * @license MIT
- * @copyright Louis-Dominique Dubeau
- */
- function e(A) {
- return A >= 65 && A <= 90 || A === 95 || A >= 97 && A <= 122 || A >= 192 && A <= 214 || A >= 216 && A <= 246 || A >= 248 && A <= 767 || A >= 880 && A <= 893 || A >= 895 && A <= 8191 || A >= 8204 && A <= 8205 || A >= 8304 && A <= 8591 || A >= 11264 && A <= 12271 || A >= 12289 && A <= 55295 || A >= 63744 && A <= 64975 || A >= 65008 && A <= 65533 || A >= 65536 && A <= 983039;
- }
- Object.defineProperty(i, "__esModule", { value: !0 }), i.NC_NAME_START_CHAR = "A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ--⁰-Ⰰ-、-豈-﷏ﷰ-�𐀀-", i.NC_NAME_CHAR = "-" + i.NC_NAME_START_CHAR + ".0-9·̀-ͯ‿-⁀", i.NC_NAME_START_CHAR_RE = new RegExp("^[" + i.NC_NAME_START_CHAR + "]$", "u"), i.NC_NAME_CHAR_RE = new RegExp("^[" + i.NC_NAME_CHAR + "]$", "u"), i.NC_NAME_RE = new RegExp("^[" + i.NC_NAME_START_CHAR + "][" + i.NC_NAME_CHAR + "]*$", "u"), i.isNCNameStartChar = e, i.isNCNameChar = function(A) {
- return e(A) || A === 45 || A === 46 || A >= 48 && A <= 57 || A === 183 || A >= 768 && A <= 879 || A >= 8255 && A <= 8256;
- };
- }, {}] }, {}, [15])(15);
- });
- }(kX)), kX.exports;
- }
- var qbg = _bg();
- const $bg = /* @__PURE__ */ u$(qbg);
- class hd {
- constructor(I, g = "") {
- typeof I == "string" ? (this.el = document.createElement(I), this.el.className = g) : this.el = I, this.data = {};
- }
- data(I, g) {
- return g !== void 0 ? (this.data[I] = g, this) : this.data[I];
- }
- on(I, g) {
- const [C, ...i] = I.split(".");
- let e = C;
- return e === "mousewheel" && /Firefox/i.test(window.navigator.userAgent) && (e = "DOMMouseScroll"), this.el.addEventListener(e, (A) => {
- g(A);
- for (let s = 0; s < i.length; s += 1) {
- const l = i[s];
- if (l === "left" && A.button !== 0 || l === "right" && A.button !== 2)
- return;
- l === "stop" && A.stopPropagation();
- }
- }), this;
- }
- offset(I) {
- if (I !== void 0)
- return Object.keys(I).forEach((A) => {
- this.css(A, `${I[A]}px`);
- }), this;
- const {
- offsetTop: g,
- offsetLeft: C,
- offsetHeight: i,
- offsetWidth: e
- } = this.el;
- return {
- top: g,
- left: C,
- height: i,
- width: e
- };
- }
- scroll(I) {
- const { el: g } = this;
- return I !== void 0 && (I.left !== void 0 && (g.scrollLeft = I.left), I.top !== void 0 && (g.scrollTop = I.top)), { left: g.scrollLeft, top: g.scrollTop };
- }
- box() {
- return this.el.getBoundingClientRect();
- }
- parent() {
- return new hd(this.el.parentNode);
- }
- children(...I) {
- return arguments.length === 0 ? this.el.childNodes : (I.forEach((g) => this.child(g)), this);
- }
- removeChild(I) {
- this.el.removeChild(I);
- }
- /*
- first() {
- return this.el.firstChild;
- }
-
- last() {
- return this.el.lastChild;
- }
-
- remove(ele) {
- return this.el.removeChild(ele);
- }
-
- prepend(ele) {
- const { el } = this;
- if (el.children.length > 0) {
- el.insertBefore(ele, el.firstChild);
- } else {
- el.appendChild(ele);
- }
- return this;
- }
-
- prev() {
- return this.el.previousSibling;
- }
-
- next() {
- return this.el.nextSibling;
- }
- */
- child(I) {
- let g = I;
- return typeof I == "string" ? g = document.createTextNode(I) : I instanceof hd && (g = I.el), this.el.appendChild(g), this;
- }
- contains(I) {
- return this.el.contains(I);
- }
- className(I) {
- return I !== void 0 ? (this.el.className = I, this) : this.el.className;
- }
- addClass(I) {
- return this.el.classList.add(I), this;
- }
- hasClass(I) {
- return this.el.classList.contains(I);
- }
- removeClass(I) {
- return this.el.classList.remove(I), this;
- }
- toggle(I = "active") {
- return this.toggleClass(I);
- }
- toggleClass(I) {
- return this.el.classList.toggle(I);
- }
- active(I = !0, g = "active") {
- return I ? this.addClass(g) : this.removeClass(g), this;
- }
- checked(I = !0) {
- return this.active(I, "checked"), this;
- }
- disabled(I = !0) {
- return I ? this.addClass("disabled") : this.removeClass("disabled"), this;
- }
- // key, value
- // key
- // {k, v}...
- attr(I, g) {
- if (g !== void 0)
- this.el.setAttribute(I, g);
- else {
- if (typeof I == "string")
- return this.el.getAttribute(I);
- Object.keys(I).forEach((C) => {
- this.el.setAttribute(C, I[C]);
- });
- }
- return this;
- }
- removeAttr(I) {
- return this.el.removeAttribute(I), this;
- }
- html(I) {
- return I !== void 0 ? (this.el.innerHTML = I, this) : this.el.innerHTML;
- }
- val(I) {
- return I !== void 0 ? (this.el.value = I, this) : this.el.value;
- }
- focus() {
- this.el.focus();
- }
- cssRemoveKeys(...I) {
- return I.forEach((g) => this.el.style.removeProperty(g)), this;
- }
- // css( propertyName )
- // css( propertyName, value )
- // css( properties )
- css(I, g) {
- return g === void 0 && typeof I != "string" ? (Object.keys(I).forEach((C) => {
- this.el.style[C] = I[C];
- }), this) : g !== void 0 ? (this.el.style[I] = g, this) : this.el.style[I];
- }
- computedStyle() {
- return window.getComputedStyle(this.el, null);
- }
- show() {
- return this.css("display", "block"), this;
- }
- hide() {
- return this.css("display", "none"), this;
- }
- }
- const yg = (t, I = "") => new hd(t, I), sa = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
- function eig(t) {
- let I = "", g = t;
- for (; g >= sa.length; )
- g /= sa.length, g -= 1, I += sa[parseInt(g, 10) % sa.length];
- const C = t % sa.length;
- return I += sa[C], I;
- }
- function gug(t) {
- let I = 0;
- for (let g = 0; g < t.length - 1; g += 1) {
- const C = t.charCodeAt(g) - 65, i = t.length - 1 - g;
- I += sa.length ** i + sa.length * C;
- }
- return I += t.charCodeAt(t.length - 1) - 65, I;
- }
- function Ua(t) {
- let I = "", g = "";
- for (let C = 0; C < t.length; C += 1)
- t.charAt(C) >= "0" && t.charAt(C) <= "9" ? g += t.charAt(C) : I += t.charAt(C);
- return [gug(I), parseInt(g, 10) - 1];
- }
- function El(t, I) {
- return `${eig(t)}${I + 1}`;
- }
- function Lu(t, I, g, C = () => !0) {
- if (I === 0 && g === 0) return t;
- const [i, e] = Ua(t);
- return C(i, e) ? El(i + I, e + g) : t;
- }
- class lt {
- constructor(I, g, C, i, e = 0, A = 0) {
- this.sri = I, this.sci = g, this.eri = C, this.eci = i, this.w = e, this.h = A;
- }
- set(I, g, C, i) {
- this.sri = I, this.sci = g, this.eri = C, this.eci = i;
- }
- multiple() {
- return this.eri - this.sri > 0 || this.eci - this.sci > 0;
- }
- // cell-index: ri, ci
- // cell-ref: A10
- includes(...I) {
- let [g, C] = [0, 0];
- I.length === 1 ? [C, g] = Ua(I[0]) : I.length === 2 && ([g, C] = I);
- const {
- sri: i,
- sci: e,
- eri: A,
- eci: s
- } = this;
- return i <= g && g <= A && e <= C && C <= s;
- }
- each(I, g = () => !0) {
- const {
- sri: C,
- sci: i,
- eri: e,
- eci: A
- } = this;
- for (let s = C; s <= e; s += 1)
- if (g(s))
- for (let l = i; l <= A; l += 1)
- I(s, l);
- }
- contains(I) {
- return this.sri <= I.sri && this.sci <= I.sci && this.eri >= I.eri && this.eci >= I.eci;
- }
- // within
- within(I) {
- return this.sri >= I.sri && this.sci >= I.sci && this.eri <= I.eri && this.eci <= I.eci;
- }
- // disjoint
- disjoint(I) {
- return this.sri > I.eri || this.sci > I.eci || I.sri > this.eri || I.sci > this.eci;
- }
- // intersects
- intersects(I) {
- return this.sri <= I.eri && this.sci <= I.eci && I.sri <= this.eri && I.sci <= this.eci;
- }
- // union
- union(I) {
- const {
- sri: g,
- sci: C,
- eri: i,
- eci: e
- } = this;
- return new lt(
- I.sri < g ? I.sri : g,
- I.sci < C ? I.sci : C,
- I.eri > i ? I.eri : i,
- I.eci > e ? I.eci : e
- );
- }
- // intersection
- // intersection(other) {}
- // Returns Array<CellRange> that represents that part of this that does not intersect with other
- // difference
- difference(I) {
- const g = [], C = (o, c, r, h) => {
- g.push(new lt(o, c, r, h));
- }, {
- sri: i,
- sci: e,
- eri: A,
- eci: s
- } = this, l = I.sri - i, n = I.sci - e, a = A - I.eri, d = s - I.eci;
- return l > 0 ? (C(i, e, I.sri - 1, s), a > 0 ? (C(I.eri + 1, e, A, s), n > 0 && C(I.sri, e, I.eri, I.sci - 1), d > 0 && C(I.sri, I.eci + 1, I.eri, s)) : (n > 0 && C(I.sri, e, A, I.sci - 1), d > 0 && C(I.sri, I.eci + 1, A, s))) : a > 0 && (C(I.eri + 1, e, A, s), n > 0 && C(i, e, I.eri, I.sci - 1), d > 0 && C(i, I.eci + 1, I.eri, s)), n > 0 ? (C(i, e, A, I.sci - 1), d > 0 ? (C(i, I.eri + 1, A, s), l > 0 && C(i, I.sci, I.sri - 1, I.eci), a > 0 && C(I.sri + 1, I.sci, A, I.eci)) : (l > 0 && C(i, I.sci, I.sri - 1, s), a > 0 && C(I.sri + 1, I.sci, A, s))) : d > 0 && (C(A, I.eci + 1, A, s), l > 0 && C(i, e, I.sri - 1, I.eci), a > 0 && C(I.eri + 1, e, A, I.eci)), g;
- }
- size() {
- return [
- this.eri - this.sri + 1,
- this.eci - this.sci + 1
- ];
- }
- toString() {
- const {
- sri: I,
- sci: g,
- eri: C,
- eci: i
- } = this;
- let e = El(g, I);
- return this.multiple() && (e = `${e}:${El(i, C)}`), e;
- }
- clone() {
- const {
- sri: I,
- sci: g,
- eri: C,
- eci: i,
- w: e,
- h: A
- } = this;
- return new lt(I, g, C, i, e, A);
- }
- /*
- toJSON() {
- return this.toString();
- }
- */
- equals(I) {
- return this.eri === I.eri && this.eci === I.eci && this.sri === I.sri && this.sci === I.sci;
- }
- static valueOf(I) {
- const g = I.split(":"), [C, i] = Ua(g[0]);
- let [e, A] = [i, C];
- return g.length > 1 && ([A, e] = Ua(g[1])), new lt(i, C, e, A);
- }
- }
- let Iug = class {
- constructor() {
- this.range = new lt(0, 0, 0, 0), this.ri = 0, this.ci = 0;
- }
- multiple() {
- return this.range.multiple();
- }
- setIndexes(I, g) {
- this.ri = I, this.ci = g;
- }
- size() {
- return this.range.size();
- }
- };
- class Cug {
- constructor() {
- this.x = 0, this.y = 0, this.ri = 0, this.ci = 0;
- }
- }
- class tug {
- constructor() {
- this.undoItems = [], this.redoItems = [];
- }
- add(I) {
- this.undoItems.push(JSON.stringify(I)), this.redoItems = [];
- }
- canUndo() {
- return this.undoItems.length > 0;
- }
- canRedo() {
- return this.redoItems.length > 0;
- }
- undo(I, g) {
- const { undoItems: C, redoItems: i } = this;
- this.canUndo() && (i.push(JSON.stringify(I)), g(JSON.parse(C.pop())));
- }
- redo(I, g) {
- const { undoItems: C, redoItems: i } = this;
- this.canRedo() && (C.push(JSON.stringify(I)), g(JSON.parse(i.pop())));
- }
- }
- class iug {
- constructor() {
- this.range = null, this.state = "clear";
- }
- copy(I) {
- return this.range = I, this.state = "copy", this;
- }
- cut(I) {
- return this.range = I, this.state = "cut", this;
- }
- isCopy() {
- return this.state === "copy";
- }
- isCut() {
- return this.state === "cut";
- }
- isClear() {
- return this.state === "clear";
- }
- clear() {
- this.range = null, this.state = "clear";
- }
- }
- class Rq {
- constructor(I, g, C) {
- this.ci = I, this.operator = g, this.value = C;
- }
- set(I, g) {
- this.operator = I, this.value = g;
- }
- includes(I) {
- const { operator: g, value: C } = this;
- return g === "all" ? !0 : g === "in" ? C.includes(I) : !1;
- }
- vlength() {
- const { operator: I, value: g } = this;
- return I === "in" ? g.length : 0;
- }
- getData() {
- const { ci: I, operator: g, value: C } = this;
- return { ci: I, operator: g, value: C };
- }
- }
- class fq {
- constructor(I, g) {
- this.ci = I, this.order = g;
- }
- asc() {
- return this.order === "asc";
- }
- desc() {
- return this.order === "desc";
- }
- }
- class eug {
- constructor() {
- this.ref = null, this.filters = [], this.sort = null;
- }
- setData({ ref: I, filters: g, sort: C }) {
- I != null && (this.ref = I, this.filters = g.map((i) => new Rq(i.ci, i.operator, i.value)), C && (this.sort = new fq(C.ci, C.order)));
- }
- getData() {
- if (this.active()) {
- const { ref: I, filters: g, sort: C } = this;
- return { ref: I, filters: g.map((i) => i.getData()), sort: C };
- }
- return {};
- }
- addFilter(I, g, C) {
- const i = this.getFilter(I);
- i == null ? this.filters.push(new Rq(I, g, C)) : i.set(g, C);
- }
- setSort(I, g) {
- this.sort = g ? new fq(I, g) : null;
- }
- includes(I, g) {
- return this.active() ? this.hrange().includes(I, g) : !1;
- }
- getSort(I) {
- const { sort: g } = this;
- return g && g.ci === I ? g : null;
- }
- getFilter(I) {
- const { filters: g } = this;
- for (let C = 0; C < g.length; C += 1)
- if (g[C].ci === I)
- return g[C];
- return null;
- }
- filteredRows(I) {
- const g = /* @__PURE__ */ new Set(), C = /* @__PURE__ */ new Set();
- if (this.active()) {
- const { sri: i, eri: e } = this.range(), { filters: A } = this;
- for (let s = i + 1; s <= e; s += 1)
- for (let l = 0; l < A.length; l += 1) {
- const n = A[l], a = I(s, n.ci), d = a ? a.text : "";
- if (n.includes(d))
- C.add(s);
- else {
- g.add(s);
- break;
- }
- }
- }
- return { rset: g, fset: C };
- }
- items(I, g) {
- const C = {};
- if (this.active()) {
- const { sri: i, eri: e } = this.range();
- for (let A = i + 1; A <= e; A += 1) {
- const s = g(A, I);
- if (s !== null && !/^\s*$/.test(s.text)) {
- const l = s.text, n = (C[l] || 0) + 1;
- C[l] = n;
- } else
- C[""] = (C[""] || 0) + 1;
- }
- }
- return C;
- }
- range() {
- return lt.valueOf(this.ref);
- }
- hrange() {
- const I = this.range();
- return I.eri = I.sri, I;
- }
- clear() {
- this.ref = null, this.filters = [], this.sort = null;
- }
- active() {
- return this.ref !== null;
- }
- }
- class Q9 {
- constructor(I = []) {
- this._ = I;
- }
- forEach(I) {
- this._.forEach(I);
- }
- deleteWithin(I) {
- this._ = this._.filter((g) => !g.within(I));
- }
- getFirstIncludes(I, g) {
- for (let C = 0; C < this._.length; C += 1) {
- const i = this._[C];
- if (i.includes(I, g))
- return i;
- }
- return null;
- }
- filterIntersects(I) {
- return new Q9(this._.filter((g) => g.intersects(I)));
- }
- intersects(I) {
- for (let g = 0; g < this._.length; g += 1)
- if (this._[g].intersects(I))
- return !0;
- return !1;
- }
- union(I) {
- let g = I;
- return this._.forEach((C) => {
- C.intersects(g) && (g = C.union(g));
- }), g;
- }
- add(I) {
- this.deleteWithin(I), this._.push(I);
- }
- // type: row | column
- shift(I, g, C, i) {
- this._.forEach((e) => {
- const {
- sri: A,
- sci: s,
- eri: l,
- eci: n
- } = e, a = e;
- I === "row" ? A >= g ? (a.sri += C, a.eri += C) : A < g && g <= l && (a.eri += C, i(A, s, C, 0)) : I === "column" && (s >= g ? (a.sci += C, a.eci += C) : s < g && g <= n && (a.eci += C, i(A, s, 0, C)));
- });
- }
- move(I, g, C) {
- this._.forEach((i) => {
- const e = i;
- e.within(I) && (e.eri += g, e.sri += g, e.sci += C, e.eci += C);
- });
- }
- setData(I) {
- return this._ = I.map((g) => lt.valueOf(g)), this;
- }
- getData() {
- return this._.map((I) => I.toString());
- }
- }
- function Aug(t) {
- return JSON.parse(JSON.stringify(t));
- }
- const Aig = (t = {}, ...I) => (I.forEach((g) => {
- Object.keys(g).forEach((C) => {
- const i = g[C];
- typeof i == "string" || typeof i == "number" || typeof i == "boolean" ? t[C] = i : typeof i != "function" && !Array.isArray(i) && i instanceof Object ? (t[C] = t[C] || {}, Aig(t[C], i)) : t[C] = i;
- });
- }), t);
- function _D(t, I) {
- const g = Object.keys(t);
- if (g.length !== Object.keys(I).length) return !1;
- for (let C = 0; C < g.length; C += 1) {
- const i = g[C], e = t[i], A = I[i];
- if (A === void 0) return !1;
- if (typeof e == "string" || typeof e == "number" || typeof e == "boolean") {
- if (e !== A) return !1;
- } else if (Array.isArray(e)) {
- if (e.length !== A.length) return !1;
- for (let s = 0; s < e.length; s += 1)
- if (!_D(e[s], A[s])) return !1;
- } else if (typeof e != "function" && !Array.isArray(e) && e instanceof Object && !_D(e, A))
- return !1;
- }
- return !0;
- }
- const sug = (t, I = (g) => g) => {
- let g = 0, C = 0;
- return Object.keys(t).forEach((i) => {
- g += I(t[i], i), C += 1;
- }), [g, C];
- };
- function lug(t, I) {
- const g = t[`${I}`];
- return delete t[`${I}`], g;
- }
- function nug(t, I, g, C, i, e) {
- let A = g, s = C, l = t;
- for (; l < I && !(A > i); l += 1)
- s = e(l), A += s;
- return [l, A - s, s];
- }
- function aug(t, I, g) {
- let C = 0;
- for (let i = t; i < I; i += 1)
- C += g(i);
- return C;
- }
- function oug(t, I, g) {
- for (let C = t; C < I; C += 1)
- g(C);
- }
- function cug(t, I) {
- if (t.length === I.length) {
- for (let g = 0; g < t.length; g += 1)
- if (t[g] !== I[g]) return !1;
- } else return !1;
- return !0;
- }
- function zX(t) {
- const I = `${t}`;
- let g = 0, C = !1;
- for (let i = 0; i < I.length; i += 1)
- C === !0 && (g += 1), I.charAt(i) === "." && (C = !0);
- return g;
- }
- function Po(t, I, g) {
- if (Number.isNaN(I) || Number.isNaN(g))
- return I + t + g;
- const C = zX(I), i = zX(g), e = Number(I), A = Number(g);
- let s = 0;
- if (t === "-")
- s = e - A;
- else if (t === "+")
- s = e + A;
- else if (t === "*")
- s = e * A;
- else if (t === "/")
- return s = e / A, zX(s) > 5 ? s.toFixed(2) : s;
- return s.toFixed(Math.max(C, i));
- }
- const _i = {
- cloneDeep: Aug,
- merge: (...t) => Aig({}, ...t),
- equals: _D,
- arrayEquals: cug,
- sum: sug,
- rangeEach: oug,
- rangeSum: aug,
- rangeReduceIf: nug,
- deleteProperty: lug,
- numberCalc: Po
- };
- class dug {
- constructor({ len: I, height: g }) {
- this._ = {}, this.len = I, this.height = g;
- }
- getHeight(I) {
- if (this.isHide(I)) return 0;
- const g = this.get(I);
- return g && g.height ? g.height : this.height;
- }
- setHeight(I, g) {
- const C = this.getOrNew(I);
- C.height = g;
- }
- unhide(I) {
- let g = I;
- for (; g > 0 && (g -= 1, this.isHide(g)); )
- this.setHide(g, !1);
- }
- isHide(I) {
- const g = this.get(I);
- return g && g.hide;
- }
- setHide(I, g) {
- const C = this.getOrNew(I);
- g === !0 ? C.hide = !0 : delete C.hide;
- }
- setStyle(I, g) {
- const C = this.getOrNew(I);
- C.style = g;
- }
- sumHeight(I, g, C) {
- return _i.rangeSum(I, g, (i) => C && C.has(i) ? 0 : this.getHeight(i));
- }
- totalHeight() {
- return this.sumHeight(0, this.len);
- }
- get(I) {
- return this._[I];
- }
- getOrNew(I) {
- return this._[I] = this._[I] || { cells: {} }, this._[I];
- }
- getCell(I, g) {
- const C = this.get(I);
- return C !== void 0 && C.cells !== void 0 && C.cells[g] !== void 0 ? C.cells[g] : null;
- }
- getCellMerge(I, g) {
- const C = this.getCell(I, g);
- return C && C.merge ? C.merge : [0, 0];
- }
- getCellOrNew(I, g) {
- const C = this.getOrNew(I);
- return C.cells[g] = C.cells[g] || {}, C.cells[g];
- }
- // what: all | text | format
- setCell(I, g, C, i = "all") {
- const e = this.getOrNew(I);
- i === "all" ? e.cells[g] = C : i === "text" ? (e.cells[g] = e.cells[g] || {}, e.cells[g].text = C.text) : i === "format" && (e.cells[g] = e.cells[g] || {}, e.cells[g].style = C.style, C.merge && (e.cells[g].merge = C.merge));
- }
- setCellText(I, g, C) {
- const i = this.getCellOrNew(I, g);
- i.editable !== !1 && (i.text = C);
- }
- // what: all | format | text
- copyPaste(I, g, C, i = !1, e = () => {
- }) {
- const {
- sri: A,
- sci: s,
- eri: l,
- eci: n
- } = I, a = g.sri, d = g.sci, o = g.eri, c = g.eci, [r, h] = I.size(), [b, u] = g.size();
- let m = !0, Z = 0;
- (o < A || c < s) && (m = !1, o < A ? Z = b : Z = u);
- for (let p = A; p <= l; p += 1)
- if (this._[p]) {
- for (let Y = s; Y <= n; Y += 1)
- if (this._[p].cells && this._[p].cells[Y])
- for (let R = a; R <= o; R += r)
- for (let X = d; X <= c; X += h) {
- const H = R + (p - A), S = X + (Y - s), z = _i.cloneDeep(this._[p].cells[Y]);
- if (i && z && z.text && z.text.length > 0) {
- const { text: v } = z;
- let K = X - d + (R - a) + 2;
- if (m || (K -= Z + 1), v[0] === "=")
- z.text = v.replace(/[a-zA-Z]{1,3}\d+/g, (V) => {
- let [N, B] = [0, 0];
- return A === a ? N = K - 1 : B = K - 1, /^\d+$/.test(V) ? V : Lu(V, N, B);
- });
- else if (r <= 1 && h > 1 && (a > l || o < A) || h <= 1 && r > 1 && (d > n || c < s) || r <= 1 && h <= 1) {
- const V = /[\\.\d]+$/.exec(v);
- if (V !== null) {
- const N = Number(V[0]) + K - 1;
- z.text = v.substring(0, V.index) + N;
- }
- }
- }
- this.setCell(H, S, z, C), e(H, S, z);
- }
- }
- }
- cutPaste(I, g) {
- const C = {};
- this.each((i) => {
- this.eachCells(i, (e) => {
- let A = parseInt(i, 10), s = parseInt(e, 10);
- I.includes(i, e) && (A = g.sri + (A - I.sri), s = g.sci + (s - I.sci)), C[A] = C[A] || { cells: {} }, C[A].cells[s] = this._[i].cells[e];
- });
- }), this._ = C;
- }
- // src: Array<Array<String>>
- paste(I, g) {
- if (I.length <= 0) return;
- const { sri: C, sci: i } = g;
- I.forEach((e, A) => {
- const s = C + A;
- e.forEach((l, n) => {
- const a = i + n;
- this.setCellText(s, a, l);
- });
- });
- }
- insert(I, g = 1) {
- const C = {};
- this.each((i, e) => {
- let A = parseInt(i, 10);
- A >= I && (A += g, this.eachCells(i, (s, l) => {
- l.text && l.text[0] === "=" && (l.text = l.text.replace(/[a-zA-Z]{1,3}\d+/g, (n) => Lu(n, 0, g, (a, d) => d >= I)));
- })), C[A] = e;
- }), this._ = C, this.len += g;
- }
- delete(I, g) {
- const C = g - I + 1, i = {};
- this.each((e, A) => {
- const s = parseInt(e, 10);
- s < I ? i[s] = A : e > g && (i[s - C] = A, this.eachCells(e, (l, n) => {
- n.text && n.text[0] === "=" && (n.text = n.text.replace(/[a-zA-Z]{1,3}\d+/g, (a) => Lu(a, 0, -C, (d, o) => o > g)));
- }));
- }), this._ = i, this.len -= C;
- }
- insertColumn(I, g = 1) {
- this.each((C, i) => {
- const e = {};
- this.eachCells(C, (A, s) => {
- let l = parseInt(A, 10);
- l >= I && (l += g, s.text && s.text[0] === "=" && (s.text = s.text.replace(/[a-zA-Z]{1,3}\d+/g, (n) => Lu(n, g, 0, (a) => a >= I)))), e[l] = s;
- }), i.cells = e;
- });
- }
- deleteColumn(I, g) {
- const C = g - I + 1;
- this.each((i, e) => {
- const A = {};
- this.eachCells(i, (s, l) => {
- const n = parseInt(s, 10);
- n < I ? A[n] = l : n > g && (A[n - C] = l, l.text && l.text[0] === "=" && (l.text = l.text.replace(/[a-zA-Z]{1,3}\d+/g, (a) => Lu(a, -C, 0, (d) => d > g))));
- }), e.cells = A;
- });
- }
- // what: all | text | format | merge
- deleteCells(I, g = "all") {
- I.each((C, i) => {
- this.deleteCell(C, i, g);
- });
- }
- // what: all | text | format | merge
- deleteCell(I, g, C = "all") {
- const i = this.get(I);
- if (i !== null) {
- const e = this.getCell(I, g);
- e !== null && e.editable !== !1 && (C === "all" ? delete i.cells[g] : C === "text" ? (e.text && delete e.text, e.value && delete e.value) : C === "format" ? (e.style !== void 0 && delete e.style, e.merge && delete e.merge) : C === "merge" && e.merge && delete e.merge);
- }
- }
- maxCell() {
- const I = Object.keys(this._), g = I[I.length - 1], C = this._[g];
- if (C) {
- const { cells: i } = C, e = Object.keys(i), A = e[e.length - 1];
- return [parseInt(g, 10), parseInt(A, 10)];
- }
- return [0, 0];
- }
- each(I) {
- Object.entries(this._).forEach(([g, C]) => {
- I(g, C);
- });
- }
- eachCells(I, g) {
- this._[I] && this._[I].cells && Object.entries(this._[I].cells).forEach(([C, i]) => {
- g(C, i);
- });
- }
- setData(I) {
- I.len && (this.len = I.len, delete I.len), this._ = I;
- }
- getData() {
- const { len: I } = this;
- return Object.assign({ len: I }, this._);
- }
- }
- class rug {
- constructor({
- len: I,
- width: g,
- indexWidth: C,
- minWidth: i
- }) {
- this._ = {}, this.len = I, this.width = g, this.indexWidth = C, this.minWidth = i;
- }
- setData(I) {
- I.len && (this.len = I.len, delete I.len), this._ = I;
- }
- getData() {
- const { len: I } = this;
- return Object.assign({ len: I }, this._);
- }
- getWidth(I) {
- if (this.isHide(I)) return 0;
- const g = this._[I];
- return g && g.width ? g.width : this.width;
- }
- getOrNew(I) {
- return this._[I] = this._[I] || {}, this._[I];
- }
- setWidth(I, g) {
- const C = this.getOrNew(I);
- C.width = g;
- }
- unhide(I) {
- let g = I;
- for (; g > 0 && (g -= 1, this.isHide(g)); )
- this.setHide(g, !1);
- }
- isHide(I) {
- const g = this._[I];
- return g && g.hide;
- }
- setHide(I, g) {
- const C = this.getOrNew(I);
- g === !0 ? C.hide = !0 : delete C.hide;
- }
- setStyle(I, g) {
- const C = this.getOrNew(I);
- C.style = g;
- }
- sumWidth(I, g) {
- return _i.rangeSum(I, g, (C) => this.getWidth(C));
- }
- totalWidth() {
- return this.sumWidth(0, this.len);
- }
- }
- const hug = {
- toolbar: {
- undo: "Undo",
- redo: "Redo",
- print: "Print",
- paintformat: "Paint format",
- clearformat: "Clear format",
- format: "Format",
- fontName: "Font",
- fontSize: "Font size",
- fontBold: "Font bold",
- fontItalic: "Font italic",
- underline: "Underline",
- strike: "Strike",
- color: "Text color",
- bgcolor: "Fill color",
- border: "Borders",
- merge: "Merge cells",
- align: "Horizontal align",
- valign: "Vertical align",
- textwrap: "Text wrapping",
- freeze: "Freeze cell",
- autofilter: "Filter",
- formula: "Functions",
- more: "More"
- },
- contextmenu: {
- copy: "Copy",
- cut: "Cut",
- paste: "Paste",
- pasteValue: "Paste values only",
- pasteFormat: "Paste format only",
- hide: "Hide",
- insertRow: "Insert row",
- insertColumn: "Insert column",
- deleteSheet: "Delete",
- deleteRow: "Delete row",
- deleteColumn: "Delete column",
- deleteCell: "Delete cell",
- deleteCellText: "Delete cell text",
- validation: "Data validations",
- cellprintable: "Enable export",
- cellnonprintable: "Disable export",
- celleditable: "Enable editing",
- cellnoneditable: "Disable editing"
- },
- print: {
- size: "Paper size",
- orientation: "Page orientation",
- orientations: ["Landscape", "Portrait"]
- },
- format: {
- normal: "Normal",
- text: "Plain Text",
- number: "Number",
- percent: "Percent",
- rmb: "RMB",
- usd: "USD",
- eur: "EUR",
- date: "Date",
- time: "Time",
- datetime: "Date time",
- duration: "Duration"
- },
- formula: {
- sum: "Sum",
- average: "Average",
- max: "Max",
- min: "Min",
- _if: "IF",
- and: "AND",
- or: "OR",
- concat: "Concat"
- },
- validation: {
- required: "it must be required",
- notMatch: "it not match its validation rule",
- between: "it is between {} and {}",
- notBetween: "it is not between {} and {}",
- notIn: "it is not in list",
- equal: "it equal to {}",
- notEqual: "it not equal to {}",
- lessThan: "it less than {}",
- lessThanEqual: "it less than or equal to {}",
- greaterThan: "it greater than {}",
- greaterThanEqual: "it greater than or equal to {}"
- },
- error: {
- pasteForMergedCell: "Unable to do this for merged cells"
- },
- calendar: {
- weeks: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
- months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
- },
- button: {
- next: "Next",
- cancel: "Cancel",
- remove: "Remove",
- save: "Save",
- ok: "OK"
- },
- sort: {
- desc: "Sort Z -> A",
- asc: "Sort A -> Z"
- },
- filter: {
- empty: "empty"
- },
- dataValidation: {
- mode: "Mode",
- range: "Cell Range",
- criteria: "Criteria",
- modeType: {
- cell: "Cell",
- column: "Colun",
- row: "Row"
- },
- type: {
- list: "List",
- number: "Number",
- date: "Date",
- phone: "Phone",
- email: "Email"
- },
- operator: {
- be: "between",
- nbe: "not betwwen",
- lt: "less than",
- lte: "less than or equal to",
- gt: "greater than",
- gte: "greater than or equal to",
- eq: "equal to",
- neq: "not equal to"
- }
- }
- };
- let qD = ["en"];
- const sig = {
- en: hug
- };
- function Hq(t, I) {
- if (I)
- for (const g of qD) {
- if (!I[g]) break;
- let C = I[g];
- const i = t.match(/(?:\\.|[^.])+/g);
- for (let e = 0; e < i.length; e += 1) {
- const A = i[e], s = C[A];
- if (!s) break;
- if (e === i.length - 1) return s;
- C = s;
- }
- }
- }
- function bt(t) {
- let I = Hq(t, sig);
- return !I && window && window.x_spreadsheet && window.x_spreadsheet.$messages && (I = Hq(t, window.x_spreadsheet.$messages)), I || "";
- }
- function $I(t) {
- return () => bt(t);
- }
- function lig(t, I, g = !1) {
- g ? qD = [t] : qD.unshift(t), I && (sig[t] = I);
- }
- const Xq = {
- phone: /^[1-9]\d{10}$/,
- email: /w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/
- };
- function hA(t, I, ...g) {
- let C = "";
- return t || (C = bt(`validation.${I}`, ...g)), [t, C];
- }
- class nig {
- // operator: b|nb|eq|neq|lt|lte|gt|gte
- // type: date|number|list|phone|email
- constructor(I, g, C, i) {
- this.required = g, this.value = C, this.type = I, this.operator = i, this.message = "";
- }
- parseValue(I) {
- const { type: g } = this;
- return g === "date" ? new Date(I) : g === "number" ? Number(I) : I;
- }
- equals(I) {
- let g = this.type === I.type && this.required === I.required && this.operator === I.operator;
- return g && (Array.isArray(this.value) ? g = _i.arrayEquals(this.value, I.value) : g = this.value === I.value), g;
- }
- values() {
- return this.value.split(",");
- }
- validate(I) {
- const {
- required: g,
- operator: C,
- value: i,
- type: e
- } = this;
- if (g && /^\s*$/.test(I))
- return hA(!1, "required");
- if (/^\s*$/.test(I)) return [!0];
- if (Xq[e] && !Xq[e].test(I))
- return hA(!1, "notMatch");
- if (e === "list")
- return hA(this.values().includes(I), "notIn");
- if (C) {
- const A = this.parseValue(I);
- if (C === "be") {
- const [s, l] = i;
- return hA(
- A >= this.parseValue(s) && A <= this.parseValue(l),
- "between",
- s,
- l
- );
- }
- if (C === "nbe") {
- const [s, l] = i;
- return hA(
- A < this.parseValue(s) || A > this.parseValue(l),
- "notBetween",
- s,
- l
- );
- }
- if (C === "eq")
- return hA(
- A === this.parseValue(i),
- "equal",
- i
- );
- if (C === "neq")
- return hA(
- A !== this.parseValue(i),
- "notEqual",
- i
- );
- if (C === "lt")
- return hA(
- A < this.parseValue(i),
- "lessThan",
- i
- );
- if (C === "lte")
- return hA(
- A <= this.parseValue(i),
- "lessThanEqual",
- i
- );
- if (C === "gt")
- return hA(
- A > this.parseValue(i),
- "greaterThan",
- i
- );
- if (C === "gte")
- return hA(
- A >= this.parseValue(i),
- "greaterThanEqual",
- i
- );
- }
- return [!0];
- }
- }
- class WV {
- constructor(I, g, C) {
- this.refs = g, this.mode = I, this.validator = C;
- }
- includes(I, g) {
- const { refs: C } = this;
- for (let i = 0; i < C.length; i += 1)
- if (lt.valueOf(C[i]).includes(I, g)) return !0;
- return !1;
- }
- addRef(I) {
- this.remove(lt.valueOf(I)), this.refs.push(I);
- }
- remove(I) {
- const g = [];
- this.refs.forEach((C) => {
- const i = lt.valueOf(C);
- i.intersects(I) ? i.difference(I).forEach((A) => g.push(A.toString())) : g.push(C);
- }), this.refs = g;
- }
- getData() {
- const { refs: I, mode: g, validator: C } = this, {
- type: i,
- required: e,
- operator: A,
- value: s
- } = C;
- return {
- refs: I,
- mode: g,
- type: i,
- required: e,
- operator: A,
- value: s
- };
- }
- static valueOf({
- refs: I,
- mode: g,
- type: C,
- required: i,
- operator: e,
- value: A
- }) {
- return new WV(g, I, new nig(C, i, A, e));
- }
- }
- class bug {
- constructor() {
- this._ = [], this.errors = /* @__PURE__ */ new Map();
- }
- getError(I, g) {
- return this.errors.get(`${I}_${g}`);
- }
- validate(I, g, C) {
- const i = this.get(I, g), e = `${I}_${g}`, { errors: A } = this;
- if (i !== null) {
- const [s, l] = i.validator.validate(C);
- s ? A.delete(e) : A.set(e, l);
- } else
- A.delete(e);
- return !0;
- }
- // type: date|number|phone|email|list
- // validator: { required, value, operator }
- add(I, g, {
- type: C,
- required: i,
- value: e,
- operator: A
- }) {
- const s = new nig(
- C,
- i,
- e,
- A
- ), l = this.getByValidator(s);
- l !== null ? l.addRef(g) : this._.push(new WV(I, [g], s));
- }
- getByValidator(I) {
- for (let g = 0; g < this._.length; g += 1) {
- const C = this._[g];
- if (C.validator.equals(I))
- return C;
- }
- return null;
- }
- get(I, g) {
- for (let C = 0; C < this._.length; C += 1) {
- const i = this._[C];
- if (i.includes(I, g)) return i;
- }
- return null;
- }
- remove(I) {
- this.each((g) => {
- g.remove(I);
- });
- }
- each(I) {
- this._.forEach((g) => I(g));
- }
- getData() {
- return this._.filter((I) => I.refs.length > 0).map((I) => I.getData());
- }
- setData(I) {
- this._ = I.map((g) => WV.valueOf(g));
- }
- }
- const uug = {
- mode: "edit",
- // edit | read
- view: {
- height: () => document.documentElement.clientHeight,
- width: () => document.documentElement.clientWidth
- },
- showGrid: !0,
- showToolbar: !0,
- showContextmenu: !0,
- showBottomBar: !0,
- row: {
- len: 100,
- height: 25
- },
- col: {
- len: 26,
- width: 100,
- indexWidth: 60,
- minWidth: 60
- },
- style: {
- bgcolor: "#ffffff",
- align: "left",
- valign: "middle",
- textwrap: !1,
- strike: !1,
- underline: !1,
- color: "#0a0a0a",
- font: {
- name: "Arial",
- size: 10,
- bold: !1,
- italic: !1
- },
- format: "normal"
- }
- }, mug = 41, Zug = 41, Sq = (t, I) => Object.prototype.hasOwnProperty.call(t, I);
- function Dq(t, I, g = () => {
- }) {
- const { merges: C } = this, i = I.clone(), [e, A] = t.size(), [s, l] = I.size();
- return e > s && (i.eri = I.sri + e - 1), A > l && (i.eci = I.sci + A - 1), C.intersects(i) ? (g(bt("error.pasteForMergedCell")), !1) : !0;
- }
- function Kq(t, I, g, C = !1) {
- const { rows: i, merges: e } = this;
- (g === "all" || g === "format") && (i.deleteCells(I, g), e.deleteWithin(I)), i.copyPaste(t, I, g, C, (A, s, l) => {
- if (l && l.merge) {
- const [n, a] = l.merge;
- if (n <= 0 && a <= 0) return;
- e.add(new lt(A, s, A + n, s + a));
- }
- });
- }
- function Gug(t, I) {
- const { clipboard: g, rows: C, merges: i } = this;
- C.cutPaste(t, I), i.move(
- t,
- I.sri - t.sri,
- I.sci - t.sci
- ), g.clear();
- }
- function vr(t, I, g) {
- const { styles: C, rows: i } = this, e = i.getCellOrNew(t, I);
- let A = {};
- e.style !== void 0 && (A = _i.cloneDeep(C[e.style])), A = _i.merge(A, { border: g }), e.style = this.addStyle(A);
- }
- function wug({ mode: t, style: I, color: g }) {
- const { styles: C, selector: i, rows: e } = this, {
- sri: A,
- sci: s,
- eri: l,
- eci: n
- } = i.range, a = !this.isSignleSelected();
- if (!(!a && (t === "inside" || t === "horizontal" || t === "vertical"))) {
- if (t === "outside" && !a)
- vr.call(this, A, s, {
- top: [I, g],
- bottom: [I, g],
- left: [I, g],
- right: [I, g]
- });
- else if (t === "none")
- i.range.each((d, o) => {
- const c = e.getCell(d, o);
- if (c && c.style !== void 0) {
- const r = _i.cloneDeep(C[c.style]);
- delete r.border, c.style = this.addStyle(r);
- }
- });
- else if (t === "all" || t === "inside" || t === "outside" || t === "horizontal" || t === "vertical") {
- const d = [];
- for (let o = A; o <= l; o += 1)
- for (let c = s; c <= n; c += 1) {
- const r = [];
- for (let Y = 0; Y < d.length; Y += 1) {
- const [R, X, H, S] = d[Y];
- if (o === R + H + 1 && r.push(Y), R <= o && o <= R + H && c === X) {
- c += S + 1;
- break;
- }
- }
- if (r.forEach((Y) => d.splice(Y, 1)), c > n) break;
- const h = e.getCell(o, c);
- let [b, u] = [0, 0];
- h && h.merge && ([b, u] = h.merge, d.push([o, c, b, u]));
- const m = b > 0 && o + b === l, Z = u > 0 && c + u === n;
- let p = {};
- t === "all" ? p = {
- bottom: [I, g],
- top: [I, g],
- left: [I, g],
- right: [I, g]
- } : t === "inside" ? (!Z && c < n && (p.right = [I, g]), !m && o < l && (p.bottom = [I, g])) : t === "horizontal" ? !m && o < l && (p.bottom = [I, g]) : t === "vertical" ? !Z && c < n && (p.right = [I, g]) : t === "outside" && a && (A === o && (p.top = [I, g]), (m || l === o) && (p.bottom = [I, g]), s === c && (p.left = [I, g]), (Z || n === c) && (p.right = [I, g])), Object.keys(p).length > 0 && vr.call(this, o, c, p), c += u;
- }
- } else if (t === "top" || t === "bottom")
- for (let d = s; d <= n; d += 1)
- t === "top" && (vr.call(this, A, d, { top: [I, g] }), d += e.getCellMerge(A, d)[1]), t === "bottom" && (vr.call(this, l, d, { bottom: [I, g] }), d += e.getCellMerge(l, d)[1]);
- else if (t === "left" || t === "right")
- for (let d = A; d <= l; d += 1)
- t === "left" && (vr.call(this, d, s, { left: [I, g] }), d += e.getCellMerge(d, s)[0]), t === "right" && (vr.call(this, d, n, { right: [I, g] }), d += e.getCellMerge(d, n)[0]);
- }
- }
- function pug(t, I) {
- const { rows: g } = this, C = this.freezeTotalHeight();
- let i = g.height;
- C + g.height < t && (i -= I);
- const e = this.exceptRowSet;
- let A = 0, s = i, { height: l } = g;
- for (; A < g.len && !(s > t); A += 1)
- e.has(A) || (l = g.getHeight(A), s += l);
- return s -= l, s <= 0 ? { ri: -1, top: 0, height: l } : { ri: A - 1, top: s, height: l };
- }
- function Bug(t, I) {
- const { cols: g } = this, C = this.freezeTotalWidth();
- let i = g.indexWidth;
- C + g.indexWidth < t && (i -= I);
- const [e, A, s] = _i.rangeReduceIf(
- 0,
- g.len,
- i,
- g.indexWidth,
- t,
- (l) => g.getWidth(l)
- );
- return A <= 0 ? { ci: -1, left: 0, width: g.indexWidth } : { ci: e - 1, left: A, width: s };
- }
- class Wug {
- constructor(I, g) {
- this.settings = _i.merge(uug, g || {}), this.name = I || "sheet", this.freeze = [0, 0], this.styles = [], this.merges = new Q9(), this.rows = new dug(this.settings.row), this.cols = new rug(this.settings.col), this.validations = new bug(), this.hyperlinks = {}, this.comments = {}, this.selector = new Iug(), this.scroll = new Cug(), this.history = new tug(), this.clipboard = new iug(), this.autoFilter = new eug(), this.change = () => {
- }, this.exceptRowSet = /* @__PURE__ */ new Set(), this.sortedRowMap = /* @__PURE__ */ new Map(), this.unsortedRowMap = /* @__PURE__ */ new Map();
- }
- addValidation(I, g, C) {
- this.changeData(() => {
- this.validations.add(I, g, C);
- });
- }
- removeValidation() {
- const { range: I } = this.selector;
- this.changeData(() => {
- this.validations.remove(I);
- });
- }
- getSelectedValidator() {
- const { ri: I, ci: g } = this.selector, C = this.validations.get(I, g);
- return C ? C.validator : null;
- }
- getSelectedValidation() {
- const { ri: I, ci: g, range: C } = this.selector, i = this.validations.get(I, g), e = { ref: C.toString() };
- return i !== null && (e.mode = i.mode, e.validator = i.validator), e;
- }
- canUndo() {
- return this.history.canUndo();
- }
- canRedo() {
- return this.history.canRedo();
- }
- undo() {
- this.history.undo(this.getData(), (I) => {
- this.setData(I);
- });
- }
- redo() {
- this.history.redo(this.getData(), (I) => {
- this.setData(I);
- });
- }
- copy() {
- this.clipboard.copy(this.selector.range);
- }
- copyToSystemClipboard() {
- if (navigator.clipboard === void 0)
- return;
- let I = "";
- const g = this.rows.getData();
- for (let C = this.selector.range.sri; C <= this.selector.range.eri; C += 1) {
- if (Sq(g, C)) {
- for (let i = this.selector.range.sci; i <= this.selector.range.eci; i += 1)
- if (i > this.selector.range.sci && (I += " "), Sq(g[C].cells, i)) {
- const e = String(g[C].cells[i].text);
- e.indexOf(`
- `) === -1 && e.indexOf(" ") === -1 && e.indexOf('"') === -1 ? I += e : I += `"${e}"`;
- }
- } else
- for (let i = this.selector.range.sci; i <= this.selector.range.eci; i += 1)
- I += " ";
- I += `
- `;
- }
- navigator.clipboard.writeText(I).then(() => {
- }, (C) => {
- console.log("text copy to the system clipboard error ", I, C);
- });
- }
- cut() {
- this.clipboard.cut(this.selector.range);
- }
- // what: all | text | format
- paste(I = "all", g = () => {
- }) {
- const { clipboard: C, selector: i } = this;
- return C.isClear() || !Dq.call(this, C.range, i.range, g) ? !1 : (this.changeData(() => {
- C.isCopy() ? Kq.call(this, C.range, i.range, I) : C.isCut() && Gug.call(this, C.range, i.range);
- }), !0);
- }
- pasteFromText(I) {
- const g = I.split(`\r
- `).map((e) => e.replace(/"/g, "").split(" "));
- g.length > 0 && (g.length -= 1);
- const { rows: C, selector: i } = this;
- this.changeData(() => {
- C.paste(g, i.range);
- });
- }
- autofill(I, g, C = () => {
- }) {
- const i = this.selector.range;
- return Dq.call(this, i, I, C) ? (this.changeData(() => {
- Kq.call(this, i, I, g, !0);
- }), !0) : !1;
- }
- clearClipboard() {
- this.clipboard.clear();
- }
- calSelectedRangeByEnd(I, g) {
- const {
- selector: C,
- rows: i,
- cols: e,
- merges: A
- } = this;
- let {
- sri: s,
- sci: l,
- eri: n,
- eci: a
- } = C.range;
- const d = C.ri, o = C.ci;
- let [c, r] = [I, g];
- return I < 0 && (c = i.len - 1), g < 0 && (r = e.len - 1), c > d ? [s, n] = [d, c] : [s, n] = [c, d], r > o ? [l, a] = [o, r] : [l, a] = [r, o], C.range = A.union(new lt(
- s,
- l,
- n,
- a
- )), C.range = A.union(C.range), C.range;
- }
- calSelectedRangeByStart(I, g) {
- const {
- selector: C,
- rows: i,
- cols: e,
- merges: A
- } = this;
- let s = A.getFirstIncludes(I, g);
- return s === null && (s = new lt(I, g, I, g), I === -1 && (s.sri = 0, s.eri = i.len - 1), g === -1 && (s.sci = 0, s.eci = e.len - 1)), C.range = s, s;
- }
- setSelectedCellAttr(I, g) {
- this.changeData(() => {
- const { selector: C, styles: i, rows: e } = this;
- if (I === "merge")
- g ? this.merge() : this.unmerge();
- else if (I === "border")
- wug.call(this, g);
- else if (I === "formula") {
- const { ri: A, ci: s, range: l } = C;
- if (C.multiple()) {
- const [n, a] = C.size(), {
- sri: d,
- sci: o,
- eri: c,
- eci: r
- } = l;
- if (n > 1)
- for (let h = o; h <= r; h += 1) {
- const b = e.getCellOrNew(c + 1, h);
- b.text = `=${g}(${El(h, d)}:${El(h, c)})`;
- }
- else if (a > 1) {
- const h = e.getCellOrNew(A, r + 1);
- h.text = `=${g}(${El(o, A)}:${El(r, A)})`;
- }
- } else {
- const n = e.getCellOrNew(A, s);
- n.text = `=${g}()`;
- }
- } else
- C.range.each((A, s) => {
- const l = e.getCellOrNew(A, s);
- let n = {};
- if (l.style !== void 0 && (n = _i.cloneDeep(i[l.style])), I === "format")
- n.format = g, l.style = this.addStyle(n);
- else if (I === "font-bold" || I === "font-italic" || I === "font-name" || I === "font-size") {
- const a = {};
- a[I.split("-")[1]] = g, n.font = Object.assign(n.font || {}, a), l.style = this.addStyle(n);
- } else I === "strike" || I === "textwrap" || I === "underline" || I === "align" || I === "valign" || I === "color" || I === "bgcolor" ? (n[I] = g, l.style = this.addStyle(n)) : l[I] = g;
- });
- });
- }
- // state: input | finished
- setSelectedCellText(I, g = "input") {
- const { autoFilter: C, selector: i, rows: e } = this, { ri: A, ci: s } = i;
- let l = A;
- this.unsortedRowMap.has(A) && (l = this.unsortedRowMap.get(A));
- const n = e.getCell(l, s), a = n ? n.text : "";
- if (this.setCellText(l, s, I, g), C.active()) {
- const d = C.getFilter(s);
- if (d) {
- const o = d.value.findIndex((c) => c === a);
- o >= 0 && d.value.splice(o, 1, I);
- }
- }
- }
- getSelectedCell() {
- const { ri: I, ci: g } = this.selector;
- let C = I;
- return this.unsortedRowMap.has(I) && (C = this.unsortedRowMap.get(I)), this.rows.getCell(C, g);
- }
- xyInSelectedRect(I, g) {
- const {
- left: C,
- top: i,
- width: e,
- height: A
- } = this.getSelectedRect(), s = I - this.cols.indexWidth, l = g - this.rows.height;
- return s > C && s < C + e && l > i && l < i + A;
- }
- getSelectedRect() {
- return this.getRect(this.selector.range);
- }
- getClipboardRect() {
- const { clipboard: I } = this;
- return I.isClear() ? { left: -100, top: -100 } : this.getRect(I.range);
- }
- getRect(I) {
- const {
- scroll: g,
- rows: C,
- cols: i,
- exceptRowSet: e
- } = this, {
- sri: A,
- sci: s,
- eri: l,
- eci: n
- } = I;
- if (A < 0 && s < 0)
- return {
- left: 0,
- l: 0,
- top: 0,
- t: 0,
- scroll: g
- };
- const a = i.sumWidth(0, s), d = C.sumHeight(0, A, e), o = C.sumHeight(A, l + 1, e), c = i.sumWidth(s, n + 1);
- let r = a - g.x, h = d - g.y;
- const b = this.freezeTotalHeight(), u = this.freezeTotalWidth();
- return u > 0 && u > a && (r = a), b > 0 && b > d && (h = d), {
- l: a,
- t: d,
- left: r,
- top: h,
- height: o,
- width: c,
- scroll: g
- };
- }
- getCellRectByXY(I, g) {
- const {
- scroll: C,
- merges: i,
- rows: e,
- cols: A
- } = this;
- let { ri: s, top: l, height: n } = pug.call(this, g, C.y), { ci: a, left: d, width: o } = Bug.call(this, I, C.x);
- if (a === -1 && (o = A.totalWidth()), s === -1 && (n = e.totalHeight()), s >= 0 || a >= 0) {
- const c = i.getFirstIncludes(s, a);
- c && (s = c.sri, a = c.sci, {
- left: d,
- top: l,
- width: o,
- height: n
- } = this.cellRect(s, a));
- }
- return {
- ri: s,
- ci: a,
- left: d,
- top: l,
- width: o,
- height: n
- };
- }
- isSignleSelected() {
- const {
- sri: I,
- sci: g,
- eri: C,
- eci: i
- } = this.selector.range, e = this.getCell(I, g);
- if (e && e.merge) {
- const [A, s] = e.merge;
- if (I + A === C && g + s === i) return !0;
- }
- return !this.selector.multiple();
- }
- canUnmerge() {
- const {
- sri: I,
- sci: g,
- eri: C,
- eci: i
- } = this.selector.range, e = this.getCell(I, g);
- if (e && e.merge) {
- const [A, s] = e.merge;
- if (I + A === C && g + s === i) return !0;
- }
- return !1;
- }
- merge() {
- const { selector: I, rows: g } = this;
- if (this.isSignleSelected()) return;
- const [C, i] = I.size();
- if (C > 1 || i > 1) {
- const { sri: e, sci: A } = I.range;
- this.changeData(() => {
- const s = g.getCellOrNew(e, A);
- s.merge = [C - 1, i - 1], this.merges.add(I.range), this.rows.deleteCells(I.range), this.rows.setCell(e, A, s);
- });
- }
- }
- unmerge() {
- const { selector: I } = this;
- if (!this.isSignleSelected()) return;
- const { sri: g, sci: C } = I.range;
- this.changeData(() => {
- this.rows.deleteCell(g, C, "merge"), this.merges.deleteWithin(I.range);
- });
- }
- canAutofilter() {
- return !this.autoFilter.active();
- }
- autofilter() {
- const { autoFilter: I, selector: g } = this;
- this.changeData(() => {
- I.active() ? (I.clear(), this.exceptRowSet = /* @__PURE__ */ new Set(), this.sortedRowMap = /* @__PURE__ */ new Map(), this.unsortedRowMap = /* @__PURE__ */ new Map()) : I.ref = g.range.toString();
- });
- }
- setAutoFilter(I, g, C, i) {
- const { autoFilter: e } = this;
- e.addFilter(I, C, i), e.setSort(I, g), this.resetAutoFilter();
- }
- resetAutoFilter() {
- const { autoFilter: I, rows: g } = this;
- if (!I.active()) return;
- const { sort: C } = I, { rset: i, fset: e } = I.filteredRows((l, n) => g.getCell(l, n)), A = Array.from(e), s = Array.from(e);
- C && A.sort((l, n) => C.order === "asc" ? l - n : C.order === "desc" ? n - l : 0), this.exceptRowSet = i, this.sortedRowMap = /* @__PURE__ */ new Map(), this.unsortedRowMap = /* @__PURE__ */ new Map(), A.forEach((l, n) => {
- this.sortedRowMap.set(s[n], l), this.unsortedRowMap.set(l, s[n]);
- });
- }
- deleteCell(I = "all") {
- const { selector: g } = this;
- this.changeData(() => {
- this.rows.deleteCells(g.range, I), (I === "all" || I === "format") && this.merges.deleteWithin(g.range);
- });
- }
- // type: row | column
- insert(I, g = 1) {
- this.changeData(() => {
- const { sri: C, sci: i } = this.selector.range, { rows: e, merges: A, cols: s } = this;
- let l = C;
- I === "row" ? e.insert(C, g) : I === "column" && (e.insertColumn(i, g), l = i, s.len += 1), A.shift(I, l, g, (n, a, d, o) => {
- const c = e.getCell(n, a);
- c.merge[0] += d, c.merge[1] += o;
- });
- });
- }
- // type: row | column
- delete(I) {
- this.changeData(() => {
- const {
- rows: g,
- merges: C,
- selector: i,
- cols: e
- } = this, { range: A } = i, {
- sri: s,
- sci: l,
- eri: n,
- eci: a
- } = i.range, [d, o] = i.range.size();
- let c = s, r = d;
- I === "row" ? g.delete(s, n) : I === "column" && (g.deleteColumn(l, a), c = A.sci, r = o, e.len -= 1), C.shift(I, c, -r, (h, b, u, m) => {
- const Z = g.getCell(h, b);
- Z.merge[0] += u, Z.merge[1] += m, Z.merge[0] === 0 && Z.merge[1] === 0 && delete Z.merge;
- });
- });
- }
- scrollx(I, g) {
- const { scroll: C, freeze: i, cols: e } = this, [, A] = i, [
- s,
- l,
- n
- ] = _i.rangeReduceIf(A, e.len, 0, 0, I, (d) => e.getWidth(d));
- let a = l;
- I > 0 && (a += n), C.x !== a && (C.ci = I > 0 ? s : 0, C.x = a, g());
- }
- scrolly(I, g) {
- const { scroll: C, freeze: i, rows: e } = this, [A] = i, [
- s,
- l,
- n
- ] = _i.rangeReduceIf(A, e.len, 0, 0, I, (d) => e.getHeight(d));
- let a = l;
- I > 0 && (a += n), C.y !== a && (C.ri = I > 0 ? s : 0, C.y = a, g());
- }
- cellRect(I, g) {
- const { rows: C, cols: i } = this, e = i.sumWidth(0, g), A = C.sumHeight(0, I), s = C.getCell(I, g);
- let l = i.getWidth(g), n = C.getHeight(I);
- if (s !== null && s.merge) {
- const [a, d] = s.merge;
- if (a > 0)
- for (let o = 1; o <= a; o += 1)
- n += C.getHeight(I + o);
- if (d > 0)
- for (let o = 1; o <= d; o += 1)
- l += i.getWidth(g + o);
- }
- return {
- left: e,
- top: A,
- width: l,
- height: n,
- cell: s
- };
- }
- getCell(I, g) {
- return this.rows.getCell(I, g);
- }
- getCellTextOrDefault(I, g) {
- const C = this.getCell(I, g);
- return C && C.text ? C.text : "";
- }
- getCellStyle(I, g) {
- const C = this.getCell(I, g);
- return C && C.style !== void 0 ? this.styles[C.style] : null;
- }
- getCellStyleOrDefault(I, g) {
- const { styles: C, rows: i } = this, e = i.getCell(I, g), A = e && e.style !== void 0 ? C[e.style] : {};
- return _i.merge(this.defaultStyle(), A);
- }
- getSelectedCellStyle() {
- const { ri: I, ci: g } = this.selector;
- return this.getCellStyleOrDefault(I, g);
- }
- // state: input | finished
- setCellText(I, g, C, i) {
- const { rows: e, history: A, validations: s } = this;
- i === "finished" ? (e.setCellText(I, g, ""), A.add(this.getData()), e.setCellText(I, g, C)) : (e.setCellText(I, g, C), this.change(this.getData())), s.validate(I, g, C);
- }
- freezeIsActive() {
- const [I, g] = this.freeze;
- return I > 0 || g > 0;
- }
- setFreeze(I, g) {
- this.changeData(() => {
- this.freeze = [I, g];
- });
- }
- freezeTotalWidth() {
- return this.cols.sumWidth(0, this.freeze[1]);
- }
- freezeTotalHeight() {
- return this.rows.sumHeight(0, this.freeze[0]);
- }
- setRowHeight(I, g) {
- this.changeData(() => {
- this.rows.setHeight(I, g);
- });
- }
- setColWidth(I, g) {
- this.changeData(() => {
- this.cols.setWidth(I, g);
- });
- }
- viewHeight() {
- const { view: I, showToolbar: g, showBottomBar: C } = this.settings;
- let i = I.height();
- return C && (i -= Zug), g && (i -= mug), i;
- }
- viewWidth() {
- return this.settings.view.width();
- }
- freezeViewRange() {
- const [I, g] = this.freeze;
- return new lt(0, 0, I - 1, g - 1, this.freezeTotalWidth(), this.freezeTotalHeight());
- }
- contentRange() {
- const { rows: I, cols: g } = this, [C, i] = I.maxCell(), e = I.sumHeight(0, C + 1), A = g.sumWidth(0, i + 1);
- return new lt(0, 0, C, i, A, e);
- }
- exceptRowTotalHeight(I, g) {
- const { exceptRowSet: C, rows: i } = this, e = Array.from(C);
- let A = 0;
- return e.forEach((s) => {
- if (s < I || s > g) {
- const l = i.getHeight(s);
- A += l;
- }
- }), A;
- }
- viewRange() {
- const {
- scroll: I,
- rows: g,
- cols: C,
- freeze: i,
- exceptRowSet: e
- } = this;
- let { ri: A, ci: s } = I;
- A <= 0 && ([A] = i), s <= 0 && ([, s] = i);
- let [l, n] = [0, 0], [a, d] = [g.len, C.len];
- for (let o = A; o < g.len && (e.has(o) || (n += g.getHeight(o), a = o), !(n > this.viewHeight())); o += 1)
- ;
- for (let o = s; o < C.len && (l += C.getWidth(o), d = o, !(l > this.viewWidth())); o += 1)
- ;
- return new lt(A, s, a, d, l, n);
- }
- eachMergesInView(I, g) {
- this.merges.filterIntersects(I).forEach((C) => g(C));
- }
- hideRowsOrCols() {
- const { rows: I, cols: g, selector: C } = this, [i, e] = C.size(), {
- sri: A,
- sci: s,
- eri: l,
- eci: n
- } = C.range;
- if (i === I.len)
- for (let a = s; a <= n; a += 1)
- g.setHide(a, !0);
- else if (e === g.len)
- for (let a = A; a <= l; a += 1)
- I.setHide(a, !0);
- }
- // type: row | col
- // index row-index | col-index
- unhideRowsOrCols(I, g) {
- this[`${I}s`].unhide(g);
- }
- rowEach(I, g, C) {
- let i = 0;
- const { rows: e } = this, A = this.exceptRowSet, s = [...A];
- let l = 0;
- for (let n = 0; n < s.length; n += 1)
- s[n] < I && (l += 1);
- for (let n = I + l; n <= g + l; n += 1)
- if (A.has(n))
- l += 1;
- else {
- const a = e.getHeight(n);
- if (a > 0 && (C(n, i, a), i += a, i > this.viewHeight()))
- break;
- }
- }
- colEach(I, g, C) {
- let i = 0;
- const { cols: e } = this;
- for (let A = I; A <= g; A += 1) {
- const s = e.getWidth(A);
- if (s > 0 && (C(A, i, s), i += s, i > this.viewWidth()))
- break;
- }
- }
- defaultStyle() {
- return this.settings.style;
- }
- addStyle(I) {
- const { styles: g } = this;
- for (let C = 0; C < g.length; C += 1) {
- const i = g[C];
- if (_i.equals(i, I)) return C;
- }
- return g.push(I), g.length - 1;
- }
- changeData(I) {
- this.history.add(this.getData()), I(), this.change(this.getData());
- }
- setData(I) {
- return Object.keys(I).forEach((g) => {
- if (g === "merges" || g === "rows" || g === "cols" || g === "validations")
- this[g].setData(I[g]);
- else if (g === "freeze") {
- const [C, i] = Ua(I[g]);
- this.freeze = [i, C];
- } else g === "autofilter" ? this.autoFilter.setData(I[g]) : I[g] !== void 0 && (this[g] = I[g]);
- }), this;
- }
- getData() {
- const {
- name: I,
- freeze: g,
- styles: C,
- merges: i,
- rows: e,
- cols: A,
- validations: s,
- autoFilter: l
- } = this;
- return {
- name: I,
- freeze: El(g[1], g[0]),
- styles: C,
- merges: i.getData(),
- rows: e.getData(),
- cols: A.getData(),
- validations: s.getData(),
- autofilter: l.getData()
- };
- }
- }
- function $i(t, I, g) {
- t.addEventListener(I, g);
- }
- function yV(t, I, g) {
- t.removeEventListener(I, g);
- }
- function X0(t) {
- t.xclickoutside && (yV(window.document.body, "click", t.xclickoutside), delete t.xclickoutside);
- }
- function ZG(t, I) {
- t.xclickoutside = (g) => {
- g.detail === 2 || t.contains(g.target) || (I ? I(t) : (t.hide(), X0(t)));
- }, $i(window.document.body, "click", t.xclickoutside);
- }
- function aig(t, I, g) {
- $i(t, "mousemove", I);
- const C = t;
- C.xEvtUp = (i) => {
- yV(t, "mousemove", I), yV(t, "mouseup", t.xEvtUp), g(i);
- }, $i(t, "mouseup", t.xEvtUp);
- }
- function Fq(t, I, g, C) {
- let i = "";
- Math.abs(t) > Math.abs(I) ? (i = t > 0 ? "right" : "left", C(i, t, g)) : (i = I > 0 ? "down" : "up", C(i, I, g));
- }
- function yug(t, { move: I, end: g }) {
- let C = 0, i = 0;
- $i(t, "touchstart", (e) => {
- const { pageX: A, pageY: s } = e.touches[0];
- C = A, i = s;
- }), $i(t, "touchmove", (e) => {
- if (!I) return;
- const { pageX: A, pageY: s } = e.changedTouches[0], l = A - C, n = s - i;
- (Math.abs(l) > 10 || Math.abs(n) > 10) && (Fq(l, n, e, I), C = A, i = s), e.preventDefault();
- }), $i(t, "touchend", (e) => {
- if (!g) return;
- const { pageX: A, pageY: s } = e.changedTouches[0], l = A - C, n = s - i;
- Fq(l, n, e, g);
- });
- }
- function Yug() {
- const t = /* @__PURE__ */ new Map();
- function I(A, s) {
- const l = () => {
- const a = t.get(A);
- return Array.isArray(a) && a.push(s) || !1;
- }, n = () => t.set(A, [].concat(s));
- return t.has(A) && l() || n();
- }
- function g(A, s) {
- const l = () => {
- const n = t.get(A);
- for (const a of n) a.call(null, ...s);
- };
- return t.has(A) && l();
- }
- function C(A, s) {
- const l = () => {
- const n = t.get(A), a = n.indexOf(s);
- return a >= 0 && n.splice(a, 1) && t.get(A).length === 0 && t.delete(A);
- };
- return t.has(A) && l();
- }
- function i(A, s) {
- const l = (...n) => {
- s.call(null, ...n), C(A, l);
- };
- return I(A, l);
- }
- function e() {
- t.clear();
- }
- return {
- get current() {
- return t;
- },
- on: I,
- once: i,
- fire: g,
- removeListener: C,
- removeAllListeners: e
- };
- }
- const Lg = "x-spreadsheet";
- class kq {
- constructor(I = !1, g) {
- this.moving = !1, this.vertical = I, this.el = yg("div", `${Lg}-resizer ${I ? "vertical" : "horizontal"}`).children(
- this.unhideHoverEl = yg("div", `${Lg}-resizer-hover`).on("dblclick.stop", (C) => this.mousedblclickHandler(C)).css("position", "absolute").hide(),
- this.hoverEl = yg("div", `${Lg}-resizer-hover`).on("mousedown.stop", (C) => this.mousedownHandler(C)),
- this.lineEl = yg("div", `${Lg}-resizer-line`).hide()
- ).hide(), this.cRect = null, this.finishedFn = null, this.minDistance = g, this.unhideFn = () => {
- };
- }
- showUnhide(I) {
- this.unhideIndex = I, this.unhideHoverEl.show();
- }
- hideUnhide() {
- this.unhideHoverEl.hide();
- }
- // rect : {top, left, width, height}
- // line : {width, height}
- show(I, g) {
- const {
- moving: C,
- vertical: i,
- hoverEl: e,
- lineEl: A,
- el: s,
- unhideHoverEl: l
- } = this;
- if (C) return;
- this.cRect = I;
- const {
- left: n,
- top: a,
- width: d,
- height: o
- } = I;
- s.offset({
- left: i ? n + d - 5 : n,
- top: i ? a : a + o - 5
- }).show(), e.offset({
- width: i ? 5 : d,
- height: i ? o : 5
- }), A.offset({
- width: i ? 0 : g.width,
- height: i ? g.height : 0
- }), l.offset({
- left: i ? 5 - d : n,
- top: i ? a : 5 - o,
- width: i ? 5 : d,
- height: i ? o : 5
- });
- }
- hide() {
- this.el.offset({
- left: 0,
- top: 0
- }).hide(), this.hideUnhide();
- }
- mousedblclickHandler() {
- this.unhideIndex && this.unhideFn(this.unhideIndex);
- }
- mousedownHandler(I) {
- let g = I;
- const {
- el: C,
- lineEl: i,
- cRect: e,
- vertical: A,
- minDistance: s
- } = this;
- let l = A ? e.width : e.height;
- i.show(), aig(window, (n) => {
- this.moving = !0, g !== null && n.buttons === 1 && (A ? (l += n.movementX, l > s && C.css("left", `${e.left + l}px`)) : (l += n.movementY, l > s && C.css("top", `${e.top + l}px`)), g = n);
- }, () => {
- g = null, i.hide(), this.moving = !1, this.hide(), this.finishedFn && (l < s && (l = s), this.finishedFn(e, l));
- });
- }
- }
- class zq {
- constructor(I) {
- this.vertical = I, this.moveFn = null, this.el = yg("div", `${Lg}-scrollbar ${I ? "vertical" : "horizontal"}`).child(this.contentEl = yg("div", "")).on("mousemove.stop", () => {
- }).on("scroll.stop", (g) => {
- const { scrollTop: C, scrollLeft: i } = g.target;
- this.moveFn && this.moveFn(this.vertical ? C : i, g);
- });
- }
- move(I) {
- return this.el.scroll(I), this;
- }
- scroll() {
- return this.el.scroll();
- }
- set(I, g) {
- const C = I - 1;
- if (g > C) {
- const i = this.vertical ? "height" : "width";
- this.el.css(i, `${C - 15}px`).show(), this.contentEl.css(this.vertical ? "width" : "height", "1px").css(i, `${g}px`);
- } else
- this.el.hide();
- return this;
- }
- }
- const CN = 2 * 2 - 1;
- let $D = 10;
- class tN {
- constructor(I = !1) {
- this.useHideInput = I, this.inputChange = () => {
- }, this.cornerEl = yg("div", `${Lg}-selector-corner`), this.areaEl = yg("div", `${Lg}-selector-area`).child(this.cornerEl).hide(), this.clipboardEl = yg("div", `${Lg}-selector-clipboard`).hide(), this.autofillEl = yg("div", `${Lg}-selector-autofill`).hide(), this.el = yg("div", `${Lg}-selector`).css("z-index", `${$D}`).children(this.areaEl, this.clipboardEl, this.autofillEl).hide(), I && (this.hideInput = yg("input", "").on("compositionend", (g) => {
- this.inputChange(g.target.value);
- }), this.el.child(this.hideInputDiv = yg("div", "hide-input").child(this.hideInput)), this.el.child(this.hideInputDiv = yg("div", "hide-input").child(this.hideInput))), $D += 1;
- }
- setOffset(I) {
- return this.el.offset(I).show(), this;
- }
- hide() {
- return this.el.hide(), this;
- }
- setAreaOffset(I) {
- const {
- left: g,
- top: C,
- width: i,
- height: e
- } = I, A = {
- width: i - CN + 0.8,
- height: e - CN + 0.8,
- left: g - 0.8,
- top: C - 0.8
- };
- this.areaEl.offset(A).show(), this.useHideInput && (this.hideInputDiv.offset(A), this.hideInput.val("").focus());
- }
- setClipboardOffset(I) {
- const {
- left: g,
- top: C,
- width: i,
- height: e
- } = I;
- this.clipboardEl.offset({
- left: g,
- top: C,
- width: i - 5,
- height: e - 5
- });
- }
- showAutofill(I) {
- const {
- left: g,
- top: C,
- width: i,
- height: e
- } = I;
- this.autofillEl.offset({
- width: i - CN,
- height: e - CN,
- left: g,
- top: C
- }).show();
- }
- hideAutofill() {
- this.autofillEl.hide();
- }
- showClipboard() {
- this.clipboardEl.show();
- }
- hideClipboard() {
- this.clipboardEl.hide();
- }
- }
- function O9(t) {
- const { data: I } = this, {
- left: g,
- top: C,
- width: i,
- height: e,
- scroll: A,
- l: s,
- t: l
- } = t, n = I.freezeTotalWidth(), a = I.freezeTotalHeight();
- let d = g - n;
- n > s && (d -= A.x);
- let o = C - a;
- return a > l && (o -= A.y), {
- left: d,
- top: o,
- width: i,
- height: e
- };
- }
- function U9(t) {
- const { data: I } = this, {
- left: g,
- width: C,
- height: i,
- l: e,
- t: A,
- scroll: s
- } = t, l = I.freezeTotalWidth();
- let n = g - l;
- return l > e && (n -= s.x), {
- left: n,
- top: A,
- width: C,
- height: i
- };
- }
- function E9(t) {
- const { data: I } = this, {
- top: g,
- width: C,
- height: i,
- l: e,
- t: A,
- scroll: s
- } = t, l = I.freezeTotalHeight();
- let n = g - l;
- return l > A && (n -= s.y), {
- left: e,
- top: n,
- width: C,
- height: i
- };
- }
- function g9(t) {
- const { br: I } = this;
- I.setAreaOffset(O9.call(this, t));
- }
- function Nug(t) {
- const { tl: I } = this;
- I.setAreaOffset(t);
- }
- function oig(t) {
- const { t: I } = this;
- I.setAreaOffset(U9.call(this, t));
- }
- function cig(t) {
- const { l: I } = this;
- I.setAreaOffset(E9.call(this, t));
- }
- function dig(t) {
- const { l: I } = this;
- I.setClipboardOffset(E9.call(this, t));
- }
- function I9(t) {
- const { br: I } = this;
- I.setClipboardOffset(O9.call(this, t));
- }
- function Vug(t) {
- const { tl: I } = this;
- I.setClipboardOffset(t);
- }
- function rig(t) {
- const { t: I } = this;
- I.setClipboardOffset(U9.call(this, t));
- }
- function Jq(t) {
- g9.call(this, t), Nug.call(this, t), oig.call(this, t), cig.call(this, t);
- }
- function Lq(t) {
- I9.call(this, t), Vug.call(this, t), rig.call(this, t), dig.call(this, t);
- }
- class Mug {
- constructor(I) {
- this.inputChange = () => {
- }, this.data = I, this.br = new tN(!0), this.t = new tN(), this.l = new tN(), this.tl = new tN(), this.br.inputChange = (g) => {
- this.inputChange(g);
- }, this.br.el.show(), this.offset = null, this.areaOffset = null, this.indexes = null, this.range = null, this.arange = null, this.el = yg("div", `${Lg}-selectors`).children(
- this.tl.el,
- this.t.el,
- this.l.el,
- this.br.el
- ).hide(), this.lastri = -1, this.lastci = -1, $D += 1;
- }
- resetData(I) {
- this.data = I, this.range = I.selector.range, this.resetAreaOffset();
- }
- hide() {
- this.el.hide();
- }
- resetOffset() {
- const {
- data: I,
- tl: g,
- t: C,
- l: i,
- br: e
- } = this, A = I.freezeTotalHeight(), s = I.freezeTotalWidth();
- A > 0 || s > 0 ? (g.setOffset({ width: s, height: A }), C.setOffset({ left: s, height: A }), i.setOffset({ top: A, width: s }), e.setOffset({ left: s, top: A })) : (g.hide(), C.hide(), i.hide(), e.setOffset({ left: 0, top: 0 }));
- }
- resetAreaOffset() {
- const I = this.data.getSelectedRect(), g = this.data.getClipboardRect();
- Jq.call(this, I), Lq.call(this, g), this.resetOffset();
- }
- resetBRTAreaOffset() {
- const I = this.data.getSelectedRect(), g = this.data.getClipboardRect();
- g9.call(this, I), oig.call(this, I), I9.call(this, g), rig.call(this, g), this.resetOffset();
- }
- resetBRLAreaOffset() {
- const I = this.data.getSelectedRect(), g = this.data.getClipboardRect();
- g9.call(this, I), cig.call(this, I), I9.call(this, g), dig.call(this, g), this.resetOffset();
- }
- set(I, g, C = !0) {
- const { data: i } = this, e = i.calSelectedRangeByStart(I, g), { sri: A, sci: s } = e;
- if (C) {
- let [l, n] = [I, g];
- I < 0 && (l = 0), g < 0 && (n = 0), i.selector.setIndexes(l, n), this.indexes = [l, n];
- }
- this.moveIndexes = [A, s], this.range = e, this.resetAreaOffset(), this.el.show();
- }
- setEnd(I, g, C = !0) {
- const { data: i, lastri: e, lastci: A } = this;
- if (C) {
- if (I === e && g === A) return;
- this.lastri = I, this.lastci = g;
- }
- this.range = i.calSelectedRangeByEnd(I, g), Jq.call(this, this.data.getSelectedRect());
- }
- reset() {
- const { eri: I, eci: g } = this.data.selector.range;
- this.setEnd(I, g);
- }
- showAutofill(I, g) {
- if (I === -1 && g === -1) return;
- const {
- sri: C,
- sci: i,
- eri: e,
- eci: A
- } = this.range, [s, l] = [I, g], n = C - I, a = i - g, d = e - I, o = A - g;
- if (a > 0)
- this.arange = new lt(C, l, e, i - 1);
- else if (n > 0)
- this.arange = new lt(s, i, C - 1, A);
- else if (o < 0)
- this.arange = new lt(C, A + 1, e, l);
- else if (d < 0)
- this.arange = new lt(e + 1, i, s, A);
- else {
- this.arange = null;
- return;
- }
- if (this.arange !== null) {
- const c = this.data.getRect(this.arange);
- c.width += 2, c.height += 2;
- const {
- br: r,
- l: h,
- t: b,
- tl: u
- } = this;
- r.showAutofill(O9.call(this, c)), h.showAutofill(E9.call(this, c)), b.showAutofill(U9.call(this, c)), u.showAutofill(c);
- }
- }
- hideAutofill() {
- ["br", "l", "t", "tl"].forEach((I) => {
- this[I].hideAutofill();
- });
- }
- showClipboard() {
- const I = this.data.getClipboardRect();
- Lq.call(this, I), ["br", "l", "t", "tl"].forEach((g) => {
- this[g].showClipboard();
- });
- }
- hideClipboard() {
- ["br", "l", "t", "tl"].forEach((I) => {
- this[I].hideClipboard();
- });
- }
- }
- function Rug(t) {
- t.preventDefault(), t.stopPropagation();
- const { filterItems: I } = this;
- I.length <= 0 || (this.itemIndex >= 0 && I[this.itemIndex].toggle(), this.itemIndex -= 1, this.itemIndex < 0 && (this.itemIndex = I.length - 1), I[this.itemIndex].toggle());
- }
- function fug(t) {
- t.stopPropagation();
- const { filterItems: I } = this;
- I.length <= 0 || (this.itemIndex >= 0 && I[this.itemIndex].toggle(), this.itemIndex += 1, this.itemIndex > I.length - 1 && (this.itemIndex = 0), I[this.itemIndex].toggle());
- }
- function vq(t) {
- t.preventDefault();
- const { filterItems: I } = this;
- I.length <= 0 || (t.stopPropagation(), this.itemIndex < 0 && (this.itemIndex = 0), I[this.itemIndex].el.click(), this.hide());
- }
- function Hug(t) {
- const { keyCode: I } = t;
- switch (t.ctrlKey && t.stopPropagation(), I) {
- case 37:
- t.stopPropagation();
- break;
- case 38:
- Rug.call(this, t);
- break;
- case 39:
- t.stopPropagation();
- break;
- case 40:
- fug.call(this, t);
- break;
- case 13:
- vq.call(this, t);
- break;
- case 9:
- vq.call(this, t);
- break;
- default:
- t.stopPropagation();
- break;
- }
- }
- class hig {
- constructor(I, g, C = "200px") {
- this.filterItems = [], this.items = I, this.el = yg("div", `${Lg}-suggest`).css("width", C).hide(), this.itemClick = g, this.itemIndex = -1;
- }
- setOffset(I) {
- this.el.cssRemoveKeys("top", "bottom").offset(I);
- }
- hide() {
- const { el: I } = this;
- this.filterItems = [], this.itemIndex = -1, I.hide(), X0(this.el.parent());
- }
- setItems(I) {
- this.items = I;
- }
- search(I) {
- let { items: g } = this;
- if (/^\s*$/.test(I) || (g = g.filter((i) => (i.key || i).startsWith(I.toUpperCase()))), g = g.map((i) => {
- let { title: e } = i;
- e ? typeof e == "function" && (e = e()) : e = i;
- const A = yg("div", `${Lg}-item`).child(e).on("click.stop", () => {
- this.itemClick(i), this.hide();
- });
- return i.label && A.child(yg("div", "label").html(i.label)), A;
- }), this.filterItems = g, g.length <= 0)
- return;
- const { el: C } = this;
- C.html("").children(...g).show(), ZG(C.parent(), () => {
- this.hide();
- });
- }
- bindInputEvents(I) {
- I.on("keydown", (g) => Hug.call(this, g));
- }
- }
- class pi extends hd {
- constructor(I) {
- super("div", `${Lg}-icon`), this.iconNameEl = yg("div", `${Lg}-icon-img ${I}`), this.child(this.iconNameEl);
- }
- setName(I) {
- this.iconNameEl.className(`${Lg}-icon-img ${I}`);
- }
- }
- function Tq(t, I) {
- t.setMonth(t.getMonth() + I);
- }
- function Xug(t, I) {
- const g = new Date(t);
- return g.setDate(I - t.getDay() + 1), g;
- }
- function Sug(t, I, g) {
- const C = new Date(t, I, 1, 23, 59, 59), i = [[], [], [], [], [], []];
- for (let e = 0; e < 6; e += 1)
- for (let A = 0; A < 7; A += 1) {
- const s = e * 7 + A, l = Xug(C, s), n = l.getMonth() !== I, a = l.getMonth() === g.getMonth() && l.getDate() === g.getDate();
- i[e][A] = { d: l, disabled: n, active: a };
- }
- return i;
- }
- class Dug {
- constructor(I) {
- this.value = I, this.cvalue = new Date(I), this.headerLeftEl = yg("div", "calendar-header-left"), this.bodyEl = yg("tbody", ""), this.buildAll(), this.el = yg("div", "x-spreadsheet-calendar").children(
- yg("div", "calendar-header").children(
- this.headerLeftEl,
- yg("div", "calendar-header-right").children(
- yg("a", "calendar-prev").on("click.stop", () => this.prev()).child(new pi("chevron-left")),
- yg("a", "calendar-next").on("click.stop", () => this.next()).child(new pi("chevron-right"))
- )
- ),
- yg("table", "calendar-body").children(
- yg("thead", "").child(
- yg("tr", "").children(
- ...bt("calendar.weeks").map((g) => yg("th", "cell").child(g))
- )
- ),
- this.bodyEl
- )
- ), this.selectChange = () => {
- };
- }
- setValue(I) {
- this.value = I, this.cvalue = new Date(I), this.buildAll();
- }
- prev() {
- const { value: I } = this;
- Tq(I, -1), this.buildAll();
- }
- next() {
- const { value: I } = this;
- Tq(I, 1), this.buildAll();
- }
- buildAll() {
- this.buildHeaderLeft(), this.buildBody();
- }
- buildHeaderLeft() {
- const { value: I } = this;
- this.headerLeftEl.html(`${bt("calendar.months")[I.getMonth()]} ${I.getFullYear()}`);
- }
- buildBody() {
- const { value: I, cvalue: g, bodyEl: C } = this, e = Sug(I.getFullYear(), I.getMonth(), g).map((A) => {
- const s = A.map((l) => {
- let n = "cell";
- return l.disabled && (n += " disabled"), l.active && (n += " active"), yg("td", "").child(
- yg("div", n).on("click.stop", () => {
- this.selectChange(l.d);
- }).child(l.d.getDate().toString())
- );
- });
- return yg("tr", "").children(...s);
- });
- C.html("").children(...e);
- }
- }
- class Kug {
- constructor() {
- this.calendar = new Dug(/* @__PURE__ */ new Date()), this.el = yg("div", `${Lg}-datepicker`).child(
- this.calendar.el
- ).hide();
- }
- setValue(I) {
- const { calendar: g } = this;
- return typeof I == "string" ? /^\d{4}-\d{1,2}-\d{1,2}$/.test(I) && g.setValue(new Date(I.replace(new RegExp("-", "g"), "/"))) : I instanceof Date && g.setValue(I), this;
- }
- change(I) {
- this.calendar.selectChange = (g) => {
- I(g), this.hide();
- };
- }
- show() {
- this.el.show();
- }
- hide() {
- this.el.hide();
- }
- }
- function YV() {
- const { inputText: t } = this;
- if (!/^\s*$/.test(t)) {
- const {
- textlineEl: I,
- textEl: g,
- areaOffset: C
- } = this, i = t.split(`
- `), e = Math.max(...i.map((d) => d.length)), s = I.offset().width / t.length, l = (e + 1) * s + 5, n = this.viewFn().width - C.left - s;
- let a = i.length;
- if (l > C.width) {
- let d = l;
- l > n && (d = n, a += parseInt(l / n, 10), a += l % n > 0 ? 1 : 0), g.css("width", `${d}px`);
- }
- a *= this.rowHeight, a > C.height && g.css("height", `${a}px`);
- }
- }
- function Fug({ target: t }, I) {
- const { value: g, selectionEnd: C } = t, i = `${g.slice(0, C)}${I}${g.slice(C)}`;
- t.value = i, t.setSelectionRange(C + 1, C + 1), this.inputText = i, this.textlineEl.html(i), YV.call(this);
- }
- function kug(t) {
- const { keyCode: I, altKey: g } = t;
- I !== 13 && I !== 9 && t.stopPropagation(), I === 13 && g && (Fug.call(this, t, `
- `), t.stopPropagation()), I === 13 && !g && t.preventDefault();
- }
- function zug(t) {
- const I = t.target.value, { suggest: g, textlineEl: C, validator: i } = this, { cell: e } = this;
- if (e !== null)
- if ("editable" in e && e.editable === !0 || e.editable === void 0) {
- if (this.inputText = I, i)
- i.type === "list" ? g.search(I) : g.hide();
- else {
- const A = I.lastIndexOf("=");
- A !== -1 ? g.search(I.substring(A + 1)) : g.hide();
- }
- C.html(I), YV.call(this), this.change("input", I);
- } else
- t.target.value = e.text;
- else {
- if (this.inputText = I, i)
- i.type === "list" ? g.search(I) : g.hide();
- else {
- const A = I.lastIndexOf("=");
- A !== -1 ? g.search(I.substring(A + 1)) : g.hide();
- }
- C.html(I), YV.call(this), this.change("input", I);
- }
- }
- function Jug(t) {
- const { el: I } = this.textEl;
- setTimeout(() => {
- I.focus(), I.setSelectionRange(t, t);
- }, 0);
- }
- function big(t, I) {
- const { textEl: g, textlineEl: C } = this;
- g.el.blur(), g.val(t), C.html(t), Jug.call(this, I);
- }
- function Lug(t) {
- const { inputText: I, validator: g } = this;
- let C = 0;
- if (g && g.type === "list")
- this.inputText = t, C = this.inputText.length;
- else {
- const i = I.lastIndexOf("="), e = I.substring(0, i + 1);
- let A = I.substring(i + 1);
- A.indexOf(")") !== -1 ? A = A.substring(A.indexOf(")")) : A = "", this.inputText = `${e + t.key}(`, C = this.inputText.length, this.inputText += `)${A}`;
- }
- big.call(this, this.inputText, C);
- }
- function vug() {
- this.suggest.setItems(this.formulas);
- }
- function Tug(t) {
- let I = t.getMonth() + 1, g = t.getDate();
- return I < 10 && (I = `0${I}`), g < 10 && (g = `0${g}`), `${t.getFullYear()}-${I}-${g}`;
- }
- class xug {
- constructor(I, g, C) {
- this.viewFn = g, this.rowHeight = C, this.formulas = I, this.suggest = new hig(I, (i) => {
- Lug.call(this, i);
- }), this.datepicker = new Kug(), this.datepicker.change((i) => {
- this.setText(Tug(i)), this.clear();
- }), this.areaEl = yg("div", `${Lg}-editor-area`).children(
- this.textEl = yg("textarea", "").on("input", (i) => zug.call(this, i)).on("paste.stop", () => {
- }).on("keydown", (i) => kug.call(this, i)),
- this.textlineEl = yg("div", "textline"),
- this.suggest.el,
- this.datepicker.el
- ).on("mousemove.stop", () => {
- }).on("mousedown.stop", () => {
- }), this.el = yg("div", `${Lg}-editor`).child(this.areaEl).hide(), this.suggest.bindInputEvents(this.textEl), this.areaOffset = null, this.freeze = { w: 0, h: 0 }, this.cell = null, this.inputText = "", this.change = () => {
- };
- }
- setFreezeLengths(I, g) {
- this.freeze.w = I, this.freeze.h = g;
- }
- clear() {
- this.inputText !== "" && this.change("finished", this.inputText), this.cell = null, this.areaOffset = null, this.inputText = "", this.el.hide(), this.textEl.val(""), this.textlineEl.html(""), vug.call(this), this.datepicker.hide();
- }
- setOffset(I, g = "top") {
- const {
- textEl: C,
- areaEl: i,
- suggest: e,
- freeze: A,
- el: s
- } = this;
- if (I) {
- this.areaOffset = I;
- const {
- left: l,
- top: n,
- width: a,
- height: d,
- l: o,
- t: c
- } = I, r = { left: 0, top: 0 };
- A.w > o && A.h > c || (A.w < o && A.h < c ? (r.left = A.w, r.top = A.h) : A.w > o ? r.top = A.h : A.h > c && (r.left = A.w)), s.offset(r), i.offset({ left: l - r.left - 0.8, top: n - r.top - 0.8 }), C.offset({ width: a - 9 + 0.8, height: d - 3 + 0.8 });
- const h = { left: 0 };
- h[g] = d, e.setOffset(h), e.hide();
- }
- }
- setCell(I, g) {
- const { el: C, datepicker: i, suggest: e } = this;
- C.show(), this.cell = I;
- const A = I && I.text || "";
- if (this.setText(A), this.validator = g, g) {
- const { type: s } = g;
- s === "date" && (i.show(), /^\s*$/.test(A) || i.setValue(A)), s === "list" && (e.setItems(g.values()), e.search(""));
- }
- }
- setText(I) {
- this.inputText = I, big.call(this, I, I.length), YV.call(this);
- }
- }
- class ad extends hd {
- // type: primary
- constructor(I, g = "") {
- super("div", `${Lg}-button ${g}`), this.child(bt(`button.${I}`));
- }
- }
- function NV() {
- return window.devicePixelRatio || 1;
- }
- function P9() {
- return NV() - 0.5;
- }
- function FI(t) {
- return parseInt(t * NV(), 10);
- }
- function Tr(t) {
- const I = FI(t);
- return I > 0 ? I - 0.5 : 0.5;
- }
- class jug {
- constructor(I, g, C, i, e = 0) {
- this.x = I, this.y = g, this.width = C, this.height = i, this.padding = e, this.bgcolor = "#ffffff", this.borderTop = null, this.borderRight = null, this.borderBottom = null, this.borderLeft = null;
- }
- setBorders({
- top: I,
- bottom: g,
- left: C,
- right: i
- }) {
- I && (this.borderTop = I), i && (this.borderRight = i), g && (this.borderBottom = g), C && (this.borderLeft = C);
- }
- innerWidth() {
- return this.width - this.padding * 2 - 2;
- }
- innerHeight() {
- return this.height - this.padding * 2 - 2;
- }
- textx(I) {
- const { width: g, padding: C } = this;
- let { x: i } = this;
- return I === "left" ? i += C : I === "center" ? i += g / 2 : I === "right" && (i += g - C), i;
- }
- texty(I, g) {
- const { height: C, padding: i } = this;
- let { y: e } = this;
- return I === "top" ? e += i : I === "middle" ? e += C / 2 - g / 2 : I === "bottom" && (e += C - i - g), e;
- }
- topxys() {
- const { x: I, y: g, width: C } = this;
- return [[I, g], [I + C, g]];
- }
- rightxys() {
- const {
- x: I,
- y: g,
- width: C,
- height: i
- } = this;
- return [[I + C, g], [I + C, g + i]];
- }
- bottomxys() {
- const {
- x: I,
- y: g,
- width: C,
- height: i
- } = this;
- return [[I, g + i], [I + C, g + i]];
- }
- leftxys() {
- const {
- x: I,
- y: g,
- height: C
- } = this;
- return [[I, g], [I, g + C]];
- }
- }
- function xq(t, I, g, C, i, e, A) {
- const s = { x: 0, y: 0 };
- t === "underline" ? i === "bottom" ? s.y = 0 : i === "top" ? s.y = -(e + 2) : s.y = -e / 2 : t === "strike" && (i === "bottom" ? s.y = e / 2 : i === "top" && (s.y = -(e / 2 + 2))), C === "center" ? s.x = A / 2 : C === "right" && (s.x = A), this.line(
- [I - s.x, g - s.y],
- [I - s.x + A, g - s.y]
- );
- }
- class uig {
- constructor(I, g, C) {
- this.el = I, this.ctx = I.getContext("2d"), this.resize(g, C), this.ctx.scale(NV(), NV());
- }
- resize(I, g) {
- this.el.style.width = `${I}px`, this.el.style.height = `${g}px`, this.el.width = FI(I), this.el.height = FI(g);
- }
- clear() {
- const { width: I, height: g } = this.el;
- return this.ctx.clearRect(0, 0, I, g), this;
- }
- attr(I) {
- return Object.assign(this.ctx, I), this;
- }
- save() {
- return this.ctx.save(), this.ctx.beginPath(), this;
- }
- restore() {
- return this.ctx.restore(), this;
- }
- beginPath() {
- return this.ctx.beginPath(), this;
- }
- translate(I, g) {
- return this.ctx.translate(FI(I), FI(g)), this;
- }
- scale(I, g) {
- return this.ctx.scale(I, g), this;
- }
- clearRect(I, g, C, i) {
- return this.ctx.clearRect(I, g, C, i), this;
- }
- fillRect(I, g, C, i) {
- return this.ctx.fillRect(FI(I) - 0.5, FI(g) - 0.5, FI(C), FI(i)), this;
- }
- fillText(I, g, C) {
- return this.ctx.fillText(I, FI(g), FI(C)), this;
- }
- /*
- txt: render text
- box: DrawBox
- attr: {
- align: left | center | right
- valign: top | middle | bottom
- color: '#333333',
- strike: false,
- font: {
- name: 'Arial',
- size: 14,
- bold: false,
- italic: false,
- }
- }
- textWrap: text wrapping
- */
- text(I, g, C = {}, i = !0) {
- const { ctx: e } = this, {
- align: A,
- valign: s,
- font: l,
- color: n,
- strike: a,
- underline: d
- } = C, o = g.textx(A);
- e.save(), e.beginPath(), this.attr({
- textAlign: A,
- textBaseline: s,
- font: `${l.italic ? "italic" : ""} ${l.bold ? "bold" : ""} ${FI(l.size)}px ${l.name}`,
- fillStyle: n,
- strokeStyle: n
- });
- const c = `${I}`.split(`
- `), r = g.innerWidth(), h = [];
- c.forEach((m) => {
- const Z = e.measureText(m).width;
- if (i && Z > FI(r)) {
- let p = { w: 0, len: 0, start: 0 };
- for (let Y = 0; Y < m.length; Y += 1)
- p.w >= FI(r) && (h.push(m.substr(p.start, p.len)), p = { w: 0, len: 0, start: Y }), p.len += 1, p.w += e.measureText(m[Y]).width + 1;
- p.len > 0 && h.push(m.substr(p.start, p.len));
- } else
- h.push(m);
- });
- const b = (h.length - 1) * (l.size + 2);
- let u = g.texty(s, b);
- return h.forEach((m) => {
- const Z = e.measureText(m).width;
- this.fillText(m, o, u), a && xq.call(this, "strike", o, u, A, s, l.size, Z), d && xq.call(this, "underline", o, u, A, s, l.size, Z), u += l.size + 2;
- }), e.restore(), this;
- }
- border(I, g) {
- const { ctx: C } = this;
- return C.lineWidth = P9, C.strokeStyle = g, I === "medium" ? C.lineWidth = FI(2) - 0.5 : I === "thick" ? C.lineWidth = FI(3) : I === "dashed" ? C.setLineDash([FI(3), FI(2)]) : I === "dotted" ? C.setLineDash([FI(1), FI(1)]) : I === "double" && C.setLineDash([FI(2), 0]), this;
- }
- line(...I) {
- const { ctx: g } = this;
- if (I.length > 1) {
- g.beginPath();
- const [C, i] = I[0];
- g.moveTo(Tr(C), Tr(i));
- for (let e = 1; e < I.length; e += 1) {
- const [A, s] = I[e];
- g.lineTo(Tr(A), Tr(s));
- }
- g.stroke();
- }
- return this;
- }
- strokeBorders(I) {
- const { ctx: g } = this;
- g.save();
- const {
- borderTop: C,
- borderRight: i,
- borderBottom: e,
- borderLeft: A
- } = I;
- C && (this.border(...C), this.line(...I.topxys())), i && (this.border(...i), this.line(...I.rightxys())), e && (this.border(...e), this.line(...I.bottomxys())), A && (this.border(...A), this.line(...I.leftxys())), g.restore();
- }
- dropdown(I) {
- const { ctx: g } = this, {
- x: C,
- y: i,
- width: e,
- height: A
- } = I, s = C + e - 15, l = i + A - 15;
- g.save(), g.beginPath(), g.moveTo(FI(s), FI(l)), g.lineTo(FI(s + 8), FI(l)), g.lineTo(FI(s + 4), FI(l + 6)), g.closePath(), g.fillStyle = "rgba(0, 0, 0, .45)", g.fill(), g.restore();
- }
- error(I) {
- const { ctx: g } = this, { x: C, y: i, width: e } = I, A = C + e - 1;
- g.save(), g.beginPath(), g.moveTo(FI(A - 8), FI(i - 1)), g.lineTo(FI(A), FI(i - 1)), g.lineTo(FI(A), FI(i + 8)), g.closePath(), g.fillStyle = "rgba(255, 0, 0, .65)", g.fill(), g.restore();
- }
- frozen(I) {
- const { ctx: g } = this, { x: C, y: i, width: e } = I, A = C + e - 1;
- g.save(), g.beginPath(), g.moveTo(FI(A - 8), FI(i - 1)), g.lineTo(FI(A), FI(i - 1)), g.lineTo(FI(A), FI(i + 8)), g.closePath(), g.fillStyle = "rgba(0, 255, 0, .85)", g.fill(), g.restore();
- }
- rect(I, g) {
- const { ctx: C } = this, {
- x: i,
- y: e,
- width: A,
- height: s,
- bgcolor: l
- } = I;
- C.save(), C.beginPath(), C.fillStyle = l || "#fff", C.rect(Tr(i + 1), Tr(e + 1), FI(A - 2), FI(s - 2)), C.clip(), C.fill(), g(), C.restore();
- }
- }
- const jq = [
- { key: "Arial", title: "Arial" },
- { key: "Helvetica", title: "Helvetica" },
- { key: "Source Sans Pro", title: "Source Sans Pro" },
- { key: "Comic Sans MS", title: "Comic Sans MS" },
- { key: "Courier New", title: "Courier New" },
- { key: "Verdana", title: "Verdana" },
- { key: "Lato", title: "Lato" }
- ], C9 = [
- { pt: 7.5, px: 10 },
- { pt: 8, px: 11 },
- { pt: 9, px: 12 },
- { pt: 10, px: 13 },
- { pt: 10.5, px: 14 },
- { pt: 11, px: 15 },
- { pt: 12, px: 16 },
- { pt: 14, px: 18.7 },
- { pt: 15, px: 20 },
- { pt: 16, px: 21.3 },
- { pt: 18, px: 24 },
- { pt: 22, px: 29.3 },
- { pt: 24, px: 32 },
- { pt: 26, px: 34.7 },
- { pt: 36, px: 48 },
- { pt: 42, px: 56 }
- // { pt: 54, px: 71.7 },
- // { pt: 63, px: 83.7 },
- // { pt: 72, px: 95.6 },
- ];
- function Qug(t) {
- for (let I = 0; I < C9.length; I += 1) {
- const g = C9[I];
- if (g.pt === t)
- return g.px;
- }
- return t;
- }
- const Oug = (t) => {
- const I = [], g = [];
- let C = [], i = 0, e = "", A = 1, s = "";
- for (let l = 0; l < t.length; l += 1) {
- const n = t.charAt(l);
- if (n !== " ") {
- if (n >= "a" && n <= "z")
- C.push(n.toUpperCase());
- else if (n >= "0" && n <= "9" || n >= "A" && n <= "Z" || n === ".")
- C.push(n);
- else if (n === '"') {
- for (l += 1; t.charAt(l) !== '"'; )
- C.push(t.charAt(l)), l += 1;
- g.push(`"${C.join("")}`), C = [];
- } else if (n === "-" && /[+\-*/,(]/.test(s))
- C.push(n);
- else {
- if (n !== "(" && C.length > 0 && g.push(C.join("")), n === ")") {
- let a = I.pop();
- if (i === 2)
- try {
- const [d, o] = Ua(g.pop()), [c, r] = Ua(g.pop());
- let h = 0;
- for (let b = c; b <= d; b += 1)
- for (let u = r; u <= o; u += 1)
- g.push(El(b, u)), h += 1;
- g.push([a, h]);
- } catch {
- }
- else if (i === 1 || i === 3)
- i === 3 && g.push(e), g.push([a, A]), A = 1;
- else
- for (; a !== "(" && (g.push(a), !(I.length <= 0)); )
- a = I.pop();
- i = 0;
- } else if (n === "=" || n === ">" || n === "<") {
- const a = t.charAt(l + 1);
- e = n, (a === "=" || a === "-") && (e += a, l += 1), i = 3;
- } else if (n === ":")
- i = 2;
- else if (n === ",")
- i === 3 && g.push(e), i = 1, A += 1;
- else if (n === "(" && C.length > 0)
- I.push(C.join(""));
- else {
- if (I.length > 0 && (n === "+" || n === "-")) {
- let a = I[I.length - 1];
- if (a !== "(" && g.push(I.pop()), a === "*" || a === "/")
- for (; I.length > 0 && (a = I[I.length - 1], a !== "("); )
- g.push(I.pop());
- } else if (I.length > 0) {
- const a = I[I.length - 1];
- (a === "*" || a === "/") && g.push(I.pop());
- }
- I.push(n);
- }
- C = [];
- }
- s = n;
- }
- }
- for (C.length > 0 && g.push(C.join("")); I.length > 0; )
- g.push(I.pop());
- return g;
- }, Uug = (t, I) => {
- const [g] = t;
- let C = t;
- if (g === '"')
- return t.substring(1);
- let i = 1;
- if (g === "-" && (C = t.substring(1), i = -1), C[0] >= "0" && C[0] <= "9")
- return i * Number(C);
- const [e, A] = Ua(C);
- return i * I(e, A);
- }, Eug = (t, I, g, C) => {
- const i = [];
- for (let e = 0; e < t.length; e += 1) {
- const A = t[e], s = A[0];
- if (A === "+") {
- const l = i.pop();
- i.push(Po("+", i.pop(), l));
- } else if (A === "-")
- if (i.length === 1) {
- const l = i.pop();
- i.push(Po("*", l, -1));
- } else {
- const l = i.pop();
- i.push(Po("-", i.pop(), l));
- }
- else if (A === "*")
- i.push(Po("*", i.pop(), i.pop()));
- else if (A === "/") {
- const l = i.pop();
- i.push(Po("/", i.pop(), l));
- } else if (s === "=" || s === ">" || s === "<") {
- let l = i.pop();
- Number.isNaN(l) || (l = Number(l));
- let n = i.pop();
- Number.isNaN(n) || (n = Number(n));
- let a = !1;
- s === "=" ? a = n === l : A === ">" ? a = n > l : A === ">=" ? a = n >= l : A === "<" ? a = n < l : A === "<=" && (a = n <= l), i.push(a);
- } else if (Array.isArray(A)) {
- const [l, n] = A, a = [];
- for (let d = 0; d < n; d += 1)
- a.push(i.pop());
- i.push(I[l].render(a.reverse()));
- } else {
- if (C.includes(A))
- return 0;
- (s >= "a" && s <= "z" || s >= "A" && s <= "Z") && C.push(A), i.push(Uug(A, g)), C.pop();
- }
- }
- return i[0];
- }, mig = (t, I, g, C = []) => {
- if (t[0] === "=") {
- const i = Oug(t.substring(1));
- return i.length <= 0 ? t : Eug(
- i,
- I,
- (e, A) => mig(g(e, A), I, g, C),
- C
- );
- }
- return t;
- }, Pug = {
- render: mig
- }, _9 = [
- {
- key: "SUM",
- title: $I("formula.sum"),
- render: (t) => t.reduce((I, g) => Po("+", I, g), 0)
- },
- {
- key: "AVERAGE",
- title: $I("formula.average"),
- render: (t) => t.reduce((I, g) => Number(I) + Number(g), 0) / t.length
- },
- {
- key: "MAX",
- title: $I("formula.max"),
- render: (t) => Math.max(...t.map((I) => Number(I)))
- },
- {
- key: "MIN",
- title: $I("formula.min"),
- render: (t) => Math.min(...t.map((I) => Number(I)))
- },
- {
- key: "IF",
- title: $I("formula._if"),
- render: ([t, I, g]) => t ? I : g
- },
- {
- key: "AND",
- title: $I("formula.and"),
- render: (t) => t.every((I) => I)
- },
- {
- key: "OR",
- title: $I("formula.or"),
- render: (t) => t.some((I) => I)
- },
- {
- key: "CONCAT",
- title: $I("formula.concat"),
- render: (t) => t.join("")
- }
- /* support: 1 + A1 + B2 * 3
- {
- key: 'DIVIDE',
- title: tf('formula.divide'),
- render: ary => ary.reduce((a, b) => Number(a) / Number(b)),
- },
- {
- key: 'PRODUCT',
- title: tf('formula.product'),
- render: ary => ary.reduce((a, b) => Number(a) * Number(b),1),
- },
- {
- key: 'SUBTRACT',
- title: tf('formula.subtract'),
- render: ary => ary.reduce((a, b) => Number(a) - Number(b)),
- },
- */
- ], _ug = _9, Zig = {};
- _9.forEach((t) => {
- Zig[t.key] = t;
- });
- const xr = (t) => t, iN = (t) => {
- if (/^(-?\d*.?\d*)$/.test(t)) {
- const I = Number(t).toFixed(2).toString(), [g, ...C] = I.split("\\.");
- return [g.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"), ...C];
- }
- return t;
- }, dm = [
- {
- key: "normal",
- title: $I("format.normal"),
- type: "string",
- render: xr
- },
- {
- key: "text",
- title: $I("format.text"),
- type: "string",
- render: xr
- },
- {
- key: "number",
- title: $I("format.number"),
- type: "number",
- label: "1,000.12",
- render: iN
- },
- {
- key: "percent",
- title: $I("format.percent"),
- type: "number",
- label: "10.12%",
- render: (t) => `${t}%`
- },
- {
- key: "rmb",
- title: $I("format.rmb"),
- type: "number",
- label: "¥10.00",
- render: (t) => `¥${iN(t)}`
- },
- {
- key: "usd",
- title: $I("format.usd"),
- type: "number",
- label: "$10.00",
- render: (t) => `$${iN(t)}`
- },
- {
- key: "eur",
- title: $I("format.eur"),
- type: "number",
- label: "€10.00",
- render: (t) => `€${iN(t)}`
- },
- {
- key: "date",
- title: $I("format.date"),
- type: "date",
- label: "26/09/2008",
- render: xr
- },
- {
- key: "time",
- title: $I("format.time"),
- type: "date",
- label: "15:59:00",
- render: xr
- },
- {
- key: "datetime",
- title: $I("format.datetime"),
- type: "date",
- label: "26/09/2008 15:59:00",
- render: xr
- },
- {
- key: "duration",
- title: $I("format.duration"),
- type: "date",
- label: "24:01:00",
- render: xr
- }
- ], Gig = {};
- dm.forEach((t) => {
- Gig[t.key] = t;
- });
- const qug = 5, $ug = { fillStyle: "#f4f5f8" }, gmg = {
- fillStyle: "#fff",
- lineWidth: P9,
- strokeStyle: "#e6e6e6"
- };
- function Img() {
- return {
- textAlign: "center",
- textBaseline: "middle",
- font: `500 ${FI(12)}px Source Sans Pro`,
- fillStyle: "#585757",
- lineWidth: P9(),
- strokeStyle: "#e6e6e6"
- };
- }
- function wig(t, I, g, C = 0) {
- const {
- left: i,
- top: e,
- width: A,
- height: s
- } = t.cellRect(I, g);
- return new jug(i, e + C, A, s, qug);
- }
- function VV(t, I, g, C, i = 0) {
- const { sortedRowMap: e, rows: A, cols: s } = I;
- if (A.isHide(g) || s.isHide(C)) return;
- let l = g;
- e.has(g) && (l = e.get(g));
- const n = I.getCell(l, C);
- if (n === null) return;
- let a = !1;
- "editable" in n && n.editable === !1 && (a = !0);
- const d = I.getCellStyleOrDefault(l, C), o = wig(I, g, C, i);
- o.bgcolor = d.bgcolor, d.border !== void 0 && (o.setBorders(d.border), t.strokeBorders(o)), t.rect(o, () => {
- let c = "";
- I.settings.evalPaused ? c = n.text || "" : c = Pug.render(n.text || "", Zig, (b, u) => I.getCellTextOrDefault(u, b)), d.format && (c = Gig[d.format].render(c));
- const r = Object.assign({}, d.font);
- r.size = Qug(r.size), t.text(c, o, {
- align: d.align,
- valign: d.valign,
- font: r,
- color: d.color,
- strike: d.strike,
- underline: d.underline
- }, d.textwrap), I.validations.getError(g, C) && t.error(o), a && t.frozen(o);
- });
- }
- function Cmg(t) {
- const { data: I, draw: g } = this;
- if (t) {
- const { autoFilter: C } = I;
- if (!C.active()) return;
- const i = C.hrange();
- t.intersects(i) && i.each((e, A) => {
- const s = wig(I, e, A);
- g.dropdown(s);
- });
- }
- }
- function eN(t, I, g, C, i) {
- const { draw: e, data: A } = this;
- e.save(), e.translate(I, g).translate(C, i);
- const { exceptRowSet: s } = A, l = (d) => {
- const o = s.has(d);
- if (o) {
- const c = A.rows.getHeight(d);
- e.translate(0, -c);
- }
- return !o;
- }, n = A.exceptRowTotalHeight(t.sri, t.eri);
- e.save(), e.translate(0, -n), t.each((d, o) => {
- VV(e, A, d, o);
- }, (d) => l(d)), e.restore();
- const a = /* @__PURE__ */ new Set();
- e.save(), e.translate(0, -n), A.eachMergesInView(t, ({ sri: d, sci: o, eri: c }) => {
- if (!s.has(d))
- VV(e, A, d, o);
- else if (!a.has(d)) {
- a.add(d);
- const r = A.rows.sumHeight(d, c + 1);
- e.translate(0, -r);
- }
- }), e.restore(), Cmg.call(this, t), e.restore();
- }
- function Qq(t, I, g, C) {
- const { draw: i } = this;
- i.save(), i.attr({ fillStyle: "rgba(75, 137, 255, 0.08)" }).fillRect(t, I, g, C), i.restore();
- }
- function AN(t, I, g, C, i, e) {
- const { draw: A, data: s } = this, l = I.h, n = I.w, a = e + C, d = i + g;
- A.save(), A.attr($ug), (t === "all" || t === "left") && A.fillRect(0, a, g, l), (t === "all" || t === "top") && A.fillRect(d, 0, n, C);
- const {
- sri: o,
- sci: c,
- eri: r,
- eci: h
- } = s.selector.range;
- A.attr(Img()), (t === "all" || t === "left") && (s.rowEach(I.sri, I.eri, (b, u, m) => {
- const Z = a + u, p = b;
- A.line([0, Z], [g, Z]), o <= p && p < r + 1 && Qq.call(this, 0, Z, g, m), A.fillText(p + 1, g / 2, Z + m / 2), b > 0 && s.rows.isHide(b - 1) && (A.save(), A.attr({ strokeStyle: "#c6c6c6" }), A.line([5, Z + 5], [g - 5, Z + 5]), A.restore());
- }), A.line([0, l + a], [g, l + a]), A.line([g, a], [g, l + a])), (t === "all" || t === "top") && (s.colEach(I.sci, I.eci, (b, u, m) => {
- const Z = d + u, p = b;
- A.line([Z, 0], [Z, C]), c <= p && p < h + 1 && Qq.call(this, Z, 0, m, C), A.fillText(eig(p), Z + m / 2, C / 2), b > 0 && s.cols.isHide(b - 1) && (A.save(), A.attr({ strokeStyle: "#c6c6c6" }), A.line([Z + 5, 5], [Z + 5, C - 5]), A.restore());
- }), A.line([n + d, 0], [n + d, C]), A.line([0, C], [n + d, C])), A.restore();
- }
- function tmg(t, I) {
- const { draw: g } = this;
- g.save(), g.attr({ fillStyle: "#f4f5f8" }).fillRect(0, 0, t, I), g.restore();
- }
- function sN({
- sri: t,
- sci: I,
- eri: g,
- eci: C,
- w: i,
- h: e
- }, A, s, l, n) {
- const { draw: a, data: d } = this, { settings: o } = d;
- if (a.save(), a.attr(gmg).translate(A + l, s + n), !o.showGrid) {
- a.restore();
- return;
- }
- d.rowEach(t, g, (c, r, h) => {
- c !== t && a.line([0, r], [i, r]), c === g && a.line([0, r + h], [i, r + h]);
- }), d.colEach(I, C, (c, r, h) => {
- c !== I && a.line([r, 0], [r, e]), c === C && a.line([r + h, 0], [r + h, e]);
- }), a.restore();
- }
- function img(t, I, g, C) {
- const { draw: i, data: e } = this, A = e.viewWidth() - t, s = e.viewHeight() - I;
- i.save().translate(t, I).attr({ strokeStyle: "rgba(75, 137, 255, .6)" }), i.line([0, C], [A, C]), i.line([g, 0], [g, s]), i.restore();
- }
- class emg {
- constructor(I, g) {
- this.el = I, this.draw = new uig(I, g.viewWidth(), g.viewHeight()), this.data = g;
- }
- resetData(I) {
- this.data = I, this.render();
- }
- render() {
- const { data: I } = this, { rows: g, cols: C } = I, i = C.indexWidth, e = g.height;
- this.draw.resize(I.viewWidth(), I.viewHeight()), this.clear();
- const A = I.viewRange(), s = I.freezeTotalWidth(), l = I.freezeTotalHeight(), { x: n, y: a } = I.scroll;
- sN.call(this, A, i, e, s, l), eN.call(this, A, i, e, -n, -a), AN.call(this, "all", A, i, e, s, l), tmg.call(this, i, e);
- const [d, o] = I.freeze;
- if (d > 0 || o > 0) {
- if (d > 0) {
- const r = A.clone();
- r.sri = 0, r.eri = d - 1, r.h = l, sN.call(this, r, i, e, s, 0), eN.call(this, r, i, e, -n, 0), AN.call(this, "top", r, i, e, s, 0);
- }
- if (o > 0) {
- const r = A.clone();
- r.sci = 0, r.eci = o - 1, r.w = s, sN.call(this, r, i, e, 0, l), AN.call(this, "left", r, i, e, 0, l), eN.call(this, r, i, e, 0, -a);
- }
- const c = I.freezeViewRange();
- sN.call(this, c, i, e, 0, 0), AN.call(this, "all", c, i, e, 0, 0), eN.call(this, c, i, e, 0, 0), img.call(this, i, e, s, l);
- }
- }
- clear() {
- this.draw.clear();
- }
- }
- const qN = [
- ["A3", 11.69, 16.54],
- ["A4", 8.27, 11.69],
- ["A5", 5.83, 8.27],
- ["B4", 9.84, 13.9],
- ["B5", 6.93, 9.84]
- ], t9 = ["landscape", "portrait"];
- function MV(t) {
- return parseInt(96 * t, 10);
- }
- function Oq(t) {
- t === "cancel" ? this.el.hide() : this.toPrint();
- }
- function Amg(t) {
- const { paper: I } = this, { value: g } = t.target, C = qN[g];
- I.w = MV(C[1]), I.h = MV(C[2]), this.preview();
- }
- function smg(t) {
- const { paper: I } = this, { value: g } = t.target, C = t9[g];
- I.orientation = C, this.preview();
- }
- let lmg = class {
- constructor(I) {
- this.paper = {
- w: MV(qN[0][1]),
- h: MV(qN[0][2]),
- padding: 50,
- orientation: t9[0],
- get width() {
- return this.orientation === "landscape" ? this.h : this.w;
- },
- get height() {
- return this.orientation === "landscape" ? this.w : this.h;
- }
- }, this.data = I, this.el = yg("div", `${Lg}-print`).children(
- yg("div", `${Lg}-print-bar`).children(
- yg("div", "-title").child("Print settings"),
- yg("div", "-right").children(
- yg("div", `${Lg}-buttons`).children(
- new ad("cancel").on("click", Oq.bind(this, "cancel")),
- new ad("next", "primary").on("click", Oq.bind(this, "next"))
- )
- )
- ),
- yg("div", `${Lg}-print-content`).children(
- this.contentEl = yg("div", "-content"),
- yg("div", "-sider").child(
- yg("form", "").children(
- yg("fieldset", "").children(
- yg("label", "").child(`${bt("print.size")}`),
- yg("select", "").children(
- ...qN.map((g, C) => yg("option", "").attr("value", C).child(`${g[0]} ( ${g[1]}''x${g[2]}'' )`))
- ).on("change", Amg.bind(this))
- ),
- yg("fieldset", "").children(
- yg("label", "").child(`${bt("print.orientation")}`),
- yg("select", "").children(
- ...t9.map((g, C) => yg("option", "").attr("value", C).child(`${bt("print.orientations")[C]}`))
- ).on("change", smg.bind(this))
- )
- )
- )
- )
- ).hide();
- }
- resetData(I) {
- this.data = I;
- }
- preview() {
- const { data: I, paper: g } = this, { width: C, height: i, padding: e } = g, A = C - e * 2, s = i - e * 2, l = I.contentRange(), n = parseInt(l.h / s, 10) + 1, a = A / l.w;
- let d = e;
- const o = e;
- a > 1 && (d += (A - l.w) / 2);
- let c = 0, r = 0;
- this.contentEl.html(""), this.canvases = [];
- const h = {
- sri: 0,
- sci: 0,
- eri: 0,
- eci: 0
- };
- for (let b = 0; b < n; b += 1) {
- let u = 0, m = 0;
- const Z = yg("div", `${Lg}-canvas-card`), p = yg("canvas", `${Lg}-canvas`);
- this.canvases.push(p.el);
- const Y = new uig(p.el, C, i);
- for (Y.save(), Y.translate(d, o), a < 1 && Y.scale(a, a); c <= l.eri; c += 1) {
- const X = I.rows.getHeight(c);
- if (u += X, u < s)
- for (let H = 0; H <= l.eci; H += 1)
- VV(Y, I, c, H, r), h.eci = H;
- else {
- m = -(u - X);
- break;
- }
- }
- h.eri = c, Y.restore(), Y.save(), Y.translate(d, o), a < 1 && Y.scale(a, a);
- const R = r;
- I.eachMergesInView(h, ({ sri: X, sci: H }) => {
- VV(Y, I, X, H, R);
- }), Y.restore(), h.sri = h.eri, h.sci = h.eci, r += m, this.contentEl.child(yg("div", `${Lg}-canvas-card-wraper`).child(Z.child(p)));
- }
- this.el.show();
- }
- toPrint() {
- this.el.hide();
- const { paper: I } = this, g = yg("iframe", "").hide(), { el: C } = g;
- window.document.body.appendChild(C);
- const { contentWindow: i } = C, e = i.document, A = document.createElement("style");
- A.innerHTML = `
- @page { size: ${I.width}px ${I.height}px; };
- canvas {
- page-break-before: auto;
- page-break-after: always;
- image-rendering: pixelated;
- };
- `, e.head.appendChild(A), this.canvases.forEach((s) => {
- const l = s.cloneNode(!1);
- l.getContext("2d").drawImage(s, 0, 0), e.body.appendChild(l);
- }), i.print();
- }
- };
- const nmg = [
- { key: "copy", title: $I("contextmenu.copy"), label: "Ctrl+C" },
- { key: "cut", title: $I("contextmenu.cut"), label: "Ctrl+X" },
- { key: "paste", title: $I("contextmenu.paste"), label: "Ctrl+V" },
- { key: "paste-value", title: $I("contextmenu.pasteValue"), label: "Ctrl+Shift+V" },
- { key: "paste-format", title: $I("contextmenu.pasteFormat"), label: "Ctrl+Alt+V" },
- { key: "divider" },
- { key: "insert-row", title: $I("contextmenu.insertRow") },
- { key: "insert-column", title: $I("contextmenu.insertColumn") },
- { key: "divider" },
- { key: "delete-row", title: $I("contextmenu.deleteRow") },
- { key: "delete-column", title: $I("contextmenu.deleteColumn") },
- { key: "delete-cell-text", title: $I("contextmenu.deleteCellText") },
- { key: "hide", title: $I("contextmenu.hide") },
- { key: "divider" },
- { key: "validation", title: $I("contextmenu.validation") },
- { key: "divider" },
- { key: "cell-printable", title: $I("contextmenu.cellprintable") },
- { key: "cell-non-printable", title: $I("contextmenu.cellnonprintable") },
- { key: "divider" },
- { key: "cell-editable", title: $I("contextmenu.celleditable") },
- { key: "cell-non-editable", title: $I("contextmenu.cellnoneditable") }
- ];
- function amg(t) {
- return t.key === "divider" ? yg("div", `${Lg}-item divider`) : yg("div", `${Lg}-item`).on("click", () => {
- this.itemClick(t.key), this.hide();
- }).children(
- t.title(),
- yg("div", "label").child(t.label || "")
- );
- }
- function omg() {
- return nmg.map((t) => amg.call(this, t));
- }
- let cmg = class {
- constructor(I, g = !1) {
- this.menuItems = omg.call(this), this.el = yg("div", `${Lg}-contextmenu`).children(...this.menuItems).hide(), this.viewFn = I, this.itemClick = () => {
- }, this.isHide = g, this.setMode("range");
- }
- // row-col: the whole rows or the whole cols
- // range: select range
- setMode(I) {
- const g = this.menuItems[12];
- I === "row-col" ? g.show() : g.hide();
- }
- hide() {
- const { el: I } = this;
- I.hide(), X0(I);
- }
- setPosition(I, g) {
- if (this.isHide) return;
- const { el: C } = this, { width: i } = C.show().offset(), e = this.viewFn(), A = e.height / 2;
- let s = I;
- e.width - I <= i && (s -= i), C.css("left", `${s}px`), g > A ? C.css("bottom", `${e.height - g}px`).css("max-height", `${g}px`).css("top", "auto") : C.css("top", `${g}px`).css("max-height", `${e.height - g}px`).css("bottom", "auto"), ZG(C);
- }
- };
- function dmg(t, I) {
- if (I.classList.contains("active"))
- return;
- const {
- left: g,
- top: C,
- width: i,
- height: e
- } = I.getBoundingClientRect(), A = yg("div", `${Lg}-tooltip`).html(t).show();
- document.body.appendChild(A.el);
- const s = A.box();
- A.css("left", `${g + i / 2 - s.width / 2}px`).css("top", `${C + e + 2}px`), $i(I, "mouseleave", () => {
- document.body.contains(A.el) && document.body.removeChild(A.el);
- }), $i(I, "click", () => {
- document.body.contains(A.el) && document.body.removeChild(A.el);
- });
- }
- class q9 {
- // tooltip
- // tag: the subclass type
- // shortcut: shortcut key
- constructor(I, g, C) {
- this.tip = bt(`toolbar.${I.replace(/-[a-z]/g, (i) => i[1].toUpperCase())}`), g && (this.tip += ` (${g})`), this.tag = I, this.shortcut = g, this.value = C, this.el = this.element(), this.change = () => {
- };
- }
- element() {
- const { tip: I } = this;
- return yg("div", `${Lg}-toolbar-btn`).on("mouseenter", (g) => {
- dmg(I, g.target);
- }).attr("data-tooltip", I);
- }
- setState() {
- }
- }
- class Js extends q9 {
- dropdown() {
- }
- getValue(I) {
- return I;
- }
- element() {
- const { tag: I } = this;
- return this.dd = this.dropdown(), this.dd.change = (g) => this.change(I, this.getValue(g)), super.element().child(
- this.dd
- );
- }
- setState(I) {
- I && (this.value = I, this.dd.setTitle(I));
- }
- }
- class Ls extends hd {
- constructor(I, g, C, i, ...e) {
- super("div", `${Lg}-dropdown ${i}`), this.title = I, this.change = () => {
- }, this.headerClick = () => {
- }, typeof I == "string" ? this.title = yg("div", `${Lg}-dropdown-title`).child(I) : C && this.title.addClass("arrow-left"), this.contentEl = yg("div", `${Lg}-dropdown-content`).css("width", g).hide(), this.setContentChildren(...e), this.headerEl = yg("div", `${Lg}-dropdown-header`), this.headerEl.on("click", () => {
- this.contentEl.css("display") !== "block" ? this.show() : this.hide();
- }).children(
- this.title,
- C ? yg("div", `${Lg}-icon arrow-right`).child(
- yg("div", `${Lg}-icon-img arrow-down`)
- ) : ""
- ), this.children(this.headerEl, this.contentEl);
- }
- setContentChildren(...I) {
- this.contentEl.html(""), I.length > 0 && this.contentEl.children(...I);
- }
- setTitle(I) {
- this.title.html(I), this.hide();
- }
- show() {
- const { contentEl: I } = this;
- I.show(), this.parent().active(), ZG(this.parent(), () => {
- this.hide();
- });
- }
- hide() {
- this.parent().active(!1), this.contentEl.hide(), X0(this.parent());
- }
- }
- function rmg(t) {
- return yg("div", `${Lg}-item`).child(new pi(t));
- }
- class pig extends Ls {
- constructor(I, g) {
- const C = new pi(`align-${g}`), i = I.map((e) => rmg(`align-${e}`).on("click", () => {
- this.setTitle(e), this.change(e);
- }));
- super(C, "auto", !0, "bottom-left", ...i);
- }
- setTitle(I) {
- this.title.setName(`align-${I}`), this.hide();
- }
- }
- class hmg extends Js {
- constructor(I) {
- super("align", "", I);
- }
- dropdown() {
- const { value: I } = this;
- return new pig(["left", "center", "right"], I);
- }
- }
- class bmg extends Js {
- constructor(I) {
- super("valign", "", I);
- }
- dropdown() {
- const { value: I } = this;
- return new pig(["top", "middle", "bottom"], I);
- }
- }
- class en extends q9 {
- element() {
- const { tag: I } = this;
- return super.element().child(new pi(I)).on("click", () => this.click());
- }
- click() {
- this.change(this.tag, this.toggle());
- }
- setState(I) {
- this.el.active(I);
- }
- toggle() {
- return this.el.toggle();
- }
- active() {
- return this.el.hasClass("active");
- }
- }
- class umg extends en {
- constructor() {
- super("autofilter");
- }
- setState() {
- }
- }
- class mmg extends en {
- constructor() {
- super("font-bold", "Ctrl+B");
- }
- }
- class Zmg extends en {
- constructor() {
- super("font-italic", "Ctrl+I");
- }
- }
- class Gmg extends en {
- constructor() {
- super("strike", "Ctrl+U");
- }
- }
- class wmg extends en {
- constructor() {
- super("underline", "Ctrl+U");
- }
- }
- const pmg = ["#ffffff", "#000100", "#e7e5e6", "#445569", "#5b9cd6", "#ed7d31", "#a5a5a5", "#ffc001", "#4371c6", "#71ae47"], Bmg = [
- ["#f2f2f2", "#7f7f7f", "#d0cecf", "#d5dce4", "#deeaf6", "#fce5d5", "#ededed", "#fff2cd", "#d9e2f3", "#e3efd9"],
- ["#d8d8d8", "#595959", "#afabac", "#adb8ca", "#bdd7ee", "#f7ccac", "#dbdbdb", "#ffe59a", "#b3c6e7", "#c5e0b3"],
- ["#bfbfbf", "#3f3f3f", "#756f6f", "#8596b0", "#9cc2e6", "#f4b184", "#c9c9c9", "#fed964", "#8eaada", "#a7d08c"],
- ["#a5a5a5", "#262626", "#3a3839", "#333f4f", "#2e75b5", "#c45a10", "#7b7b7b", "#bf8e01", "#2f5596", "#538136"],
- ["#7f7f7f", "#0c0c0c", "#171516", "#222a35", "#1f4e7a", "#843c0a", "#525252", "#7e6000", "#203864", "#365624"]
- ], Wmg = ["#c00000", "#fe0000", "#fdc101", "#ffff01", "#93d051", "#00b04e", "#01b0f1", "#0170c1", "#012060", "#7030a0"];
- function JX(t) {
- return yg("td", "").child(
- yg("div", `${Lg}-color-palette-cell`).on("click.stop", () => this.change(t)).css("background-color", t)
- );
- }
- class ymg {
- constructor() {
- this.el = yg("div", `${Lg}-color-palette`), this.change = () => {
- };
- const I = yg("table", "").children(
- yg("tbody", "").children(
- yg("tr", `${Lg}-theme-color-placeholders`).children(
- ...pmg.map((g) => JX.call(this, g))
- ),
- ...Bmg.map((g) => yg("tr", `${Lg}-theme-colors`).children(
- ...g.map((C) => JX.call(this, C))
- )),
- yg("tr", `${Lg}-standard-colors`).children(
- ...Wmg.map((g) => JX.call(this, g))
- )
- )
- );
- this.el.child(I);
- }
- }
- class $9 extends Ls {
- constructor(I, g) {
- const C = new pi(I).css("height", "16px").css("border-bottom", `3px solid ${g}`), i = new ymg();
- i.change = (e) => {
- this.setTitle(e), this.change(e);
- }, super(C, "auto", !1, "bottom-left", i.el);
- }
- setTitle(I) {
- this.title.css("border-color", I), this.hide();
- }
- }
- const Ymg = [
- ["thin", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="1" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" style="user-select: none;"></line></svg>'],
- ["medium", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="2" style="user-select: none;"><line x1="0" y1="1.0" x2="50" y2="1.0" stroke-width="2" stroke="black" style="user-select: none;"></line></svg>'],
- ["thick", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="3" style="user-select: none;"><line x1="0" y1="1.5" x2="50" y2="1.5" stroke-width="3" stroke="black" style="user-select: none;"></line></svg>'],
- ["dashed", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="1" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" stroke-dasharray="2" style="user-select: none;"></line></svg>'],
- ["dotted", '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="1" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" stroke-dasharray="1" style="user-select: none;"></line></svg>']
- // ['double', '<svg xmlns="http://www.w3.org/2000/svg" width="50" height="3" style="user-select: none;"><line x1="0" y1="0.5" x2="50" y2="0.5" stroke-width="1" stroke="black" style="user-select: none;"></line><line x1="0" y1="2.5" x2="50" y2="2.5" stroke-width="1" stroke="black" style="user-select: none;"></line></svg>'],
- ];
- class Nmg extends Ls {
- constructor(I) {
- const g = new pi("line-type");
- let C = 0;
- const i = Ymg.map((e, A) => yg("div", `${Lg}-item state ${I === e[0] ? "checked" : ""}`).on("click", () => {
- i[C].toggle("checked"), i[A].toggle("checked"), C = A, this.hide(), this.change(e);
- }).child(
- yg("div", `${Lg}-line-type`).html(e[1])
- ));
- super(g, "auto", !1, "bottom-left", ...i);
- }
- }
- function Uq(...t) {
- return yg("table", "").child(
- yg("tbody", "").children(...t)
- );
- }
- function Eq(t) {
- return yg("td", "").child(
- yg("div", `${Lg}-border-palette-cell`).child(
- new pi(`border-${t}`)
- ).on("click", () => {
- this.mode = t;
- const { mode: I, style: g, color: C } = this;
- this.change({ mode: I, style: g, color: C });
- })
- );
- }
- class Vmg {
- constructor() {
- this.color = "#000", this.style = "thin", this.mode = "all", this.change = () => {
- }, this.ddColor = new $9("line-color", this.color), this.ddColor.change = (g) => {
- this.color = g;
- }, this.ddType = new Nmg(this.style), this.ddType.change = ([g]) => {
- this.style = g;
- }, this.el = yg("div", `${Lg}-border-palette`);
- const I = Uq(
- yg("tr", "").children(
- yg("td", `${Lg}-border-palette-left`).child(
- Uq(
- yg("tr", "").children(
- ...["all", "inside", "horizontal", "vertical", "outside"].map((g) => Eq.call(this, g))
- ),
- yg("tr", "").children(
- ...["left", "top", "right", "bottom", "none"].map((g) => Eq.call(this, g))
- )
- )
- ),
- yg("td", `${Lg}-border-palette-right`).children(
- yg("div", `${Lg}-toolbar-btn`).child(this.ddColor.el),
- yg("div", `${Lg}-toolbar-btn`).child(this.ddType.el)
- )
- )
- );
- this.el.child(I);
- }
- }
- class Mmg extends Ls {
- constructor() {
- const I = new pi("border-all"), g = new Vmg();
- g.change = (C) => {
- this.change(C), this.hide();
- }, super(I, "auto", !1, "bottom-left", g.el);
- }
- }
- class Rmg extends Js {
- constructor() {
- super("border");
- }
- dropdown() {
- return new Mmg();
- }
- }
- class hM extends q9 {
- element() {
- return super.element().child(new pi(this.tag)).on("click", () => this.change(this.tag));
- }
- setState(I) {
- this.el.disabled(I);
- }
- }
- class fmg extends hM {
- constructor() {
- super("clearformat");
- }
- }
- class Hmg extends en {
- constructor() {
- super("paintformat");
- }
- setState() {
- }
- }
- class Xmg extends Js {
- constructor(I) {
- super("color", void 0, I);
- }
- dropdown() {
- const { tag: I, value: g } = this;
- return new $9(I, g);
- }
- }
- class Smg extends Js {
- constructor(I) {
- super("bgcolor", void 0, I);
- }
- dropdown() {
- const { tag: I, value: g } = this;
- return new $9(I, g);
- }
- }
- class Dmg extends Ls {
- constructor() {
- const I = C9.map((g) => yg("div", `${Lg}-item`).on("click", () => {
- this.setTitle(`${g.pt}`), this.change(g);
- }).child(`${g.pt}`));
- super("10", "60px", !0, "bottom-left", ...I);
- }
- }
- let Kmg = class extends Js {
- constructor() {
- super("font-size");
- }
- getValue(I) {
- return I.pt;
- }
- dropdown() {
- return new Dmg();
- }
- };
- class Fmg extends Ls {
- constructor() {
- const I = jq.map((g) => yg("div", `${Lg}-item`).on("click", () => {
- this.setTitle(g.title), this.change(g);
- }).child(g.title));
- super(jq[0].title, "160px", !0, "bottom-left", ...I);
- }
- }
- class kmg extends Js {
- constructor() {
- super("font-name");
- }
- getValue(I) {
- return I.key;
- }
- dropdown() {
- return new Fmg();
- }
- }
- class zmg extends Ls {
- constructor() {
- let I = dm.slice(0);
- I.splice(2, 0, { key: "divider" }), I.splice(8, 0, { key: "divider" }), I = I.map((g) => {
- const C = yg("div", `${Lg}-item`);
- return g.key === "divider" ? C.addClass("divider") : (C.child(g.title()).on("click", () => {
- this.setTitle(g.title()), this.change(g);
- }), g.label && C.child(yg("div", "label").html(g.label))), C;
- }), super("Normal", "220px", !0, "bottom-left", ...I);
- }
- setTitle(I) {
- for (let g = 0; g < dm.length; g += 1)
- dm[g].key === I && this.title.html(dm[g].title());
- this.hide();
- }
- }
- let Jmg = class extends Js {
- constructor() {
- super("format");
- }
- getValue(I) {
- return I.key;
- }
- dropdown() {
- return new zmg();
- }
- };
- class Lmg extends Ls {
- constructor() {
- const I = _9.map((g) => yg("div", `${Lg}-item`).on("click", () => {
- this.hide(), this.change(g);
- }).child(g.key));
- super(new pi("formula"), "180px", !0, "bottom-left", ...I);
- }
- }
- class vmg extends Js {
- constructor() {
- super("formula");
- }
- getValue(I) {
- return I.key;
- }
- dropdown() {
- return new Lmg();
- }
- }
- class Tmg extends en {
- constructor() {
- super("freeze");
- }
- }
- class xmg extends en {
- constructor() {
- super("merge");
- }
- setState(I, g) {
- this.el.active(I).disabled(g);
- }
- }
- class jmg extends hM {
- constructor() {
- super("redo", "Ctrl+Y");
- }
- }
- class Qmg extends hM {
- constructor() {
- super("undo", "Ctrl+Z");
- }
- }
- class Omg extends hM {
- constructor() {
- super("print", "Ctrl+P");
- }
- }
- class Umg extends en {
- constructor() {
- super("textwrap");
- }
- }
- let Emg = class extends Ls {
- constructor() {
- const I = new pi("ellipsis"), g = yg("div", `${Lg}-toolbar-more`);
- super(I, "auto", !1, "bottom-right", g), this.moreBtns = g, this.contentEl.css("max-width", "420px");
- }
- };
- class Pmg extends Js {
- constructor() {
- super("more"), this.el.hide();
- }
- dropdown() {
- return new Emg();
- }
- show() {
- this.el.show();
- }
- hide() {
- this.el.hide();
- }
- }
- function jr() {
- return yg("div", `${Lg}-toolbar-divider`);
- }
- function _mg() {
- this.btns2 = [], this.items.forEach((t) => {
- if (Array.isArray(t))
- t.forEach(({ el: I }) => {
- const g = I.box(), { marginLeft: C, marginRight: i } = I.computedStyle();
- this.btns2.push([I, g.width + parseInt(C, 10) + parseInt(i, 10)]);
- });
- else {
- const I = t.box(), { marginLeft: g, marginRight: C } = t.computedStyle();
- this.btns2.push([t, I.width + parseInt(g, 10) + parseInt(C, 10)]);
- }
- });
- }
- function Pq() {
- const {
- el: t,
- btns: I,
- moreEl: g,
- btns2: C
- } = this, { moreBtns: i, contentEl: e } = g.dd;
- t.css("width", `${this.widthFn() - 60}px`);
- const A = t.box();
- let s = 160, l = 12;
- const n = [], a = [];
- C.forEach(([d, o], c) => {
- s += o, c === C.length - 1 || s < A.width ? n.push(d) : (l += o, a.push(d));
- }), I.html("").children(...n), i.html("").children(...a), e.css("width", `${l}px`), a.length > 0 ? g.show() : g.hide();
- }
- class qmg {
- constructor(I, g, C = !1) {
- this.data = I, this.change = () => {
- }, this.widthFn = g, this.isHide = C;
- const i = I.defaultStyle();
- this.items = [
- [
- this.undoEl = new Qmg(),
- this.redoEl = new jmg(),
- new Omg(),
- this.paintformatEl = new Hmg(),
- this.clearformatEl = new fmg()
- ],
- jr(),
- [
- this.formatEl = new Jmg()
- ],
- jr(),
- [
- this.fontEl = new kmg(),
- this.fontSizeEl = new Kmg()
- ],
- jr(),
- [
- this.boldEl = new mmg(),
- this.italicEl = new Zmg(),
- this.underlineEl = new wmg(),
- this.strikeEl = new Gmg(),
- this.textColorEl = new Xmg(i.color)
- ],
- jr(),
- [
- this.fillColorEl = new Smg(i.bgcolor),
- this.borderEl = new Rmg(),
- this.mergeEl = new xmg()
- ],
- jr(),
- [
- this.alignEl = new hmg(i.align),
- this.valignEl = new bmg(i.valign),
- this.textwrapEl = new Umg()
- ],
- jr(),
- [
- this.freezeEl = new Tmg(),
- this.autofilterEl = new umg(),
- this.formulaEl = new vmg(),
- this.moreEl = new Pmg()
- ]
- ], this.el = yg("div", `${Lg}-toolbar`), this.btns = yg("div", `${Lg}-toolbar-btns`), this.items.forEach((e) => {
- Array.isArray(e) ? e.forEach((A) => {
- this.btns.child(A.el), A.change = (...s) => {
- this.change(...s);
- };
- }) : this.btns.child(e.el);
- }), this.el.child(this.btns), C ? this.el.hide() : (this.reset(), setTimeout(() => {
- _mg.call(this), Pq.call(this);
- }, 0), $i(window, "resize", () => {
- Pq.call(this);
- }));
- }
- paintformatActive() {
- return this.paintformatEl.active();
- }
- paintformatToggle() {
- this.paintformatEl.toggle();
- }
- trigger(I) {
- this[`${I}El`].click();
- }
- resetData(I) {
- this.data = I, this.reset();
- }
- reset() {
- if (this.isHide) return;
- const { data: I } = this, g = I.getSelectedCellStyle();
- this.undoEl.setState(!I.canUndo()), this.redoEl.setState(!I.canRedo()), this.mergeEl.setState(I.canUnmerge(), !I.selector.multiple()), this.autofilterEl.setState(!I.canAutofilter());
- const { font: C, format: i } = g;
- this.formatEl.setState(i), this.fontEl.setState(C.name), this.fontSizeEl.setState(C.size), this.boldEl.setState(C.bold), this.italicEl.setState(C.italic), this.underlineEl.setState(g.underline), this.strikeEl.setState(g.strike), this.textColorEl.setState(g.color), this.fillColorEl.setState(g.bgcolor), this.alignEl.setState(g.align), this.valignEl.setState(g.valign), this.textwrapEl.setState(g.textwrap), this.freezeEl.setState(I.freezeIsActive());
- }
- }
- class $mg {
- constructor(I, g, C = "600px") {
- this.title = I, this.el = yg("div", `${Lg}-modal`).css("width", C).children(
- yg("div", `${Lg}-modal-header`).children(
- new pi("close").on("click.stop", () => this.hide()),
- this.title
- ),
- yg("div", `${Lg}-modal-content`).children(...g)
- ).hide();
- }
- show() {
- this.dimmer = yg("div", `${Lg}-dimmer active`), document.body.appendChild(this.dimmer.el);
- const { width: I, height: g } = this.el.show().box(), { clientHeight: C, clientWidth: i } = document.documentElement;
- this.el.offset({
- left: (i - I) / 2,
- top: (C - g) / 3
- }), window.xkeydownEsc = (e) => {
- e.keyCode === 27 && this.hide();
- }, $i(window, "keydown", window.xkeydownEsc);
- }
- hide() {
- this.el.hide(), document.body.removeChild(this.dimmer.el), yV(window, "keydown", window.xkeydownEsc), delete window.xkeydownEsc;
- }
- }
- class eh {
- constructor(I, g) {
- this.vchange = () => {
- }, this.el = yg("div", `${Lg}-form-input`), this.input = yg("input", "").css("width", I).on("input", (C) => this.vchange(C)).attr("placeholder", g), this.el.child(this.input);
- }
- focus() {
- setTimeout(() => {
- this.input.el.focus();
- }, 10);
- }
- hint(I) {
- this.input.attr("placeholder", I);
- }
- val(I) {
- return this.input.val(I);
- }
- }
- class LX {
- constructor(I, g, C, i = (A) => A, e = () => {
- }) {
- this.key = I, this.getTitle = i, this.vchange = () => {
- }, this.el = yg("div", `${Lg}-form-select`), this.suggest = new hig(g.map((A) => ({ key: A, title: this.getTitle(A) })), (A) => {
- this.itemClick(A.key), e(A.key), this.vchange(A.key);
- }, C, this.el), this.el.children(
- this.itemEl = yg("div", "input-text").html(this.getTitle(I)),
- this.suggest.el
- ).on("click", () => this.show());
- }
- show() {
- this.suggest.search("");
- }
- itemClick(I) {
- this.key = I, this.itemEl.html(this.getTitle(I));
- }
- val(I) {
- return I !== void 0 ? (this.key = I, this.itemEl.html(this.getTitle(I)), this) : this.key;
- }
- }
- const gZg = {
- number: /(^\d+$)|(^\d+(\.\d{0,4})?$)/,
- date: /^\d{4}-\d{1,2}-\d{1,2}$/
- };
- class qn {
- constructor(I, g, C, i) {
- this.label = "", this.rule = g, C && (this.label = yg("label", "label").css("width", `${i}px`).html(C)), this.tip = yg("div", "tip").child("tip").hide(), this.input = I, this.input.vchange = () => this.validate(), this.el = yg("div", `${Lg}-form-field`).children(this.label, I.el, this.tip);
- }
- isShow() {
- return this.el.css("display") !== "none";
- }
- show() {
- this.el.show();
- }
- hide() {
- return this.el.hide(), this;
- }
- val(I) {
- return this.input.val(I);
- }
- hint(I) {
- this.input.hint(I);
- }
- validate() {
- const {
- input: I,
- rule: g,
- tip: C,
- el: i
- } = this, e = I.val();
- return g.required && /^\s*$/.test(e) ? (C.html(bt("validation.required")), i.addClass("error"), !1) : (g.type || g.pattern) && !(g.pattern || gZg[g.type]).test(e) ? (C.html(bt("validation.notMatch")), i.addClass("error"), !1) : (i.removeClass("error"), !0);
- }
- }
- const _q = 100;
- class IZg extends $mg {
- constructor() {
- const I = new qn(
- new LX(
- "cell",
- ["cell"],
- // cell|row|column
- "100%",
- (n) => bt(`dataValidation.modeType.${n}`)
- ),
- { required: !0 },
- `${bt("dataValidation.range")}:`,
- _q
- ), g = new qn(
- new eh("120px", "E3 or E3:F12"),
- { required: !0, pattern: /^([A-Z]{1,2}[1-9]\d*)(:[A-Z]{1,2}[1-9]\d*)?$/ }
- ), C = new qn(
- new LX(
- "list",
- ["list", "number", "date", "phone", "email"],
- "100%",
- (n) => bt(`dataValidation.type.${n}`),
- (n) => this.criteriaSelected(n)
- ),
- { required: !0 },
- `${bt("dataValidation.criteria")}:`,
- _q
- ), i = new qn(
- new LX(
- "be",
- ["be", "nbe", "eq", "neq", "lt", "lte", "gt", "gte"],
- "160px",
- (n) => bt(`dataValidation.operator.${n}`),
- (n) => this.criteriaOperatorSelected(n)
- ),
- { required: !0 }
- ).hide(), e = new qn(
- new eh("70px", "10"),
- { required: !0 }
- ).hide(), A = new qn(
- new eh("70px", "100"),
- { required: !0, type: "number" }
- ).hide(), s = new qn(
- new eh("120px", "a,b,c"),
- { required: !0 }
- ), l = new qn(
- new eh("70px", "10"),
- { required: !0, type: "number" }
- ).hide();
- super(bt("contextmenu.validation"), [
- yg("div", `${Lg}-form-fields`).children(
- I.el,
- g.el
- ),
- yg("div", `${Lg}-form-fields`).children(
- C.el,
- i.el,
- e.el,
- A.el,
- l.el,
- s.el
- ),
- yg("div", `${Lg}-buttons`).children(
- new ad("cancel").on("click", () => this.btnClick("cancel")),
- new ad("remove").on("click", () => this.btnClick("remove")),
- new ad("save", "primary").on("click", () => this.btnClick("save"))
- )
- ]), this.mf = I, this.rf = g, this.cf = C, this.of = i, this.minvf = e, this.maxvf = A, this.vf = l, this.svf = s, this.change = () => {
- };
- }
- showVf(I) {
- const g = I === "date" ? "2018-11-12" : "10", { vf: C } = this;
- C.input.hint(g), C.show();
- }
- criteriaSelected(I) {
- const {
- of: g,
- minvf: C,
- maxvf: i,
- vf: e,
- svf: A
- } = this;
- I === "date" || I === "number" ? (g.show(), C.rule.type = I, i.rule.type = I, I === "date" ? (C.hint("2018-11-12"), i.hint("2019-11-12")) : (C.hint("10"), i.hint("100")), C.show(), i.show(), e.hide(), A.hide()) : (I === "list" ? A.show() : A.hide(), e.hide(), g.hide(), C.hide(), i.hide());
- }
- criteriaOperatorSelected(I) {
- if (!I) return;
- const {
- minvf: g,
- maxvf: C,
- vf: i
- } = this;
- if (I === "be" || I === "nbe")
- g.show(), C.show(), i.hide();
- else {
- const e = this.cf.val();
- i.rule.type = e, e === "date" ? i.hint("2018-11-12") : i.hint("10"), i.show(), g.hide(), C.hide();
- }
- }
- btnClick(I) {
- if (I === "cancel")
- this.hide();
- else if (I === "remove")
- this.change("remove"), this.hide();
- else if (I === "save") {
- const g = ["mf", "rf", "cf", "of", "svf", "vf", "minvf", "maxvf"];
- for (let l = 0; l < g.length; l += 1) {
- const n = this[g[l]];
- if (n.isShow() && !n.validate())
- return;
- }
- const C = this.mf.val(), i = this.rf.val(), e = this.cf.val(), A = this.of.val();
- let s = this.svf.val();
- (e === "number" || e === "date") && (A === "be" || A === "nbe" ? s = [this.minvf.val(), this.maxvf.val()] : s = this.vf.val()), this.change(
- "save",
- C,
- i,
- {
- type: e,
- operator: A,
- required: !1,
- value: s
- }
- ), this.hide();
- }
- }
- // validation: { mode, ref, validator }
- setValue(I) {
- if (I) {
- const {
- mf: g,
- rf: C,
- cf: i,
- of: e,
- svf: A,
- vf: s,
- minvf: l,
- maxvf: n
- } = this, {
- mode: a,
- ref: d,
- validator: o
- } = I, {
- type: c,
- operator: r,
- value: h
- } = o || { type: "list" };
- g.val(a || "cell"), C.val(d), i.val(c), e.val(r), Array.isArray(h) ? (l.val(h[0]), n.val(h[1])) : (A.val(h || ""), s.val(h || "")), this.criteriaSelected(c), this.criteriaOperatorSelected(r);
- }
- this.show();
- }
- }
- function Big(t) {
- return yg("div", `${Lg}-item ${t}`);
- }
- function qq(t) {
- return Big("state").child(bt(`sort.${t}`)).on("click.stop", () => this.itemClick(t));
- }
- function CZg(t) {
- const { filterbEl: I, filterValues: g } = this;
- I.html(""), Object.keys(t).forEach((i, e) => {
- const A = t[i], s = g.includes(i) ? "checked" : "";
- I.child(yg("div", `${Lg}-item state ${s}`).on("click.stop", () => this.filterClick(e, i)).children(i === "" ? bt("filter.empty") : i, yg("div", "label").html(`(${A})`)));
- });
- }
- function $q() {
- const { filterhEl: t, filterValues: I, values: g } = this;
- t.html(`${I.length} / ${g.length}`), t.checked(I.length === g.length);
- }
- class tZg {
- constructor() {
- this.filterbEl = yg("div", `${Lg}-body`), this.filterhEl = yg("div", `${Lg}-header state`).on("click.stop", () => this.filterClick(0, "all")), this.el = yg("div", `${Lg}-sort-filter`).children(
- this.sortAscEl = qq.call(this, "asc"),
- this.sortDescEl = qq.call(this, "desc"),
- Big("divider"),
- yg("div", `${Lg}-filter`).children(
- this.filterhEl,
- this.filterbEl
- ),
- yg("div", `${Lg}-buttons`).children(
- new ad("cancel").on("click", () => this.btnClick("cancel")),
- new ad("ok", "primary").on("click", () => this.btnClick("ok"))
- )
- ).hide(), this.ci = null, this.sortDesc = null, this.values = null, this.filterValues = [];
- }
- btnClick(I) {
- if (I === "ok") {
- const { ci: g, sort: C, filterValues: i } = this;
- this.ok && this.ok(g, C, "in", i);
- }
- this.hide();
- }
- itemClick(I) {
- this.sort = I;
- const { sortAscEl: g, sortDescEl: C } = this;
- g.checked(I === "asc"), C.checked(I === "desc");
- }
- filterClick(I, g) {
- const { filterbEl: C, filterValues: i, values: e } = this, A = C.children();
- g === "all" ? A.length === i.length ? (this.filterValues = [], A.forEach((s) => yg(s).checked(!1))) : (this.filterValues = Array.from(e), A.forEach((s) => yg(s).checked(!0))) : yg(A[I]).toggle("checked") ? i.push(g) : i.splice(i.findIndex((l) => l === g), 1), $q.call(this);
- }
- // v: autoFilter
- // items: {value: cnt}
- // sort { ci, order }
- set(I, g, C, i) {
- this.ci = I;
- const { sortAscEl: e, sortDescEl: A } = this;
- i !== null ? (this.sort = i.order, e.checked(i.asc()), A.checked(i.desc())) : (this.sortDesc = null, e.checked(!1), A.checked(!1)), this.values = Object.keys(g), this.filterValues = C ? Array.from(C.value) : Object.keys(g), CZg.call(this, g, C), $q.call(this);
- }
- setOffset(I) {
- this.el.offset(I).show();
- let g = 1;
- ZG(this.el, () => {
- g <= 0 && this.hide(), g -= 1;
- });
- }
- show() {
- this.el.show();
- }
- hide() {
- this.el.hide(), X0(this.el);
- }
- }
- function Wig(t, I) {
- const g = yg("div", `${Lg}-toast`), C = yg("div", `${Lg}-dimmer active`), i = () => {
- document.body.removeChild(g.el), document.body.removeChild(C.el);
- };
- g.children(
- yg("div", `${Lg}-toast-header`).children(
- new pi("close").on("click.stop", () => i()),
- t
- ),
- yg("div", `${Lg}-toast-content`).html(I)
- ), document.body.appendChild(g.el), document.body.appendChild(C.el);
- const { width: e, height: A } = g.box(), { clientHeight: s, clientWidth: l } = document.documentElement;
- g.offset({
- left: (l - e) / 2,
- top: (s - A) / 3
- });
- }
- function vX(t, I) {
- let g;
- return (...C) => {
- const i = this, e = C;
- g || (g = setTimeout(() => {
- g = null, t.apply(i, e);
- }, I));
- };
- }
- function iZg() {
- const {
- data: t,
- verticalScrollbar: I,
- horizontalScrollbar: g
- } = this, {
- l: C,
- t: i,
- left: e,
- top: A,
- width: s,
- height: l
- } = t.getSelectedRect(), n = this.getTableOffset();
- if (Math.abs(e) + s > n.width)
- g.move({ left: C + s - n.width });
- else {
- const a = t.freezeTotalWidth();
- e < a && g.move({ left: C - 1 - a });
- }
- if (Math.abs(A) + l > n.height)
- I.move({ top: i + l - n.height - 1 });
- else {
- const a = t.freezeTotalHeight();
- A < a && I.move({ top: i - 1 - a });
- }
- }
- function od(t, I, g, C = !0, i = !1) {
- if (I === -1 && g === -1) return;
- const {
- table: e,
- selector: A,
- toolbar: s,
- data: l,
- contextMenu: n
- } = this;
- n.setMode(I === -1 || g === -1 ? "row-col" : "range");
- const a = l.getCell(I, g);
- t ? (A.setEnd(I, g, i), this.trigger("cells-selected", a, A.range)) : (A.set(I, g, C), this.trigger("cell-selected", a, I, g)), s.reset(), e.render();
- }
- function cs(t, I) {
- const {
- selector: g,
- data: C
- } = this, { rows: i, cols: e } = C;
- let [A, s] = g.indexes;
- const { eri: l, eci: n } = g.range;
- t && ([A, s] = g.moveIndexes), I === "left" ? s > 0 && (s -= 1) : I === "right" ? (n !== s && (s = n), s < e.len - 1 && (s += 1)) : I === "up" ? A > 0 && (A -= 1) : I === "down" ? (l !== A && (A = l), A < i.len - 1 && (A += 1)) : I === "row-first" ? s = 0 : I === "row-last" ? s = e.len - 1 : I === "col-first" ? A = 0 : I === "col-last" && (A = i.len - 1), t && (g.moveIndexes = [A, s]), od.call(this, t, A, s), iZg.call(this);
- }
- function eZg(t) {
- if (t.buttons !== 0 || t.target.className === `${Lg}-resizer-hover`) return;
- const { offsetX: I, offsetY: g } = t, {
- rowResizer: C,
- colResizer: i,
- tableEl: e,
- data: A
- } = this, { rows: s, cols: l } = A;
- if (I > l.indexWidth && g > s.height) {
- C.hide(), i.hide();
- return;
- }
- const n = e.box(), a = A.getCellRectByXY(t.offsetX, t.offsetY);
- a.ri >= 0 && a.ci === -1 ? (a.width = l.indexWidth, C.show(a, {
- width: n.width
- }), s.isHide(a.ri - 1) ? C.showUnhide(a.ri) : C.hideUnhide()) : C.hide(), a.ri === -1 && a.ci >= 0 ? (a.height = s.height, i.show(a, {
- height: n.height
- }), l.isHide(a.ci - 1) ? i.showUnhide(a.ci) : i.hideUnhide()) : i.hide();
- }
- function AZg(t) {
- const { verticalScrollbar: I, horizontalScrollbar: g, data: C } = this, { top: i } = I.scroll(), { left: e } = g.scroll(), { rows: A, cols: s } = C, { deltaY: l, deltaX: n } = t, a = (b, u) => {
- let m = b, Z = 0;
- do
- Z = u(m), m += 1;
- while (Z <= 0);
- return Z;
- }, d = (b) => {
- if (b > 0) {
- const u = C.scroll.ri + 1;
- if (u < A.len) {
- const m = a(u, (Z) => A.getHeight(Z));
- I.move({ top: i + m - 1 });
- }
- } else {
- const u = C.scroll.ri - 1;
- if (u >= 0) {
- const m = a(u, (Z) => A.getHeight(Z));
- I.move({ top: u === 0 ? 0 : i - m });
- }
- }
- }, o = (b) => {
- if (b > 0) {
- const u = C.scroll.ci + 1;
- if (u < s.len) {
- const m = a(u, (Z) => s.getWidth(Z));
- g.move({ left: e + m - 1 });
- }
- } else {
- const u = C.scroll.ci - 1;
- if (u >= 0) {
- const m = a(u, (Z) => s.getWidth(Z));
- g.move({ left: u === 0 ? 0 : e - m });
- }
- }
- }, c = Math.abs(l), r = Math.abs(n), h = Math.max(c, r);
- /Firefox/i.test(window.navigator.userAgent) && vX(d(t.detail), 50), h === r && vX(o(n), 50), h === c && vX(d(l), 50);
- }
- function sZg(t, I) {
- const { verticalScrollbar: g, horizontalScrollbar: C } = this, { top: i } = g.scroll(), { left: e } = C.scroll();
- t === "left" || t === "right" ? C.move({ left: e - I }) : (t === "up" || t === "down") && g.move({ top: i - I });
- }
- function g1() {
- const { data: t, verticalScrollbar: I } = this, { height: g } = this.getTableOffset(), C = t.exceptRowTotalHeight(0, -1);
- I.set(g, t.rows.totalHeight() - C);
- }
- function I1() {
- const { data: t, horizontalScrollbar: I } = this, { width: g } = this.getTableOffset();
- t && I.set(g, t.cols.totalWidth());
- }
- function lZg() {
- const {
- selector: t,
- data: I,
- editor: g
- } = this, [C, i] = I.freeze;
- if (C > 0 || i > 0) {
- const e = I.freezeTotalWidth(), A = I.freezeTotalHeight();
- g.setFreezeLengths(e, A);
- }
- t.resetAreaOffset();
- }
- function qi() {
- const {
- tableEl: t,
- overlayerEl: I,
- overlayerCEl: g,
- table: C,
- toolbar: i,
- selector: e,
- el: A
- } = this, s = this.getTableOffset(), l = this.getRect();
- t.attr(l), I.offset(l), g.offset(s), A.css("width", `${l.width}px`), g1.call(this), I1.call(this), lZg.call(this), C.render(), i.reset(), e.reset();
- }
- function GG() {
- const { data: t, selector: I } = this;
- t.clearClipboard(), I.hideClipboard();
- }
- function i9() {
- const { data: t, selector: I } = this;
- t.copy(), t.copyToSystemClipboard(), I.showClipboard();
- }
- function g$() {
- const { data: t, selector: I } = this;
- t.cut(), I.showClipboard();
- }
- function rm(t, I) {
- const { data: g } = this;
- if (g.settings.mode !== "read") {
- if (g.paste(t, (C) => Wig("Tip", C)))
- qi.call(this);
- else if (I) {
- const C = I.clipboardData.getData("text/plain");
- this.data.pasteFromText(C), qi.call(this);
- }
- }
- }
- function nZg() {
- this.data.hideRowsOrCols(), qi.call(this);
- }
- function I$(t, I) {
- this.data.unhideRowsOrCols(t, I), qi.call(this);
- }
- function aZg() {
- const { data: t } = this;
- t.autofilter(), qi.call(this);
- }
- function oZg() {
- const { toolbar: t } = this;
- t.paintformatActive() && (rm.call(this, "format"), GG.call(this), t.paintformatToggle());
- }
- function C$(t) {
- const {
- selector: I,
- data: g,
- table: C,
- sortFilter: i
- } = this, { offsetX: e, offsetY: A } = t, s = t.target.className === `${Lg}-selector-corner`, l = g.getCellRectByXY(e, A), {
- left: n,
- top: a,
- width: d,
- height: o
- } = l;
- let { ri: c, ci: r } = l;
- const { autoFilter: h } = g;
- if (h.includes(c, r) && n + d - 20 < e && a + o - 20 < A) {
- const b = h.items(r, (u, m) => g.rows.getCell(u, m));
- i.hide(), i.set(r, b, h.getFilter(r), h.getSort(r)), i.setOffset({ left: n, top: a + o + 2 });
- return;
- }
- t.shiftKey || (s ? I.showAutofill(c, r) : od.call(this, !1, c, r), aig(window, (b) => {
- ({ ri: c, ci: r } = g.getCellRectByXY(b.offsetX, b.offsetY)), s ? I.showAutofill(c, r) : b.buttons === 1 && !b.shiftKey && od.call(this, !0, c, r, !0, !0);
- }, () => {
- s && I.arange && g.settings.mode !== "read" && g.autofill(I.arange, "all", (b) => Wig("Tip", b)) && C.render(), I.hideAutofill(), oZg.call(this);
- })), !s && t.buttons === 1 && t.shiftKey && od.call(this, !0, c, r);
- }
- function wG() {
- const { editor: t, data: I } = this, g = I.getSelectedRect(), C = this.getTableOffset();
- let i = "top";
- g.top > C.height / 2 && (i = "bottom"), t.setOffset(g, i);
- }
- function hm() {
- const { editor: t, data: I } = this;
- I.settings.mode !== "read" && (wG.call(this), t.setCell(I.getSelectedCell(), I.getSelectedValidator()), GG.call(this));
- }
- function cZg(t) {
- const { data: I, table: g, selector: C } = this;
- I.scrolly(t, () => {
- C.resetBRLAreaOffset(), wG.call(this), g.render();
- });
- }
- function dZg(t) {
- const { data: I, table: g, selector: C } = this;
- I.scrollx(t, () => {
- C.resetBRTAreaOffset(), wG.call(this), g.render();
- });
- }
- function rZg(t, I) {
- const { ri: g } = t, { table: C, selector: i, data: e } = this;
- e.rows.setHeight(g, I), C.render(), i.resetAreaOffset(), g1.call(this), wG.call(this);
- }
- function hZg(t, I) {
- const { ci: g } = t, { table: C, selector: i, data: e } = this;
- e.cols.setWidth(g, I), C.render(), i.resetAreaOffset(), I1.call(this), wG.call(this);
- }
- function TX(t, I = "finished") {
- const { data: g, table: C } = this;
- if (g.settings.mode === "read") return;
- g.setSelectedCellText(t, I);
- const { ri: i, ci: e } = g.selector;
- I === "finished" ? C.render() : this.trigger("cell-edited", t, i, e);
- }
- function $N(t) {
- const { data: I } = this;
- I.settings.mode !== "read" && (t === "insert-row" ? I.insert("row") : t === "delete-row" ? I.delete("row") : t === "insert-column" ? I.insert("column") : t === "delete-column" ? I.delete("column") : t === "delete-cell" ? I.deleteCell() : t === "delete-cell-format" ? I.deleteCell("format") : t === "delete-cell-text" ? I.deleteCell("text") : t === "cell-printable" ? I.setSelectedCellAttr("printable", !0) : t === "cell-non-printable" ? I.setSelectedCellAttr("printable", !1) : t === "cell-editable" ? I.setSelectedCellAttr("editable", !0) : t === "cell-non-editable" && I.setSelectedCellAttr("editable", !1), GG.call(this), qi.call(this));
- }
- function bZg(t, I) {
- const { data: g } = this;
- if (t === "undo")
- this.undo();
- else if (t === "redo")
- this.redo();
- else if (t === "print")
- this.print.preview();
- else if (t === "paintformat")
- I === !0 ? i9.call(this) : GG.call(this);
- else if (t === "clearformat")
- $N.call(this, "delete-cell-format");
- else if (t !== "link") {
- if (t !== "chart") if (t === "autofilter")
- aZg.call(this);
- else if (t === "freeze")
- if (I) {
- const { ri: C, ci: i } = g.selector;
- this.freeze(C, i);
- } else
- this.freeze(0, 0);
- else
- g.setSelectedCellAttr(t, I), t === "formula" && !g.selector.multiple() && hm.call(this), qi.call(this);
- }
- }
- function uZg(t, I, g, C) {
- this.data.setAutoFilter(t, I, g, C), qi.call(this);
- }
- function mZg() {
- const {
- selector: t,
- overlayerEl: I,
- rowResizer: g,
- colResizer: C,
- verticalScrollbar: i,
- horizontalScrollbar: e,
- editor: A,
- contextMenu: s,
- toolbar: l,
- modalValidation: n,
- sortFilter: a
- } = this;
- I.on("mousemove", (d) => {
- eZg.call(this, d);
- }).on("mousedown", (d) => {
- A.clear(), s.hide(), d.buttons === 2 ? (this.data.xyInSelectedRect(d.offsetX, d.offsetY) || C$.call(this, d), s.setPosition(d.offsetX, d.offsetY), d.stopPropagation()) : d.detail === 2 ? hm.call(this) : C$.call(this, d);
- }).on("mousewheel.stop", (d) => {
- AZg.call(this, d);
- }).on("mouseout", (d) => {
- const { offsetX: o, offsetY: c } = d;
- c <= 0 && C.hide(), o <= 0 && g.hide();
- }), t.inputChange = (d) => {
- TX.call(this, d, "input"), hm.call(this);
- }, yug(I.el, {
- move: (d, o) => {
- sZg.call(this, d, o);
- }
- }), l.change = (d, o) => bZg.call(this, d, o), a.ok = (d, o, c, r) => uZg.call(this, d, o, c, r), g.finishedFn = (d, o) => {
- rZg.call(this, d, o);
- }, C.finishedFn = (d, o) => {
- hZg.call(this, d, o);
- }, g.unhideFn = (d) => {
- I$.call(this, "row", d);
- }, C.unhideFn = (d) => {
- I$.call(this, "col", d);
- }, i.moveFn = (d, o) => {
- cZg.call(this, d, o);
- }, e.moveFn = (d, o) => {
- dZg.call(this, d, o);
- }, A.change = (d, o) => {
- TX.call(this, o, d);
- }, n.change = (d, ...o) => {
- d === "save" ? this.data.addValidation(...o) : this.data.removeValidation();
- }, s.itemClick = (d) => {
- d === "validation" ? n.setValue(this.data.getSelectedValidation()) : d === "copy" ? i9.call(this) : d === "cut" ? g$.call(this) : d === "paste" ? rm.call(this, "all") : d === "paste-value" ? rm.call(this, "text") : d === "paste-format" ? rm.call(this, "format") : d === "hide" ? nZg.call(this) : $N.call(this, d);
- }, $i(window, "resize", () => {
- this.reload();
- }), $i(window, "click", (d) => {
- this.focusing = I.contains(d.target);
- }), $i(window, "paste", (d) => {
- this.focusing && (rm.call(this, "all", d), d.preventDefault());
- }), $i(window, "keydown", (d) => {
- if (!this.focusing) return;
- const o = d.keyCode || d.which, {
- key: c,
- ctrlKey: r,
- shiftKey: h,
- metaKey: b
- } = d;
- if (r || b)
- switch (o) {
- case 90:
- this.undo(), d.preventDefault();
- break;
- case 89:
- this.redo(), d.preventDefault();
- break;
- case 67:
- i9.call(this), d.preventDefault();
- break;
- case 88:
- g$.call(this), d.preventDefault();
- break;
- case 85:
- l.trigger("underline"), d.preventDefault();
- break;
- case 86:
- break;
- case 37:
- cs.call(this, h, "row-first"), d.preventDefault();
- break;
- case 38:
- cs.call(this, h, "col-first"), d.preventDefault();
- break;
- case 39:
- cs.call(this, h, "row-last"), d.preventDefault();
- break;
- case 40:
- cs.call(this, h, "col-last"), d.preventDefault();
- break;
- case 32:
- od.call(this, !1, -1, this.data.selector.ci, !1), d.preventDefault();
- break;
- case 66:
- l.trigger("bold");
- break;
- case 73:
- l.trigger("italic");
- break;
- }
- else {
- switch (o) {
- case 32:
- h && od.call(this, !1, this.data.selector.ri, -1, !1);
- break;
- case 27:
- s.hide(), GG.call(this);
- break;
- case 37:
- cs.call(this, h, "left"), d.preventDefault();
- break;
- case 38:
- cs.call(this, h, "up"), d.preventDefault();
- break;
- case 39:
- cs.call(this, h, "right"), d.preventDefault();
- break;
- case 40:
- cs.call(this, h, "down"), d.preventDefault();
- break;
- case 9:
- A.clear(), cs.call(this, !1, h ? "left" : "right"), d.preventDefault();
- break;
- case 13:
- A.clear(), cs.call(this, !1, h ? "up" : "down"), d.preventDefault();
- break;
- case 8:
- $N.call(this, "delete-cell-text"), d.preventDefault();
- break;
- }
- c === "Delete" ? ($N.call(this, "delete-cell-text"), d.preventDefault()) : o >= 65 && o <= 90 || o >= 48 && o <= 57 || o >= 96 && o <= 105 || d.key === "=" ? (TX.call(this, d.key, "input"), hm.call(this)) : o === 113 && hm.call(this);
- }
- });
- }
- class ZZg {
- constructor(I, g) {
- this.eventMap = Yug();
- const { view: C, showToolbar: i, showContextmenu: e } = g.settings;
- this.el = yg("div", `${Lg}-sheet`), this.toolbar = new qmg(g, C.width, !i), this.print = new lmg(g), I.children(this.toolbar.el, this.el, this.print.el), this.data = g, this.tableEl = yg("canvas", `${Lg}-table`), this.rowResizer = new kq(!1, g.rows.height), this.colResizer = new kq(!0, g.cols.minWidth), this.verticalScrollbar = new zq(!0), this.horizontalScrollbar = new zq(!1), this.editor = new xug(
- _ug,
- () => this.getTableOffset(),
- g.rows.height
- ), this.modalValidation = new IZg(), this.contextMenu = new cmg(() => this.getRect(), !e), this.selector = new Mug(g), this.overlayerCEl = yg("div", `${Lg}-overlayer-content`).children(
- this.editor.el,
- this.selector.el
- ), this.overlayerEl = yg("div", `${Lg}-overlayer`).child(this.overlayerCEl), this.sortFilter = new tZg(), this.el.children(
- this.tableEl,
- this.overlayerEl.el,
- this.rowResizer.el,
- this.colResizer.el,
- this.verticalScrollbar.el,
- this.horizontalScrollbar.el,
- this.contextMenu.el,
- this.modalValidation.el,
- this.sortFilter.el
- ), this.table = new emg(this.tableEl.el, g), mZg.call(this), qi.call(this), od.call(this, !1, 0, 0);
- }
- on(I, g) {
- return this.eventMap.on(I, g), this;
- }
- trigger(I, ...g) {
- const { eventMap: C } = this;
- C.fire(I, g);
- }
- resetData(I) {
- this.editor.clear(), this.data = I, g1.call(this), I1.call(this), this.toolbar.resetData(I), this.print.resetData(I), this.selector.resetData(I), this.table.resetData(I);
- }
- loadData(I) {
- return this.data.setData(I), qi.call(this), this;
- }
- // freeze rows or cols
- freeze(I, g) {
- const { data: C } = this;
- return C.setFreeze(I, g), qi.call(this), this;
- }
- undo() {
- this.data.undo(), qi.call(this);
- }
- redo() {
- this.data.redo(), qi.call(this);
- }
- reload() {
- return qi.call(this), this;
- }
- getRect() {
- const { data: I } = this;
- return { width: I.viewWidth(), height: I.viewHeight() };
- }
- getTableOffset() {
- const { rows: I, cols: g } = this.data, { width: C, height: i } = this.getRect();
- return {
- width: C - g.indexWidth,
- height: i - I.height,
- left: g.indexWidth,
- top: I.height
- };
- }
- }
- class GZg extends Ls {
- constructor(I) {
- const g = new pi("ellipsis");
- super(g, "auto", !1, "top-left"), this.contentClick = I;
- }
- reset(I) {
- const g = I.map((C, i) => yg("div", `${Lg}-item`).css("width", "150px").css("font-weight", "normal").on("click", () => {
- this.contentClick(i), this.hide();
- }).child(C));
- this.setContentChildren(...g);
- }
- setTitle() {
- }
- }
- const wZg = [
- { key: "delete", title: $I("contextmenu.deleteSheet") }
- ];
- function pZg(t) {
- return yg("div", `${Lg}-item`).child(t.title()).on("click", () => {
- this.itemClick(t.key), this.hide();
- });
- }
- function BZg() {
- return wZg.map((t) => pZg.call(this, t));
- }
- class WZg {
- constructor() {
- this.el = yg("div", `${Lg}-contextmenu`).css("width", "160px").children(...BZg.call(this)).hide(), this.itemClick = () => {
- };
- }
- hide() {
- const { el: I } = this;
- I.hide(), X0(I);
- }
- setOffset(I) {
- const { el: g } = this;
- g.offset(I), g.show(), ZG(g);
- }
- }
- class yZg {
- constructor(I = () => {
- }, g = () => {
- }, C = () => {
- }, i = () => {
- }) {
- this.swapFunc = g, this.updateFunc = i, this.dataNames = [], this.activeEl = null, this.deleteEl = null, this.items = [], this.moreEl = new GZg((e) => {
- this.clickSwap2(this.items[e]);
- }), this.contextMenu = new WZg(), this.contextMenu.itemClick = C, this.el = yg("div", `${Lg}-bottombar`).children(
- this.contextMenu.el,
- this.menuEl = yg("ul", `${Lg}-menu`).child(
- yg("li", "").children(
- new pi("add").on("click", () => {
- I();
- }),
- yg("span", "").child(this.moreEl)
- )
- )
- );
- }
- addItem(I, g) {
- this.dataNames.push(I);
- const C = yg("li", g ? "active" : "").child(I);
- C.on("click", () => {
- this.clickSwap2(C);
- }).on("contextmenu", (i) => {
- const { offsetLeft: e, offsetHeight: A } = i.target;
- this.contextMenu.setOffset({ left: e, bottom: A + 1 }), this.deleteEl = C;
- }).on("dblclick", () => {
- const i = C.html(), e = new eh("auto", "");
- e.val(i), e.input.on("blur", ({ target: A }) => {
- const { value: s } = A, l = this.dataNames.findIndex((n) => n === i);
- this.renameItem(l, s);
- }), C.html("").child(e.el), e.focus();
- }), g && this.clickSwap(C), this.items.push(C), this.menuEl.child(C), this.moreEl.reset(this.dataNames);
- }
- renameItem(I, g) {
- this.dataNames.splice(I, 1, g), this.moreEl.reset(this.dataNames), this.items[I].html("").child(g), this.updateFunc(I, g);
- }
- clear() {
- this.items.forEach((I) => {
- this.menuEl.removeChild(I.el);
- }), this.items = [], this.dataNames = [], this.moreEl.reset(this.dataNames);
- }
- deleteItem() {
- const { activeEl: I, deleteEl: g } = this;
- if (this.items.length > 1) {
- const C = this.items.findIndex((i) => i === g);
- if (this.items.splice(C, 1), this.dataNames.splice(C, 1), this.menuEl.removeChild(g.el), this.moreEl.reset(this.dataNames), I === g) {
- const [i] = this.items;
- return this.activeEl = i, this.activeEl.toggle(), [C, 0];
- }
- return [C, -1];
- }
- return [-1];
- }
- clickSwap2(I) {
- const g = this.items.findIndex((C) => C === I);
- this.clickSwap(I), this.activeEl.toggle(), this.swapFunc(g);
- }
- clickSwap(I) {
- this.activeEl !== null && this.activeEl.toggle(), this.activeEl = I;
- }
- }
- class e9 {
- constructor(I, g = {}) {
- let C = I;
- this.options = { showBottomBar: !0, ...g }, this.sheetIndex = 1, this.datas = [], typeof I == "string" && (C = document.querySelector(I)), this.bottombar = this.options.showBottomBar ? new yZg(() => {
- const e = this.addSheet();
- this.sheet.resetData(e);
- }, (e) => {
- const A = this.datas[e];
- this.sheet.resetData(A);
- }, () => {
- this.deleteSheet();
- }, (e, A) => {
- this.datas[e].name = A;
- }) : null, this.data = this.addSheet();
- const i = yg("div", `${Lg}`).on("contextmenu", (e) => e.preventDefault());
- C.appendChild(i.el), this.sheet = new ZZg(i, this.data), this.bottombar !== null && i.child(this.bottombar.el);
- }
- addSheet(I, g = !0) {
- const C = I || `sheet${this.sheetIndex}`, i = new Wug(C, this.options);
- return i.change = (...e) => {
- this.sheet.trigger("change", ...e);
- }, this.datas.push(i), this.bottombar !== null && this.bottombar.addItem(C, g), this.sheetIndex += 1, i;
- }
- deleteSheet() {
- if (this.bottombar === null) return;
- const [I, g] = this.bottombar.deleteItem();
- I >= 0 && (this.datas.splice(I, 1), g >= 0 && this.sheet.resetData(this.datas[g]));
- }
- loadData(I) {
- const g = Array.isArray(I) ? I : [I];
- if (this.bottombar !== null && this.bottombar.clear(), this.datas = [], g.length > 0)
- for (let C = 0; C < g.length; C += 1) {
- const i = g[C], e = this.addSheet(i.name, C === 0);
- e.setData(i), C === 0 && this.sheet.resetData(e);
- }
- return this;
- }
- getData() {
- return this.datas.map((I) => I.getData());
- }
- cellText(I, g, C, i = 0) {
- return this.datas[i].setCellText(I, g, C, "finished"), this;
- }
- cell(I, g, C = 0) {
- return this.datas[C].getCell(I, g);
- }
- cellStyle(I, g, C = 0) {
- return this.datas[C].getCellStyle(I, g);
- }
- reRender() {
- return this.sheet.table.render(), this;
- }
- on(I, g) {
- return this.sheet.on(I, g), this;
- }
- validate() {
- const { validations: I } = this.data;
- return I.errors.size <= 0;
- }
- change(I) {
- return this.sheet.on("change", I), this;
- }
- static locale(I, g) {
- lig(I, g);
- }
- }
- const YZg = (t, I = {}) => new e9(t, I);
- window && (window.x_spreadsheet = YZg, window.x_spreadsheet.locale = (t, I) => lig(t, I));
- const t$ = [
- "000000",
- "FFFFFF",
- "FF0000",
- "00FF00",
- "0000FF",
- "FFFF00",
- "FF00FF",
- "00FFFF",
- "000000",
- "FFFFFF",
- "FF0000",
- "00FF00",
- "0000FF",
- "FFFF00",
- "FF00FF",
- "00FFFF",
- "800000",
- "008000",
- "000080",
- "808000",
- "800080",
- "008080",
- "C0C0C0",
- "808080",
- "9999FF",
- "993366",
- "FFFFCC",
- "CCFFFF",
- "660066",
- "FF8080",
- "0066CC",
- "CCCCFF",
- "000080",
- "FF00FF",
- "FFFF00",
- "00FFFF",
- "800080",
- "800000",
- "008080",
- "0000FF",
- "00CCFF",
- "CCFFFF",
- "CCFFCC",
- "FFFF99",
- "99CCFF",
- "FF99CC",
- "CC99FF",
- "FFCC99",
- "3366FF",
- "33CCCC",
- "99CC00",
- "FFCC00",
- "FF9900",
- "FF6600",
- "666699",
- "969696",
- "003366",
- "339966",
- "003300",
- "333300",
- "993300",
- "993366",
- "333399",
- "333333",
- "b7e0ff",
- "00CCFF"
- ];
- function RV(t) {
- "@babel/helpers - typeof";
- return RV = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
- return typeof I;
- } : function(I) {
- return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
- }, RV(t);
- }
- var NZg = /^\s+/, VZg = /\s+$/;
- function lI(t, I) {
- if (t = t || "", I = I || {}, t instanceof lI)
- return t;
- if (!(this instanceof lI))
- return new lI(t, I);
- var g = MZg(t);
- this._originalInput = t, this._r = g.r, this._g = g.g, this._b = g.b, this._a = g.a, this._roundA = Math.round(100 * this._a) / 100, this._format = I.format || g.format, this._gradientType = I.gradientType, this._r < 1 && (this._r = Math.round(this._r)), this._g < 1 && (this._g = Math.round(this._g)), this._b < 1 && (this._b = Math.round(this._b)), this._ok = g.ok;
- }
- lI.prototype = {
- isDark: function() {
- return this.getBrightness() < 128;
- },
- isLight: function() {
- return !this.isDark();
- },
- isValid: function() {
- return this._ok;
- },
- getOriginalInput: function() {
- return this._originalInput;
- },
- getFormat: function() {
- return this._format;
- },
- getAlpha: function() {
- return this._a;
- },
- getBrightness: function() {
- var I = this.toRgb();
- return (I.r * 299 + I.g * 587 + I.b * 114) / 1e3;
- },
- getLuminance: function() {
- var I = this.toRgb(), g, C, i, e, A, s;
- return g = I.r / 255, C = I.g / 255, i = I.b / 255, g <= 0.03928 ? e = g / 12.92 : e = Math.pow((g + 0.055) / 1.055, 2.4), C <= 0.03928 ? A = C / 12.92 : A = Math.pow((C + 0.055) / 1.055, 2.4), i <= 0.03928 ? s = i / 12.92 : s = Math.pow((i + 0.055) / 1.055, 2.4), 0.2126 * e + 0.7152 * A + 0.0722 * s;
- },
- setAlpha: function(I) {
- return this._a = yig(I), this._roundA = Math.round(100 * this._a) / 100, this;
- },
- toHsv: function() {
- var I = e$(this._r, this._g, this._b);
- return {
- h: I.h * 360,
- s: I.s,
- v: I.v,
- a: this._a
- };
- },
- toHsvString: function() {
- var I = e$(this._r, this._g, this._b), g = Math.round(I.h * 360), C = Math.round(I.s * 100), i = Math.round(I.v * 100);
- return this._a == 1 ? "hsv(" + g + ", " + C + "%, " + i + "%)" : "hsva(" + g + ", " + C + "%, " + i + "%, " + this._roundA + ")";
- },
- toHsl: function() {
- var I = i$(this._r, this._g, this._b);
- return {
- h: I.h * 360,
- s: I.s,
- l: I.l,
- a: this._a
- };
- },
- toHslString: function() {
- var I = i$(this._r, this._g, this._b), g = Math.round(I.h * 360), C = Math.round(I.s * 100), i = Math.round(I.l * 100);
- return this._a == 1 ? "hsl(" + g + ", " + C + "%, " + i + "%)" : "hsla(" + g + ", " + C + "%, " + i + "%, " + this._roundA + ")";
- },
- toHex: function(I) {
- return A$(this._r, this._g, this._b, I);
- },
- toHexString: function(I) {
- return "#" + this.toHex(I);
- },
- toHex8: function(I) {
- return XZg(this._r, this._g, this._b, this._a, I);
- },
- toHex8String: function(I) {
- return "#" + this.toHex8(I);
- },
- toRgb: function() {
- return {
- r: Math.round(this._r),
- g: Math.round(this._g),
- b: Math.round(this._b),
- a: this._a
- };
- },
- toRgbString: function() {
- return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
- },
- toPercentageRgb: function() {
- return {
- r: Math.round(LC(this._r, 255) * 100) + "%",
- g: Math.round(LC(this._g, 255) * 100) + "%",
- b: Math.round(LC(this._b, 255) * 100) + "%",
- a: this._a
- };
- },
- toPercentageRgbString: function() {
- return this._a == 1 ? "rgb(" + Math.round(LC(this._r, 255) * 100) + "%, " + Math.round(LC(this._g, 255) * 100) + "%, " + Math.round(LC(this._b, 255) * 100) + "%)" : "rgba(" + Math.round(LC(this._r, 255) * 100) + "%, " + Math.round(LC(this._g, 255) * 100) + "%, " + Math.round(LC(this._b, 255) * 100) + "%, " + this._roundA + ")";
- },
- toName: function() {
- return this._a === 0 ? "transparent" : this._a < 1 ? !1 : jZg[A$(this._r, this._g, this._b, !0)] || !1;
- },
- toFilter: function(I) {
- var g = "#" + s$(this._r, this._g, this._b, this._a), C = g, i = this._gradientType ? "GradientType = 1, " : "";
- if (I) {
- var e = lI(I);
- C = "#" + s$(e._r, e._g, e._b, e._a);
- }
- return "progid:DXImageTransform.Microsoft.gradient(" + i + "startColorstr=" + g + ",endColorstr=" + C + ")";
- },
- toString: function(I) {
- var g = !!I;
- I = I || this._format;
- var C = !1, i = this._a < 1 && this._a >= 0, e = !g && i && (I === "hex" || I === "hex6" || I === "hex3" || I === "hex4" || I === "hex8" || I === "name");
- return e ? I === "name" && this._a === 0 ? this.toName() : this.toRgbString() : (I === "rgb" && (C = this.toRgbString()), I === "prgb" && (C = this.toPercentageRgbString()), (I === "hex" || I === "hex6") && (C = this.toHexString()), I === "hex3" && (C = this.toHexString(!0)), I === "hex4" && (C = this.toHex8String(!0)), I === "hex8" && (C = this.toHex8String()), I === "name" && (C = this.toName()), I === "hsl" && (C = this.toHslString()), I === "hsv" && (C = this.toHsvString()), C || this.toHexString());
- },
- clone: function() {
- return lI(this.toString());
- },
- _applyModification: function(I, g) {
- var C = I.apply(null, [this].concat([].slice.call(g)));
- return this._r = C._r, this._g = C._g, this._b = C._b, this.setAlpha(C._a), this;
- },
- lighten: function() {
- return this._applyModification(FZg, arguments);
- },
- brighten: function() {
- return this._applyModification(kZg, arguments);
- },
- darken: function() {
- return this._applyModification(zZg, arguments);
- },
- desaturate: function() {
- return this._applyModification(SZg, arguments);
- },
- saturate: function() {
- return this._applyModification(DZg, arguments);
- },
- greyscale: function() {
- return this._applyModification(KZg, arguments);
- },
- spin: function() {
- return this._applyModification(JZg, arguments);
- },
- _applyCombination: function(I, g) {
- return I.apply(null, [this].concat([].slice.call(g)));
- },
- analogous: function() {
- return this._applyCombination(TZg, arguments);
- },
- complement: function() {
- return this._applyCombination(LZg, arguments);
- },
- monochromatic: function() {
- return this._applyCombination(xZg, arguments);
- },
- splitcomplement: function() {
- return this._applyCombination(vZg, arguments);
- },
- // Disabled until https://github.com/bgrins/TinyColor/issues/254
- // polyad: function (number) {
- // return this._applyCombination(polyad, [number]);
- // },
- triad: function() {
- return this._applyCombination(l$, [3]);
- },
- tetrad: function() {
- return this._applyCombination(l$, [4]);
- }
- };
- lI.fromRatio = function(t, I) {
- if (RV(t) == "object") {
- var g = {};
- for (var C in t)
- t.hasOwnProperty(C) && (C === "a" ? g[C] = t[C] : g[C] = bm(t[C]));
- t = g;
- }
- return lI(t, I);
- };
- function MZg(t) {
- var I = {
- r: 0,
- g: 0,
- b: 0
- }, g = 1, C = null, i = null, e = null, A = !1, s = !1;
- return typeof t == "string" && (t = EZg(t)), RV(t) == "object" && (cl(t.r) && cl(t.g) && cl(t.b) ? (I = RZg(t.r, t.g, t.b), A = !0, s = String(t.r).substr(-1) === "%" ? "prgb" : "rgb") : cl(t.h) && cl(t.s) && cl(t.v) ? (C = bm(t.s), i = bm(t.v), I = HZg(t.h, C, i), A = !0, s = "hsv") : cl(t.h) && cl(t.s) && cl(t.l) && (C = bm(t.s), e = bm(t.l), I = fZg(t.h, C, e), A = !0, s = "hsl"), t.hasOwnProperty("a") && (g = t.a)), g = yig(g), {
- ok: A,
- format: t.format || s,
- r: Math.min(255, Math.max(I.r, 0)),
- g: Math.min(255, Math.max(I.g, 0)),
- b: Math.min(255, Math.max(I.b, 0)),
- a: g
- };
- }
- function RZg(t, I, g) {
- return {
- r: LC(t, 255) * 255,
- g: LC(I, 255) * 255,
- b: LC(g, 255) * 255
- };
- }
- function i$(t, I, g) {
- t = LC(t, 255), I = LC(I, 255), g = LC(g, 255);
- var C = Math.max(t, I, g), i = Math.min(t, I, g), e, A, s = (C + i) / 2;
- if (C == i)
- e = A = 0;
- else {
- var l = C - i;
- switch (A = s > 0.5 ? l / (2 - C - i) : l / (C + i), C) {
- case t:
- e = (I - g) / l + (I < g ? 6 : 0);
- break;
- case I:
- e = (g - t) / l + 2;
- break;
- case g:
- e = (t - I) / l + 4;
- break;
- }
- e /= 6;
- }
- return {
- h: e,
- s: A,
- l: s
- };
- }
- function fZg(t, I, g) {
- var C, i, e;
- t = LC(t, 360), I = LC(I, 100), g = LC(g, 100);
- function A(n, a, d) {
- return d < 0 && (d += 1), d > 1 && (d -= 1), d < 1 / 6 ? n + (a - n) * 6 * d : d < 1 / 2 ? a : d < 2 / 3 ? n + (a - n) * (2 / 3 - d) * 6 : n;
- }
- if (I === 0)
- C = i = e = g;
- else {
- var s = g < 0.5 ? g * (1 + I) : g + I - g * I, l = 2 * g - s;
- C = A(l, s, t + 1 / 3), i = A(l, s, t), e = A(l, s, t - 1 / 3);
- }
- return {
- r: C * 255,
- g: i * 255,
- b: e * 255
- };
- }
- function e$(t, I, g) {
- t = LC(t, 255), I = LC(I, 255), g = LC(g, 255);
- var C = Math.max(t, I, g), i = Math.min(t, I, g), e, A, s = C, l = C - i;
- if (A = C === 0 ? 0 : l / C, C == i)
- e = 0;
- else {
- switch (C) {
- case t:
- e = (I - g) / l + (I < g ? 6 : 0);
- break;
- case I:
- e = (g - t) / l + 2;
- break;
- case g:
- e = (t - I) / l + 4;
- break;
- }
- e /= 6;
- }
- return {
- h: e,
- s: A,
- v: s
- };
- }
- function HZg(t, I, g) {
- t = LC(t, 360) * 6, I = LC(I, 100), g = LC(g, 100);
- var C = Math.floor(t), i = t - C, e = g * (1 - I), A = g * (1 - i * I), s = g * (1 - (1 - i) * I), l = C % 6, n = [g, A, e, e, s, g][l], a = [s, g, g, A, e, e][l], d = [e, e, s, g, g, A][l];
- return {
- r: n * 255,
- g: a * 255,
- b: d * 255
- };
- }
- function A$(t, I, g, C) {
- var i = [FA(Math.round(t).toString(16)), FA(Math.round(I).toString(16)), FA(Math.round(g).toString(16))];
- return C && i[0].charAt(0) == i[0].charAt(1) && i[1].charAt(0) == i[1].charAt(1) && i[2].charAt(0) == i[2].charAt(1) ? i[0].charAt(0) + i[1].charAt(0) + i[2].charAt(0) : i.join("");
- }
- function XZg(t, I, g, C, i) {
- var e = [FA(Math.round(t).toString(16)), FA(Math.round(I).toString(16)), FA(Math.round(g).toString(16)), FA(Yig(C))];
- return i && e[0].charAt(0) == e[0].charAt(1) && e[1].charAt(0) == e[1].charAt(1) && e[2].charAt(0) == e[2].charAt(1) && e[3].charAt(0) == e[3].charAt(1) ? e[0].charAt(0) + e[1].charAt(0) + e[2].charAt(0) + e[3].charAt(0) : e.join("");
- }
- function s$(t, I, g, C) {
- var i = [FA(Yig(C)), FA(Math.round(t).toString(16)), FA(Math.round(I).toString(16)), FA(Math.round(g).toString(16))];
- return i.join("");
- }
- lI.equals = function(t, I) {
- return !t || !I ? !1 : lI(t).toRgbString() == lI(I).toRgbString();
- };
- lI.random = function() {
- return lI.fromRatio({
- r: Math.random(),
- g: Math.random(),
- b: Math.random()
- });
- };
- function SZg(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = lI(t).toHsl();
- return g.s -= I / 100, g.s = bM(g.s), lI(g);
- }
- function DZg(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = lI(t).toHsl();
- return g.s += I / 100, g.s = bM(g.s), lI(g);
- }
- function KZg(t) {
- return lI(t).desaturate(100);
- }
- function FZg(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = lI(t).toHsl();
- return g.l += I / 100, g.l = bM(g.l), lI(g);
- }
- function kZg(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = lI(t).toRgb();
- return g.r = Math.max(0, Math.min(255, g.r - Math.round(255 * -(I / 100)))), g.g = Math.max(0, Math.min(255, g.g - Math.round(255 * -(I / 100)))), g.b = Math.max(0, Math.min(255, g.b - Math.round(255 * -(I / 100)))), lI(g);
- }
- function zZg(t, I) {
- I = I === 0 ? 0 : I || 10;
- var g = lI(t).toHsl();
- return g.l -= I / 100, g.l = bM(g.l), lI(g);
- }
- function JZg(t, I) {
- var g = lI(t).toHsl(), C = (g.h + I) % 360;
- return g.h = C < 0 ? 360 + C : C, lI(g);
- }
- function LZg(t) {
- var I = lI(t).toHsl();
- return I.h = (I.h + 180) % 360, lI(I);
- }
- function l$(t, I) {
- if (isNaN(I) || I <= 0)
- throw new Error("Argument to polyad must be a positive number");
- for (var g = lI(t).toHsl(), C = [lI(t)], i = 360 / I, e = 1; e < I; e++)
- C.push(lI({
- h: (g.h + e * i) % 360,
- s: g.s,
- l: g.l
- }));
- return C;
- }
- function vZg(t) {
- var I = lI(t).toHsl(), g = I.h;
- return [lI(t), lI({
- h: (g + 72) % 360,
- s: I.s,
- l: I.l
- }), lI({
- h: (g + 216) % 360,
- s: I.s,
- l: I.l
- })];
- }
- function TZg(t, I, g) {
- I = I || 6, g = g || 30;
- var C = lI(t).toHsl(), i = 360 / g, e = [lI(t)];
- for (C.h = (C.h - (i * I >> 1) + 720) % 360; --I; )
- C.h = (C.h + i) % 360, e.push(lI(C));
- return e;
- }
- function xZg(t, I) {
- I = I || 6;
- for (var g = lI(t).toHsv(), C = g.h, i = g.s, e = g.v, A = [], s = 1 / I; I--; )
- A.push(lI({
- h: C,
- s: i,
- v: e
- })), e = (e + s) % 1;
- return A;
- }
- lI.mix = function(t, I, g) {
- g = g === 0 ? 0 : g || 50;
- var C = lI(t).toRgb(), i = lI(I).toRgb(), e = g / 100, A = {
- r: (i.r - C.r) * e + C.r,
- g: (i.g - C.g) * e + C.g,
- b: (i.b - C.b) * e + C.b,
- a: (i.a - C.a) * e + C.a
- };
- return lI(A);
- };
- lI.readability = function(t, I) {
- var g = lI(t), C = lI(I);
- return (Math.max(g.getLuminance(), C.getLuminance()) + 0.05) / (Math.min(g.getLuminance(), C.getLuminance()) + 0.05);
- };
- lI.isReadable = function(t, I, g) {
- var C = lI.readability(t, I), i, e;
- switch (e = !1, i = PZg(g), i.level + i.size) {
- case "AAsmall":
- case "AAAlarge":
- e = C >= 4.5;
- break;
- case "AAlarge":
- e = C >= 3;
- break;
- case "AAAsmall":
- e = C >= 7;
- break;
- }
- return e;
- };
- lI.mostReadable = function(t, I, g) {
- var C = null, i = 0, e, A, s, l;
- g = g || {}, A = g.includeFallbackColors, s = g.level, l = g.size;
- for (var n = 0; n < I.length; n++)
- e = lI.readability(t, I[n]), e > i && (i = e, C = lI(I[n]));
- return lI.isReadable(t, C, {
- level: s,
- size: l
- }) || !A ? C : (g.includeFallbackColors = !1, lI.mostReadable(t, ["#fff", "#000"], g));
- };
- var A9 = lI.names = {
- aliceblue: "f0f8ff",
- antiquewhite: "faebd7",
- aqua: "0ff",
- aquamarine: "7fffd4",
- azure: "f0ffff",
- beige: "f5f5dc",
- bisque: "ffe4c4",
- black: "000",
- blanchedalmond: "ffebcd",
- blue: "00f",
- blueviolet: "8a2be2",
- brown: "a52a2a",
- burlywood: "deb887",
- burntsienna: "ea7e5d",
- cadetblue: "5f9ea0",
- chartreuse: "7fff00",
- chocolate: "d2691e",
- coral: "ff7f50",
- cornflowerblue: "6495ed",
- cornsilk: "fff8dc",
- crimson: "dc143c",
- cyan: "0ff",
- darkblue: "00008b",
- darkcyan: "008b8b",
- darkgoldenrod: "b8860b",
- darkgray: "a9a9a9",
- darkgreen: "006400",
- darkgrey: "a9a9a9",
- darkkhaki: "bdb76b",
- darkmagenta: "8b008b",
- darkolivegreen: "556b2f",
- darkorange: "ff8c00",
- darkorchid: "9932cc",
- darkred: "8b0000",
- darksalmon: "e9967a",
- darkseagreen: "8fbc8f",
- darkslateblue: "483d8b",
- darkslategray: "2f4f4f",
- darkslategrey: "2f4f4f",
- darkturquoise: "00ced1",
- darkviolet: "9400d3",
- deeppink: "ff1493",
- deepskyblue: "00bfff",
- dimgray: "696969",
- dimgrey: "696969",
- dodgerblue: "1e90ff",
- firebrick: "b22222",
- floralwhite: "fffaf0",
- forestgreen: "228b22",
- fuchsia: "f0f",
- gainsboro: "dcdcdc",
- ghostwhite: "f8f8ff",
- gold: "ffd700",
- goldenrod: "daa520",
- gray: "808080",
- green: "008000",
- greenyellow: "adff2f",
- grey: "808080",
- honeydew: "f0fff0",
- hotpink: "ff69b4",
- indianred: "cd5c5c",
- indigo: "4b0082",
- ivory: "fffff0",
- khaki: "f0e68c",
- lavender: "e6e6fa",
- lavenderblush: "fff0f5",
- lawngreen: "7cfc00",
- lemonchiffon: "fffacd",
- lightblue: "add8e6",
- lightcoral: "f08080",
- lightcyan: "e0ffff",
- lightgoldenrodyellow: "fafad2",
- lightgray: "d3d3d3",
- lightgreen: "90ee90",
- lightgrey: "d3d3d3",
- lightpink: "ffb6c1",
- lightsalmon: "ffa07a",
- lightseagreen: "20b2aa",
- lightskyblue: "87cefa",
- lightslategray: "789",
- lightslategrey: "789",
- lightsteelblue: "b0c4de",
- lightyellow: "ffffe0",
- lime: "0f0",
- limegreen: "32cd32",
- linen: "faf0e6",
- magenta: "f0f",
- maroon: "800000",
- mediumaquamarine: "66cdaa",
- mediumblue: "0000cd",
- mediumorchid: "ba55d3",
- mediumpurple: "9370db",
- mediumseagreen: "3cb371",
- mediumslateblue: "7b68ee",
- mediumspringgreen: "00fa9a",
- mediumturquoise: "48d1cc",
- mediumvioletred: "c71585",
- midnightblue: "191970",
- mintcream: "f5fffa",
- mistyrose: "ffe4e1",
- moccasin: "ffe4b5",
- navajowhite: "ffdead",
- navy: "000080",
- oldlace: "fdf5e6",
- olive: "808000",
- olivedrab: "6b8e23",
- orange: "ffa500",
- orangered: "ff4500",
- orchid: "da70d6",
- palegoldenrod: "eee8aa",
- palegreen: "98fb98",
- paleturquoise: "afeeee",
- palevioletred: "db7093",
- papayawhip: "ffefd5",
- peachpuff: "ffdab9",
- peru: "cd853f",
- pink: "ffc0cb",
- plum: "dda0dd",
- powderblue: "b0e0e6",
- purple: "800080",
- rebeccapurple: "663399",
- red: "f00",
- rosybrown: "bc8f8f",
- royalblue: "4169e1",
- saddlebrown: "8b4513",
- salmon: "fa8072",
- sandybrown: "f4a460",
- seagreen: "2e8b57",
- seashell: "fff5ee",
- sienna: "a0522d",
- silver: "c0c0c0",
- skyblue: "87ceeb",
- slateblue: "6a5acd",
- slategray: "708090",
- slategrey: "708090",
- snow: "fffafa",
- springgreen: "00ff7f",
- steelblue: "4682b4",
- tan: "d2b48c",
- teal: "008080",
- thistle: "d8bfd8",
- tomato: "ff6347",
- turquoise: "40e0d0",
- violet: "ee82ee",
- wheat: "f5deb3",
- white: "fff",
- whitesmoke: "f5f5f5",
- yellow: "ff0",
- yellowgreen: "9acd32"
- }, jZg = lI.hexNames = QZg(A9);
- function QZg(t) {
- var I = {};
- for (var g in t)
- t.hasOwnProperty(g) && (I[t[g]] = g);
- return I;
- }
- function yig(t) {
- return t = parseFloat(t), (isNaN(t) || t < 0 || t > 1) && (t = 1), t;
- }
- function LC(t, I) {
- OZg(t) && (t = "100%");
- var g = UZg(t);
- return t = Math.min(I, Math.max(0, parseFloat(t))), g && (t = parseInt(t * I, 10) / 100), Math.abs(t - I) < 1e-6 ? 1 : t % I / parseFloat(I);
- }
- function bM(t) {
- return Math.min(1, Math.max(0, t));
- }
- function le(t) {
- return parseInt(t, 16);
- }
- function OZg(t) {
- return typeof t == "string" && t.indexOf(".") != -1 && parseFloat(t) === 1;
- }
- function UZg(t) {
- return typeof t == "string" && t.indexOf("%") != -1;
- }
- function FA(t) {
- return t.length == 1 ? "0" + t : "" + t;
- }
- function bm(t) {
- return t <= 1 && (t = t * 100 + "%"), t;
- }
- function Yig(t) {
- return Math.round(parseFloat(t) * 255).toString(16);
- }
- function n$(t) {
- return le(t) / 255;
- }
- var ZA = function() {
- var t = "[-\\+]?\\d+%?", I = "[-\\+]?\\d*\\.\\d+%?", g = "(?:" + I + ")|(?:" + t + ")", C = "[\\s|\\(]+(" + g + ")[,|\\s]+(" + g + ")[,|\\s]+(" + g + ")\\s*\\)?", i = "[\\s|\\(]+(" + g + ")[,|\\s]+(" + g + ")[,|\\s]+(" + g + ")[,|\\s]+(" + g + ")\\s*\\)?";
- return {
- CSS_UNIT: new RegExp(g),
- rgb: new RegExp("rgb" + C),
- rgba: new RegExp("rgba" + i),
- hsl: new RegExp("hsl" + C),
- hsla: new RegExp("hsla" + i),
- hsv: new RegExp("hsv" + C),
- hsva: new RegExp("hsva" + i),
- hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
- hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
- };
- }();
- function cl(t) {
- return !!ZA.CSS_UNIT.exec(t);
- }
- function EZg(t) {
- t = t.replace(NZg, "").replace(VZg, "").toLowerCase();
- var I = !1;
- if (A9[t])
- t = A9[t], I = !0;
- else if (t == "transparent")
- return {
- r: 0,
- g: 0,
- b: 0,
- a: 0,
- format: "name"
- };
- var g;
- return (g = ZA.rgb.exec(t)) ? {
- r: g[1],
- g: g[2],
- b: g[3]
- } : (g = ZA.rgba.exec(t)) ? {
- r: g[1],
- g: g[2],
- b: g[3],
- a: g[4]
- } : (g = ZA.hsl.exec(t)) ? {
- h: g[1],
- s: g[2],
- l: g[3]
- } : (g = ZA.hsla.exec(t)) ? {
- h: g[1],
- s: g[2],
- l: g[3],
- a: g[4]
- } : (g = ZA.hsv.exec(t)) ? {
- h: g[1],
- s: g[2],
- v: g[3]
- } : (g = ZA.hsva.exec(t)) ? {
- h: g[1],
- s: g[2],
- v: g[3],
- a: g[4]
- } : (g = ZA.hex8.exec(t)) ? {
- r: le(g[1]),
- g: le(g[2]),
- b: le(g[3]),
- a: n$(g[4]),
- format: I ? "name" : "hex8"
- } : (g = ZA.hex6.exec(t)) ? {
- r: le(g[1]),
- g: le(g[2]),
- b: le(g[3]),
- format: I ? "name" : "hex"
- } : (g = ZA.hex4.exec(t)) ? {
- r: le(g[1] + "" + g[1]),
- g: le(g[2] + "" + g[2]),
- b: le(g[3] + "" + g[3]),
- a: n$(g[4] + "" + g[4]),
- format: I ? "name" : "hex8"
- } : (g = ZA.hex3.exec(t)) ? {
- r: le(g[1] + "" + g[1]),
- g: le(g[2] + "" + g[2]),
- b: le(g[3] + "" + g[3]),
- format: I ? "name" : "hex"
- } : !1;
- }
- function PZg(t) {
- var I, g;
- return t = t || {
- level: "AA",
- size: "small"
- }, I = (t.level || "AA").toUpperCase(), g = (t.size || "small").toLowerCase(), I !== "AA" && I !== "AAA" && (I = "AA"), g !== "small" && g !== "large" && (g = "small"), {
- level: I,
- size: g
- };
- }
- const _Zg = {
- __name: "Table",
- props: {
- workbook: Object
- },
- setup(t) {
- const I = t, g = wi(null), C = wi([]), i = wi(null), e = DA(() => I.workbook.worksheets ? I.workbook.worksheets.filter((Z) => Z._rows.length) : []), A = () => {
- g.value = new e9(i.value, {
- view: {
- height: () => document.documentElement.clientHeight - 120,
- width: () => document.documentElement.clientWidth - 40
- },
- mode: "read",
- // 只读模式
- showToolbar: !1,
- showGrid: !0,
- showContextmenu: !1,
- // 禁用右键菜单提高性能
- multipleSheets: !0,
- rpx: 1,
- // 减少渲染计算
- row: {
- len: 100,
- // 限制初始行数
- height: 25,
- // 固定行高
- autoHeight: !0
- },
- col: {
- len: 26,
- // 限制初始列数
- width: 50,
- // 固定列宽
- indexWidth: 60,
- // 行索引宽度
- minWidth: 30,
- // 最小列宽
- autoWidth: !0
- // 自动调整列宽
- },
- style: {
- // 确保默认样式正确
- bgcolor: "#ffffff",
- color: "#333333",
- align: "left",
- valign: "middle",
- textwrap: !1,
- strike: !1,
- underline: !1,
- italic: !1,
- bold: !1,
- fontSize: 12
- }
- }).loadData({}), m();
- }, s = () => {
- if (g.value) {
- i.value.classList.add("loading");
- try {
- const Z = l();
- g.value && (i.value.innerHTML = ""), g.value = new e9(i.value, {
- view: {
- height: () => document.documentElement.clientHeight - 120,
- width: () => document.documentElement.clientWidth - 40
- },
- mode: "read",
- showToolbar: !1,
- showGrid: !0,
- showContextmenu: !1,
- multipleSheets: !0,
- rpx: 1,
- row: {
- len: 100,
- height: 25,
- autoHeight: !0
- },
- col: {
- len: 26,
- width: 50,
- indexWidth: 60,
- minWidth: 30,
- autoWidth: !0
- }
- }).loadData(Z);
- } finally {
- i.value.classList.remove("loading");
- }
- }
- }, l = () => {
- let Z = [];
- return e.value.forEach((p) => {
- const Y = p.id, R = {
- name: p._name,
- freeze: "A1",
- styles: [
- {
- bgcolor: "#ffffff",
- color: "#000000",
- align: "left",
- valign: "middle",
- fontSize: 12
- }
- ],
- merges: [],
- rows: {},
- cols: {}
- };
- try {
- n(p, R), a(p, R, /* @__PURE__ */ new Map()), r(p, R), Z.push(R);
- } catch {
- Z[Y] = {
- name: p._name || "Sheet1",
- rows: {},
- cols: {}
- };
- }
- }), Z;
- }, n = (Z, p) => {
- Z._merges && Object.values(Z._merges).forEach((Y) => {
- const { top: R, left: X, bottom: H, right: S } = Y;
- p.merges.push(
- `${h(X - 1)}${R}:${h(
- S - 1
- )}${H}`
- );
- });
- }, a = (Z, p, Y) => {
- const R = Math.min(Z.rowCount || 50, 100);
- for (let X = 0; X < R; X++) {
- const H = Z.getRow(X + 1);
- let S = 25;
- if (p.rows[X] = {
- cells: {},
- height: S
- }, !H || !H.cellCount)
- continue;
- const z = Math.min(Z.columnCount || 26, 100);
- for (let v = 0; v < z; v++)
- try {
- const K = H.getCell(v + 1);
- if (!K || K.type === "null" && !K.style) {
- p.rows[X].cells[v] = {
- text: "",
- style: 0
- };
- continue;
- }
- const { text: V, height: N } = d(K), B = o(K, Y, p.styles);
- S = Math.max(S, N);
- const G = Object.values(Z._merges || {}).find(
- (w) => w.top === H.number && w.left === v + 1
- );
- G ? p.rows[X].cells[v] = {
- text: V,
- style: B,
- merge: [
- G.bottom - G.top,
- G.right - G.left
- ]
- } : p.rows[X].cells[v] = {
- text: V,
- style: B
- };
- } catch {
- p.rows[X].cells[v] = {
- text: "",
- style: 0
- };
- }
- p.rows[X].height = S;
- }
- }, d = (Z) => {
- let p = "";
- try {
- if (!Z || Z.value === null || Z.value === void 0)
- p = "";
- else if (Z.type === "date" || Z.numFmt && (Z.numFmt.includes("yy") || Z.numFmt.includes("mm") || Z.numFmt.includes("dd") || Z.numFmt.includes("h") || Z.numFmt.includes("m:s")))
- try {
- let S;
- if (Z.value instanceof Date)
- S = Z.value;
- else if (typeof Z.value == "number") {
- const z = new Date(1899, 11, 30);
- S = new Date(
- z.getTime() + Z.value * 24 * 60 * 60 * 1e3
- );
- } else
- S = new Date(Z.value);
- if (isNaN(S.getTime()))
- p = String(Z.text || Z.value || "");
- else {
- const z = S.getFullYear(), v = (S.getMonth() + 1).toString().padStart(2, "0"), K = S.getDate().toString().padStart(2, "0");
- if (Z.numFmt && (Z.numFmt.includes("h") || Z.numFmt.includes("s"))) {
- const V = S.getHours().toString().padStart(2, "0"), N = S.getMinutes().toString().padStart(2, "0"), B = S.getSeconds().toString().padStart(2, "0");
- p = `${z}/${v}/${K} ${V}:${N}:${B}`;
- } else
- p = `${z}/${v}/${K}`;
- }
- } catch {
- p = String(Z.text || Z.value || "");
- }
- else if (typeof Z.value == "object" && Z.value !== null)
- Z.value.hyperlink ? p = "[链接]" : Z.value.image ? p = "[图片]" : Z.value.richText ? p = Z.value.richText.map((S) => String((S == null ? void 0 : S.text) || "")).join("") : p = String(Z.text || "");
- else if (Z.formula)
- if (Z.numFmt && (Z.numFmt.includes("yy") || Z.numFmt.includes("mm") || Z.numFmt.includes("dd")))
- try {
- const S = new Date(1899, 11, 30), z = new Date(
- S.getTime() + Z.result * 24 * 60 * 60 * 1e3
- );
- if (isNaN(z.getTime()))
- p = String(Z.result || Z.value || "");
- else {
- const v = z.getFullYear(), K = (z.getMonth() + 1).toString().padStart(2, "0"), V = z.getDate().toString().padStart(2, "0");
- p = `${v}-${K}-${V}`;
- }
- } catch {
- p = String(Z.result || Z.value || "");
- }
- else
- p = Z.result !== void 0 && Z.result !== null ? String(Z.result) : String(Z.value || "");
- else
- p = Z.text !== void 0 && Z.text !== null ? String(Z.text) : Z.value !== void 0 && Z.value !== null ? String(Z.value) : "";
- } catch {
- p = "[格式错误]";
- }
- const Y = ((p || "").match(/\n/g) || []).length + 1, R = [...p || ""], X = Math.ceil(R.length / 40), H = Math.max(Y, X) * 20;
- return { text: p, height: H };
- }, o = (Z, p, Y) => {
- var S, z, v, K, V;
- const R = {
- bgcolor: "#ffffff",
- color: "#000000",
- align: ((S = Z.alignment) == null ? void 0 : S.horizontal) || "left",
- valign: ((z = Z.alignment) == null ? void 0 : z.vertical) || "middle",
- fontSize: ((v = Z.font) == null ? void 0 : v.size) || 12,
- textwrap: !0,
- bold: (K = Z.font) == null ? void 0 : K.bold,
- italic: (V = Z.font) == null ? void 0 : V.italic,
- underline: !1,
- strike: !1
- };
- if (Z.fill && Z.fill.type === "pattern") {
- const N = Z.fill.fgColor || {};
- if (typeof N.indexed == "number") {
- const B = t$[N.indexed];
- B && (R.bgcolor = `#${B}`);
- } else if (typeof N.theme == "number") {
- const B = {
- 0: 1,
- // 浅色1
- 1: 0,
- // 深色1
- 2: 3,
- // 浅色2
- 3: 2,
- // 深色2
- 4: 4,
- // 强调色1
- 5: 5,
- // 强调色2
- 6: 6,
- // 强调色3
- 7: 7,
- // 强调色4
- 8: 8,
- // 强调色5
- 9: 9
- // 强调色6
- }, G = B[N.theme] !== void 0 ? B[N.theme] : N.theme;
- if (C.value[G]) {
- let w = `#${C.value[G]}`;
- typeof N.tint == "number" && N.tint !== 0 && (w = c(w, N.tint)), R.bgcolor = w;
- }
- } else if (N.rgb)
- R.bgcolor = `#${N.rgb.substring(N.rgb.length - 6)}`;
- else if (N.argb) {
- const B = u(N.argb);
- B && (R.bgcolor = B);
- }
- }
- if (Z.font && Z.font.color) {
- const N = Z.font.color;
- if (typeof N.indexed == "number") {
- const B = t$[N.indexed];
- B && (R.color = `#${B}`);
- } else if (typeof N.theme == "number") {
- const B = {
- 0: 1,
- // 浅色1
- 1: 0,
- // 深色1
- 2: 3,
- // 浅色2
- 3: 2,
- // 深色2
- 4: 4,
- // 强调色1
- 5: 5,
- // 强调色2
- 6: 6,
- // 强调色3
- 7: 7,
- // 强调色4
- 8: 8,
- // 强调色5
- 9: 9
- // 强调色6
- }, G = B[N.theme] !== void 0 ? B[N.theme] : N.theme;
- if (C.value[G]) {
- let w = `#${C.value[G]}`;
- typeof N.tint == "number" && N.tint !== 0 && (w = c(w, N.tint)), R.color = w;
- }
- } else if (N.rgb)
- R.color = `#${N.rgb.substring(N.rgb.length - 6)}`;
- else if (N.argb) {
- const B = u(N.argb);
- B && (R.color = B);
- }
- }
- const X = JSON.stringify(R);
- if (p.has(X))
- return p.get(X);
- Y.push(R);
- const H = Y.length - 1;
- return p.set(X, H), H;
- }, c = (Z, p) => {
- try {
- const R = lI(Z).toRgb(), X = (v, K) => {
- let V;
- return K < 0 ? V = v * (1 + K) : V = v + (255 - v) * K, Math.max(0, Math.min(255, Math.round(V)));
- }, H = X(R.r, p), S = X(R.g, p), z = X(R.b, p);
- return lI({ r: H, g: S, b: z }).toHexString();
- } catch {
- return Z;
- }
- }, r = (Z, p) => {
- const Y = Math.min(Z.columnCount || 26, 50), R = /* @__PURE__ */ new Map(), X = /* @__PURE__ */ new Set();
- Z._merges && Object.values(Z._merges).forEach((H) => {
- for (let S = H.left; S <= H.right; S++)
- X.add(S - 1);
- }), Z.eachRow((H) => {
- var S, z, v;
- for (let K = 0; K < Y; K++)
- try {
- const V = H.getCell(K + 1);
- if (!V) continue;
- let N = "";
- try {
- V.text !== void 0 && V.text !== null ? N = String(V.text) : V.value !== void 0 && V.value !== null && (typeof V.value == "object" ? N = (S = V.value) != null && S.richText ? V.value.richText.map((B) => String((B == null ? void 0 : B.text) || "")).join("") : (z = V.value) != null && z.hyperlink ? "[链接]" : (v = V.value) != null && v.image ? "[图片]" : "" : N = String(V.value));
- } catch {
- N = "";
- }
- if (N)
- if (Object.values(Z._merges || {}).some(
- (G) => H.number >= G.top && H.number <= G.bottom && K + 1 >= G.left && K + 1 <= G.right
- )) {
- const G = Object.values(Z._merges || {}).find(
- (w) => H.number >= w.top && H.number <= w.bottom && K + 1 >= w.left && K + 1 <= w.right
- );
- if (G && K + 1 === G.left) {
- const w = G.right - G.left + 1, W = [...N].reduce((f, D) => f + (/[\u4e00-\u9fa5]/.test(D) ? 2 : 1), 0), y = Math.ceil(W / w);
- R.set(
- K,
- Math.max(R.get(K) || 0, y)
- );
- }
- } else {
- const G = [...N].reduce((w, W) => w + (/[\u4e00-\u9fa5]/.test(W) ? 2 : 1), 0);
- R.set(
- K,
- Math.max(R.get(K) || 0, G)
- );
- }
- } catch {
- }
- });
- for (let H = 0; H < Y; H++) {
- const S = R.get(H);
- if (S) {
- const z = Math.min(Math.max(S * 8 + 10, 50), 300);
- p.cols[H] = { width: z };
- }
- }
- }, h = (Z) => {
- let p, Y = "";
- for (; Z >= 0; )
- p = Z % 26, Y = String.fromCharCode(p + 65) + Y, Z = (Z - p) / 26 - 1;
- return Y;
- }, b = () => {
- var p;
- const Z = (p = I.workbook._themes) == null ? void 0 : p.theme1;
- if (!Z) {
- C.value = [
- "FFFFFF",
- // 白色 - 浅色1
- "000000",
- // 黑色 - 深色1
- "EEECE1",
- // 浅灰 - 浅色2
- "1F497D",
- // 深灰 - 深色2
- "4F81BD",
- // 蓝色 - 强调色1
- "C0504D",
- // 红色 - 强调色2
- "9BBB59",
- // 绿色 - 强调色3
- "8064A2",
- // 紫色 - 强调色4
- "4BACC6",
- // 青色 - 强调色5
- "F79646"
- // 橙色 - 强调色6
- ];
- return;
- }
- try {
- const X = new DOMParser().parseFromString(Z, "text/xml").getElementsByTagName("a:clrScheme")[0];
- if (!X)
- throw new Error("找不到颜色方案元素");
- C.value = [];
- const H = Array.from(X.children);
- for (const S of H) {
- let z = null;
- const v = S.getElementsByTagName("a:srgbClr")[0], K = S.getElementsByTagName("a:sysClr")[0];
- v ? z = v.getAttribute("val") : K && (z = K.getAttribute("lastClr") || K.getAttribute("val")), C.value.push(z || "FFFFFF");
- }
- } catch (Y) {
- console.error("解析主题颜色出错:", Y), C.value = [
- "FFFFFF",
- // 白色 - 浅色1
- "000000",
- // 黑色 - 深色1
- "EEECE1",
- // 浅灰 - 浅色2
- "1F497D",
- // 深灰 - 深色2
- "4F81BD",
- // 蓝色 - 强调色1
- "C0504D",
- // 红色 - 强调色2
- "9BBB59",
- // 绿色 - 强调色3
- "8064A2",
- // 紫色 - 强调色4
- "4BACC6",
- // 青色 - 强调色5
- "F79646"
- // 橙色 - 强调色6
- ];
- }
- }, u = (Z) => !Z || Z.length < 8 ? null : `#${Z.substring(2)}`, m = () => {
- b(), s();
- };
- return tG(() => {
- A();
- }), b$(
- () => I.workbook,
- () => {
- m();
- }
- ), (Z, p) => (Ug(), Pg("div", null, [
- tC("div", {
- ref_key: "spreadsheetRef",
- ref: i,
- class: "spreadsheet-container",
- id: "spreadsheet"
- }, null, 512)
- ]));
- }
- };
- async function qZg(t, I) {
- const g = await new $bg.Workbook().xlsx.load(t), C = iG(_Zg, { workbook: g });
- return C.mount(I), {
- $el: I,
- $destroy() {
- C.unmount();
- }
- };
- }
- const a$ = (t) => ({
- $el: t,
- $destroy() {
- }
- }), $Zg = [
- // 使用docxjs支持,目前效果最好的渲染器
- {
- accepts: ["docx"],
- handler: async (t, I) => {
- const g = {
- ...o9,
- debug: !0,
- experimental: !0
- };
- return await Fog(t, I, null, g), a$(I);
- }
- },
- // 使用pptx2html,已通过默认值更替
- {
- accepts: ["pptx"],
- handler: async (t, I) => Pbg(t, I)
- },
- // 使用sheetjs + handsontable,无样式
- {
- accepts: ["xlsx"],
- handler: async (t, I) => qZg(t, I)
- },
- // 使用pdfjs,渲染pdf,效果最好
- {
- accepts: ["pdf"],
- handler: async (t, I) => Kdg(t, I)
- },
- // 图片过滤器
- {
- accepts: ["gif", "jpg", "jpeg", "bmp", "tiff", "tif", "png", "svg"],
- handler: async (t, I) => Ldg(t, I)
- },
- // 纯文本预览
- {
- accepts: [
- "txt",
- "json",
- "js",
- "css",
- "java",
- "py",
- "html",
- "jsx",
- "ts",
- "tsx",
- "xml",
- "md",
- "log"
- ],
- handler: async (t, I) => jdg(t, I)
- },
- // 错误处理
- {
- accepts: ["error"],
- handler: async (t, I, g) => (I.innerHTML = `<div style="text-align: center margin-top: 80px">不支持.${g}格式的在线预览,请下载后预览或转换为支持的格式</div>
- <div style="text-align: center">支持docx, xlsx, pptx, pdf, 以及纯文本格式和各种图片格式的在线预览</div>`, a$(I))
- }
- ], o$ = $Zg.reduce((t, { accepts: I, handler: g }) => (I.forEach((C) => t[C] = g), t), {});
- async function MGg(t) {
- return new Promise((I, g) => {
- const C = new FileReader();
- C.onload = (i) => I(i.target.result), C.onerror = (i) => g(i), C.readAsArrayBuffer(t);
- });
- }
- async function Nig(t) {
- return new Promise((I, g) => {
- const C = new FileReader();
- C.onload = (i) => I(i.target.result), C.onerror = (i) => g(i), C.readAsDataURL(new Blob([t]));
- });
- }
- async function gGg(t) {
- return new Promise((I, g) => {
- const C = new FileReader();
- C.onload = (i) => I(i.target.result), C.onerror = (i) => g(i), C.readAsText(new Blob([t]), "utf-8");
- });
- }
- function RGg(t) {
- const I = t.lastIndexOf(".");
- return t.substr(I + 1);
- }
- async function IGg(t, I, g) {
- const C = o$[I];
- return C ? C(t, g) : o$.error(t, g, I);
- }
- const CGg = "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1623827680993'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='6860'%20width='128'%20height='128'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3cdefs%3e%3cstyle%20type='text/css'%3e%3c/style%3e%3c/defs%3e%3cpath%20d='M971.232%2041.216l0.768%200.768a32%2032%200%200%201%200%2044.96L88.512%20982.496a31.808%2031.808%200%200%201-41.952%202.944l-3.808-3.424a32%2032%200%200%201%200-44.96l169.12-171.36c-58.08-49.28-112.256-114.4-162.592-195.36l-7.84-12.8a65.664%2065.664%200%200%201%200-67.84c130.176-215.392%20286.656-323.104%20469.44-323.104%2081.312%200%20157.6%2021.312%20228.8%2064l186.56-189.088a31.808%2031.808%200%200%201%2044.992-0.32zM828.576%20297.28c51.584%2047.04%20100.16%20106.72%20145.728%20179.104l8.096%2013.024c12.8%2020.96%2012.8%2047.488%200%2068.448-131.68%20215.2-288.864%20322.784-471.52%20322.784-73.152%200-142.08-17.248-206.784-51.712l47.84-48.48a369.888%20369.888%200%200%200%20158.944%2035.296c158.144%200%20296.192-94.528%20417.088-292.096l-7.68-12.352c-43.424-69.056-89.088-124.96-137.024-168.128l45.312-45.888z%20m-317.696-65.792c-158.112%200-295.392%2094.496-414.848%20292.16l7.424%2012.064c48.32%2077.76%2099.552%20138.88%20153.856%20183.904l91.008-92.256a195.776%20195.776%200%200%201-29.504-103.744c0-107.552%2086.016-194.752%20192.128-194.752%2037.6%200%2072.704%2010.976%20102.336%2029.92l79.424-80.544a373.76%20373.76%200%200%200-181.824-46.72z%20m174.656%20210.784c11.264%2024.768%2017.504%2052.32%2017.504%2081.344%200%20107.552-85.984%20194.752-192.096%20194.752a189.248%20189.248%200%200%201-80.256-17.76l50.08-50.784c9.696%202.368%2019.776%203.616%2030.176%203.616%2070.72%200%20128.064-58.112%20128.064-129.824a131.84%20131.84%200%200%200-3.552-30.56l50.08-50.784z%20m-174.592-48.48c-70.72%200-128.096%2058.112-128.096%20129.824%200%2020.064%204.48%2039.04%2012.48%2056l170.88-173.152a126.144%20126.144%200%200%200-55.264-12.672z'%20fill='%23bfbfbf'%20p-id='6861'%3e%3c/path%3e%3c/svg%3e", tGg = { class: "view-other" }, iGg = ["src"], eGg = { class: "size-item" }, AGg = {
- __name: "index",
- props: {
- file: {
- type: Object,
- default: () => ({})
- }
- },
- setup(t) {
- const I = t, g = DA(() => {
- const C = Number(I.file.size);
- if (!Number.isFinite(C) || !C) return "0KB";
- const i = 1024, e = 1048576, A = Math.abs(C), s = C < 0 ? "-" : "";
- return A >= e ? `${s}${Math.floor(A / e * 100) / 100} GB` : A >= i ? `${s}${Math.floor(A / i * 100) / 100} MB` : `${s}${A} KB`;
- });
- return (C, i) => {
- const e = lag("big");
- return Ug(), Pg("div", tGg, [
- tC("img", {
- class: "view-off-icon",
- src: Dg(CGg),
- alt: ""
- }, null, 8, iGg),
- tC("p", null, [
- nag(um(t.file.name) + "." + um(t.file.type), 1),
- tC("span", eGg, um(g.value), 1)
- ]),
- tC("p", null, [
- aag(e, null, {
- default: oag(() => i[0] || (i[0] = [
- tC("strong", null, "该类型文件不支持在线预览,请下载后查看。", -1)
- ])),
- _: 1
- })
- ])
- ]);
- };
- }
- }, sGg = /* @__PURE__ */ V0(AGg, [["__scopeId", "data-v-d007bf31"]]), lGg = { class: "container" }, nGg = { class: "modal-height" }, aGg = { class: "file-box" }, oGg = { class: "view-wrapper" }, cGg = {
- key: 0,
- class: "preview-wrapper",
- ref: "wrapper"
- }, dGg = {
- class: "preview-inner",
- ref: "preview-inner"
- }, rGg = {
- class: "preview-mark",
- ref: "bg-mark",
- id: "bg-mark"
- }, hGg = { class: "loading-container" }, bGg = {
- key: 0,
- class: "viewfile-image"
- }, uGg = ["src", "alt"], mGg = ["src"], ZGg = {
- __name: "index",
- props: {
- file: {
- type: Object,
- default: () => ({})
- }
- },
- setup(t) {
- const I = t, g = wi(!1), C = wi(null), i = wi(""), e = wi(!1), A = wi(0), s = DA(() => {
- const u = (I.file.type || "").toLowerCase();
- return Object.values({
- doc: ["docx"],
- xlsx: ["xlsx"],
- pdf: ["pdf"],
- ppt: ["pptx"],
- image: ["gif", "jpg", "jpeg", "bmp", "tiff", "tif", "png", "svg"],
- text: [
- "txt",
- "json",
- "js",
- "css",
- "java",
- "py",
- "html",
- "jsx",
- "ts",
- "tsx",
- "xml",
- "md",
- "log"
- ]
- }).flat().includes(u);
- }), l = DA(() => {
- const u = (I.file.type || "").toLowerCase();
- return ["gif", "jpg", "jpeg", "bmp", "tiff", "tif", "png", "svg"].includes(u);
- }), n = DA(() => {
- const u = String(i.value || "");
- return u ? [u] : [];
- }), a = DA(() => ({
- visible: e.value,
- open: d,
- close: o,
- next: c,
- prev: r
- }));
- function d(u = 0) {
- n.value.length && (A.value = Math.max(0, Math.min(n.value.length - 1, Number(u) || 0)), e.value = !0);
- }
- function o() {
- e.value = !1;
- }
- function c() {
- const u = n.value;
- u.length <= 1 || (A.value = (A.value + 1) % u.length);
- }
- function r() {
- const u = n.value;
- u.length <= 1 || (A.value = (A.value - 1 + u.length) % u.length);
- }
- function h(u) {
- e.value && (u.key === "Escape" && o(), u.key === "ArrowRight" && c(), u.key === "ArrowLeft" && r());
- }
- tG(() => {
- window.addEventListener("keydown", h);
- }), s9(() => {
- window.removeEventListener("keydown", h);
- });
- const b = (u, m) => {
- if (!C.value)
- return Promise.reject(new Error("Output element not found"));
- C.value.innerHTML = "";
- const Z = document.createElement("div"), p = C.value.appendChild(Z);
- return new Promise(
- (Y, R) => IGg(u, m, p).then(Y).catch(R)
- );
- };
- return b$(
- () => I.file,
- (u) => {
- if (u && u.type)
- try {
- g.value = !0, cag(() => {
- if (l.value) {
- i.value = "", e.value = !1, A.value = 0, C.value && (C.value.innerHTML = ""), Nig(u.fileBuffer).then((m) => {
- i.value = String(m || "");
- }).finally(() => {
- g.value = !1;
- });
- return;
- }
- i.value = "", e.value = !1, A.value = 0, b(u.fileBuffer, u.type).finally(() => {
- g.value = !1;
- });
- });
- } catch (m) {
- console.warn(m);
- }
- },
- { immediate: !0, deep: !0 }
- ), (u, m) => (Ug(), Pg("div", lGg, [
- tC("div", nGg, [
- tC("div", aGg, [
- SY(tC("p", { class: "file-name" }, um(t.file.filename), 513), [
- [DY, !g.value]
- ]),
- tC("div", oGg, [
- s.value ? (Ug(), Pg("div", cGg, [
- tC("div", dGg, [
- tC("div", rGg, null, 512),
- SY(tC("div", hGg, m[1] || (m[1] = [
- tC("div", { class: "loading-spinner" }, [
- tC("svg", {
- viewBox: "0 0 50 50",
- class: "circular"
- }, [
- tC("circle", {
- cx: "25",
- cy: "25",
- r: "20",
- fill: "none",
- class: "path"
- })
- ])
- ], -1)
- ]), 512), [
- [DY, g.value]
- ]),
- l.value ? SY((Ug(), Pg("div", bGg, [
- d$(u.$slots, "image", {
- src: i.value,
- srcList: n.value,
- index: A.value,
- file: t.file,
- preview: a.value
- }, () => [
- tC("img", {
- class: "viewfile-image-inner",
- src: i.value,
- alt: t.file.filename || "",
- onClick: m[0] || (m[0] = (Z) => d(0))
- }, null, 8, uGg)
- ], !0),
- e.value ? (Ug(), Pg("div", {
- key: 0,
- class: "viewfile-image-preview",
- onClick: ah(o, ["self"])
- }, [
- tC("button", {
- class: "viewfile-image-preview-close",
- type: "button",
- onClick: o
- }, "×"),
- n.value.length > 1 ? (Ug(), Pg("button", {
- key: 0,
- class: "viewfile-image-preview-prev",
- type: "button",
- onClick: ah(r, ["stop"])
- }, " ‹ ")) : Yt("", !0),
- tC("img", {
- class: "viewfile-image-preview-img",
- src: n.value[A.value],
- alt: ""
- }, null, 8, mGg),
- n.value.length > 1 ? (Ug(), Pg("button", {
- key: 1,
- class: "viewfile-image-preview-next",
- type: "button",
- onClick: ah(c, ["stop"])
- }, " › ")) : Yt("", !0)
- ])) : Yt("", !0)
- ], 512)), [
- [DY, !g.value]
- ]) : SY((Ug(), Pg("div", {
- key: 1,
- class: "output",
- ref_key: "output",
- ref: C
- }, null, 512)), [
- [DY, !g.value]
- ])
- ], 512)
- ], 512)) : t.file.type && !s.value ? (Ug(), h$(sGg, {
- key: 1,
- file: t.file
- }, null, 8, ["file"])) : Yt("", !0)
- ])
- ])
- ])
- ]));
- }
- }, GGg = /* @__PURE__ */ V0(ZGg, [["__scopeId", "data-v-3eb932b1"]]), fGg = {
- install(t) {
- t.component("ViewFile", GGg);
- }
- };
- export {
- GGg as ViewFile,
- fGg as default,
- RGg as getExtend,
- MGg as readBuffer,
- Nig as readDataURL,
- gGg as readText,
- IGg as render
- };
|